2002-07-17 Martin Baulig <martin@gnome.org>
[mono.git] / mcs / class / corlib / Test / System / DecimalTest.cs
1 // DecimalTest.cs - NUnit Test Cases for the System.Decimal struct\r
2 //\r
3 // Author: Martin Weindel (martin.weindel@t-online.de)\r
4 //\r
5 // (C) Martin Weindel, 2001\r
6 // \r
7 \r
8 using NUnit.Framework;\r
9 using System;\r
10 \r
11 using System.Globalization;\r
12 using System.Runtime.CompilerServices;\r
13 using System.Threading;\r
14 \r
15 namespace MonoTests.System {\r
16     internal struct ParseTest\r
17     {\r
18         public ParseTest(String str, bool exceptionFlag)\r
19         {\r
20             this.str = str;\r
21             this.exceptionFlag = exceptionFlag;\r
22             this.style = NumberStyles.Number;\r
23             this.d = 0;\r
24         }\r
25 \r
26         public ParseTest(String str, Decimal d)\r
27         {\r
28             this.str = str;\r
29             this.exceptionFlag = false;\r
30             this.style = NumberStyles.Number;\r
31             this.d = d;\r
32         }\r
33 \r
34         public ParseTest(String str, Decimal d, NumberStyles style)\r
35         {\r
36             this.str = str;\r
37             this.exceptionFlag = false;\r
38             this.style = style;\r
39             this.d = d;\r
40         }\r
41 \r
42         public String str;\r
43         public Decimal d;\r
44         public NumberStyles style;\r
45         public bool exceptionFlag;\r
46     }\r
47 \r
48     internal struct ToStringTest\r
49     {\r
50         public ToStringTest(String format, Decimal d, String str)\r
51         {\r
52             this.format = format;\r
53             this.d = d;\r
54             this.str = str;\r
55         }\r
56 \r
57         public String format;\r
58         public Decimal d;\r
59         public String str;\r
60     }\r
61 \r
62     /// <summary>\r
63     /// Tests for System.Decimal\r
64     /// </summary>\r
65     public class DecimalTest : TestCase\r
66     {\r
67         public DecimalTest() : base ("MonoTests.System.DecimalTest testcase") {}\r
68         public DecimalTest(string name) : base(name) {}\r
69 \r
70         public static ITest Suite \r
71         {\r
72             get { return new TestSuite(typeof(DecimalTest)); }\r
73         }\r
74 \r
75         private const int negativeBitValue = unchecked ((int)0x80000000);\r
76         private const int negativeScale4Value = unchecked ((int)0x80040000);\r
77         private int [] parts0 = {0,0,0,0}; //Positive Zero.\r
78         private int [] parts1 = {1,0,0,0};\r
79         private int [] parts2 = {0,1,0,0};\r
80         private int [] parts3 = {0,0,1,0};\r
81         private int [] parts4 = {0,0,0,negativeBitValue}; // Negative zero.\r
82         private int [] parts5 = {1,1,1,0};\r
83         private int [] partsMaxValue = {-1,-1,-1,0};\r
84         private int [] partsMinValue = {-1,-1,-1,negativeBitValue};\r
85         private int [] parts6 = {1234, 5678, 8888, negativeScale4Value};\r
86         private NumberFormatInfo NfiUser;\r
87 \r
88         private CultureInfo old_culture;\r
89 \r
90         protected override void SetUp() \r
91         {\r
92                 old_culture = Thread.CurrentThread.CurrentCulture;\r
93 \r
94                 // Set culture to en-US and don't let the user override.\r
95                 Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US", false);\r
96 \r
97                 NfiUser = new NumberFormatInfo();\r
98                 NfiUser.CurrencyDecimalDigits = 3;\r
99                 NfiUser.CurrencyDecimalSeparator = ",";\r
100                 NfiUser.CurrencyGroupSeparator = "_";\r
101                 NfiUser.CurrencyGroupSizes = new int[] { 2,1,0 };\r
102                 NfiUser.CurrencyNegativePattern = 10;\r
103                 NfiUser.CurrencyPositivePattern = 3;\r
104                 NfiUser.CurrencySymbol = "XYZ";\r
105                 NfiUser.NumberDecimalSeparator = "##";\r
106                 NfiUser.NumberDecimalDigits = 4;\r
107                 NfiUser.NumberGroupSeparator = "__";\r
108                 NfiUser.NumberGroupSizes = new int[] { 2,1 };\r
109                 NfiUser.PercentDecimalDigits = 1;\r
110                 NfiUser.PercentDecimalSeparator = ";";\r
111                 NfiUser.PercentGroupSeparator = "~";\r
112                 NfiUser.PercentGroupSizes = new int[] {1};\r
113                 NfiUser.PercentNegativePattern = 2;\r
114                 NfiUser.PercentPositivePattern = 2;\r
115                 NfiUser.PercentSymbol = "%%%";\r
116         }\r
117 \r
118         protected override void TearDown()\r
119         {\r
120                 Thread.CurrentThread.CurrentCulture = old_culture;\r
121         }\r
122 \r
123         public void TestToString()\r
124         {\r
125             ToStringTest[] tab = {\r
126                 new ToStringTest("F", 12.345678m, "12.35"),\r
127                 new ToStringTest("F3", 12.345678m, "12.346"),\r
128                 new ToStringTest("F0", 12.345678m, "12"),\r
129                 new ToStringTest("F7", 12.345678m, "12.3456780"),\r
130                 new ToStringTest("g", 12.345678m, "12.345678"),\r
131                 new ToStringTest("E", 12.345678m, "1.234568E+001"),\r
132                 new ToStringTest("E3", 12.345678m, "1.235E+001"),\r
133                 new ToStringTest("E0", 12.345678m, "1E+001"),\r
134                 new ToStringTest("e8", 12.345678m, "1.23456780e+001"),\r
135                 new ToStringTest("F", 0.0012m, "0.00"),\r
136                 new ToStringTest("F3", 0.0012m, "0.001"),\r
137                 new ToStringTest("F0", 0.0012m, "0"),\r
138                 new ToStringTest("F6", 0.0012m, "0.001200"),\r
139                 new ToStringTest("e", 0.0012m, "1.200000e-003"),\r
140                 new ToStringTest("E3", 0.0012m, "1.200E-003"),\r
141                 new ToStringTest("E0", 0.0012m, "1E-003"),\r
142                 new ToStringTest("E6", 0.0012m, "1.200000E-003"),\r
143                 new ToStringTest("F4", -0.001234m, "-0.0012"),\r
144                 new ToStringTest("E3", -0.001234m, "-1.234E-003"),\r
145                 new ToStringTest("g", -0.000012m, "-1.2e-05"),\r
146                 new ToStringTest("g", -0.00012m, "-0.00012"),\r
147                 new ToStringTest("g4", -0.00012m, "-0.00012"),\r
148                 new ToStringTest("g7", -0.00012m, "-0.00012"),\r
149                 new ToStringTest("g", -0.0001234m, "-0.0001234"),\r
150                 new ToStringTest("g", -0.0012m, "-0.0012"),\r
151                 new ToStringTest("g", -0.001234m, "-0.001234"),\r
152                 new ToStringTest("g", -0.012m, "-0.012"),\r
153                 new ToStringTest("g4", -0.012m, "-0.012"),\r
154                 new ToStringTest("g", -0.12m, "-0.12"),\r
155                 new ToStringTest("g", -1.2m, "-1.2"),\r
156                 new ToStringTest("g4", -120m, "-120"),\r
157                 new ToStringTest("g", -12m, "-12"),\r
158                 new ToStringTest("g", -120m, "-120"),\r
159                 new ToStringTest("g", -1200m, "-1200"),\r
160                 new ToStringTest("g4", -1200m, "-1200"),\r
161                 new ToStringTest("g", -1234m, "-1234"),\r
162                 new ToStringTest("g", -12000m, "-12000"),\r
163                 new ToStringTest("g4", -12000m, "-1.2e+04"),\r
164                 new ToStringTest("g5", -12000m, "-12000"),\r
165                 new ToStringTest("g", -12345m, "-12345"),\r
166                 new ToStringTest("g", -120000m, "-120000"),\r
167                 new ToStringTest("g4", -120000m, "-1.2e+05"),\r
168                 new ToStringTest("g5", -120000m, "-1.2e+05"),\r
169                 new ToStringTest("g6", -120000m, "-120000"),\r
170                 new ToStringTest("g", -123456.1m, "-123456.1"),\r
171                 new ToStringTest("g5", -123456.1m, "-1.2346e+05"),\r
172                 new ToStringTest("g6", -123456.1m, "-123456"),\r
173                 new ToStringTest("g", -1200000m, "-1200000"),\r
174                 new ToStringTest("g", -123456.1m, "-123456.1"),\r
175                 new ToStringTest("g", -123456.1m, "-123456.1"),\r
176                 new ToStringTest("g", -1234567.1m, "-1234567.1"),\r
177                 new ToStringTest("g", -12000000m, "-12000000"),\r
178                 new ToStringTest("g", -12345678.1m, "-12345678.1"),\r
179                 new ToStringTest("g", -12000000000000000000m, "-12000000000000000000"),\r
180                 new ToStringTest("F", -123, "-123.00"),\r
181                 new ToStringTest("F3", -123, "-123.000"),\r
182                 new ToStringTest("F0", -123, "-123"),\r
183                 new ToStringTest("E3", -123, "-1.230E+002"),\r
184                 new ToStringTest("E0", -123, "-1E+002"),\r
185                 new ToStringTest("E", -123, "-1.230000E+002"),\r
186                 new ToStringTest("F3", Decimal.MinValue, "-79228162514264337593543950335.000"),\r
187                 new ToStringTest("F", Decimal.MinValue, "-79228162514264337593543950335.00"),\r
188                 new ToStringTest("F0", Decimal.MinValue, "-79228162514264337593543950335"),\r
189                 new ToStringTest("E", Decimal.MinValue, "-7.922816E+028"),\r
190                 new ToStringTest("E3", Decimal.MinValue, "-7.923E+028"),\r
191                 new ToStringTest("E28", Decimal.MinValue, "-7.9228162514264337593543950335E+028"),\r
192                 new ToStringTest("E30", Decimal.MinValue, "-7.922816251426433759354395033500E+028"),\r
193                 new ToStringTest("E0", Decimal.MinValue, "-8E+028"),\r
194                 new ToStringTest("N3", Decimal.MinValue, "-79,228,162,514,264,337,593,543,950,335.000"),\r
195                 new ToStringTest("N0", Decimal.MinValue, "-79,228,162,514,264,337,593,543,950,335"),\r
196                 new ToStringTest("N", Decimal.MinValue, "-79,228,162,514,264,337,593,543,950,335.00"),\r
197                 new ToStringTest("n3", Decimal.MinValue, "-79,228,162,514,264,337,593,543,950,335.000"),\r
198                 new ToStringTest("n0", Decimal.MinValue, "-79,228,162,514,264,337,593,543,950,335"),\r
199                 new ToStringTest("n", Decimal.MinValue, "-79,228,162,514,264,337,593,543,950,335.00"),\r
200                 new ToStringTest("C", 123456.7890m, NumberFormatInfo.InvariantInfo.CurrencySymbol + "123,456.79"),\r
201                 new ToStringTest("C", -123456.7890m, "(" + NumberFormatInfo.InvariantInfo.CurrencySymbol + "123,456.79)"),\r
202                 new ToStringTest("C3", 1123456.7890m, NumberFormatInfo.InvariantInfo.CurrencySymbol + "1,123,456.789"),\r
203                 new ToStringTest("P", 123456.7891m, "12,345,678.91 %"),\r
204                 new ToStringTest("P", -123456.7892m, "-12,345,678.92 %"),\r
205                 new ToStringTest("P3", 1234.56789m, "123,456.789 %"),\r
206             };\r
207 \r
208             NumberFormatInfo nfi = NumberFormatInfo.InvariantInfo;\r
209 \r
210             for (int i = 0; i < tab.Length; i++) \r
211             {\r
212                 try\r
213                 {\r
214                     string s = tab[i].d.ToString(tab[i].format, nfi);\r
215                     AssertEquals("A01 tab[" + i + "].format = '" + tab[i].format + "')", tab[i].str, s);\r
216                 } \r
217                 catch (OverflowException)\r
218                 {\r
219                     Fail(tab[i].d.ToString(tab[i].format, nfi) + " (format = '" + tab[i].format + "'): unexpected exception !");\r
220                 }\r
221                 catch (NUnit.Framework.AssertionFailedError e) {\r
222                         throw e;\r
223                 }\r
224                 catch (Exception e) {\r
225                         Fail ("Unexpected Exception when i = " + i + ". e = " + e);\r
226                 }\r
227             }      \r
228         }\r
229 \r
230         public void TestCurrencyPattern()\r
231         {\r
232             NumberFormatInfo nfi2 = (NumberFormatInfo)NfiUser.Clone();\r
233             Decimal d = -1234567.8976m;\r
234             string[] ergCurrencyNegativePattern = new String[16] {\r
235                 "(XYZ1234_5_67,898)", "-XYZ1234_5_67,898", "XYZ-1234_5_67,898", "XYZ1234_5_67,898-",\r
236                 "(1234_5_67,898XYZ)", "-1234_5_67,898XYZ", "1234_5_67,898-XYZ", "1234_5_67,898XYZ-",\r
237                 "-1234_5_67,898 XYZ", "-XYZ 1234_5_67,898", "1234_5_67,898 XYZ-", "XYZ 1234_5_67,898-",\r
238                 "XYZ -1234_5_67,898", "1234_5_67,898- XYZ", "(XYZ 1234_5_67,898)", "(1234_5_67,898 XYZ)",\r
239             };\r
240 \r
241             for (int i = 0; i < ergCurrencyNegativePattern.Length; i++) \r
242             {\r
243                 nfi2.CurrencyNegativePattern = i;\r
244                 if (d.ToString("C", nfi2) != ergCurrencyNegativePattern[i]) \r
245                 {\r
246                     Fail("CurrencyNegativePattern #" + i + " failed: " +\r
247                         d.ToString("C", nfi2) + " != " + ergCurrencyNegativePattern[i]);\r
248                 }\r
249             }\r
250 \r
251             d = 1234567.8976m;\r
252             string[] ergCurrencyPositivePattern = new String[4] {\r
253                 "XYZ1234_5_67,898", "1234_5_67,898XYZ", "XYZ 1234_5_67,898", "1234_5_67,898 XYZ",\r
254             };\r
255 \r
256             for (int i = 0; i < ergCurrencyPositivePattern.Length; i++) \r
257             {\r
258                 nfi2.CurrencyPositivePattern = i;\r
259                 if (d.ToString("C", nfi2) != ergCurrencyPositivePattern[i]) \r
260                 {\r
261                     Fail("CurrencyPositivePattern #" + i + " failed: " +\r
262                         d.ToString("C", nfi2) + " != " + ergCurrencyPositivePattern[i]);\r
263                 }\r
264             }\r
265         }\r
266 \r
267         public void TestNumberNegativePattern()\r
268         {\r
269             NumberFormatInfo nfi2 = (NumberFormatInfo)NfiUser.Clone();\r
270             Decimal d = -1234.89765m;\r
271             string[] ergNumberNegativePattern = new String[5] {\r
272                 "(1__2__34##8977)", "-1__2__34##8977", "- 1__2__34##8977", "1__2__34##8977-", "1__2__34##8977 -",\r
273             };\r
274 \r
275             for (int i = 0; i < ergNumberNegativePattern.Length; i++) \r
276             {\r
277                 nfi2.NumberNegativePattern = i;\r
278                 AssertEquals ("NumberNegativePattern #" + i, ergNumberNegativePattern[i], d.ToString("N", nfi2));\r
279             }\r
280         }\r
281         \r
282         public void TestPercentPattern()\r
283         {\r
284             NumberFormatInfo nfi2 = (NumberFormatInfo)NfiUser.Clone();\r
285             Decimal d = -1234.8976m;\r
286             string[] ergPercentNegativePattern = new String[3] {\r
287                 "-1~2~3~4~8~9;8 %%%", "-1~2~3~4~8~9;8%%%", "-%%%1~2~3~4~8~9;8"\r
288             };\r
289 \r
290             for (int i = 0; i < ergPercentNegativePattern.Length; i++) \r
291             {\r
292                 nfi2.PercentNegativePattern = i;\r
293                 if (d.ToString("P", nfi2) != ergPercentNegativePattern[i]) \r
294                 {\r
295                     Fail("PercentNegativePattern #" + i + " failed: " +\r
296                         d.ToString("P", nfi2) + " != " + ergPercentNegativePattern[i]);\r
297                 }\r
298             }\r
299 \r
300             d = 1234.8976m;\r
301             string[] ergPercentPositivePattern = new String[3] {\r
302                 "1~2~3~4~8~9;8 %%%", "1~2~3~4~8~9;8%%%", "%%%1~2~3~4~8~9;8"\r
303             };\r
304 \r
305             for (int i = 0; i < ergPercentPositivePattern.Length; i++) \r
306             {\r
307                 nfi2.PercentPositivePattern = i;\r
308                 if (d.ToString("P", nfi2) != ergPercentPositivePattern[i]) \r
309                 {\r
310                     Fail("PercentPositivePattern #" + i + " failed: " +\r
311                         d.ToString("P", nfi2) + " != " + ergPercentPositivePattern[i]);\r
312                 }\r
313             }\r
314         }\r
315 \r
316         public void TestParse()\r
317         {\r
318             ParseTest[] tab = {\r
319                 new ParseTest("1.2345", 1.2345m),\r
320                 new ParseTest("-9876543210", -9876543210m),\r
321                 new ParseTest(NumberFormatInfo.InvariantInfo.CurrencySymbol \r
322                         + " (  79,228,162,514,264,337,593,543,950,335.000 ) ", Decimal.MinValue, NumberStyles.Currency),\r
323                 new ParseTest("1.234567890e-10", (Decimal)1.234567890e-10, NumberStyles.Float),\r
324                 new ParseTest("1.234567890e-24", 1.2346e-24m, NumberStyles.Float),\r
325                 new ParseTest("  47896396.457983645462346E10  ", 478963964579836454.62346m, NumberStyles.Float),\r
326                 new ParseTest("-7922816251426433759354395033.250000000000001", -7922816251426433759354395033.3m),\r
327                 new ParseTest("-00000000000000795033.2500000000000000", -795033.25m),\r
328                 new ParseTest("-000000000000001922816251426433759354395033.300000000000000", -1922816251426433759354395033.3m),\r
329                 new ParseTest("-7922816251426433759354395033.150000000000", -7922816251426433759354395033.2m),\r
330                 new ParseTest("-7922816251426433759354395033.2400000000000", -7922816251426433759354395033.2m),\r
331                 new ParseTest("-7922816251426433759354395033.2600000000000", -7922816251426433759354395033.3m)\r
332             };\r
333 \r
334             Decimal d;\r
335             for (int i = 0; i < tab.Length; i++) \r
336             {\r
337                 try\r
338                 {\r
339                     d = Decimal.Parse(tab[i].str, tab[i].style, NumberFormatInfo.InvariantInfo);\r
340                     if (tab[i].exceptionFlag)\r
341                     {\r
342                         Fail(tab[i].str + ": missing exception !");\r
343                     }\r
344                     else if (d != tab[i].d) \r
345                     {\r
346                         Fail(tab[i].str + " != " + d);\r
347                     }\r
348                 } \r
349                 catch (OverflowException)\r
350                 {\r
351                     if (!tab[i].exceptionFlag)\r
352                     {\r
353                         Fail(tab[i].str + ": unexpected exception !");\r
354                     }\r
355                 }\r
356             }  \r
357     \r
358             try \r
359             {\r
360                 d = Decimal.Parse(null);\r
361                 Fail("Expected ArgumentNullException");\r
362             }\r
363             catch (ArgumentNullException)\r
364             {\r
365                 //ok\r
366             }\r
367 \r
368             try \r
369             {\r
370                 d = Decimal.Parse("123nx");\r
371                 Fail("Expected FormatException");\r
372             }\r
373             catch (FormatException)\r
374             {\r
375                 //ok\r
376             }\r
377 \r
378             try \r
379             {\r
380                 d = Decimal.Parse("79228162514264337593543950336");\r
381                 Fail("Expected OverflowException" + d);\r
382             }\r
383             catch (OverflowException)\r
384             {\r
385                 //ok\r
386             }\r
387         }\r
388 \r
389         public void TestConstants()\r
390         {\r
391             Assert(0m == (decimal)Decimal.Zero);\r
392             Assert(1m == (decimal)Decimal.One);\r
393             Assert(-1m == (decimal)Decimal.MinusOne);\r
394             Assert(0m == (decimal)Decimal.Zero);\r
395             Assert(79228162514264337593543950335m == (decimal)Decimal.MaxValue);\r
396             Assert(-79228162514264337593543950335m == (decimal)Decimal.MinValue);       \r
397         }\r
398 \r
399         public void TestConstructInt32()\r
400         {\r
401             decimal[] dtab = {0m, 1m, -1m, 123456m, -1234567m};\r
402             int[] itab = {0, 1, -1, 123456, -1234567};\r
403 \r
404             Decimal d;\r
405             \r
406             for (int i = 0; i < dtab.GetLength(0); i++)\r
407             {\r
408                 d = new Decimal(itab[i]);\r
409                 if ((decimal)d != dtab[i]) \r
410                 {\r
411                     Fail("Int32 -> Decimal: " + itab[i] + " != " + d);\r
412                 }\r
413                 else \r
414                 {\r
415                     int n = (int) d;\r
416                     if (n != itab[i]) \r
417                     {\r
418                         Fail("Decimal -> Int32: " + d + " != " + itab[i]);\r
419                     }\r
420                 }\r
421             }\r
422 \r
423             d = new Decimal(Int32.MaxValue);\r
424             Assert((int)d == Int32.MaxValue);\r
425 \r
426             d = new Decimal(Int32.MinValue);\r
427             Assert((int)d == Int32.MinValue);\r
428         }\r
429 \r
430         public void TestConstructUInt32()\r
431         {\r
432             decimal[] dtab = {0m, 1m, 123456m, 123456789m};\r
433             uint[] itab = {0, 1, 123456, 123456789};\r
434 \r
435             Decimal d;\r
436             \r
437             for (int i = 0; i < dtab.GetLength(0); i++)\r
438             {\r
439                 d = new Decimal(itab[i]);\r
440                 if ((decimal)d != dtab[i]) \r
441                 {\r
442                     Fail("UInt32 -> Decimal: " + itab[i] + " != " + d);\r
443                 }\r
444                 else \r
445                 {\r
446                     uint n = (uint) d;\r
447                     if (n != itab[i]) \r
448                     {\r
449                         Fail("Decimal -> UInt32: " + d + " != " + itab[i]);\r
450                     }\r
451                 }\r
452             }\r
453 \r
454             d = new Decimal(UInt32.MaxValue);\r
455             Assert((uint)d == UInt32.MaxValue);\r
456 \r
457             d = new Decimal(UInt32.MinValue);\r
458             Assert((uint)d == UInt32.MinValue);\r
459         }\r
460 \r
461         public void TestConstructInt64()\r
462         {\r
463             decimal[] dtab = {0m, 1m, -1m, 9876543m, -9876543210m, 12345678987654321m};\r
464             long[] itab = {0, 1, -1, 9876543, -9876543210L, 12345678987654321L};\r
465 \r
466             Decimal d;\r
467             \r
468             for (int i = 0; i < dtab.GetLength(0); i++)\r
469             {\r
470                 d = new Decimal(itab[i]);\r
471                 if ((decimal)d != dtab[i]) \r
472                 {\r
473                     Fail("Int64 -> Decimal: " + itab[i] + " != " + d);\r
474                 }\r
475                 else \r
476                 {\r
477                     long n = (long) d;\r
478                     if (n != itab[i]) \r
479                     {\r
480                         Fail("Decimal -> Int64: " + d + " != " + itab[i]);\r
481                     }\r
482                 }\r
483             }\r
484 \r
485             d = new Decimal(Int64.MaxValue);\r
486             Assert((long)d == Int64.MaxValue);\r
487 \r
488             d = new Decimal(Int64.MinValue);\r
489             Assert((long)d == Int64.MinValue);\r
490         }\r
491 \r
492         public void TestConstructUInt64()\r
493         {\r
494             decimal[] dtab = {0m, 1m, 987654321m, 123456789876543210m};\r
495             ulong[] itab = {0, 1, 987654321, 123456789876543210L};\r
496 \r
497             Decimal d;\r
498             \r
499             for (int i = 0; i < dtab.GetLength(0); i++)\r
500             {\r
501                 d = new Decimal(itab[i]);\r
502                 if ((decimal)d != dtab[i]) \r
503                 {\r
504                     Fail("UInt64 -> Decimal: " + itab[i] + " != " + d);\r
505                 }\r
506                 else \r
507                 {\r
508                     ulong n = (ulong) d;\r
509                     if (n != itab[i]) \r
510                     {\r
511                         Fail("Decimal -> UInt64: " + d + " != " + itab[i]);\r
512                     }\r
513                 }\r
514             }\r
515 \r
516             d = new Decimal(UInt64.MaxValue);\r
517             Assert((ulong)d == UInt64.MaxValue);\r
518 \r
519             d = new Decimal(UInt64.MinValue);\r
520             Assert((ulong)d == UInt64.MinValue);\r
521         }\r
522 \r
523         public void TestConstructSingle()\r
524         {\r
525             Decimal d;\r
526 \r
527             d = new Decimal(-1.2345678f);\r
528             AssertEquals("A#01", -1.234568m, (decimal)d);\r
529 \r
530             d=3;\r
531             AssertEquals("A#02", 3.0f, (float)d);\r
532 \r
533             d = new Decimal(0.0f);\r
534             AssertEquals("A#03", 0m, (decimal)d);\r
535             AssertEquals("A#04", 0.0f, (float)d);\r
536 \r
537             d = new Decimal(1.0f);\r
538             AssertEquals("A#05", 1m, (decimal)d);\r
539             AssertEquals("A#06", 1.0f, (float)d);\r
540 \r
541             d = new Decimal(-1.2345678f);\r
542             AssertEquals("A#07", -1.234568m, (decimal)d);\r
543             AssertEquals("A#08", -1.234568f, (float)d);\r
544 \r
545             d = new Decimal(1.2345673f);\r
546             AssertEquals("A#09", 1.234567m, (decimal)d);\r
547 \r
548             d = new Decimal(1.2345673e7f);\r
549             AssertEquals("A#10", 12345670m, (decimal)d);\r
550 \r
551             d = new Decimal(1.2345673e-17f);\r
552             AssertEquals("A#11", 0.00000000000000001234567m, (decimal)d);\r
553             AssertEquals("A#12", 1.234567e-17f, (float)d);\r
554 \r
555             // test exceptions\r
556             try\r
557             {\r
558                 d = new Decimal(Single.MaxValue);\r
559                 Fail();\r
560             } \r
561             catch (OverflowException) \r
562             {\r
563             }\r
564 \r
565             try\r
566             {\r
567                 d = new Decimal(Single.NaN);\r
568                 Fail();\r
569             } \r
570             catch (OverflowException) \r
571             {\r
572             }\r
573 \r
574             try\r
575             {\r
576                 d = new Decimal(Single.PositiveInfinity);\r
577                 Fail();\r
578             } \r
579             catch (OverflowException) \r
580             {\r
581             }\r
582         }\r
583 \r
584         public void TestConstructSingleRounding()\r
585         {\r
586             decimal d;\r
587 \r
588             d = new Decimal(1765.2356f);\r
589             Assert(d == 1765.236m);\r
590 \r
591             d = new Decimal(1765.23554f);\r
592             Assert("failed banker's rule rounding test 1", d == 1765.236m);\r
593 \r
594             d = new Decimal(1765.2354f);\r
595             Assert(d == 1765.235m);\r
596 \r
597             d = new Decimal(1765.2346f);\r
598             Assert(d == 1765.235m);\r
599 \r
600             d = new Decimal(1765.23454f);\r
601             Assert("failed banker's rule rounding test 2", d == 1765.234m);\r
602 \r
603             d = new Decimal(1765.2344f);\r
604             Assert(d == 1765.234m);\r
605 \r
606             d = new Decimal(0.00017652356f);\r
607             Assert(d == 0.0001765236m);\r
608 \r
609             d = new Decimal(0.000176523554f);\r
610             Assert("failed banker's rule rounding test 3", d == 0.0001765236m);\r
611 \r
612             d = new Decimal(0.00017652354f);\r
613             Assert(d == 0.0001765235m);\r
614 \r
615             d = new Decimal(0.00017652346f);\r
616             Assert(d == 0.0001765235m);\r
617 \r
618             d = new Decimal(0.000176523454f);\r
619             Assert("failed banker's rule rounding test 4", d == 0.0001765234m);\r
620 \r
621             d = new Decimal(0.00017652344f);\r
622             Assert(d == 0.0001765234m);\r
623 \r
624             d = new Decimal(3.7652356e10f);\r
625             Assert(d == 37652360000m);\r
626 \r
627             d = new Decimal(3.7652356e20f);\r
628             Assert(d == 376523600000000000000m);\r
629 \r
630             d = new Decimal(3.76523554e20f);\r
631             Assert("failed banker's rule rounding test 5", d == 376523600000000000000m);\r
632 \r
633             d = new Decimal(3.7652352e20f);\r
634             Assert(d == 376523500000000000000m);\r
635 \r
636             d = new Decimal(3.7652348e20f);\r
637             Assert(d == 376523500000000000000m);\r
638 \r
639             d = new Decimal(3.76523454e20f);\r
640             Assert("failed banker's rule rounding test 6", d == 376523400000000000000m);\r
641 \r
642             d = new Decimal(3.7652342e20f);\r
643             Assert(d == 376523400000000000000m);\r
644         }\r
645 \r
646         public void TestConstructDouble()\r
647         {\r
648             Decimal d;\r
649 \r
650             d = new Decimal(0.0);\r
651             Assert((decimal)d == 0m);\r
652 \r
653             d = new Decimal(1.0);\r
654             Assert((decimal)d == 1m);\r
655             Assert(1.0 == (double)d);\r
656 \r
657             d = new Decimal(-1.2345678901234);\r
658             Assert((decimal)d == -1.2345678901234m);\r
659             Assert(-1.2345678901234 == (double)d);\r
660 \r
661             d = new Decimal(1.2345678901234);\r
662             Assert((decimal)d == 1.2345678901234m);\r
663 \r
664             d = new Decimal(1.2345678901234e8);\r
665             Assert((decimal)d == 123456789.01234m);\r
666             Assert(1.2345678901234e8 == (double)d);\r
667 \r
668             d = new Decimal(1.2345678901234e16);\r
669             Assert((decimal)d == 12345678901234000m);\r
670             Assert(1.2345678901234e16 == (double)d);\r
671 \r
672             d = new Decimal(1.2345678901234e24);\r
673             Assert((decimal)d == 1234567890123400000000000m);\r
674             Assert(1.2345678901234e24 == (double)d);\r
675 \r
676             d = new Decimal(1.2345678901234e28);\r
677             Assert((decimal)d == 1.2345678901234e28m);\r
678             Assert(1.2345678901234e28 == (double)d);\r
679 \r
680             d = new Decimal(7.2345678901234e28);\r
681             Assert((decimal)d == 7.2345678901234e28m);\r
682             Assert(new Decimal((double)d) == d);\r
683 \r
684             d = new Decimal(1.2345678901234e-8);\r
685             Assert((decimal)d == 1.2345678901234e-8m);\r
686 \r
687             d = new Decimal(1.2345678901234e-14);\r
688             Assert((decimal)d == 1.2345678901234e-14m);\r
689             Assert(1.2345678901234e-14 == (double)d);\r
690 \r
691             d = new Decimal(1.2342278901234e-25);\r
692             Assert((decimal)d == 1.234e-25m);\r
693 \r
694             // test exceptions\r
695             try\r
696             {\r
697                 d = new Decimal(8e28);\r
698                 Fail();\r
699             } \r
700             catch (OverflowException) \r
701             {\r
702             }\r
703 \r
704             try\r
705             {\r
706                 d = new Decimal(8e48);\r
707                 Fail();\r
708             } \r
709             catch (OverflowException) \r
710             {\r
711             }\r
712 \r
713             try\r
714             {\r
715                 d = new Decimal(Double.NaN);\r
716                 Fail();\r
717             } \r
718             catch (OverflowException) \r
719             {\r
720             }\r
721 \r
722             try\r
723             {\r
724                 d = new Decimal(Double.PositiveInfinity);\r
725                 Fail();\r
726             } \r
727             catch (OverflowException) \r
728             {\r
729             }\r
730         }\r
731 \r
732         public void TestConstructDoubleRound()\r
733         {\r
734             decimal d;\r
735             \r
736             d = new Decimal(1765.231234567857);\r
737             Assert(d == 1765.23123456786m);\r
738 \r
739             d = new Decimal(1765.2312345678554);\r
740             Assert("failed banker's rule rounding test 1", d == 1765.23123456786m);\r
741             Assert(1765.23123456786 == (double)d);\r
742 \r
743             d = new Decimal(1765.231234567853);\r
744             Assert(d == 1765.23123456785m);\r
745 \r
746             d = new Decimal(1765.231234567847);\r
747             Assert(d == 1765.23123456785m);\r
748 \r
749             d = new Decimal(1765.231234567843);\r
750             Assert(d == 1765.23123456784m);\r
751 \r
752             d = new Decimal(1.765231234567857e-9);\r
753             Assert(d == 1.76523123456786e-9m);\r
754 \r
755             d = new Decimal(1.7652312345678554e-9);\r
756             Assert("failed banker's rule rounding test 3", d == 1.76523123456786e-9m);\r
757 \r
758             d = new Decimal(1.765231234567853e-9);\r
759             Assert(d == 1.76523123456785e-9m);\r
760 \r
761             d = new Decimal(1.765231234567857e+24);\r
762             Assert(d == 1.76523123456786e+24m);\r
763 \r
764             d = new Decimal(1.7652312345678554e+24);\r
765             Assert("failed banker's rule rounding test 4", d == 1.76523123456786e+24m);\r
766 \r
767             d = new Decimal(1.765231234567853e+24);\r
768             Assert(d == 1.76523123456785e+24m);\r
769 \r
770             d = new Decimal(1765.2312345678454);\r
771             Assert(d == 1765.23123456785m);\r
772         }\r
773 \r
774         public void TestNegate()\r
775         {\r
776             decimal d;\r
777 \r
778             d = new Decimal(12345678);\r
779             Assert((decimal)Decimal.Negate(d) == -12345678m);\r
780         }\r
781 \r
782         public void TestPartConstruct()\r
783         {\r
784             decimal d;\r
785             \r
786             d = new Decimal(parts0);\r
787             Assert(d == 0);\r
788 \r
789             d = new Decimal(parts1);\r
790             Assert(d == 1);\r
791 \r
792             d = new Decimal(parts2);\r
793             Assert(d == 4294967296m);\r
794 \r
795             d = new Decimal(parts3);\r
796             Assert(d == 18446744073709551616m);\r
797 \r
798             d = new Decimal(parts4);\r
799             Assert(d == 0m);\r
800 \r
801             d = new Decimal(parts5);\r
802             Assert(d == 18446744078004518913m);\r
803             \r
804             d = new Decimal(partsMaxValue);\r
805             Assert(d == Decimal.MaxValue);\r
806             \r
807             d = new Decimal(partsMinValue);\r
808             Assert(d == Decimal.MinValue);\r
809 \r
810             d = new Decimal(parts6);\r
811             int[] erg = Decimal.GetBits(d);\r
812             for (int i = 0; i < 4; i++) \r
813             {\r
814                 Assert(erg[i] == parts6[i]); \r
815             }\r
816         }\r
817 \r
818         public void TestFloorTruncate()\r
819         {\r
820             decimal[,] dtab = {\r
821                 {0m, 0m, 0m}, {1m, 1m, 1m}, {-1m, -1m, -1m}, {1.1m, 1m, 1m}, \r
822                 {-1.000000000001m, -2m, -1m}, {12345.67890m,12345m,12345m},\r
823                 {-123456789012345.67890m, -123456789012346m, -123456789012345m},\r
824                 {Decimal.MaxValue, Decimal.MaxValue, Decimal.MaxValue},\r
825                 {Decimal.MinValue, Decimal.MinValue, Decimal.MinValue},\r
826                 {6.999999999m, 6m, 6m}, {-6.999999999m, -7m, -6m}, \r
827                 {0.00001m, 0m, 0m}, {-0.00001m, -1m, 0m}\r
828             };\r
829 \r
830             decimal d;\r
831             \r
832             for (int i = 0; i < dtab.GetLength(0); i++)\r
833             {\r
834                 d = Decimal.Floor(dtab[i,0]);\r
835                 if (d != dtab[i,1]) \r
836                 {\r
837                     Fail("Floor: Floor(" + dtab[i,0] + ") != " + d);\r
838                 }\r
839                 d = Decimal.Truncate(dtab[i,0]);\r
840                 if (d != dtab[i,2]) \r
841                 {\r
842                     Fail("Truncate: Truncate(" + dtab[i,0] + ") != " + d);\r
843                 }\r
844             }\r
845         }\r
846 \r
847         public void TestRound()\r
848         {\r
849             decimal[,] dtab = { \r
850                 {1m, 0, 1m}, {1.234567890m, 1, 1.2m}, \r
851                 {1.234567890m, 2, 1.23m}, {1.23450000001m, 3, 1.235m}, \r
852                 {1.2345m, 3, 1.234m}, {1.2355m, 3, 1.236m}, \r
853                 {1.234567890m, 4, 1.2346m}, {1.23567890m, 2, 1.24m}, \r
854                 {47893764694.4578563236436621m, 7, 47893764694.4578563m},\r
855                 {-47893764694.4578563236436621m, 9, -47893764694.457856324m},\r
856                 {-47893764694.4578m, 5, -47893764694.4578m}\r
857             };\r
858 \r
859             decimal d;\r
860             \r
861             for (int i = 0; i < dtab.GetLength(0); i++)\r
862             {\r
863                 d = Decimal.Round(dtab[i,0], (int)dtab[i,1]);\r
864                 if (d != dtab[i,2]) \r
865                 {\r
866                     Fail("Round: Round(" + dtab[i,0] + "," + (int)dtab[i,1] + ") != " + d);\r
867                 }\r
868             }\r
869         }\r
870     }\r
871 \r
872 }\r