11using System ;
2+ using System . Collections . Generic ;
23using System . Data ;
34using System . Data . Common ;
5+ using NHibernate . Dialect ;
46using NHibernate . Driver ;
57using NHibernate . SqlCommand ;
68using NHibernate . SqlTypes ;
9+ using NHibernate . Util ;
710using NUnit . Framework ;
11+ using Environment = NHibernate . Cfg . Environment ;
812
913namespace NHibernate . Test . DriverTest
1014{
@@ -17,21 +21,134 @@ public class OracleDataClientDriverFixture
1721 /// </summary>
1822 [ Test ]
1923 [ Category ( "ODP.NET" ) ]
20- [ Explicit ]
21- public void NoBooleanParameters ( )
24+ [ Theory ]
25+ public void NoBooleanParameters ( bool managed )
2226 {
23- OracleDataClientDriver driver = new OracleDataClientDriver ( ) ;
27+ var driver = GetDriver ( managed , TestConfigurationHelper . GetDefaultConfiguration ( ) . Properties ) ;
28+ var param = GetParameterForType ( driver , SqlTypeFactory . Boolean ) ;
2429
25- SqlStringBuilder builder = new SqlStringBuilder ( ) ;
30+ Assert . That ( param . DbType , Is . Not . EqualTo ( DbType . Boolean ) , "should not still be a DbType.Boolean" ) ;
31+ }
32+
33+ [ Test ]
34+ [ Category ( "ODP.NET" ) ]
35+ [ Theory ]
36+ public void UnicodeParameters ( bool managed )
37+ {
38+ var cfg = TestConfigurationHelper . GetDefaultConfiguration ( ) ;
39+ var driver = GetDriver ( managed , cfg . Properties ) ;
40+ var useNPrefixedTypesForUnicode = PropertiesHelper . GetBoolean ( Environment . OracleUseNPrefixedTypesForUnicode , cfg . Properties , false ) ;
41+
42+ Assert . That ( driver . UseNPrefixedTypesForUnicode , Is . EqualTo ( useNPrefixedTypesForUnicode ) ,
43+ $ "Unexpected value for { nameof ( OracleDataClientDriverBase ) } .{ nameof ( OracleDataClientDriverBase . UseNPrefixedTypesForUnicode ) } ") ;
44+
45+ var param = GetParameterForType ( driver , SqlTypeFactory . GetString ( 200 ) ) ;
46+ var oracleParamType = GetOracleParameterType ( param ) ;
47+ Assert . That ( oracleParamType . ToString ( ) , Is . EqualTo ( useNPrefixedTypesForUnicode ? "NVarchar2" : "Varchar2" ) . IgnoreCase ,
48+ "Unexpected Unicode string parameter type" ) ;
49+
50+ param = GetParameterForType ( driver , new StringFixedLengthSqlType ( 10 ) ) ;
51+ oracleParamType = GetOracleParameterType ( param ) ;
52+ Assert . That ( oracleParamType . ToString ( ) , Is . EqualTo ( useNPrefixedTypesForUnicode ? "NChar" : "Char" ) . IgnoreCase ,
53+ "Unexpected Unicode string fixed length parameter type" ) ;
54+ }
55+
56+ [ Test ]
57+ [ Category ( "ODP.NET" ) ]
58+ [ Theory ]
59+ public void UnicodeParametersNoPrefix ( bool managed )
60+ {
61+ var cfg = TestConfigurationHelper . GetDefaultConfiguration ( ) ;
62+ cfg . SetProperty ( Environment . OracleUseNPrefixedTypesForUnicode , "false" ) ;
63+ var driver = GetDriver ( managed , cfg . Properties ) ;
64+
65+ Assert . That ( driver . UseNPrefixedTypesForUnicode , Is . False ,
66+ $ "Unexpected value for { nameof ( OracleDataClientDriverBase ) } .{ nameof ( OracleDataClientDriverBase . UseNPrefixedTypesForUnicode ) } ") ;
67+
68+ var param = GetParameterForType ( driver , SqlTypeFactory . GetString ( 200 ) ) ;
69+ var oracleParamType = GetOracleParameterType ( param ) ;
70+ Assert . That ( oracleParamType . ToString ( ) , Is . EqualTo ( "Varchar2" ) . IgnoreCase , "Unexpected Unicode string parameter type" ) ;
71+
72+ param = GetParameterForType ( driver , new StringFixedLengthSqlType ( 10 ) ) ;
73+ oracleParamType = GetOracleParameterType ( param ) ;
74+ Assert . That ( oracleParamType . ToString ( ) , Is . EqualTo ( "Char" ) . IgnoreCase , "Unexpected Unicode string fixed length parameter type" ) ;
75+ }
76+
77+ [ Test ]
78+ [ Category ( "ODP.NET" ) ]
79+ [ Theory ]
80+ public void UnicodeParametersWithPrefix ( bool managed )
81+ {
82+ var cfg = TestConfigurationHelper . GetDefaultConfiguration ( ) ;
83+ cfg . SetProperty ( Environment . OracleUseNPrefixedTypesForUnicode , "true" ) ;
84+ var driver = GetDriver ( managed , cfg . Properties ) ;
85+
86+ Assert . That ( driver . UseNPrefixedTypesForUnicode , Is . True ,
87+ $ "Unexpected value for { nameof ( OracleDataClientDriverBase ) } .{ nameof ( OracleDataClientDriverBase . UseNPrefixedTypesForUnicode ) } ") ;
88+
89+ var param = GetParameterForType ( driver , SqlTypeFactory . GetString ( 200 ) ) ;
90+ var oracleParamType = GetOracleParameterType ( param ) ;
91+ Assert . That ( oracleParamType . ToString ( ) , Is . EqualTo ( "NVarchar2" ) . IgnoreCase , "Unexpected Unicode string parameter type" ) ;
92+
93+ param = GetParameterForType ( driver , new StringFixedLengthSqlType ( 10 ) ) ;
94+ oracleParamType = GetOracleParameterType ( param ) ;
95+ Assert . That ( oracleParamType . ToString ( ) , Is . EqualTo ( "NChar" ) . IgnoreCase , "Unexpected Unicode string fixed length parameter type" ) ;
96+ }
97+
98+ [ Test ]
99+ [ Category ( "ODP.NET" ) ]
100+ [ Theory ]
101+ public void HasSameUnicodeDefaultThanDialect ( bool managed )
102+ {
103+ var cfg = TestConfigurationHelper . GetDefaultConfiguration ( ) ;
104+ cfg . Properties . Remove ( Environment . OracleUseNPrefixedTypesForUnicode ) ;
105+ var driver = GetDriver ( managed , cfg . Properties ) ;
106+ var dialect = new Oracle8iDialect ( ) ;
107+ dialect . Configure ( cfg . Properties ) ;
108+
109+ Assert . That ( driver . UseNPrefixedTypesForUnicode , Is . EqualTo ( dialect . UseNPrefixedTypesForUnicode ) ,
110+ $ "Default { nameof ( Oracle8iDialect . UseNPrefixedTypesForUnicode ) } values mismatch between driver and dialect") ;
111+ }
112+
113+
114+ private static OracleDataClientDriverBase GetDriver ( bool managed , IDictionary < string , string > settings )
115+ {
116+ OracleDataClientDriverBase driver = null ;
117+ try
118+ {
119+ driver = managed
120+ ? ( OracleDataClientDriverBase ) new OracleManagedDataClientDriver ( )
121+ : new OracleDataClientDriver ( ) ;
122+ }
123+ catch ( Exception ex )
124+ {
125+ Assert . Ignore ( "Unable to load the driver: {0}" , ex ) ;
126+ }
127+
128+ driver . Configure ( settings ) ;
129+
130+ return driver ;
131+ }
132+
133+ private static DbParameter GetParameterForType ( IDriver driver , SqlType paramType )
134+ {
135+ var builder = new SqlStringBuilder ( ) ;
26136 builder . Add ( "select * from table1 where col1=" ) ;
27137 builder . Add ( Parameter . Placeholder ) ;
28138
29- var cmd = driver . GenerateCommand ( CommandType . Text , builder . ToSqlString ( ) , new SqlType [ ] { SqlTypeFactory . Boolean } ) ;
139+ var cmd = driver . GenerateCommand ( CommandType . Text , builder . ToSqlString ( ) , new [ ] { paramType } ) ;
30140
141+ Assert . That ( cmd . Parameters , Has . Count . EqualTo ( 1 ) , "Unexpected parameters count" ) ;
31142 var param = cmd . Parameters [ 0 ] ;
143+ return param ;
144+ }
32145
33- Assert . AreEqual ( "col1" , param . ParameterName , "kept same param name" ) ;
34- Assert . IsFalse ( param . DbType == DbType . Boolean , "should not still be a DbType.Boolean" ) ;
146+ private static object GetOracleParameterType ( DbParameter dbParameter )
147+ {
148+ var parameterType = dbParameter . GetType ( ) ;
149+ var typeProperty = parameterType . GetProperty ( "OracleDbType" ) ??
150+ throw new InvalidOperationException ( "Unable to find OracleDbType property" ) ;
151+ return typeProperty . GetValue ( dbParameter ) ;
35152 }
36153 }
37154}
0 commit comments