Handle relocatable libMonoPosixHelper.so when --libdir= isn't lib/
[mono.git] / mcs / class / System.Data / Test / System.Data.SqlClient / SqlParameterTest.cs
1 //
2 // SqlParameterTest.cs - NUnit Test Cases for testing the
3 //                          SqlParameter class
4 // Author:
5 //      Senganal T (tsenganal@novell.com)
6 //      Amit Biswas (amit@amitbiswas.com)
7 //      Gert Driesen (drieseng@users.sourceforge.net)
8 //
9 // Copyright (c) 2004 Novell Inc., and the individuals listed
10 // on the ChangeLog entries.
11 //
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
19 //
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 //
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 //
31
32 using System;
33 using System.Data;
34 using System.Data.Common;
35 using System.Data.SqlClient;
36 using System.Data.SqlTypes;
37 using System.IO;
38 using System.Xml;
39
40 using NUnit.Framework;
41
42 namespace MonoTests.System.Data.SqlClient
43 {
44         [TestFixture]
45         public class SqlParameterTest
46         {
47                 [Test]
48                 public void Constructor1 ()
49                 {
50                         SqlParameter p = new SqlParameter ();
51                         Assert.AreEqual (DbType.String, p.DbType, "DbType");
52                         Assert.AreEqual (ParameterDirection.Input, p.Direction, "Direction");
53                         Assert.IsFalse (p.IsNullable, "IsNullable");
54                         Assert.AreEqual (0, p.LocaleId, "LocaleId");
55                         Assert.AreEqual (string.Empty, p.ParameterName, "ParameterName");
56                         Assert.AreEqual (0, p.Precision, "Precision");
57                         Assert.AreEqual (0, p.Scale, "Scale");
58                         Assert.AreEqual (0, p.Size, "Size");
59                         Assert.AreEqual (string.Empty, p.SourceColumn, "SourceColumn");
60                         Assert.IsFalse (p.SourceColumnNullMapping, "SourceColumnNullMapping");
61                         Assert.AreEqual (DataRowVersion.Current, p.SourceVersion, "SourceVersion");
62                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "SqlDbType");
63                         Assert.IsNull (p.SqlValue, "SqlValue");
64                         Assert.IsNull (p.Value, "Value");
65                         Assert.AreEqual (string.Empty, p.XmlSchemaCollectionDatabase, "XmlSchemaCollectionDatabase");
66                         Assert.AreEqual (string.Empty, p.XmlSchemaCollectionName, "XmlSchemaCollectionName");
67                         Assert.AreEqual (string.Empty, p.XmlSchemaCollectionOwningSchema, "XmlSchemaCollectionOwningSchema");
68                 }
69
70                 [Test]
71                 public void Constructor2_Value_DateTime ()
72                 {
73                         DateTime value = new DateTime (2004, 8, 24);
74
75                         SqlParameter p = new SqlParameter ("address", value);
76                         Assert.AreEqual (DbType.DateTime, p.DbType, "B:DbType");
77                         Assert.AreEqual (ParameterDirection.Input, p.Direction, "B:Direction");
78                         Assert.IsFalse (p.IsNullable, "B:IsNullable");
79                         Assert.AreEqual (0, p.LocaleId, "B:LocaleId");
80                         Assert.AreEqual ("address", p.ParameterName, "B:ParameterName");
81                         Assert.AreEqual (0, p.Precision, "B:Precision");
82                         Assert.AreEqual (0, p.Scale, "B:Scale");
83                         //Assert.AreEqual (0, p.Size, "B:Size");
84                         Assert.AreEqual (string.Empty, p.SourceColumn, "B:SourceColumn");
85                         Assert.IsFalse (p.SourceColumnNullMapping, "B:SourceColumnNullMapping");
86                         Assert.AreEqual (DataRowVersion.Current, p.SourceVersion, "B:SourceVersion");
87                         Assert.AreEqual (SqlDbType.DateTime, p.SqlDbType, "B:SqlDbType");
88                         // FIXME
89                         //Assert.AreEqual (new SqlDateTime (value), p.SqlValue, "B:SqlValue");
90                         Assert.AreEqual (value, p.Value, "B:Value");
91                         Assert.AreEqual (string.Empty, p.XmlSchemaCollectionDatabase, "B:XmlSchemaCollectionDatabase");
92                         Assert.AreEqual (string.Empty, p.XmlSchemaCollectionName, "B:XmlSchemaCollectionName");
93                         Assert.AreEqual (string.Empty, p.XmlSchemaCollectionOwningSchema, "B:XmlSchemaCollectionOwningSchema");
94                 }
95
96                 [Test]
97                 public void Constructor2_Value_DBNull ()
98                 {
99                         SqlParameter p = new SqlParameter ("address", DBNull.Value);
100                         Assert.AreEqual (DbType.String, p.DbType, "B:DbType");
101                         Assert.AreEqual (ParameterDirection.Input, p.Direction, "B:Direction");
102                         Assert.IsFalse (p.IsNullable, "B:IsNullable");
103                         Assert.AreEqual (0, p.LocaleId, "B:LocaleId");
104                         Assert.AreEqual ("address", p.ParameterName, "B:ParameterName");
105                         Assert.AreEqual (0, p.Precision, "B:Precision");
106                         Assert.AreEqual (0, p.Scale, "B:Scale");
107                         Assert.AreEqual (0, p.Size, "B:Size");
108                         Assert.AreEqual (string.Empty, p.SourceColumn, "B:SourceColumn");
109                         Assert.IsFalse (p.SourceColumnNullMapping, "B:SourceColumnNullMapping");
110                         Assert.AreEqual (DataRowVersion.Current, p.SourceVersion, "B:SourceVersion");
111                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "B:SqlDbType");
112                         // FIXME
113                         //Assert.AreEqual (SqlString.Null, p.SqlValue, "B:SqlValue");
114                         Assert.AreEqual (DBNull.Value, p.Value, "B:Value");
115                         Assert.AreEqual (string.Empty, p.XmlSchemaCollectionDatabase, "B:XmlSchemaCollectionDatabase");
116                         Assert.AreEqual (string.Empty, p.XmlSchemaCollectionName, "B:XmlSchemaCollectionName");
117                         Assert.AreEqual (string.Empty, p.XmlSchemaCollectionOwningSchema, "B:XmlSchemaCollectionOwningSchema");
118                 }
119
120                 [Test]
121                 public void Constructor2_Value_Null ()
122                 {
123                         SqlParameter p = new SqlParameter ("address", (Object) null);
124                         Assert.AreEqual (DbType.String, p.DbType, "A:DbType");
125                         Assert.AreEqual (ParameterDirection.Input, p.Direction, "A:Direction");
126                         Assert.IsFalse (p.IsNullable, "A:IsNullable");
127                         Assert.AreEqual (0, p.LocaleId, "A:LocaleId");
128                         Assert.AreEqual ("address", p.ParameterName, "A:ParameterName");
129                         Assert.AreEqual (0, p.Precision, "A:Precision");
130                         Assert.AreEqual (0, p.Scale, "A:Scale");
131                         Assert.AreEqual (0, p.Size, "A:Size");
132                         Assert.AreEqual (string.Empty, p.SourceColumn, "A:SourceColumn");
133                         Assert.IsFalse (p.SourceColumnNullMapping, "A:SourceColumnNullMapping");
134                         Assert.AreEqual (DataRowVersion.Current, p.SourceVersion, "A:SourceVersion");
135                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "A:SqlDbType");
136                         Assert.IsNull (p.SqlValue, "A:SqlValue");
137                         Assert.IsNull (p.Value, "A:Value");
138                         Assert.AreEqual (string.Empty, p.XmlSchemaCollectionDatabase, "A:XmlSchemaCollectionDatabase");
139                         Assert.AreEqual (string.Empty, p.XmlSchemaCollectionName, "A:XmlSchemaCollectionName");
140                         Assert.AreEqual (string.Empty, p.XmlSchemaCollectionOwningSchema, "A:XmlSchemaCollectionOwningSchema");
141                 }
142
143                 [Test] // .ctor (String, SqlDbType, Int32, ParameterDirection, Byte, Byte, String, DataRowVersion, Boolean, Object, String, String, String)
144                 public void Constructor7 ()
145                 {
146                         SqlParameter p1 = new SqlParameter ("p1Name", SqlDbType.VarChar, 20,
147                                                             ParameterDirection.InputOutput, 0, 0,
148                                                             "srcCol", DataRowVersion.Original, false,
149                                                             "foo", "database", "schema", "name");
150                         Assert.AreEqual (DbType.AnsiString, p1.DbType, "DbType");
151                         Assert.AreEqual (ParameterDirection.InputOutput, p1.Direction, "Direction");
152                         Assert.AreEqual (false, p1.IsNullable, "IsNullable");
153                         //Assert.AreEqual (999, p1.LocaleId, "#");
154                         Assert.AreEqual ("p1Name", p1.ParameterName, "ParameterName");
155                         Assert.AreEqual (0, p1.Precision, "Precision");
156                         Assert.AreEqual (0, p1.Scale, "Scale");
157                         Assert.AreEqual (20, p1.Size, "Size");
158                         Assert.AreEqual ("srcCol", p1.SourceColumn, "SourceColumn");
159                         Assert.AreEqual (false, p1.SourceColumnNullMapping, "SourceColumnNullMapping");
160                         Assert.AreEqual (DataRowVersion.Original, p1.SourceVersion, "SourceVersion");
161                         Assert.AreEqual (SqlDbType.VarChar, p1.SqlDbType, "SqlDbType");
162                         //Assert.AreEqual (3210, p1.SqlValue, "#");
163                         Assert.AreEqual ("foo", p1.Value, "Value");
164                         Assert.AreEqual ("database", p1.XmlSchemaCollectionDatabase, "XmlSchemaCollectionDatabase");
165                         Assert.AreEqual ("name", p1.XmlSchemaCollectionName, "XmlSchemaCollectionName");
166                         Assert.AreEqual ("schema", p1.XmlSchemaCollectionOwningSchema, "XmlSchemaCollectionOwningSchema");
167                 }
168
169                 [Test]
170                 public void CompareInfo ()
171                 {
172                         SqlParameter parameter = new SqlParameter ();
173                         Assert.AreEqual (SqlCompareOptions.None, parameter.CompareInfo, "#1");
174                         parameter.CompareInfo = SqlCompareOptions.IgnoreNonSpace;
175                         Assert.AreEqual (SqlCompareOptions.IgnoreNonSpace, parameter.CompareInfo, "#2");
176                 }
177
178                 [Test]
179                 public void InferType_Byte ()
180                 {
181                         Byte value = 0x0a;
182
183                         SqlParameter param = new SqlParameter ();
184                         param.Value = value;
185                         Assert.AreEqual (SqlDbType.TinyInt, param.SqlDbType, "#1");
186                         Assert.AreEqual (DbType.Byte, param.DbType, "#2");
187                 }
188
189                 [Test]
190                 public void InferType_ByteArray ()
191                 {
192                         Byte [] value = new Byte [] { 0x0a, 0x0d };
193
194                         SqlParameter param = new SqlParameter ();
195                         param.Value = value;
196                         Assert.AreEqual (SqlDbType.VarBinary, param.SqlDbType, "#1");
197                         Assert.AreEqual (DbType.Binary, param.DbType, "#2");
198                 }
199
200                 [Test]
201                 [Category ("NotWorking")]
202                 public void InferType_Char ()
203                 {
204                         Char value = 'X';
205
206                         String string_value = "X";
207
208                         SqlParameter p = new SqlParameter ();
209                         p.Value = value;
210                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#A:SqlDbType");
211                         Assert.AreEqual (DbType.String, p.DbType, "#A:DbType");
212                         Assert.AreEqual (string_value, p.Value, "#A:Value");
213
214                         p = new SqlParameter ();
215                         p.Value = value;
216                         Assert.AreEqual (value, p.Value, "#B:Value1");
217                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#B:SqlDbType");
218                         Assert.AreEqual (string_value, p.Value, "#B:Value2");
219
220                         p = new SqlParameter ();
221                         p.Value = value;
222                         Assert.AreEqual (value, p.Value, "#C:Value1");
223                         Assert.AreEqual (DbType.String, p.DbType, "#C:DbType");
224                         Assert.AreEqual (string_value, p.Value, "#C:Value2");
225
226                         p = new SqlParameter ("name", value);
227                         Assert.AreEqual (value, p.Value, "#D:Value1");
228                         Assert.AreEqual (DbType.String, p.DbType, "#D:DbType");
229                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#D:SqlDbType");
230                         Assert.AreEqual (string_value, p.Value, "#D:Value2");
231
232                         p = new SqlParameter ("name", 5);
233                         p.Value = value;
234                         Assert.AreEqual (value, p.Value, "#E:Value1");
235                         Assert.AreEqual (DbType.String, p.DbType, "#E:DbType");
236                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#E:SqlDbType");
237                         Assert.AreEqual (string_value, p.Value, "#E:Value2");
238
239                         p = new SqlParameter ("name", SqlDbType.NVarChar);
240                         p.Value = value;
241                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#F:SqlDbType");
242                         Assert.AreEqual (value, p.Value, "#F:Value");
243                 }
244
245                 [Test]
246                 [Category ("NotWorking")]
247                 public void InferType_CharArray ()
248                 {
249                         Char [] value = new Char [] { 'A', 'X' };
250
251                         String string_value = "AX";
252
253                         SqlParameter p = new SqlParameter ();
254                         p.Value = value;
255                         Assert.AreEqual (value, p.Value, "#A:Value1");
256                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#A:SqlDbType");
257                         Assert.AreEqual (DbType.String, p.DbType, "#A:DbType");
258                         Assert.AreEqual (string_value, p.Value, "#A:Value2");
259
260                         p = new SqlParameter ();
261                         p.Value = value;
262                         Assert.AreEqual (value, p.Value, "#B:Value1");
263                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#B:SqlDbType");
264                         Assert.AreEqual (string_value, p.Value, "#B:Value2");
265
266                         p = new SqlParameter ();
267                         p.Value = value;
268                         Assert.AreEqual (value, p.Value, "#C:Value1");
269                         Assert.AreEqual (DbType.String, p.DbType, "#C:DbType");
270                         Assert.AreEqual (string_value, p.Value, "#C:Value2");
271
272                         p = new SqlParameter ("name", value);
273                         Assert.AreEqual (value, p.Value, "#D:Value1");
274                         Assert.AreEqual (DbType.String, p.DbType, "#D:DbType");
275                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#D:SqlDbType");
276                         Assert.AreEqual (string_value, p.Value, "#D:Value2");
277
278                         p = new SqlParameter ("name", 5);
279                         p.Value = value;
280                         Assert.AreEqual (value, p.Value, "#E:Value1");
281                         Assert.AreEqual (DbType.String, p.DbType, "#E:DbType");
282                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#E:SqlDbType");
283                         Assert.AreEqual (string_value, p.Value, "#E:Value2");
284
285                         p = new SqlParameter ("name", SqlDbType.NVarChar);
286                         p.Value = value;
287                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#F:SqlDbType");
288                         Assert.AreEqual (value, p.Value, "#F:Value");
289                 }
290
291                 [Test]
292                 public void InferType_DateTime ()
293                 {
294                         DateTime value;
295                         SqlParameter param;
296
297                         value = DateTime.Now;
298                         param = new SqlParameter ();
299                         param.Value = value;
300                         Assert.AreEqual (SqlDbType.DateTime, param.SqlDbType, "#A1");
301                         Assert.AreEqual (DbType.DateTime, param.DbType, "#A2");
302
303                         value = DateTime.Now;
304                         param = new SqlParameter ();
305                         param.Value = value;
306                         Assert.AreEqual (SqlDbType.DateTime, param.SqlDbType, "#B1");
307                         Assert.AreEqual (DbType.DateTime, param.DbType, "#B2");
308
309                         value = new DateTime (1973, 8, 13);
310                         param = new SqlParameter ();
311                         param.Value = value;
312                         Assert.AreEqual (SqlDbType.DateTime, param.SqlDbType, "#C1");
313                         Assert.AreEqual (DbType.DateTime, param.DbType, "#C2");
314                 }
315
316                 [Test]
317                 public void InferType_Decimal ()
318                 {
319                         Decimal value;
320                         SqlParameter param;
321                         
322                         value = Decimal.MaxValue;
323                         param = new SqlParameter ();
324                         param.Value = value;
325                         Assert.AreEqual (SqlDbType.Decimal, param.SqlDbType, "#A1");
326                         Assert.AreEqual (DbType.Decimal, param.DbType, "#A2");
327
328                         value = Decimal.MinValue;
329                         param = new SqlParameter ();
330                         param.Value = value;
331                         Assert.AreEqual (SqlDbType.Decimal, param.SqlDbType, "#B1");
332                         Assert.AreEqual (DbType.Decimal, param.DbType, "#B2");
333
334                         value = 214748.364m;
335                         param = new SqlParameter ();
336                         param.Value = value;
337                         Assert.AreEqual (SqlDbType.Decimal, param.SqlDbType, "#C1");
338                         Assert.AreEqual (DbType.Decimal, param.DbType, "#C2");
339                 }
340
341                 [Test]
342                 public void InferType_Double ()
343                 {
344                         Double value;
345                         SqlParameter param;
346                         
347                         value = Double.MaxValue;
348                         param = new SqlParameter ();
349                         param.Value = value;
350                         Assert.AreEqual (SqlDbType.Float, param.SqlDbType, "#A1");
351                         Assert.AreEqual (DbType.Double, param.DbType, "#A2");
352
353                         value = Double.MinValue;
354                         param = new SqlParameter ();
355                         param.Value = value;
356                         Assert.AreEqual (SqlDbType.Float, param.SqlDbType, "#B1");
357                         Assert.AreEqual (DbType.Double, param.DbType, "#B2");
358
359                         value = 0d;
360                         param = new SqlParameter ();
361                         param.Value = value;
362                         Assert.AreEqual (SqlDbType.Float, param.SqlDbType, "#C1");
363                         Assert.AreEqual (DbType.Double, param.DbType, "#C2");
364                 }
365
366                 [Test]
367                 public void InferType_Enum ()
368                 {
369                         SqlParameter param;
370
371                         param = new SqlParameter ();
372                         param.Value = ByteEnum.A;
373                         Assert.AreEqual (SqlDbType.TinyInt, param.SqlDbType, "#A1");
374                         Assert.AreEqual (DbType.Byte, param.DbType, "#A2");
375
376                         param = new SqlParameter ();
377                         param.Value = Int64Enum.A;
378                         Assert.AreEqual (SqlDbType.BigInt, param.SqlDbType, "#B1");
379                         Assert.AreEqual (DbType.Int64, param.DbType, "#B2");
380                 }
381
382                 [Test]
383                 public void InferType_Guid ()
384                 {
385                         Guid value = Guid.NewGuid ();
386
387                         SqlParameter param = new SqlParameter ();
388                         param.Value = value;
389                         Assert.AreEqual (SqlDbType.UniqueIdentifier, param.SqlDbType, "#1");
390                         Assert.AreEqual (DbType.Guid, param.DbType, "#2");
391                 }
392
393                 [Test]
394                 public void InferType_Int16 ()
395                 {
396                         Int16 value;
397                         SqlParameter param;
398                         
399                         value = Int16.MaxValue;
400                         param = new SqlParameter ();
401                         param.Value = value;
402                         Assert.AreEqual (SqlDbType.SmallInt, param.SqlDbType, "#A1");
403                         Assert.AreEqual (DbType.Int16, param.DbType, "#A2");
404
405                         value = Int16.MinValue;
406                         param = new SqlParameter ();
407                         param.Value = value;
408                         Assert.AreEqual (SqlDbType.SmallInt, param.SqlDbType, "#B1");
409                         Assert.AreEqual (DbType.Int16, param.DbType, "#B2");
410
411                         value = (Int16) 0;
412                         param = new SqlParameter ();
413                         param.Value = value;
414                         Assert.AreEqual (SqlDbType.SmallInt, param.SqlDbType, "#C1");
415                         Assert.AreEqual (DbType.Int16, param.DbType, "#C2");
416                 }
417
418                 [Test]
419                 public void InferType_Int32 ()
420                 {
421                         Int32 value;
422                         SqlParameter param;
423                         
424                         value = Int32.MaxValue;
425                         param = new SqlParameter ();
426                         param.Value = value;
427                         Assert.AreEqual (SqlDbType.Int, param.SqlDbType, "#A1");
428                         Assert.AreEqual (DbType.Int32, param.DbType, "#A2");
429
430                         value = Int32.MinValue;
431                         param = new SqlParameter ();
432                         param.Value = value;
433                         Assert.AreEqual (SqlDbType.Int, param.SqlDbType, "#B1");
434                         Assert.AreEqual (DbType.Int32, param.DbType, "#B2");
435
436                         value = 0;
437                         param = new SqlParameter ();
438                         param.Value = value;
439                         Assert.AreEqual (SqlDbType.Int, param.SqlDbType, "#C1");
440                         Assert.AreEqual (DbType.Int32, param.DbType, "#C2");
441                 }
442
443                 [Test]
444                 public void InferType_Int64 ()
445                 {
446                         Int64 value;
447                         SqlParameter param;
448                         
449                         value = Int64.MaxValue;
450                         param = new SqlParameter ();
451                         param.Value = value;
452                         Assert.AreEqual (SqlDbType.BigInt, param.SqlDbType, "#A1");
453                         Assert.AreEqual (DbType.Int64, param.DbType, "#A2");
454
455                         value = Int64.MinValue;
456                         param = new SqlParameter ();
457                         param.Value = value;
458                         Assert.AreEqual (SqlDbType.BigInt, param.SqlDbType, "#B1");
459                         Assert.AreEqual (DbType.Int64, param.DbType, "#B2");
460
461                         value = 0L;
462                         param = new SqlParameter ();
463                         param.Value = value;
464                         Assert.AreEqual (SqlDbType.BigInt, param.SqlDbType, "#C1");
465                         Assert.AreEqual (DbType.Int64, param.DbType, "#C2");
466                 }
467
468                 [Test]
469                 [Category ("NotWorking")]
470                 public void InferType_Invalid ()
471                 {
472                         object [] notsupported = new object [] {
473                                 UInt16.MaxValue,
474                                 UInt32.MaxValue,
475                                 UInt64.MaxValue,
476                                 SByte.MaxValue,
477                                 new SqlParameter ()
478                         };
479
480                         SqlParameter param = new SqlParameter ();
481
482                         for (int i = 0; i < notsupported.Length; i++) {
483                                 param.Value = notsupported [i];
484                                 try {
485                                         SqlDbType type = param.SqlDbType;
486                                         Assert.Fail ("#A1:" + i + " (" + type + ")");
487                                 } catch (ArgumentException ex) {
488                                         // The parameter data type of ... is invalid
489                                         Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
490                                         Assert.IsNull (ex.InnerException, "#A3");
491                                         Assert.IsNotNull (ex.Message, "#A4");
492                                         Assert.IsNull (ex.ParamName, "#A5");
493                                 }
494
495                                 try {
496                                         DbType type = param.DbType;
497                                         Assert.Fail ("#B1:" + i + " (" + type + ")");
498                                 } catch (ArgumentException ex) {
499                                         // The parameter data type of ... is invalid
500                                         Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
501                                         Assert.IsNull (ex.InnerException, "#B3");
502                                         Assert.IsNotNull (ex.Message, "#B4");
503                                         Assert.IsNull (ex.ParamName, "#B5");
504                                 }
505                         }
506                 }
507
508                 [Test]
509                 public void InferType_Object ()
510                 {
511                         Object value = new Object ();
512
513                         SqlParameter param = new SqlParameter ();
514                         param.Value = value;
515                         Assert.AreEqual (SqlDbType.Variant, param.SqlDbType, "#1");
516                         Assert.AreEqual (DbType.Object, param.DbType, "#2");
517                 }
518
519                 [Test]
520                 public void InferType_Single ()
521                 {
522                         Single value = Single.MaxValue;
523
524                         SqlParameter param = new SqlParameter ();
525                         param.Value = value;
526                         Assert.AreEqual (SqlDbType.Real, param.SqlDbType, "#1");
527                         Assert.AreEqual (DbType.Single, param.DbType, "#2");
528                 }
529
530                 [Test]
531                 public void InferType_String ()
532                 {
533                         String value = "some text";
534
535                         SqlParameter param = new SqlParameter ();
536                         param.Value = value;
537                         Assert.AreEqual (SqlDbType.NVarChar, param.SqlDbType, "#1");
538                         Assert.AreEqual (DbType.String, param.DbType, "#2");
539                 }
540
541                 [Test]
542                 [Category ("NotWorking")]
543                 public void InferType_TimeSpan ()
544                 {
545                         TimeSpan value = new TimeSpan (4, 6, 23);
546
547                         SqlParameter param = new SqlParameter ();
548                         param.Value = value;
549                         Assert.AreEqual (SqlDbType.Time, param.SqlDbType, "#1");
550                         Assert.AreEqual (DbType.Time, param.DbType, "#2");
551                 }
552
553                 [Test]
554                 public void LocaleId ()
555                 {
556                         SqlParameter parameter = new SqlParameter ();
557                         Assert.AreEqual (0, parameter.LocaleId, "#1");
558                         parameter.LocaleId = 15;
559                         Assert.AreEqual(15, parameter.LocaleId, "#2");
560                 }
561
562                 [Test] // bug #320196
563                 public void ParameterNullTest ()
564                 {
565                         SqlParameter param = new SqlParameter ("param", SqlDbType.Decimal);
566                         Assert.AreEqual (0, param.Scale, "#A1");
567                         param.Value = DBNull.Value;
568                         Assert.AreEqual (0, param.Scale, "#A2");
569
570                         param = new SqlParameter ("param", SqlDbType.Int);
571                         Assert.AreEqual (0, param.Scale, "#B1");
572                         param.Value = DBNull.Value;
573                         Assert.AreEqual (0, param.Scale, "#B2");
574                 }
575
576                 [Test]
577                 public void ParameterType ()
578                 {
579                         SqlParameter p;
580
581                         // If Type is not set, then type is inferred from the value
582                         // assigned. The Type should be inferred everytime Value is assigned
583                         // If value is null or DBNull, then the current Type should be reset to NVarChar.
584                         p = new SqlParameter ();
585                         Assert.AreEqual (DbType.String, p.DbType, "#A1");
586                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#A2");
587                         p.Value = DBNull.Value;
588                         Assert.AreEqual (DbType.String, p.DbType, "#B1");
589                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#B2");
590                         p.Value = 1;
591                         Assert.AreEqual (DbType.Int32, p.DbType, "#C1");
592                         Assert.AreEqual (SqlDbType.Int, p.SqlDbType, "#C2");
593                         p.Value = DBNull.Value;
594                         Assert.AreEqual (DbType.String, p.DbType, "#D1");
595                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#D2");
596                         p.Value = new byte [] { 0x0a };
597                         Assert.AreEqual (DbType.Binary, p.DbType, "#E1");
598                         Assert.AreEqual (SqlDbType.VarBinary, p.SqlDbType, "#E2");
599                         p.Value = null;
600                         Assert.AreEqual (DbType.String, p.DbType, "#F1");
601                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#F2");
602                         p.Value = DateTime.Now;
603                         Assert.AreEqual (DbType.DateTime, p.DbType, "#G1");
604                         Assert.AreEqual (SqlDbType.DateTime, p.SqlDbType, "#G2");
605                         p.Value = null;
606                         Assert.AreEqual (DbType.String, p.DbType, "#H1");
607                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#H2");
608
609                         // If DbType is set, then the SqlDbType should not be
610                         // inferred from the value assigned.
611                         p = new SqlParameter ();
612                         p.DbType = DbType.DateTime;
613                         Assert.AreEqual (SqlDbType.DateTime, p.SqlDbType, "#I1");
614                         p.Value = 1;
615                         Assert.AreEqual (SqlDbType.DateTime, p.SqlDbType, "#I2");
616                         p.Value = null;
617                         Assert.AreEqual (SqlDbType.DateTime, p.SqlDbType, "#I3");
618                         p.Value = DBNull.Value;
619                         Assert.AreEqual (SqlDbType.DateTime, p.SqlDbType, "#I4");
620
621                         // If SqlDbType is set, then the DbType should not be
622                         // inferred from the value assigned.
623                         p = new SqlParameter ();
624                         p.SqlDbType = SqlDbType.VarBinary;
625                         Assert.AreEqual (SqlDbType.VarBinary, p.SqlDbType, "#J1");
626                         p.Value = 1;
627                         Assert.AreEqual (SqlDbType.VarBinary, p.SqlDbType, "#J2");
628                         p.Value = null;
629                         Assert.AreEqual (SqlDbType.VarBinary, p.SqlDbType, "#J3");
630                         p.Value = DBNull.Value;
631                         Assert.AreEqual (SqlDbType.VarBinary, p.SqlDbType, "#J4");
632                 }
633
634                 [Test]
635                 public void InferType_Boolean ()
636                 {
637                         Boolean value;
638                         SqlParameter param;
639
640                         value = false;
641                         param = new SqlParameter ();
642                         param.Value = value;
643                         Assert.AreEqual (SqlDbType.Bit, param.SqlDbType, "#A1");
644                         Assert.AreEqual (DbType.Boolean, param.DbType, "#A2");
645
646                         value = true;
647                         param = new SqlParameter ();
648                         param.Value = value;
649                         Assert.AreEqual (SqlDbType.Bit, param.SqlDbType, "#B1");
650                         Assert.AreEqual (DbType.Boolean, param.DbType, "#B2");
651                 }
652
653                 [Test]
654                 public void ParameterName ()
655                 {
656                         SqlParameter p = new SqlParameter ();
657                         p.ParameterName = "name";
658                         Assert.AreEqual ("name", p.ParameterName, "#A:ParameterName");
659                         Assert.AreEqual (string.Empty, p.SourceColumn, "#A:SourceColumn");
660
661                         p.ParameterName = null;
662                         Assert.AreEqual (string.Empty, p.ParameterName, "#B:ParameterName");
663                         Assert.AreEqual (string.Empty, p.SourceColumn, "#B:SourceColumn");
664
665                         p.ParameterName = " ";
666                         Assert.AreEqual (" ", p.ParameterName, "#C:ParameterName");
667                         Assert.AreEqual (string.Empty, p.SourceColumn, "#C:SourceColumn");
668
669                         p.ParameterName = " name ";
670                         Assert.AreEqual (" name ", p.ParameterName, "#D:ParameterName");
671                         Assert.AreEqual (string.Empty, p.SourceColumn, "#D:SourceColumn");
672
673                         p.ParameterName = string.Empty;
674                         Assert.AreEqual (string.Empty, p.ParameterName, "#E:ParameterName");
675                         Assert.AreEqual (string.Empty, p.SourceColumn, "#E:SourceColumn");
676                 }
677
678                 [Test]
679                 public void ResetDbType ()
680                 {
681                         SqlParameter p;
682
683                         //Parameter with an assigned value but no DbType specified
684                         p = new SqlParameter ("foo", 42);
685                         p.ResetDbType ();
686                         Assert.AreEqual (DbType.Int32, p.DbType, "#A:DbType");
687                         Assert.AreEqual (SqlDbType.Int, p.SqlDbType, "#A:SqlDbType");
688                         Assert.AreEqual (42, p.Value, "#A:Value");
689
690                         p.DbType = DbType.DateTime; //assigning a DbType
691                         Assert.AreEqual (DbType.DateTime, p.DbType, "#B:DbType1");
692                         Assert.AreEqual (SqlDbType.DateTime, p.SqlDbType, "#B:SqlDbType1");
693                         p.ResetDbType ();
694                         Assert.AreEqual (DbType.Int32, p.DbType, "#B:DbType2");
695                         Assert.AreEqual (SqlDbType.Int, p.SqlDbType, "#B:SqlDbtype2");
696
697                         //Parameter with an assigned SqlDbType but no specified value
698                         p = new SqlParameter ("foo", SqlDbType.Int);
699                         p.ResetDbType ();
700                         Assert.AreEqual (DbType.String, p.DbType, "#C:DbType");
701                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#C:SqlDbType");
702
703                         p.DbType = DbType.DateTime; //assigning a SqlDbType
704                         Assert.AreEqual (DbType.DateTime, p.DbType, "#D:DbType1");
705                         Assert.AreEqual (SqlDbType.DateTime, p.SqlDbType, "#D:SqlDbType1");
706                         p.ResetDbType ();
707                         Assert.AreEqual (DbType.String, p.DbType, "#D:DbType2");
708                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#D:SqlDbType2");
709
710                         p = new SqlParameter ();
711                         p.Value = DateTime.MaxValue;
712                         Assert.AreEqual (DbType.DateTime, p.DbType, "#E:DbType1");
713                         Assert.AreEqual (SqlDbType.DateTime, p.SqlDbType, "#E:SqlDbType1");
714                         p.Value = null;
715                         p.ResetDbType ();
716                         Assert.AreEqual (DbType.String, p.DbType, "#E:DbType2");
717                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#E:SqlDbType2");
718
719                         p = new SqlParameter ("foo", SqlDbType.VarChar);
720                         p.Value = DateTime.MaxValue;
721                         p.ResetDbType ();
722                         Assert.AreEqual (DbType.DateTime, p.DbType, "#F:DbType");
723                         Assert.AreEqual (SqlDbType.DateTime, p.SqlDbType, "#F:SqlDbType");
724                         Assert.AreEqual (DateTime.MaxValue, p.Value, "#F:Value");
725
726                         p = new SqlParameter ("foo", SqlDbType.VarChar);
727                         p.Value = DBNull.Value;
728                         p.ResetDbType ();
729                         Assert.AreEqual (DbType.String, p.DbType, "#G:DbType");
730                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#G:SqlDbType");
731                         Assert.AreEqual (DBNull.Value, p.Value, "#G:Value");
732
733                         p = new SqlParameter ("foo", SqlDbType.VarChar);
734                         p.Value = null;
735                         p.ResetDbType ();
736                         Assert.AreEqual (DbType.String, p.DbType, "#G:DbType");
737                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#G:SqlDbType");
738                         Assert.IsNull (p.Value, "#G:Value");
739                 }
740
741                 [Test]
742                 public void ResetSqlDbType ()
743                 {
744                         //Parameter with an assigned value but no SqlDbType specified
745                         SqlParameter p1 = new SqlParameter ("foo", 42);
746                         Assert.AreEqual (42, p1.Value, "#1");
747                         Assert.AreEqual (DbType.Int32, p1.DbType, "#2");
748                         Assert.AreEqual (SqlDbType.Int, p1.SqlDbType, "#3");
749
750                         p1.ResetSqlDbType ();
751                         Assert.AreEqual (DbType.Int32, p1.DbType, "#4 The parameter with value 42 must have DbType as Int32");
752                         Assert.AreEqual (SqlDbType.Int, p1.SqlDbType, "#5 The parameter with value 42 must have SqlDbType as Int");
753
754                         p1.SqlDbType = SqlDbType.DateTime; //assigning a SqlDbType
755                         Assert.AreEqual (DbType.DateTime, p1.DbType, "#6");
756                         Assert.AreEqual (SqlDbType.DateTime, p1.SqlDbType, "#7");
757                         p1.ResetSqlDbType (); //Resetting SqlDbType
758                         Assert.AreEqual (DbType.Int32, p1.DbType, "#8 Resetting SqlDbType must infer the type from the value");
759                         Assert.AreEqual (SqlDbType.Int, p1.SqlDbType, "#9 Resetting SqlDbType must infer the type from the value");
760
761                         //Parameter with an assigned SqlDbType but no specified value
762                         SqlParameter p2 = new SqlParameter ("foo", SqlDbType.Int);
763                         Assert.AreEqual (null, p2.Value, "#10");
764                         Assert.AreEqual (DbType.Int32, p2.DbType, "#11");
765                         Assert.AreEqual (SqlDbType.Int, p2.SqlDbType, "#12");
766
767                         //Although a SqlDbType is specified, calling ResetSqlDbType resets 
768                         //the SqlDbType and DbType properties to default values
769                         p2.ResetSqlDbType ();
770                         Assert.AreEqual (DbType.String, p2.DbType, "#13 Resetting SqlDbType must infer the type from the value");
771                         Assert.AreEqual (SqlDbType.NVarChar, p2.SqlDbType, "#14 Resetting SqlDbType must infer the type from the value");
772
773                         p2.SqlDbType = SqlDbType.DateTime; //assigning a SqlDbType
774                         Assert.AreEqual (DbType.DateTime, p2.DbType, "#15");
775                         Assert.AreEqual (SqlDbType.DateTime, p2.SqlDbType, "#16");
776                         p2.ResetSqlDbType (); //Resetting SqlDbType
777                         Assert.AreEqual (DbType.String, p2.DbType, "#17 Resetting SqlDbType must infer the type from the value");
778                         Assert.AreEqual (SqlDbType.NVarChar, p2.SqlDbType, "#18 Resetting SqlDbType must infer the type from the value");
779                 }
780
781                 [Test]
782                 public void SourceColumn ()
783                 {
784                         SqlParameter p = new SqlParameter ();
785                         p.SourceColumn = "name";
786                         Assert.AreEqual (string.Empty, p.ParameterName, "#A:ParameterName");
787                         Assert.AreEqual ("name", p.SourceColumn, "#A:SourceColumn");
788
789                         p.SourceColumn = null;
790                         Assert.AreEqual (string.Empty, p.ParameterName, "#B:ParameterName");
791                         Assert.AreEqual (string.Empty, p.SourceColumn, "#B:SourceColumn");
792
793                         p.SourceColumn = " ";
794                         Assert.AreEqual (string.Empty, p.ParameterName, "#C:ParameterName");
795                         Assert.AreEqual (" ", p.SourceColumn, "#C:SourceColumn");
796
797                         p.SourceColumn = " name ";
798                         Assert.AreEqual (string.Empty, p.ParameterName, "#D:ParameterName");
799                         Assert.AreEqual (" name ", p.SourceColumn, "#D:SourceColumn");
800
801                         p.SourceColumn = string.Empty;
802                         Assert.AreEqual (string.Empty, p.ParameterName, "#E:ParameterName");
803                         Assert.AreEqual (string.Empty, p.SourceColumn, "#E:SourceColumn");
804                 }
805
806                 [Test]
807                 public void SourceColumnNullMapping ()
808                 {
809                         SqlParameter p = new SqlParameter ();
810                         Assert.IsFalse (p.SourceColumnNullMapping, "#1");
811                         p.SourceColumnNullMapping = true;
812                         Assert.IsTrue (p.SourceColumnNullMapping, "#2");
813                         p.SourceColumnNullMapping = false;
814                         Assert.IsFalse (p.SourceColumnNullMapping, "#3");
815                 }
816
817                 [Test]
818                 public void SqlDbTypeTest ()
819                 {
820                         SqlParameter p = new SqlParameter ("zipcode", 3510);
821                         p.SqlDbType = SqlDbType.DateTime;
822                         Assert.AreEqual (DbType.DateTime, p.DbType, "#A:DbType");
823                         Assert.AreEqual (SqlDbType.DateTime, p.SqlDbType, "#A:SqlDbType");
824                         Assert.AreEqual (3510, p.Value, "#A:Value");
825                         p.SqlDbType = SqlDbType.VarChar;
826                         Assert.AreEqual (DbType.AnsiString, p.DbType, "#B:DbType");
827                         Assert.AreEqual (SqlDbType.VarChar, p.SqlDbType, "#B:SqlDbType");
828                         Assert.AreEqual (3510, p.Value, "#B:Value");
829                 }
830
831                 [Test]
832                 public void SqlDbTypeTest_Value_Invalid ()
833                 {
834                         SqlParameter p = new SqlParameter ("zipcode", 3510);
835                         try {
836                                 p.SqlDbType = (SqlDbType) 666;
837                                 Assert.Fail ("#1");
838                         } catch (ArgumentOutOfRangeException ex) {
839                                 // The SqlDbType enumeration value, 666, is
840                                 // invalid
841                                 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
842                                 Assert.IsNull (ex.InnerException, "#3");
843                                 Assert.IsNotNull (ex.Message, "#4");
844                                 Assert.IsTrue (ex.Message.IndexOf ("666") != -1, "#5:" + ex.Message);
845                                 Assert.AreEqual ("SqlDbType", ex.ParamName, "#6");
846                         }
847                 }
848
849                 [Test]
850                 public void SqlValue ()
851                 {
852                         SqlParameter parameter = new SqlParameter ();
853                         Assert.IsNull (parameter.SqlValue, "#A1");
854
855                         object value;
856
857                         value = "Char";
858                         parameter.SqlValue = value;
859                         Assert.AreEqual (SqlDbType.NVarChar, parameter.SqlDbType, "String:SqlDbType");
860                         Assert.IsNotNull (parameter.SqlValue, "String:SqlValue1");
861                         Assert.AreEqual (typeof (SqlString), parameter.SqlValue.GetType (), "String:SqlValue2");
862                         Assert.AreEqual (value, ((SqlString) parameter.SqlValue).Value, "String:SqlValue3");
863                         Assert.AreEqual (value, parameter.Value, "String:Value");
864
865                         value = true;
866                         parameter.SqlValue = value;
867                         Assert.AreEqual (SqlDbType.Bit, parameter.SqlDbType, "Boolean:SqlDbType");
868                         Assert.IsNotNull (parameter.SqlValue, "Boolean:SqlValue1");
869                         Assert.AreEqual (typeof (SqlBoolean), parameter.SqlValue.GetType (), "Boolean:SqlValue2");
870                         Assert.AreEqual (value, ((SqlBoolean) parameter.SqlValue).Value, "Boolean:SqlValue3");
871                         Assert.AreEqual (value, parameter.Value, "Boolean:Value");
872
873                         value = (byte) 0x0a;
874                         parameter.SqlValue = value;
875                         Assert.AreEqual (SqlDbType.TinyInt, parameter.SqlDbType, "Boolean:SqlDbType");
876                         Assert.IsNotNull (parameter.SqlValue, "Boolean:SqlValue1");
877                         Assert.AreEqual (typeof (SqlByte), parameter.SqlValue.GetType (), "Boolean:SqlValue2");
878                         Assert.AreEqual (value, ((SqlByte) parameter.SqlValue).Value, "Boolean:SqlValue3");
879                         Assert.AreEqual (value, parameter.Value, "Boolean:Value");
880
881                         value = new DateTime (2008, 6, 4);
882                         parameter.SqlValue = value;
883                         Assert.AreEqual (SqlDbType.DateTime, parameter.SqlDbType, "DateTime:SqlDbType");
884                         Assert.IsNotNull (parameter.SqlValue, "DateTime:SqlValue1");
885                         Assert.AreEqual (typeof (SqlDateTime), parameter.SqlValue.GetType (), "DateTime:SqlValue2");
886                         Assert.AreEqual (value, ((SqlDateTime) parameter.SqlValue).Value, "DateTime:SqlValue3");
887                         Assert.AreEqual (value, parameter.Value, "DateTime:Value");
888
889                         value = Guid.NewGuid ();
890                         parameter.SqlValue = value;
891                         Assert.AreEqual (SqlDbType.UniqueIdentifier, parameter.SqlDbType, "Guid:SqlDbType");
892                         Assert.IsNotNull (parameter.SqlValue, "Guid:SqlValue1");
893                         Assert.AreEqual (typeof (SqlGuid), parameter.SqlValue.GetType (), "Guid:SqlValue2");
894                         Assert.AreEqual (value, ((SqlGuid) parameter.SqlValue).Value, "Guid:SqlValue3");
895                         Assert.AreEqual (value, parameter.Value, "Guid:Value");
896
897                         value = (short) 5;
898                         parameter.SqlValue = value;
899                         Assert.AreEqual (SqlDbType.SmallInt, parameter.SqlDbType, "Int16:SqlDbType");
900                         Assert.IsNotNull (parameter.SqlValue, "Int16:SqlValue1");
901                         Assert.AreEqual (typeof (SqlInt16), parameter.SqlValue.GetType (), "Int16:SqlValue2");
902                         Assert.AreEqual (value, ((SqlInt16) parameter.SqlValue).Value, "Int16:SqlValue3");
903                         Assert.AreEqual (value, parameter.Value, "Int16:Value");
904
905                         value = 10;
906                         parameter.SqlValue = value;
907                         Assert.AreEqual (SqlDbType.Int, parameter.SqlDbType, "Int32:SqlDbType");
908                         Assert.IsNotNull (parameter.SqlValue, "Int32:SqlValue1");
909                         Assert.AreEqual (typeof (SqlInt32), parameter.SqlValue.GetType (), "Int32:SqlValue2");
910                         Assert.AreEqual (value, ((SqlInt32) parameter.SqlValue).Value, "Int32:SqlValue3");
911                         Assert.AreEqual (value, parameter.Value, "Int32:Value");
912
913                         value = 56L;
914                         parameter.SqlValue = value;
915                         Assert.AreEqual (SqlDbType.BigInt, parameter.SqlDbType, "Int64:SqlDbType");
916                         Assert.IsNotNull (parameter.SqlValue, "Int64:SqlValue1");
917                         Assert.AreEqual (typeof (SqlInt64), parameter.SqlValue.GetType (), "Int64:SqlValue2");
918                         Assert.AreEqual (value, ((SqlInt64) parameter.SqlValue).Value, "Int64:SqlValue3");
919                         Assert.AreEqual (value, parameter.Value, "Int64:Value");
920
921                         parameter.SqlValue = 45.5D;
922                         Assert.AreEqual (SqlDbType.Float, parameter.SqlDbType, "Double:SqlDbType");
923                         Assert.IsNotNull (parameter.SqlValue, "Double:SqlValue1");
924                         Assert.AreEqual (typeof (SqlDouble), parameter.SqlValue.GetType (), "Double:SqlValue2");
925                         Assert.AreEqual (45.5D, ((SqlDouble) parameter.SqlValue).Value, "Double:SqlValue3");
926                         Assert.AreEqual (45.5D, parameter.Value, "Double:Value");
927
928                         value = 45m;
929                         parameter.SqlValue = value;
930                         Assert.AreEqual (SqlDbType.Decimal, parameter.SqlDbType, "Decimal:SqlDbType");
931                         Assert.IsNotNull (parameter.SqlValue, "Decimal:SqlValue1");
932                         Assert.AreEqual (typeof (SqlDecimal), parameter.SqlValue.GetType (), "Decimal:SqlValue2");
933                         Assert.AreEqual (value, ((SqlDecimal) parameter.SqlValue).Value, "Decimal:SqlValue3");
934                         Assert.AreEqual (value, parameter.Value, "Decimal:Value");
935
936                         value = 45f;
937                         parameter.SqlValue = value;
938                         Assert.AreEqual (SqlDbType.Real, parameter.SqlDbType, "Decimal:SqlDbType");
939                         Assert.IsNotNull (parameter.SqlValue, "Decimal:SqlValue1");
940                         Assert.AreEqual (typeof (SqlSingle), parameter.SqlValue.GetType (), "Decimal:SqlValue2");
941                         Assert.AreEqual (value, ((SqlSingle) parameter.SqlValue).Value, "Decimal:SqlValue3");
942                         Assert.AreEqual (value, parameter.Value, "Decimal:Value");
943
944                         value = new byte [] { 0x0d, 0x0a };
945                         parameter.SqlValue = value;
946                         Assert.AreEqual (SqlDbType.VarBinary, parameter.SqlDbType, "Bytes:SqlDbType");
947                         Assert.IsNotNull (parameter.SqlValue, "Bytes:SqlValue1");
948                         Assert.AreEqual (typeof (SqlBinary), parameter.SqlValue.GetType (), "Bytes:SqlValue2");
949                         Assert.AreEqual (value, ((SqlBinary) parameter.SqlValue).Value, "Bytes:SqlValue3");
950                         Assert.AreEqual (value, parameter.Value, "Bytes:Value");
951
952                         parameter = new SqlParameter ();
953                         value = 'X';
954                         parameter.SqlValue = value;
955                         Assert.AreEqual (SqlDbType.NVarChar, parameter.SqlDbType, "Chars:SqlDbType");
956                         Assert.IsNotNull (parameter.SqlValue, "Chars:SqlValue1");
957                         Assert.AreEqual (typeof (SqlString), parameter.SqlValue.GetType (), "Chars:SqlValue2");
958                         Assert.AreEqual ("X", ((SqlString) parameter.SqlValue).Value, "Chars:SqlValue3");
959                         // FIXME bug #525321
960                         //Assert.AreEqual ("X", parameter.Value, "Chars:Value");
961
962                         value = new char [] { 'X', 'A' };
963                         parameter.SqlValue = value;
964                         Assert.AreEqual (SqlDbType.NVarChar, parameter.SqlDbType, "Chars:SqlDbType");
965                         Assert.IsNotNull (parameter.SqlValue, "Chars:SqlValue1");
966                         Assert.AreEqual (typeof (SqlString), parameter.SqlValue.GetType (), "Chars:SqlValue2");
967                         Assert.AreEqual ("XA", ((SqlString) parameter.SqlValue).Value, "Chars:SqlValue3");
968                         // FIXME bug #525321
969                         //Assert.AreEqual ("XA", parameter.Value, "Chars:Value");
970                 }
971
972                 [Test]
973                 public void SqlTypes_SqlBinary ()
974                 {
975                         SqlParameter parameter;
976                         SqlBinary value = new SqlBinary (new byte [] { 0x0d, 0x0a });
977
978                         parameter = new SqlParameter ();
979                         parameter.SqlValue = value;
980                         Assert.AreEqual (SqlDbType.VarBinary, parameter.SqlDbType, "#A:SqlDbType");
981                         Assert.AreEqual (value, parameter.SqlValue, "#A:SqlValue");
982                         Assert.AreEqual (value, parameter.Value, "#A:Value");
983
984                         parameter = new SqlParameter ();
985                         parameter.SqlValue = SqlBinary.Null;
986                         Assert.AreEqual (SqlDbType.VarBinary, parameter.SqlDbType, "#B:SqlDbType");
987                         Assert.AreEqual (SqlBinary.Null, parameter.SqlValue, "#B:SqlValue");
988                         Assert.AreEqual (SqlBinary.Null, parameter.Value, "#B:Value");
989
990                         parameter = new SqlParameter ();
991                         parameter.Value = value;
992                         Assert.AreEqual (SqlDbType.VarBinary, parameter.SqlDbType, "#C:SqlDbType");
993                         Assert.AreEqual (value, parameter.SqlValue, "#C:SqlValue");
994                         Assert.AreEqual (value, parameter.Value, "#C:Value");
995                 }
996
997                 [Test]
998                 public void SqlTypes_SqlBoolean ()
999                 {
1000                         SqlParameter parameter;
1001                         SqlBoolean value = new SqlBoolean (false);
1002
1003                         parameter = new SqlParameter ();
1004                         parameter.SqlValue = value;
1005                         Assert.AreEqual (SqlDbType.Bit, parameter.SqlDbType, "#A:SqlDbType");
1006                         Assert.AreEqual (value, parameter.SqlValue, "#A:SqlValue");
1007                         Assert.AreEqual (value, parameter.Value, "#A:Value");
1008
1009                         parameter = new SqlParameter ();
1010                         parameter.SqlValue = SqlBoolean.Null;
1011                         Assert.AreEqual (SqlDbType.Bit, parameter.SqlDbType, "#B:SqlDbType");
1012                         Assert.AreEqual (SqlBoolean.Null, parameter.SqlValue, "#B:SqlValue");
1013                         Assert.AreEqual (SqlBoolean.Null, parameter.Value, "#B:Value");
1014
1015                         parameter = new SqlParameter ();
1016                         parameter.Value = value;
1017                         Assert.AreEqual (SqlDbType.Bit, parameter.SqlDbType, "#C:SqlDbType");
1018                         Assert.AreEqual (value, parameter.SqlValue, "#C:SqlValue");
1019                         Assert.AreEqual (value, parameter.Value, "#C:Value");
1020                 }
1021
1022                 [Test]
1023                 public void SqlTypes_SqlByte ()
1024                 {
1025                         SqlParameter parameter;
1026                         SqlByte value = new SqlByte (0x0d);
1027
1028                         parameter = new SqlParameter ();
1029                         parameter.SqlValue = value;
1030                         Assert.AreEqual (SqlDbType.TinyInt, parameter.SqlDbType, "#A:SqlDbType");
1031                         Assert.AreEqual (value, parameter.SqlValue, "#A:SqlValue");
1032                         Assert.AreEqual (value, parameter.Value, "#A:Value");
1033
1034                         parameter = new SqlParameter ();
1035                         parameter.SqlValue = SqlByte.Null;
1036                         Assert.AreEqual (SqlDbType.TinyInt, parameter.SqlDbType, "#B:SqlDbType");
1037                         Assert.AreEqual (SqlByte.Null, parameter.SqlValue, "#B:SqlValue");
1038                         Assert.AreEqual (SqlByte.Null, parameter.Value, "#B:Value");
1039
1040                         parameter = new SqlParameter ();
1041                         parameter.Value = value;
1042                         Assert.AreEqual (SqlDbType.TinyInt, parameter.SqlDbType, "#C:SqlDbType");
1043                         Assert.AreEqual (value, parameter.SqlValue, "#C:SqlValue");
1044                         Assert.AreEqual (value, parameter.Value, "#C:Value");
1045                 }
1046
1047                 [Test]
1048                 [Category ("NotWorking")]
1049                 // This doesn't work as SqlBytes are represented as SqlBinary
1050                 public void SqlTypes_SqlBytes ()
1051                 {
1052                         SqlParameter parameter;
1053                         SqlBytes value = new SqlBytes (new byte [] { 0x0d, 0x0a });
1054
1055                         parameter = new SqlParameter ();
1056                         parameter.SqlValue = value;
1057                         Assert.AreEqual (SqlDbType.VarBinary, parameter.SqlDbType, "#A:SqlDbType");
1058                         Assert.AreSame (value, parameter.SqlValue, "#A:SqlValue");
1059                         Assert.AreSame (value, parameter.Value, "#A:Value");
1060
1061                         parameter = new SqlParameter ();
1062                         parameter.SqlValue = SqlBytes.Null;
1063                         Assert.AreEqual (SqlDbType.VarBinary, parameter.SqlDbType, "#B:SqlDbType");
1064                         Assert.IsNotNull (parameter.SqlValue, "#B:SqlValue1");
1065                         Assert.AreEqual (typeof (SqlBytes), parameter.SqlValue.GetType (), "#B:SqlValue2");
1066                         Assert.IsTrue (((SqlBytes) parameter.SqlValue).IsNull, "#B:SqlValue3");
1067                         Assert.IsNotNull (parameter.Value, "#B:Value1");
1068                         Assert.AreEqual (typeof (SqlBytes), parameter.Value.GetType (), "#B:Value2");
1069                         Assert.IsTrue (((SqlBytes) parameter.Value).IsNull, "#B:Value3");
1070
1071                         parameter = new SqlParameter ();
1072                         parameter.Value = value;
1073                         Assert.AreEqual (SqlDbType.VarBinary, parameter.SqlDbType, "#C:SqlDbType");
1074                         Assert.AreEqual (value, parameter.SqlValue, "#C:SqlValue");
1075                         Assert.AreEqual (value, parameter.Value, "#C:Value");
1076                 }
1077
1078                 [Test]
1079                 [Category ("NotWorking")]
1080                 // This doesn't work as SqlChars are represented as SqlString
1081                 public void SqlTypes_SqlChars ()
1082                 {
1083                         SqlParameter parameter;
1084                         SqlChars value = new SqlChars (new char [] { 'X', 'A' });
1085
1086                         parameter = new SqlParameter ();
1087                         parameter.SqlValue = value;
1088                         Assert.AreEqual (SqlDbType.NVarChar, parameter.SqlDbType, "#A:SqlDbType");
1089                         Assert.AreSame (value, parameter.SqlValue, "#A:SqlValue");
1090                         Assert.AreSame (value, parameter.Value, "#A:Value");
1091
1092                         parameter = new SqlParameter ();
1093                         parameter.SqlValue = SqlChars.Null;
1094                         Assert.AreEqual (SqlDbType.NVarChar, parameter.SqlDbType, "#B:SqlDbType");
1095                         Assert.IsNotNull (parameter.SqlValue, "#B:SqlValue1");
1096                         Assert.AreEqual (typeof (SqlChars), parameter.SqlValue.GetType (), "#B:SqlValue2");
1097                         Assert.IsTrue (((SqlChars) parameter.SqlValue).IsNull, "#B:SqlValue3");
1098                         Assert.IsNotNull (parameter.Value, "#B:Value1");
1099                         Assert.AreEqual (typeof (SqlChars), parameter.Value.GetType (), "#B:Value2");
1100                         Assert.IsTrue (((SqlChars) parameter.Value).IsNull, "#B:Value3");
1101
1102                         parameter = new SqlParameter ();
1103                         parameter.Value = value;
1104                         Assert.AreEqual (SqlDbType.NVarChar, parameter.SqlDbType, "#C:SqlDbType");
1105                         Assert.AreSame (value, parameter.SqlValue, "#C:SqlValue");
1106                         Assert.AreSame (value, parameter.Value, "#C:Value");
1107                 }
1108
1109                 [Test]
1110                 public void SqlTypes_SqlDateTime ()
1111                 {
1112                         SqlParameter parameter;
1113                         SqlDateTime value = new SqlDateTime (DateTime.Now);
1114
1115                         parameter = new SqlParameter ();
1116                         parameter.SqlValue = value;
1117                         Assert.AreEqual (SqlDbType.DateTime, parameter.SqlDbType, "#A:SqlDbType");
1118                         Assert.AreEqual (value, parameter.SqlValue, "#A:SqlValue");
1119                         Assert.AreEqual (value, parameter.Value, "#A:Value");
1120
1121                         parameter = new SqlParameter ();
1122                         parameter.SqlValue = SqlDateTime.Null;
1123                         Assert.AreEqual (SqlDbType.DateTime, parameter.SqlDbType, "#B:SqlDbType");
1124                         Assert.AreEqual (SqlDateTime.Null, parameter.SqlValue, "#B:SqlValue");
1125                         Assert.AreEqual (SqlDateTime.Null, parameter.Value, "#B:Value");
1126
1127                         parameter = new SqlParameter ();
1128                         parameter.Value = value;
1129                         Assert.AreEqual (SqlDbType.DateTime, parameter.SqlDbType, "#C:SqlDbType");
1130                         Assert.AreEqual (value, parameter.SqlValue, "#C:SqlValue");
1131                         Assert.AreEqual (value, parameter.Value, "#C:Value");
1132                 }
1133
1134                 [Test]
1135                 public void SqlTypes_SqlDecimal ()
1136                 {
1137                         SqlParameter parameter;
1138                         SqlDecimal value = new SqlDecimal (45m);
1139
1140                         parameter = new SqlParameter ();
1141                         parameter.SqlValue = value;
1142                         Assert.AreEqual (SqlDbType.Decimal, parameter.SqlDbType, "#A:SqlDbType");
1143                         Assert.AreEqual (value, parameter.SqlValue, "#A:SqlValue");
1144                         Assert.AreEqual (value, parameter.Value, "#A:Value");
1145
1146                         parameter = new SqlParameter ();
1147                         parameter.SqlValue = SqlDecimal.Null;
1148                         Assert.AreEqual (SqlDbType.Decimal, parameter.SqlDbType, "#B:SqlDbType");
1149                         Assert.AreEqual (SqlDecimal.Null, parameter.SqlValue, "#B:SqlValue");
1150                         Assert.AreEqual (SqlDecimal.Null, parameter.Value, "#B:Value");
1151
1152                         parameter = new SqlParameter ();
1153                         parameter.Value = value;
1154                         Assert.AreEqual (SqlDbType.Decimal, parameter.SqlDbType, "#C:SqlDbType");
1155                         Assert.AreEqual (value, parameter.SqlValue, "#C:SqlValue");
1156                         Assert.AreEqual (value, parameter.Value, "#C:Value");
1157                 }
1158
1159                 [Test]
1160                 public void SqlTypes_SqlDouble ()
1161                 {
1162                         SqlParameter parameter;
1163                         SqlDouble value = new SqlDouble (4.5D);
1164
1165                         parameter = new SqlParameter ();
1166                         parameter.SqlValue = value;
1167                         Assert.AreEqual (SqlDbType.Float, parameter.SqlDbType, "#A:SqlDbType");
1168                         Assert.AreEqual (value, parameter.SqlValue, "#A:SqlValue");
1169                         Assert.AreEqual (value, parameter.Value, "#A:Value");
1170
1171                         parameter = new SqlParameter ();
1172                         parameter.SqlValue = SqlDouble.Null;
1173                         Assert.AreEqual (SqlDbType.Float, parameter.SqlDbType, "#B:SqlDbType");
1174                         Assert.AreEqual (SqlDouble.Null, parameter.SqlValue, "#B:SqlValue");
1175                         Assert.AreEqual (SqlDouble.Null, parameter.Value, "#B:Value");
1176
1177                         parameter = new SqlParameter ();
1178                         parameter.Value = value;
1179                         Assert.AreEqual (SqlDbType.Float, parameter.SqlDbType, "#C:SqlDbType");
1180                         Assert.AreEqual (value, parameter.SqlValue, "#C:SqlValue");
1181                         Assert.AreEqual (value, parameter.Value, "#C:Value");
1182                 }
1183
1184                 [Test]
1185                 public void SqlTypes_SqlGuid ()
1186                 {
1187                         SqlParameter parameter;
1188                         SqlGuid value = new SqlGuid (Guid.NewGuid ());
1189
1190                         parameter = new SqlParameter ();
1191                         parameter.SqlValue = value;
1192                         Assert.AreEqual (SqlDbType.UniqueIdentifier, parameter.SqlDbType, "#A:SqlDbType");
1193                         Assert.AreEqual (value, parameter.SqlValue, "#A:SqlValue");
1194                         Assert.AreEqual (value, parameter.Value, "#A:Value");
1195
1196                         parameter = new SqlParameter ();
1197                         parameter.SqlValue = SqlGuid.Null;
1198                         Assert.AreEqual (SqlDbType.UniqueIdentifier, parameter.SqlDbType, "#B:SqlDbType");
1199                         Assert.AreEqual (SqlGuid.Null, parameter.SqlValue, "#B:SqlValue");
1200                         Assert.AreEqual (SqlGuid.Null, parameter.Value, "#B:Value");
1201
1202                         parameter = new SqlParameter ();
1203                         parameter.Value = value;
1204                         Assert.AreEqual (SqlDbType.UniqueIdentifier, parameter.SqlDbType, "#C:SqlDbType");
1205                         Assert.AreEqual (value, parameter.SqlValue, "#C:SqlValue");
1206                         Assert.AreEqual (value, parameter.Value, "#C:Value");
1207                 }
1208
1209                 [Test]
1210                 public void SqlTypes_SqlInt16 ()
1211                 {
1212                         SqlParameter parameter;
1213                         SqlInt16 value = new SqlInt16 ((short) 5);
1214
1215                         parameter = new SqlParameter ();
1216                         parameter.SqlValue = value;
1217                         Assert.AreEqual (SqlDbType.SmallInt, parameter.SqlDbType, "#A:SqlDbType");
1218                         Assert.AreEqual (value, parameter.SqlValue, "#A:SqlValue");
1219                         Assert.AreEqual (value, parameter.Value, "#A:Value");
1220
1221                         parameter = new SqlParameter ();
1222                         parameter.SqlValue = SqlInt16.Null;
1223                         Assert.AreEqual (SqlDbType.SmallInt, parameter.SqlDbType, "#B:SqlDbType");
1224                         Assert.AreEqual (SqlInt16.Null, parameter.SqlValue, "#B:SqlValue");
1225                         Assert.AreEqual (SqlInt16.Null, parameter.Value, "#B:Value");
1226
1227                         parameter = new SqlParameter ();
1228                         parameter.Value = value;
1229                         Assert.AreEqual (SqlDbType.SmallInt, parameter.SqlDbType, "#C:SqlDbType");
1230                         Assert.AreEqual (value, parameter.SqlValue, "#C:SqlValue");
1231                         Assert.AreEqual (value, parameter.Value, "#C:Value");
1232                 }
1233
1234                 [Test]
1235                 public void SqlTypes_SqlInt32 ()
1236                 {
1237                         SqlParameter parameter;
1238                         SqlInt32 value = new SqlInt32 (5);
1239
1240                         parameter = new SqlParameter ();
1241                         parameter.SqlValue = value;
1242                         Assert.AreEqual (SqlDbType.Int, parameter.SqlDbType, "#A:SqlDbType");
1243                         Assert.AreEqual (value, parameter.SqlValue, "#A:SqlValue");
1244                         Assert.AreEqual (value, parameter.Value, "#A:Value");
1245
1246                         parameter = new SqlParameter ();
1247                         parameter.SqlValue = SqlInt32.Null;
1248                         Assert.AreEqual (SqlDbType.Int, parameter.SqlDbType, "#B:SqlDbType");
1249                         Assert.AreEqual (SqlInt32.Null, parameter.SqlValue, "#B:SqlValue");
1250                         Assert.AreEqual (SqlInt32.Null, parameter.Value, "#B:Value");
1251
1252                         parameter = new SqlParameter ();
1253                         parameter.Value = value;
1254                         Assert.AreEqual (SqlDbType.Int, parameter.SqlDbType, "#C:SqlDbType");
1255                         Assert.AreEqual (value, parameter.SqlValue, "#C:SqlValue");
1256                         Assert.AreEqual (value, parameter.Value, "#C:Value");
1257                 }
1258
1259                 [Test]
1260                 public void SqlTypes_SqlInt64 ()
1261                 {
1262                         SqlParameter parameter;
1263                         SqlInt64 value = new SqlInt64 (5L);
1264
1265                         parameter = new SqlParameter ();
1266                         parameter.SqlValue = value;
1267                         Assert.AreEqual (SqlDbType.BigInt, parameter.SqlDbType, "#A:SqlDbType");
1268                         Assert.AreEqual (value, parameter.SqlValue, "#A:SqlValue");
1269                         Assert.AreEqual (value, parameter.Value, "#A:Value");
1270
1271                         parameter = new SqlParameter ();
1272                         parameter.SqlValue = SqlInt64.Null;
1273                         Assert.AreEqual (SqlDbType.BigInt, parameter.SqlDbType, "#B:SqlDbType");
1274                         Assert.AreEqual (SqlInt64.Null, parameter.SqlValue, "#B:SqlValue");
1275                         Assert.AreEqual (SqlInt64.Null, parameter.Value, "#B:Value");
1276
1277                         parameter = new SqlParameter ();
1278                         parameter.Value = value;
1279                         Assert.AreEqual (SqlDbType.BigInt, parameter.SqlDbType, "#C:SqlDbType");
1280                         Assert.AreEqual (value, parameter.SqlValue, "#C:SqlValue");
1281                         Assert.AreEqual (value, parameter.Value, "#C:Value");
1282                 }
1283
1284                 [Test]
1285                 public void SqlTypes_SqlMoney ()
1286                 {
1287                         SqlParameter parameter;
1288                         SqlMoney value = new SqlMoney (45m);
1289
1290                         parameter = new SqlParameter ();
1291                         parameter.SqlValue = value;
1292                         Assert.AreEqual (SqlDbType.Money, parameter.SqlDbType, "#A:SqlDbType");
1293                         Assert.AreEqual (value, parameter.SqlValue, "#A:SqlValue");
1294                         Assert.AreEqual (value, parameter.Value, "#A:Value");
1295
1296                         parameter = new SqlParameter ();
1297                         parameter.SqlValue = SqlMoney.Null;
1298                         Assert.AreEqual (SqlDbType.Money, parameter.SqlDbType, "#B:SqlDbType");
1299                         Assert.AreEqual (SqlMoney.Null, parameter.SqlValue, "#B:SqlValue");
1300                         Assert.AreEqual (SqlMoney.Null, parameter.Value, "#B:Value");
1301
1302                         parameter = new SqlParameter ();
1303                         parameter.Value = value;
1304                         Assert.AreEqual (SqlDbType.Money, parameter.SqlDbType, "#C:SqlDbType");
1305                         Assert.AreEqual (value, parameter.SqlValue, "#C:SqlValue");
1306                         Assert.AreEqual (value, parameter.Value, "#C:Value");
1307                 }
1308
1309                 [Test]
1310                 public void SqlTypes_SqlSingle ()
1311                 {
1312                         SqlParameter parameter;
1313                         SqlSingle value = new SqlSingle (45f);
1314
1315                         parameter = new SqlParameter ();
1316                         parameter.SqlValue = value;
1317                         Assert.AreEqual (SqlDbType.Real, parameter.SqlDbType, "#A:SqlDbType");
1318                         Assert.AreEqual (value, parameter.SqlValue, "#A:SqlValue");
1319                         Assert.AreEqual (value, parameter.Value, "#A:Value");
1320
1321                         parameter = new SqlParameter ();
1322                         parameter.SqlValue = SqlSingle.Null;
1323                         Assert.AreEqual (SqlDbType.Real, parameter.SqlDbType, "#B:SqlDbType");
1324                         Assert.AreEqual (SqlSingle.Null, parameter.SqlValue, "#B:SqlValue");
1325                         Assert.AreEqual (SqlSingle.Null, parameter.Value, "#B:Value");
1326
1327                         parameter = new SqlParameter ();
1328                         parameter.Value = value;
1329                         Assert.AreEqual (SqlDbType.Real, parameter.SqlDbType, "#C:SqlDbType");
1330                         Assert.AreEqual (value, parameter.SqlValue, "#C:SqlValue");
1331                         Assert.AreEqual (value, parameter.Value, "#C:Value");
1332                 }
1333
1334                 [Test]
1335                 public void SqlTypes_SqlString ()
1336                 {
1337                         SqlParameter parameter;
1338                         SqlString value = new SqlString ("XA");
1339
1340                         parameter = new SqlParameter ();
1341                         parameter.SqlValue = value;
1342                         Assert.AreEqual (SqlDbType.NVarChar, parameter.SqlDbType, "#A:SqlDbType");
1343                         Assert.AreEqual (value, parameter.SqlValue, "#A:SqlValue");
1344                         Assert.AreEqual (value, parameter.Value, "#A:Value");
1345
1346                         parameter = new SqlParameter ();
1347                         parameter.SqlValue = SqlString.Null;
1348                         Assert.AreEqual (SqlDbType.NVarChar, parameter.SqlDbType, "#B:SqlDbType");
1349                         Assert.AreEqual (SqlString.Null, parameter.SqlValue, "#B:SqlValue");
1350                         Assert.AreEqual (SqlString.Null, parameter.Value, "#B:Value");
1351
1352                         parameter = new SqlParameter ();
1353                         parameter.Value = value;
1354                         Assert.AreEqual (SqlDbType.NVarChar, parameter.SqlDbType, "#C:SqlDbType");
1355                         Assert.AreEqual (value, parameter.SqlValue, "#C:SqlValue");
1356                         Assert.AreEqual (value, parameter.Value, "#C:Value");
1357                 }
1358
1359                 [Test]
1360                 public void SqlTypes_SqlXml ()
1361                 {
1362                         SqlParameter parameter;
1363                         SqlXml value = new SqlXml (new XmlTextReader (new StringReader ("<test>Mono</test>")));
1364
1365                         parameter = new SqlParameter ();
1366                         parameter.SqlValue = value;
1367                         Assert.AreEqual (SqlDbType.Xml, parameter.SqlDbType, "#A:SqlDbType");
1368                         Assert.AreSame (value, parameter.SqlValue, "#A:SqlValue");
1369                         Assert.AreSame (value, parameter.Value, "#A:Value");
1370
1371                         parameter = new SqlParameter ();
1372                         parameter.SqlValue = SqlXml.Null;
1373                         Assert.AreEqual (SqlDbType.Xml, parameter.SqlDbType, "#B:SqlDbType");
1374                         Assert.IsNotNull (parameter.SqlValue, "#B:SqlValue1");
1375                         Assert.AreEqual (typeof (SqlXml), parameter.SqlValue.GetType (), "#B:SqlValue2");
1376                         Assert.IsTrue (((SqlXml) parameter.SqlValue).IsNull, "#B:SqlValue3");
1377                         Assert.IsNotNull (parameter.Value, "#B:Value1");
1378                         Assert.AreEqual (typeof (SqlXml), parameter.Value.GetType (), "#B:Value2");
1379                         Assert.IsTrue (((SqlXml) parameter.Value).IsNull, "#B:Value3");
1380
1381                         parameter = new SqlParameter ();
1382                         parameter.Value = value;
1383                         Assert.AreEqual (SqlDbType.Xml, parameter.SqlDbType, "#C:SqlDbType");
1384                         Assert.AreSame (value, parameter.SqlValue, "#C:SqlValue");
1385                         Assert.AreSame (value, parameter.Value, "#C:Value");
1386                 }
1387
1388                 [Test]
1389                 public void Value ()
1390                 {
1391                         SqlParameter p;
1392
1393                         p = new SqlParameter ("name", (Object) null);
1394                         p.Value = 42;
1395                         Assert.AreEqual (DbType.Int32, p.DbType, "#A:DbType");
1396                         Assert.AreEqual (SqlDbType.Int, p.SqlDbType, "#A:SqlDbType");
1397                         Assert.AreEqual (42, p.Value, "#A:Value");
1398
1399                         p.Value = DBNull.Value;
1400                         Assert.AreEqual (DbType.String, p.DbType, "#B:DbType");
1401                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#B:SqlDbType");
1402                         Assert.AreEqual (DBNull.Value, p.Value, "#B:Value");
1403
1404                         p.Value = DateTime.MaxValue;
1405                         Assert.AreEqual (DbType.DateTime, p.DbType, "#C:DbType");
1406                         Assert.AreEqual (SqlDbType.DateTime, p.SqlDbType, "#C:SqlDbType");
1407                         Assert.AreEqual (DateTime.MaxValue, p.Value, "#C:Value");
1408
1409                         p.Value = null;
1410                         Assert.AreEqual (DbType.String, p.DbType, "#D:DbType");
1411                         Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#D:SqlDbType");
1412                         Assert.IsNull (p.Value, "#D:Value");
1413
1414                         p = new SqlParameter ("zipcode", SqlDbType.Int);
1415                         p.Value = DateTime.MaxValue;
1416                         Assert.AreEqual (DbType.Int32, p.DbType, "#E:DbType");
1417                         Assert.AreEqual (SqlDbType.Int, p.SqlDbType, "#E:SqlDbType");
1418                         Assert.AreEqual (DateTime.MaxValue, p.Value, "#E:Value");
1419
1420                         p.Value = null;
1421                         Assert.AreEqual (DbType.Int32, p.DbType, "#F:DbType");
1422                         Assert.AreEqual (SqlDbType.Int, p.SqlDbType, "#F:SqlDbType");
1423                         Assert.IsNull (p.Value, "#F:Value");
1424
1425                         p.Value = DBNull.Value;
1426                         Assert.AreEqual (DbType.Int32, p.DbType, "#G:DbType");
1427                         Assert.AreEqual (SqlDbType.Int, p.SqlDbType, "#G:SqlDbType");
1428                         Assert.AreEqual (DBNull.Value, p.Value, "#G:Value");
1429                 }
1430
1431                 [Test]
1432                 public void XmlSchemaTest ()
1433                 {
1434                         SqlParameter p1 = new SqlParameter ();
1435                         
1436                         //Testing default values
1437                         Assert.AreEqual (String.Empty, p1.XmlSchemaCollectionDatabase,
1438                                          "#1 Default value for XmlSchemaCollectionDatabase is an empty string");
1439                         Assert.AreEqual (String.Empty, p1.XmlSchemaCollectionName,
1440                                          "#2 Default value for XmlSchemaCollectionName is an empty string");
1441                         Assert.AreEqual (String.Empty, p1.XmlSchemaCollectionOwningSchema,
1442                                          "#3 Default value for XmlSchemaCollectionOwningSchema is an empty string");
1443
1444                         //Changing one property should not affect the remaining two properties
1445                         p1.XmlSchemaCollectionDatabase = "database";
1446                         Assert.AreEqual ("database", p1.XmlSchemaCollectionDatabase,
1447                                          "#4 Default value for XmlSchemaCollectionDatabase is an empty string");
1448                         Assert.AreEqual (String.Empty, p1.XmlSchemaCollectionName,
1449                                          "#5 Default value for XmlSchemaCollectionName is an empty string");
1450                         Assert.AreEqual (String.Empty, p1.XmlSchemaCollectionOwningSchema,
1451                                          "#6 Default value for XmlSchemaCollectionOwningSchema is an empty string");
1452
1453                         p1.XmlSchemaCollectionName = "name";
1454                         Assert.AreEqual ("database", p1.XmlSchemaCollectionDatabase,
1455                                          "#7 Default value for XmlSchemaCollectionDatabase is an empty string");
1456                         Assert.AreEqual ("name", p1.XmlSchemaCollectionName,
1457                                          "#8 Default value for XmlSchemaCollectionName is an empty string");
1458                         Assert.AreEqual (String.Empty, p1.XmlSchemaCollectionOwningSchema,
1459                                          "#9 Default value for XmlSchemaCollectionOwningSchema is an empty string");
1460
1461                         p1.XmlSchemaCollectionOwningSchema = "schema";
1462                         Assert.AreEqual ("database", p1.XmlSchemaCollectionDatabase,
1463                                          "#10 Default value for XmlSchemaCollectionDatabase is an empty string");
1464                         Assert.AreEqual ("name", p1.XmlSchemaCollectionName,
1465                                          "#11 Default value for XmlSchemaCollectionName is an empty string");
1466                         Assert.AreEqual ("schema", p1.XmlSchemaCollectionOwningSchema,
1467                                          "#12 Default value for XmlSchemaCollectionOwningSchema is an empty string");
1468
1469                         //assigning null value stores default empty string
1470                         p1.XmlSchemaCollectionDatabase = null;
1471                         Assert.AreEqual (String.Empty, p1.XmlSchemaCollectionDatabase,
1472                                          "#13 Default value for XmlSchemaCollectionDatabase is an empty string");
1473                         Assert.AreEqual ("name", p1.XmlSchemaCollectionName,
1474                                          "#14 Default value for XmlSchemaCollectionName is an empty string");
1475                         Assert.AreEqual ("schema", p1.XmlSchemaCollectionOwningSchema,
1476                                          "#15 Default value for XmlSchemaCollectionOwningSchema is an empty string");
1477
1478                         p1.XmlSchemaCollectionName = "";
1479                         Assert.AreEqual (String.Empty, p1.XmlSchemaCollectionDatabase,
1480                                          "#16 Default value for XmlSchemaCollectionDatabase is an empty string");
1481                         Assert.AreEqual ("", p1.XmlSchemaCollectionName,
1482                                          "#17 Default value for XmlSchemaCollectionName is an empty string");
1483                         Assert.AreEqual ("schema", p1.XmlSchemaCollectionOwningSchema,
1484                                          "#18 Default value for XmlSchemaCollectionOwningSchema is an empty string");
1485
1486                         //values are not trimmed
1487                         p1.XmlSchemaCollectionOwningSchema = "  a  ";
1488                         Assert.AreEqual (String.Empty, p1.XmlSchemaCollectionDatabase,
1489                                          "#19 Default value for XmlSchemaCollectionDatabase is an empty string");
1490                         Assert.AreEqual ("", p1.XmlSchemaCollectionName,
1491                                          "#20 Default value for XmlSchemaCollectionName is an empty string");
1492                         Assert.AreEqual ("  a  ", p1.XmlSchemaCollectionOwningSchema,
1493                                          "#21 Default value for XmlSchemaCollectionOwningSchema is an empty string");
1494                 }
1495
1496                 private enum ByteEnum : byte
1497                 {
1498                         A = 0x0a,
1499                         B = 0x0d
1500                 }
1501
1502                 private enum Int64Enum : long
1503                 {
1504                         A = long.MinValue,
1505                         B = long.MaxValue
1506                 }
1507         }
1508 }