2 // SqlDecimalTest.cs - NUnit Test Cases for System.Data.SqlTypes.SqlDecimal
\r
5 // Ville Palo (vi64pa@koti.soon.fi)
\r
6 // Martin Willemoes Hansen
\r
8 // (C) 2002 Ville Palo
\r
9 // (C) 2003 Martin Willemoes Hansen
\r
12 using NUnit.Framework;
\r
14 using System.Data.SqlTypes;
\r
15 using System.Threading;
\r
16 using System.Globalization;
\r
18 namespace MonoTests.System.Data.SqlTypes
\r
21 public class SqlDecimalTest : Assertion {
\r
23 private SqlDecimal Test1;
\r
24 private SqlDecimal Test2;
\r
25 private SqlDecimal Test3;
\r
26 private SqlDecimal Test4;
\r
29 public void GetReady()
\r
31 Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US");
\r
32 Test1 = new SqlDecimal (6464.6464m);
\r
33 Test2 = new SqlDecimal (10000.00m);
\r
34 Test3 = new SqlDecimal (10000.00m);
\r
35 Test4 = new SqlDecimal (-6m);
\r
40 public void Create()
\r
42 // SqlDecimal (decimal)
\r
43 SqlDecimal Test = new SqlDecimal (30.3098m);
\r
44 AssertEquals ("#A01", (decimal)30.3098, Test.Value);
\r
47 SqlDecimal test = new SqlDecimal (Decimal.MaxValue + 1);
\r
49 } catch (Exception e) {
\r
50 AssertEquals ("#A03", typeof (OverflowException), e.GetType ());
\r
53 // SqlDecimal (double)
\r
54 Test = new SqlDecimal (10E+10d);
\r
55 AssertEquals ("#A05", 100000000000.00000m, Test.Value);
\r
58 SqlDecimal test = new SqlDecimal (10E+200d);
\r
60 } catch (Exception e) {
\r
61 AssertEquals ("#A07", typeof (OverflowException), e.GetType ());
\r
65 Test = new SqlDecimal (-1);
\r
66 AssertEquals ("#A08", -1m, Test.Value);
\r
68 // SqlDecimal (long)
\r
69 Test = new SqlDecimal ((long)(-99999));
\r
70 AssertEquals ("#A09", -99999m, Test.Value);
\r
72 // SqlDecimal (byte, byte, bool. int[]
\r
73 Test = new SqlDecimal (10, 3, false, new int [4] {200, 1, 0, 0});
\r
74 AssertEquals ("#A10", -4294967.496m, Test.Value);
\r
77 Test = new SqlDecimal (100, 100, false,
\r
78 new int [4] {Int32.MaxValue,
\r
79 Int32.MaxValue, Int32.MaxValue,
\r
82 } catch (Exception e) {
\r
83 AssertEquals ("#A12", typeof (SqlTypeException), e.GetType ());
\r
86 // sqlDecimal (byte, byte, bool, int, int, int, int)
\r
87 Test = new SqlDecimal (12, 2, true, 100, 100, 0, 0);
\r
88 AssertEquals ("#A13", 4294967297.00m, Test.Value);
\r
91 Test = new SqlDecimal (100, 100, false,
\r
93 Int32.MaxValue, Int32.MaxValue,
\r
96 } catch (Exception e) {
\r
97 AssertEquals ("#A15", typeof (SqlTypeException), e.GetType ());
\r
101 // Test public fields
\r
103 public void PublicFields()
\r
105 AssertEquals ("#B01", (byte)38, SqlDecimal.MaxPrecision);
\r
106 AssertEquals ("#B02", (byte)38, SqlDecimal.MaxScale);
\r
108 // FIXME: on windows: Conversion overflow
\r
109 AssertEquals ("#B03a", 1262177448, SqlDecimal.MaxValue.Data [3]);
\r
112 AssertEquals ("#B04", 1262177448, SqlDecimal.MinValue.Data [3]);
\r
113 Assert ("#B05", SqlDecimal.Null.IsNull);
\r
114 Assert ("#B06", !Test1.IsNull);
\r
119 public void Properties()
\r
121 byte[] b = Test1.BinData;
\r
122 AssertEquals ("#C01", (byte)64, b [0]);
\r
124 int[] i = Test1.Data;
\r
125 AssertEquals ("#C02", 64646464, i [0]);
\r
127 Assert ("#C03", SqlDecimal.Null.IsNull);
\r
128 Assert ("#C04", Test1.IsPositive);
\r
129 Assert ("#C05", !Test4.IsPositive);
\r
130 AssertEquals ("#C06", (byte)8, Test1.Precision);
\r
131 AssertEquals ("#C07", (byte)2, Test2.Scale);
\r
132 AssertEquals ("#C08", 6464.6464m, Test1.Value);
\r
133 AssertEquals ("#C09", (byte)4, Test1.Scale);
\r
134 AssertEquals ("#C10", (byte)7, Test2.Precision);
\r
135 AssertEquals ("#C11", (byte)1, Test4.Precision);
\r
140 public void ArithmeticMethods()
\r
144 AssertEquals ("#D01", (SqlDecimal)6m, SqlDecimal.Abs (Test4));
\r
145 AssertEquals ("#D02", new SqlDecimal (6464.6464m).Value, SqlDecimal.Abs (Test1).Value);
\r
147 AssertEquals ("#D03", SqlDecimal.Null, SqlDecimal.Abs (SqlDecimal.Null));
\r
150 AssertEquals ("#D04", 16464.6464m, SqlDecimal.Add (Test1, Test2).Value);
\r
153 SqlDecimal test = SqlDecimal.Add (SqlDecimal.MaxValue, SqlDecimal.MaxValue);
\r
155 } catch (Exception e) {
\r
156 AssertEquals ("#D06", typeof (OverflowException), e.GetType ());
\r
159 AssertEquals ("#D07", (SqlDecimal)6465m, SqlDecimal.Ceiling(Test1));
\r
160 AssertEquals ("#D08", SqlDecimal.Null, SqlDecimal.Ceiling(SqlDecimal.Null));
\r
163 AssertEquals ("#D09", (SqlDecimal)(-1077.441066m), SqlDecimal.Divide (Test1, Test4));
\r
164 AssertEquals ("#D10", 1.54687501546m, SqlDecimal.Divide (Test2, Test1).Value);
\r
167 SqlDecimal test = SqlDecimal.Divide(Test1, new SqlDecimal(0)).Value;
\r
169 } catch(Exception e) {
\r
170 AssertEquals ("#D12", typeof (DivideByZeroException), e.GetType ());
\r
173 AssertEquals ("#D13", (SqlDecimal)6464m, SqlDecimal.Floor (Test1));
\r
176 AssertEquals ("#D14", 64646464.000000m, SqlDecimal.Multiply (Test1, Test2).Value);
\r
177 AssertEquals ("#D15", -38787.8784m, SqlDecimal.Multiply (Test1, Test4).Value);
\r
180 SqlDecimal test = SqlDecimal.Multiply (SqlDecimal.MaxValue, Test1);
\r
182 } catch (Exception e) {
\r
183 AssertEquals ("#D17", typeof (OverflowException), e.GetType ());
\r
187 AssertEquals ("#D18", (SqlDecimal)41791653.0770m, SqlDecimal.Power (Test1, 2));
\r
190 AssertEquals ("#D19", (SqlDecimal)6464.65m, SqlDecimal.Round (Test1, 2));
\r
193 AssertEquals ("#D20", -3535.3536m, SqlDecimal.Subtract (Test1, Test3).Value);
\r
196 SqlDecimal test = SqlDecimal.Subtract(SqlDecimal.MinValue, SqlDecimal.MaxValue);
\r
198 } catch (Exception e) {
\r
199 AssertEquals ("#D22", typeof (OverflowException), e.GetType ());
\r
202 AssertEquals ("#D23", (SqlInt32)1, SqlDecimal.Sign (Test1));
\r
203 AssertEquals ("#D24", new SqlInt32(-1), SqlDecimal.Sign (Test4));
\r
207 public void AdjustScale()
\r
209 AssertEquals ("#E01", (SqlString)"6464.646400", SqlDecimal.AdjustScale (Test1, 2, false).ToSqlString ());
\r
210 AssertEquals ("#E02", (SqlString)"6464.65", SqlDecimal.AdjustScale (Test1, -2, true).ToSqlString ());
\r
211 AssertEquals ("#E03", (SqlString)"6464.64", SqlDecimal.AdjustScale (Test1, -2, false).ToSqlString ());
\r
212 AssertEquals ("#E01", (SqlString)"10000.000000000000", SqlDecimal.AdjustScale (Test2, 10, false).ToSqlString ());
\r
216 public void ConvertToPrecScale()
\r
218 AssertEquals ("#F01", new SqlDecimal(6464.6m).Value, SqlDecimal.ConvertToPrecScale (Test1, 5, 1).Value);
\r
221 SqlDecimal test = SqlDecimal.ConvertToPrecScale (Test1, 6, 5);
\r
223 } catch (Exception e) {
\r
224 AssertEquals ("#F03", typeof (SqlTruncateException), e.GetType ());
\r
227 AssertEquals ("#F01", (SqlString)"10000.00", SqlDecimal.ConvertToPrecScale (Test2, 7, 2).ToSqlString ());
\r
231 public void CompareTo()
\r
233 SqlString TestString = new SqlString ("This is a test");
\r
235 Assert ("#G01", Test1.CompareTo (Test3) < 0);
\r
236 Assert ("#G02", Test2.CompareTo (Test1) > 0);
\r
237 Assert ("#G03", Test2.CompareTo (Test3) == 0);
\r
238 Assert ("#G04", Test4.CompareTo (SqlDecimal.Null) > 0);
\r
241 Test1.CompareTo (TestString);
\r
243 } catch(Exception e) {
\r
244 AssertEquals ("#G06", typeof (ArgumentException), e.GetType ());
\r
249 public void EqualsMethods()
\r
251 Assert ("#H01", !Test1.Equals (Test2));
\r
252 Assert ("#H02", !Test2.Equals (new SqlString ("TEST")));
\r
253 Assert ("#H03", Test2.Equals (Test3));
\r
255 // Static Equals()-method
\r
256 Assert ("#H05", SqlDecimal.Equals (Test2, Test2).Value);
\r
257 Assert ("#H06", !SqlDecimal.Equals (Test1, Test2).Value);
\r
260 Assert ("#H07", SqlDecimal.NotEquals (Test1, Test2).Value);
\r
261 Assert ("#H08", SqlDecimal.NotEquals (Test4, Test1).Value);
\r
262 Assert ("#H09", !SqlDecimal.NotEquals (Test2, Test3).Value);
\r
263 Assert ("#H10", SqlDecimal.NotEquals (SqlDecimal.Null, Test3).IsNull);
\r
266 /* Don't do such environment-dependent test. It will never succeed under Portable.NET and MS.NET
\r
268 public void GetHashCodeTest()
\r
270 // FIXME: Better way to test HashCode
\r
271 AssertEquals ("#I01", -1281249885, Test1.GetHashCode ());
\r
276 public void GetTypeTest()
\r
278 AssertEquals ("#J01", "System.Data.SqlTypes.SqlDecimal",
\r
279 Test1.GetType ().ToString ());
\r
280 AssertEquals ("#J02", "System.Decimal", Test1.Value.GetType ().ToString ());
\r
284 public void Greaters()
\r
287 Assert ("#K01", !SqlDecimal.GreaterThan (Test1, Test2).Value);
\r
288 Assert ("#K02", SqlDecimal.GreaterThan (Test2, Test1).Value);
\r
289 Assert ("#K03", !SqlDecimal.GreaterThan (Test2, Test3).Value);
\r
291 // GreaterTharOrEqual ()
\r
292 Assert ("#K04", !SqlDecimal.GreaterThanOrEqual (Test1, Test2).Value);
\r
293 Assert ("#K05", SqlDecimal.GreaterThanOrEqual (Test2, Test1).Value);
\r
294 Assert ("#K06", SqlDecimal.GreaterThanOrEqual (Test2, Test3).Value);
\r
298 public void Lessers()
\r
301 Assert ("#L01", !SqlDecimal.LessThan (Test3, Test2).Value);
\r
302 Assert ("#L02", !SqlDecimal.LessThan (Test2, Test1).Value);
\r
303 Assert ("#L03", SqlDecimal.LessThan (Test1, Test2).Value);
\r
305 // LessThanOrEqual ()
\r
306 Assert ("#L04", SqlDecimal.LessThanOrEqual (Test1, Test2).Value);
\r
307 Assert ("#L05", !SqlDecimal.LessThanOrEqual (Test2, Test1).Value);
\r
308 Assert ("#L06", SqlDecimal.LessThanOrEqual (Test2, Test3).Value);
\r
309 Assert ("#L07", SqlDecimal.LessThanOrEqual (Test1, SqlDecimal.Null).IsNull);
\r
313 public void Parse()
\r
316 SqlDecimal.Parse (null);
\r
318 } catch (Exception e) {
\r
319 AssertEquals ("#M02", typeof (ArgumentNullException), e.GetType ());
\r
323 SqlDecimal.Parse ("not-a-number");
\r
325 } catch (Exception e) {
\r
326 AssertEquals ("#M04", typeof (FormatException), e.GetType ());
\r
330 SqlDecimal test = SqlDecimal.Parse ("9e300");
\r
332 } catch (Exception e) {
\r
333 AssertEquals ("#M06", typeof (FormatException), e.GetType ());
\r
336 AssertEquals("#M07", 150m, SqlDecimal.Parse ("150").Value);
\r
340 public void Conversions()
\r
343 AssertEquals ("N01", 6464.6464, Test1.ToDouble ());
\r
346 AssertEquals ("#N02", new SqlBoolean(1), Test1.ToSqlBoolean ());
\r
348 SqlDecimal Test = new SqlDecimal (0);
\r
349 Assert ("#N03", !Test.ToSqlBoolean ().Value);
\r
351 Test = new SqlDecimal (0);
\r
352 Assert ("#N04", !Test.ToSqlBoolean ().Value);
\r
353 Assert ("#N05", SqlDecimal.Null.ToSqlBoolean ().IsNull);
\r
356 Test = new SqlDecimal (250);
\r
357 AssertEquals ("#N06", (byte)250, Test.ToSqlByte ().Value);
\r
360 SqlByte b = (byte)Test2.ToSqlByte ();
\r
362 } catch (Exception e) {
\r
363 AssertEquals ("#N08", typeof (OverflowException), e.GetType ());
\r
367 AssertEquals ("#N09", (SqlDouble)6464.6464, Test1.ToSqlDouble ());
\r
370 AssertEquals ("#N10", (short)1, new SqlDecimal (1).ToSqlInt16 ().Value);
\r
373 SqlInt16 test = SqlDecimal.MaxValue.ToSqlInt16().Value;
\r
375 } catch (Exception e) {
\r
376 AssertEquals ("#N12", typeof (OverflowException), e.GetType ());
\r
380 // FIXME: 6464.6464 --> 64646464 ??? with windows
\r
381 AssertEquals ("#N13a", (int)64646464, Test1.ToSqlInt32 ().Value);
\r
382 AssertEquals ("#N13b", (int)1212, new SqlDecimal(12.12m).ToSqlInt32 ().Value);
\r
385 SqlInt32 test = SqlDecimal.MaxValue.ToSqlInt32 ().Value;
\r
387 } catch (Exception e) {
\r
388 AssertEquals ("#N15", typeof (OverflowException), e.GetType ());
\r
392 AssertEquals ("#N16", (long)6464, Test1.ToSqlInt64 ().Value);
\r
395 AssertEquals ("#N17", (decimal)6464.6464, Test1.ToSqlMoney ().Value);
\r
398 SqlMoney test = SqlDecimal.MaxValue.ToSqlMoney ().Value;
\r
400 } catch (Exception e) {
\r
401 AssertEquals ("#N19", typeof (OverflowException), e.GetType ());
\r
405 AssertEquals ("#N20", (float)6464.6464, Test1.ToSqlSingle ().Value);
\r
408 AssertEquals ("#N21", "6464.6464", Test1.ToSqlString ().Value);
\r
411 AssertEquals ("#N22", "6464.6464", Test1.ToString ());
\r
412 AssertEquals ("#N23", (SqlDouble)1E+38, SqlDecimal.MaxValue.ToSqlDouble ());
\r
417 public void Truncate()
\r
419 AssertEquals ("#O01", new SqlDecimal (6464.6400m).Value, SqlDecimal.Truncate (Test1, 2).Value);
\r
425 public void ArithmeticOperators()
\r
428 AssertEquals ("#P01", new SqlDecimal(16464.6464m), Test1 + Test2);
\r
431 SqlDecimal test = SqlDecimal.MaxValue + SqlDecimal.MaxValue;
\r
433 } catch (Exception e) {
\r
434 AssertEquals ("#P03", typeof (OverflowException), e.GetType ());
\r
438 AssertEquals ("#P04", (SqlDecimal)1.54687501546m, Test2 / Test1);
\r
441 SqlDecimal test = Test3 / new SqlDecimal (0);
\r
443 } catch (Exception e) {
\r
444 AssertEquals ("#P06", typeof (DivideByZeroException), e.GetType ());
\r
448 AssertEquals ("#P07", (SqlDecimal)64646464m, Test1 * Test2);
\r
451 SqlDecimal test = SqlDecimal.MaxValue * Test1;
\r
453 } catch (Exception e) {
\r
454 AssertEquals ("#P09", typeof (OverflowException), e.GetType ());
\r
458 AssertEquals ("#P10", (SqlDecimal)3535.3536m, Test2 - Test1);
\r
461 SqlDecimal test = SqlDecimal.MinValue - SqlDecimal.MaxValue;
\r
463 } catch (Exception e) {
\r
464 AssertEquals ("#P12", typeof (OverflowException), e.GetType ());
\r
467 AssertEquals ("#P13", SqlDecimal.Null, SqlDecimal.Null + Test1);
\r
471 public void ThanOrEqualOperators()
\r
475 Assert ("#Q01", (Test2 == Test3).Value);
\r
476 Assert ("#Q02", !(Test1 == Test2).Value);
\r
477 Assert ("#Q03", (Test1 == SqlDecimal.Null).IsNull);
\r
480 Assert ("#Q04", !(Test2 != Test3).Value);
\r
481 Assert ("#Q05", (Test1 != Test3).Value);
\r
482 Assert ("#Q06", (Test4 != Test3).Value);
\r
483 Assert ("#Q07", (Test1 != SqlDecimal.Null).IsNull);
\r
486 Assert ("#Q08", (Test2 > Test1).Value);
\r
487 Assert ("#Q09", !(Test1 > Test3).Value);
\r
488 Assert ("#Q10", !(Test2 > Test3).Value);
\r
489 Assert ("#Q11", (Test1 > SqlDecimal.Null).IsNull);
\r
492 Assert ("#Q12", !(Test1 >= Test3).Value);
\r
493 Assert ("#Q13", (Test3 >= Test1).Value);
\r
494 Assert ("#Q14", (Test2 >= Test3).Value);
\r
495 Assert ("#Q15", (Test1 >= SqlDecimal.Null).IsNull);
\r
498 Assert ("#Q16", !(Test2 < Test1).Value);
\r
499 Assert ("#Q17", (Test1 < Test3).Value);
\r
500 Assert ("#Q18", !(Test2 < Test3).Value);
\r
501 Assert ("#Q19", (Test1 < SqlDecimal.Null).IsNull);
\r
504 Assert ("#Q20", (Test1 <= Test3).Value);
\r
505 Assert ("#Q21", !(Test3 <= Test1).Value);
\r
506 Assert ("#Q22", (Test2 <= Test3).Value);
\r
507 Assert ("#Q23", (Test1 <= SqlDecimal.Null).IsNull);
\r
511 public void UnaryNegation()
\r
513 AssertEquals ("#R01", 6m, -Test4.Value);
\r
514 AssertEquals ("#R02", -6464.6464m, -Test1.Value);
\r
515 AssertEquals ("#R03", SqlDecimal.Null, SqlDecimal.Null);
\r
519 public void SqlBooleanToSqlDecimal()
\r
521 SqlBoolean TestBoolean = new SqlBoolean (true);
\r
524 Result = (SqlDecimal)TestBoolean;
\r
526 AssertEquals ("#S01", 1m, Result.Value);
\r
528 Result = (SqlDecimal)SqlBoolean.Null;
\r
529 Assert ("#S02", Result.IsNull);
\r
530 AssertEquals ("#S03", SqlDecimal.Null, (SqlDecimal)SqlBoolean.Null);
\r
534 public void SqlDecimalToDecimal()
\r
536 AssertEquals ("#T01", 6464.6464m, (Decimal)Test1);
\r
540 public void SqlDoubleToSqlDecimal()
\r
542 SqlDouble Test = new SqlDouble (12E+10);
\r
543 AssertEquals ("#U01", 120000000000.00000m, ((SqlDecimal)Test).Value);
\r
547 public void SqlSingleToSqlDecimal()
\r
549 SqlSingle Test = new SqlSingle (1E+9);
\r
550 AssertEquals ("#V01", 1000000000.0000000m, ((SqlDecimal)Test).Value);
\r
553 SqlDecimal test = (SqlDecimal)SqlSingle.MaxValue;
\r
555 } catch (Exception e) {
\r
556 AssertEquals ("#V03", typeof (OverflowException), e.GetType ());
\r
561 public void SqlStringToSqlDecimal()
\r
563 SqlString TestString = new SqlString ("Test string");
\r
564 SqlString TestString100 = new SqlString ("100");
\r
566 AssertEquals ("#W01", 100m, ((SqlDecimal)TestString100).Value);
\r
569 SqlDecimal test = (SqlDecimal)TestString;
\r
571 } catch(Exception e) {
\r
572 AssertEquals ("#W03", typeof (FormatException), e.GetType ());
\r
576 SqlDecimal test = (SqlDecimal)new SqlString("9E+100");
\r
578 } catch (Exception e) {
\r
579 AssertEquals ("#W05", typeof (FormatException), e.GetType());
\r
584 public void DecimalToSqlDecimal()
\r
586 decimal d = 1000.1m;
\r
587 AssertEquals ("#X01", (SqlDecimal)1000.1m, (SqlDecimal)d);
\r
591 public void ByteToSqlDecimal()
\r
593 AssertEquals ("#Y01", 255m, ((SqlDecimal)SqlByte.MaxValue).Value);
\r
597 public void SqlIntToSqlDouble()
\r
599 SqlInt16 Test64 = new SqlInt16 (64);
\r
600 SqlInt32 Test640 = new SqlInt32 (640);
\r
601 SqlInt64 Test64000 = new SqlInt64 (64000);
\r
602 AssertEquals ("#Z01", 64m, ((SqlDecimal)Test64).Value);
\r
603 AssertEquals ("#Z02", 640m,((SqlDecimal)Test640).Value);
\r
604 AssertEquals ("#Z03", 64000m, ((SqlDecimal)Test64000).Value);
\r
608 public void SqlMoneyToSqlDecimal()
\r
610 SqlMoney TestMoney64 = new SqlMoney(64);
\r
611 AssertEquals ("#AA01", 64.0000M, ((SqlDecimal)TestMoney64).Value);
\r