1 // DecimalTest.cs - NUnit Test Cases for the System.Decimal struct
\r
3 // Author: Martin Weindel (martin.weindel@t-online.de)
\r
5 // (C) Martin Weindel, 2001
\r
8 using NUnit.Framework;
\r
11 using System.Globalization;
\r
12 using System.Runtime.CompilerServices;
\r
13 using System.Threading;
\r
15 namespace MonoTests.System {
\r
16 internal struct ParseTest
\r
18 public ParseTest(String str, bool exceptionFlag)
\r
21 this.exceptionFlag = exceptionFlag;
\r
22 this.style = NumberStyles.Number;
\r
26 public ParseTest(String str, Decimal d)
\r
29 this.exceptionFlag = false;
\r
30 this.style = NumberStyles.Number;
\r
34 public ParseTest(String str, Decimal d, NumberStyles style)
\r
37 this.exceptionFlag = false;
\r
44 public NumberStyles style;
\r
45 public bool exceptionFlag;
\r
48 internal struct ToStringTest
\r
50 public ToStringTest(String format, Decimal d, String str)
\r
52 this.format = format;
\r
57 public String format;
\r
63 public class DecimalTest : Assertion
\r
65 private const int negativeBitValue = unchecked ((int)0x80000000);
\r
66 private const int negativeScale4Value = unchecked ((int)0x80040000);
\r
67 private int [] parts0 = {0,0,0,0}; //Positive Zero.
\r
68 private int [] parts1 = {1,0,0,0};
\r
69 private int [] parts2 = {0,1,0,0};
\r
70 private int [] parts3 = {0,0,1,0};
\r
71 private int [] parts4 = {0,0,0,negativeBitValue}; // Negative zero.
\r
72 private int [] parts5 = {1,1,1,0};
\r
73 private int [] partsMaxValue = {-1,-1,-1,0};
\r
74 private int [] partsMinValue = {-1,-1,-1,negativeBitValue};
\r
75 private int [] parts6 = {1234, 5678, 8888, negativeScale4Value};
\r
76 private NumberFormatInfo NfiUser;
\r
78 private CultureInfo old_culture;
\r
81 public void FixtureSetUp ()
\r
83 old_culture = Thread.CurrentThread.CurrentCulture;
\r
85 // Set culture to en-US and don't let the user override.
\r
86 Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US", false);
\r
88 NfiUser = new NumberFormatInfo();
\r
89 NfiUser.CurrencyDecimalDigits = 3;
\r
90 NfiUser.CurrencyDecimalSeparator = ",";
\r
91 NfiUser.CurrencyGroupSeparator = "_";
\r
92 NfiUser.CurrencyGroupSizes = new int[] { 2,1,0 };
\r
93 NfiUser.CurrencyNegativePattern = 10;
\r
94 NfiUser.CurrencyPositivePattern = 3;
\r
95 NfiUser.CurrencySymbol = "XYZ";
\r
96 NfiUser.NumberDecimalSeparator = "##";
\r
97 NfiUser.NumberDecimalDigits = 4;
\r
98 NfiUser.NumberGroupSeparator = "__";
\r
99 NfiUser.NumberGroupSizes = new int[] { 2,1 };
\r
100 NfiUser.PercentDecimalDigits = 1;
\r
101 NfiUser.PercentDecimalSeparator = ";";
\r
102 NfiUser.PercentGroupSeparator = "~";
\r
103 NfiUser.PercentGroupSizes = new int[] {1};
\r
104 NfiUser.PercentNegativePattern = 2;
\r
105 NfiUser.PercentPositivePattern = 2;
\r
106 NfiUser.PercentSymbol = "%%%";
\r
109 [TestFixtureTearDown]
\r
110 public void FixtureTearDown ()
\r
112 Thread.CurrentThread.CurrentCulture = old_culture;
\r
115 public void TestToString()
\r
117 ToStringTest[] tab = {
\r
118 new ToStringTest("F", 12.345678m, "12.35"),
\r
119 new ToStringTest("F3", 12.345678m, "12.346"),
\r
120 new ToStringTest("F0", 12.345678m, "12"),
\r
121 new ToStringTest("F7", 12.345678m, "12.3456780"),
\r
122 new ToStringTest("g", 12.345678m, "12.345678"),
\r
123 new ToStringTest("E", 12.345678m, "1.234568E+001"),
\r
124 new ToStringTest("E3", 12.345678m, "1.235E+001"),
\r
125 new ToStringTest("E0", 12.345678m, "1E+001"),
\r
126 new ToStringTest("e8", 12.345678m, "1.23456780e+001"),
\r
127 new ToStringTest("F", 0.0012m, "0.00"),
\r
128 new ToStringTest("F3", 0.0012m, "0.001"),
\r
129 new ToStringTest("F0", 0.0012m, "0"),
\r
130 new ToStringTest("F6", 0.0012m, "0.001200"),
\r
131 new ToStringTest("e", 0.0012m, "1.200000e-003"),
\r
132 new ToStringTest("E3", 0.0012m, "1.200E-003"),
\r
133 new ToStringTest("E0", 0.0012m, "1E-003"),
\r
134 new ToStringTest("E6", 0.0012m, "1.200000E-003"),
\r
135 new ToStringTest("F4", -0.001234m, "-0.0012"),
\r
136 new ToStringTest("E3", -0.001234m, "-1.234E-003"),
\r
138 new ToStringTest("g", -0.000012m, "-1.2e-05"),
\r
140 new ToStringTest("g", -0.000012m, "-0.000012"),
\r
142 new ToStringTest("g", -0.00012m, "-0.00012"),
\r
143 new ToStringTest("g4", -0.00012m, "-0.00012"),
\r
144 new ToStringTest("g7", -0.00012m, "-0.00012"),
\r
145 new ToStringTest("g", -0.0001234m, "-0.0001234"),
\r
146 new ToStringTest("g", -0.0012m, "-0.0012"),
\r
147 new ToStringTest("g", -0.001234m, "-0.001234"),
\r
148 new ToStringTest("g", -0.012m, "-0.012"),
\r
149 new ToStringTest("g4", -0.012m, "-0.012"),
\r
150 new ToStringTest("g", -0.12m, "-0.12"),
\r
151 new ToStringTest("g", -1.2m, "-1.2"),
\r
152 new ToStringTest("g4", -120m, "-120"),
\r
153 new ToStringTest("g", -12m, "-12"),
\r
154 new ToStringTest("g", -120m, "-120"),
\r
155 new ToStringTest("g", -1200m, "-1200"),
\r
156 new ToStringTest("g4", -1200m, "-1200"),
\r
157 new ToStringTest("g", -1234m, "-1234"),
\r
158 new ToStringTest("g", -12000m, "-12000"),
\r
159 new ToStringTest("g4", -12000m, "-1.2e+04"),
\r
160 new ToStringTest("g5", -12000m, "-12000"),
\r
161 new ToStringTest("g", -12345m, "-12345"),
\r
162 new ToStringTest("g", -120000m, "-120000"),
\r
163 new ToStringTest("g4", -120000m, "-1.2e+05"),
\r
164 new ToStringTest("g5", -120000m, "-1.2e+05"),
\r
165 new ToStringTest("g6", -120000m, "-120000"),
\r
166 new ToStringTest("g", -123456.1m, "-123456.1"),
\r
167 new ToStringTest("g5", -123456.1m, "-1.2346e+05"),
\r
168 new ToStringTest("g6", -123456.1m, "-123456"),
\r
169 new ToStringTest("g", -1200000m, "-1200000"),
\r
170 new ToStringTest("g", -123456.1m, "-123456.1"),
\r
171 new ToStringTest("g", -123456.1m, "-123456.1"),
\r
172 new ToStringTest("g", -1234567.1m, "-1234567.1"),
\r
173 new ToStringTest("g", -12000000m, "-12000000"),
\r
174 new ToStringTest("g", -12345678.1m, "-12345678.1"),
\r
175 new ToStringTest("g", -12000000000000000000m, "-12000000000000000000"),
\r
176 new ToStringTest("F", -123, "-123.00"),
\r
177 new ToStringTest("F3", -123, "-123.000"),
\r
178 new ToStringTest("F0", -123, "-123"),
\r
179 new ToStringTest("E3", -123, "-1.230E+002"),
\r
180 new ToStringTest("E0", -123, "-1E+002"),
\r
181 new ToStringTest("E", -123, "-1.230000E+002"),
\r
182 new ToStringTest("F3", Decimal.MinValue, "-79228162514264337593543950335.000"),
\r
183 new ToStringTest("F", Decimal.MinValue, "-79228162514264337593543950335.00"),
\r
184 new ToStringTest("F0", Decimal.MinValue, "-79228162514264337593543950335"),
\r
185 new ToStringTest("E", Decimal.MinValue, "-7.922816E+028"),
\r
186 new ToStringTest("E3", Decimal.MinValue, "-7.923E+028"),
\r
187 new ToStringTest("E28", Decimal.MinValue, "-7.9228162514264337593543950335E+028"),
\r
188 new ToStringTest("E30", Decimal.MinValue, "-7.922816251426433759354395033500E+028"),
\r
189 new ToStringTest("E0", Decimal.MinValue, "-8E+028"),
\r
190 new ToStringTest("N3", Decimal.MinValue, "-79,228,162,514,264,337,593,543,950,335.000"),
\r
191 new ToStringTest("N0", Decimal.MinValue, "-79,228,162,514,264,337,593,543,950,335"),
\r
192 new ToStringTest("N", Decimal.MinValue, "-79,228,162,514,264,337,593,543,950,335.00"),
\r
193 new ToStringTest("n3", Decimal.MinValue, "-79,228,162,514,264,337,593,543,950,335.000"),
\r
194 new ToStringTest("n0", Decimal.MinValue, "-79,228,162,514,264,337,593,543,950,335"),
\r
195 new ToStringTest("n", Decimal.MinValue, "-79,228,162,514,264,337,593,543,950,335.00"),
\r
196 new ToStringTest("C", 123456.7890m, NumberFormatInfo.InvariantInfo.CurrencySymbol + "123,456.79"),
\r
197 new ToStringTest("C", -123456.7890m, "(" + NumberFormatInfo.InvariantInfo.CurrencySymbol + "123,456.79)"),
\r
198 new ToStringTest("C3", 1123456.7890m, NumberFormatInfo.InvariantInfo.CurrencySymbol + "1,123,456.789"),
\r
199 new ToStringTest("P", 123456.7891m, "12,345,678.91 %"),
\r
200 new ToStringTest("P", -123456.7892m, "-12,345,678.92 %"),
\r
201 new ToStringTest("P3", 1234.56789m, "123,456.789 %"),
\r
204 NumberFormatInfo nfi = NumberFormatInfo.InvariantInfo;
\r
206 for (int i = 0; i < tab.Length; i++)
\r
210 string s = tab[i].d.ToString(tab[i].format, nfi);
\r
211 AssertEquals("A01 tab[" + i + "].format = '" + tab[i].format + "')", tab[i].str, s);
\r
213 catch (OverflowException)
\r
215 Fail(tab[i].d.ToString(tab[i].format, nfi) + " (format = '" + tab[i].format + "'): unexpected exception !");
\r
217 catch (NUnit.Framework.AssertionException e) {
\r
220 catch (Exception e) {
\r
221 Fail ("Unexpected Exception when i = " + i + ". e = " + e);
\r
226 public void TestCurrencyPattern()
\r
228 NumberFormatInfo nfi2 = (NumberFormatInfo)NfiUser.Clone();
\r
229 Decimal d = -1234567.8976m;
\r
230 string[] ergCurrencyNegativePattern = new String[16] {
\r
231 "(XYZ1234_5_67,898)", "-XYZ1234_5_67,898", "XYZ-1234_5_67,898", "XYZ1234_5_67,898-",
\r
232 "(1234_5_67,898XYZ)", "-1234_5_67,898XYZ", "1234_5_67,898-XYZ", "1234_5_67,898XYZ-",
\r
233 "-1234_5_67,898 XYZ", "-XYZ 1234_5_67,898", "1234_5_67,898 XYZ-", "XYZ 1234_5_67,898-",
\r
234 "XYZ -1234_5_67,898", "1234_5_67,898- XYZ", "(XYZ 1234_5_67,898)", "(1234_5_67,898 XYZ)",
\r
237 for (int i = 0; i < ergCurrencyNegativePattern.Length; i++)
\r
239 nfi2.CurrencyNegativePattern = i;
\r
240 if (d.ToString("C", nfi2) != ergCurrencyNegativePattern[i])
\r
242 Fail("CurrencyNegativePattern #" + i + " failed: " +
\r
243 d.ToString("C", nfi2) + " != " + ergCurrencyNegativePattern[i]);
\r
248 string[] ergCurrencyPositivePattern = new String[4] {
\r
249 "XYZ1234_5_67,898", "1234_5_67,898XYZ", "XYZ 1234_5_67,898", "1234_5_67,898 XYZ",
\r
252 for (int i = 0; i < ergCurrencyPositivePattern.Length; i++)
\r
254 nfi2.CurrencyPositivePattern = i;
\r
255 if (d.ToString("C", nfi2) != ergCurrencyPositivePattern[i])
\r
257 Fail("CurrencyPositivePattern #" + i + " failed: " +
\r
258 d.ToString("C", nfi2) + " != " + ergCurrencyPositivePattern[i]);
\r
263 public void TestNumberNegativePattern()
\r
265 NumberFormatInfo nfi2 = (NumberFormatInfo)NfiUser.Clone();
\r
266 Decimal d = -1234.89765m;
\r
267 string[] ergNumberNegativePattern = new String[5] {
\r
268 "(1__2__34##8977)", "-1__2__34##8977", "- 1__2__34##8977", "1__2__34##8977-", "1__2__34##8977 -",
\r
271 for (int i = 0; i < ergNumberNegativePattern.Length; i++)
\r
273 nfi2.NumberNegativePattern = i;
\r
274 AssertEquals ("NumberNegativePattern #" + i, ergNumberNegativePattern[i], d.ToString("N", nfi2));
\r
278 public void TestPercentPattern()
\r
280 NumberFormatInfo nfi2 = (NumberFormatInfo)NfiUser.Clone();
\r
281 Decimal d = -1234.8976m;
\r
282 string[] ergPercentNegativePattern = new String[3] {
\r
283 "-1~2~3~4~8~9;8 %%%", "-1~2~3~4~8~9;8%%%", "-%%%1~2~3~4~8~9;8"
\r
286 for (int i = 0; i < ergPercentNegativePattern.Length; i++)
\r
288 nfi2.PercentNegativePattern = i;
\r
289 if (d.ToString("P", nfi2) != ergPercentNegativePattern[i])
\r
291 Fail("PercentNegativePattern #" + i + " failed: " +
\r
292 d.ToString("P", nfi2) + " != " + ergPercentNegativePattern[i]);
\r
297 string[] ergPercentPositivePattern = new String[3] {
\r
298 "1~2~3~4~8~9;8 %%%", "1~2~3~4~8~9;8%%%", "%%%1~2~3~4~8~9;8"
\r
301 for (int i = 0; i < ergPercentPositivePattern.Length; i++)
\r
303 nfi2.PercentPositivePattern = i;
\r
304 if (d.ToString("P", nfi2) != ergPercentPositivePattern[i])
\r
306 Fail("PercentPositivePattern #" + i + " failed: " +
\r
307 d.ToString("P", nfi2) + " != " + ergPercentPositivePattern[i]);
\r
312 public void TestParse()
\r
314 ParseTest[] tab = {
\r
315 new ParseTest("1.2345", 1.2345m),
\r
316 new ParseTest("-9876543210", -9876543210m),
\r
317 new ParseTest(NumberFormatInfo.InvariantInfo.CurrencySymbol
\r
318 + " ( 79,228,162,514,264,337,593,543,950,335.000 ) ", Decimal.MinValue, NumberStyles.Currency),
\r
319 new ParseTest("1.234567890e-10", (Decimal)1.234567890e-10, NumberStyles.Float),
\r
320 new ParseTest("1.234567890e-24", 1.2346e-24m, NumberStyles.Float),
\r
321 new ParseTest(" 47896396.457983645462346E10 ", 478963964579836454.62346m, NumberStyles.Float),
\r
322 new ParseTest("-7922816251426433759354395033.250000000000001", -7922816251426433759354395033.3m),
\r
323 new ParseTest("-00000000000000795033.2500000000000000", -795033.25m),
\r
324 new ParseTest("-000000000000001922816251426433759354395033.300000000000000", -1922816251426433759354395033.3m),
\r
325 new ParseTest("-7922816251426433759354395033.150000000000", -7922816251426433759354395033.2m),
\r
326 new ParseTest("-7922816251426433759354395033.2400000000000", -7922816251426433759354395033.2m),
\r
327 new ParseTest("-7922816251426433759354395033.2600000000000", -7922816251426433759354395033.3m)
\r
331 for (int i = 0; i < tab.Length; i++)
\r
335 d = Decimal.Parse(tab[i].str, tab[i].style, NumberFormatInfo.InvariantInfo);
\r
336 if (tab[i].exceptionFlag)
\r
338 Fail(tab[i].str + ": missing exception !");
\r
340 else if (d != tab[i].d)
\r
342 Fail(tab[i].str + " != " + d);
\r
345 catch (OverflowException)
\r
347 if (!tab[i].exceptionFlag)
\r
349 Fail(tab[i].str + ": unexpected exception !");
\r
356 d = Decimal.Parse(null);
\r
357 Fail("Expected ArgumentNullException");
\r
359 catch (ArgumentNullException)
\r
366 d = Decimal.Parse("123nx");
\r
367 Fail("Expected FormatException");
\r
369 catch (FormatException)
\r
376 d = Decimal.Parse("79228162514264337593543950336");
\r
377 Fail("Expected OverflowException" + d);
\r
379 catch (OverflowException)
\r
385 public void TestConstants()
\r
387 AssertEquals ("Zero", 0m, Decimal.Zero);
\r
388 AssertEquals ("One", 1m, Decimal.One);
\r
389 AssertEquals ("MinusOne", -1m, Decimal.MinusOne);
\r
390 AssertEquals ("MaxValue", 79228162514264337593543950335m, Decimal.MaxValue);
\r
391 AssertEquals ("MinValue", -79228162514264337593543950335m, Decimal.MinValue);
\r
392 Assert ("MinusOne 2", -1m == Decimal.MinusOne);
\r
395 public void TestConstructInt32()
\r
397 decimal[] dtab = {0m, 1m, -1m, 123456m, -1234567m};
\r
398 int[] itab = {0, 1, -1, 123456, -1234567};
\r
402 for (int i = 0; i < dtab.GetLength(0); i++)
\r
404 d = new Decimal(itab[i]);
\r
405 if ((decimal)d != dtab[i])
\r
407 Fail("Int32 -> Decimal: " + itab[i] + " != " + d);
\r
414 Fail("Decimal -> Int32: " + d + " != " + itab[i]);
\r
419 d = new Decimal(Int32.MaxValue);
\r
420 Assert((int)d == Int32.MaxValue);
\r
422 d = new Decimal(Int32.MinValue);
\r
423 Assert((int)d == Int32.MinValue);
\r
426 public void TestConstructUInt32()
\r
428 decimal[] dtab = {0m, 1m, 123456m, 123456789m};
\r
429 uint[] itab = {0, 1, 123456, 123456789};
\r
433 for (int i = 0; i < dtab.GetLength(0); i++)
\r
435 d = new Decimal(itab[i]);
\r
436 if ((decimal)d != dtab[i])
\r
438 Fail("UInt32 -> Decimal: " + itab[i] + " != " + d);
\r
445 Fail("Decimal -> UInt32: " + d + " != " + itab[i]);
\r
450 d = new Decimal(UInt32.MaxValue);
\r
451 Assert((uint)d == UInt32.MaxValue);
\r
453 d = new Decimal(UInt32.MinValue);
\r
454 Assert((uint)d == UInt32.MinValue);
\r
457 public void TestConstructInt64()
\r
459 decimal[] dtab = {0m, 1m, -1m, 9876543m, -9876543210m, 12345678987654321m};
\r
460 long[] itab = {0, 1, -1, 9876543, -9876543210L, 12345678987654321L};
\r
464 for (int i = 0; i < dtab.GetLength(0); i++)
\r
466 d = new Decimal(itab[i]);
\r
467 if ((decimal)d != dtab[i])
\r
469 Fail("Int64 -> Decimal: " + itab[i] + " != " + d);
\r
476 Fail("Decimal -> Int64: " + d + " != " + itab[i]);
\r
481 d = new Decimal(Int64.MaxValue);
\r
482 Assert((long)d == Int64.MaxValue);
\r
484 d = new Decimal(Int64.MinValue);
\r
485 Assert((long)d == Int64.MinValue);
\r
488 public void TestConstructUInt64()
\r
490 decimal[] dtab = {0m, 1m, 987654321m, 123456789876543210m};
\r
491 ulong[] itab = {0, 1, 987654321, 123456789876543210L};
\r
495 for (int i = 0; i < dtab.GetLength(0); i++)
\r
497 d = new Decimal(itab[i]);
\r
498 if ((decimal)d != dtab[i])
\r
500 Fail("UInt64 -> Decimal: " + itab[i] + " != " + d);
\r
504 ulong n = (ulong) d;
\r
507 Fail("Decimal -> UInt64: " + d + " != " + itab[i]);
\r
512 d = new Decimal(UInt64.MaxValue);
\r
513 Assert((ulong)d == UInt64.MaxValue);
\r
515 d = new Decimal(UInt64.MinValue);
\r
516 Assert((ulong)d == UInt64.MinValue);
\r
519 public void TestConstructSingle()
\r
523 d = new Decimal(-1.2345678f);
\r
524 AssertEquals("A#01", -1.234568m, (decimal)d);
\r
527 AssertEquals("A#02", 3.0f, (float)d);
\r
529 d = new Decimal(0.0f);
\r
530 AssertEquals("A#03", 0m, (decimal)d);
\r
531 AssertEquals("A#04", 0.0f, (float)d);
\r
533 d = new Decimal(1.0f);
\r
534 AssertEquals("A#05", 1m, (decimal)d);
\r
535 AssertEquals("A#06", 1.0f, (float)d);
\r
537 d = new Decimal(-1.2345678f);
\r
538 AssertEquals("A#07", -1.234568m, (decimal)d);
\r
539 AssertEquals("A#08", -1.234568f, (float)d);
\r
541 d = new Decimal(1.2345673f);
\r
542 AssertEquals("A#09", 1.234567m, (decimal)d);
\r
544 d = new Decimal(1.2345673e7f);
\r
545 AssertEquals("A#10", 12345670m, (decimal)d);
\r
547 d = new Decimal(1.2345673e-17f);
\r
548 AssertEquals("A#11", 0.00000000000000001234567m, (decimal)d);
\r
549 AssertEquals("A#12", 1.234567e-17f, (float)d);
\r
554 d = new Decimal(Single.MaxValue);
\r
557 catch (OverflowException)
\r
563 d = new Decimal(Single.NaN);
\r
566 catch (OverflowException)
\r
572 d = new Decimal(Single.PositiveInfinity);
\r
575 catch (OverflowException)
\r
580 public void TestConstructSingleRounding()
\r
584 d = new Decimal(1765.2356f);
\r
585 Assert(d == 1765.236m);
\r
587 d = new Decimal(1765.23554f);
\r
588 Assert("failed banker's rule rounding test 1", d == 1765.236m);
\r
590 d = new Decimal(1765.2354f);
\r
591 Assert(d == 1765.235m);
\r
593 d = new Decimal(1765.2346f);
\r
594 Assert(d == 1765.235m);
\r
596 d = new Decimal(1765.23454f);
\r
597 Assert("failed banker's rule rounding test 2", d == 1765.234m);
\r
599 d = new Decimal(1765.2344f);
\r
600 Assert(d == 1765.234m);
\r
602 d = new Decimal(0.00017652356f);
\r
603 Assert(d == 0.0001765236m);
\r
605 d = new Decimal(0.000176523554f);
\r
606 Assert("failed banker's rule rounding test 3", d == 0.0001765236m);
\r
608 d = new Decimal(0.00017652354f);
\r
609 Assert(d == 0.0001765235m);
\r
611 d = new Decimal(0.00017652346f);
\r
612 Assert(d == 0.0001765235m);
\r
614 d = new Decimal(0.000176523454f);
\r
615 Assert("failed banker's rule rounding test 4", d == 0.0001765234m);
\r
617 d = new Decimal(0.00017652344f);
\r
618 Assert(d == 0.0001765234m);
\r
620 d = new Decimal(3.7652356e10f);
\r
621 Assert(d == 37652360000m);
\r
623 d = new Decimal(3.7652356e20f);
\r
624 Assert(d == 376523600000000000000m);
\r
626 d = new Decimal(3.76523554e20f);
\r
627 Assert("failed banker's rule rounding test 5", d == 376523600000000000000m);
\r
629 d = new Decimal(3.7652352e20f);
\r
630 Assert(d == 376523500000000000000m);
\r
632 d = new Decimal(3.7652348e20f);
\r
633 Assert(d == 376523500000000000000m);
\r
635 d = new Decimal(3.76523454e20f);
\r
636 Assert("failed banker's rule rounding test 6", d == 376523400000000000000m);
\r
638 d = new Decimal(3.7652342e20f);
\r
639 Assert(d == 376523400000000000000m);
\r
642 public void TestConstructDouble()
\r
646 d = new Decimal(0.0);
\r
647 Assert((decimal)d == 0m);
\r
649 d = new Decimal(1.0);
\r
650 Assert((decimal)d == 1m);
\r
651 Assert(1.0 == (double)d);
\r
653 d = new Decimal(-1.2345678901234);
\r
654 Assert((decimal)d == -1.2345678901234m);
\r
655 Assert(-1.2345678901234 == (double)d);
\r
657 d = new Decimal(1.2345678901234);
\r
658 Assert((decimal)d == 1.2345678901234m);
\r
660 d = new Decimal(1.2345678901234e8);
\r
661 Assert((decimal)d == 123456789.01234m);
\r
662 Assert(1.2345678901234e8 == (double)d);
\r
664 d = new Decimal(1.2345678901234e16);
\r
665 Assert((decimal)d == 12345678901234000m);
\r
666 Assert(1.2345678901234e16 == (double)d);
\r
668 d = new Decimal(1.2345678901234e24);
\r
669 Assert((decimal)d == 1234567890123400000000000m);
\r
670 Assert(1.2345678901234e24 == (double)d);
\r
672 d = new Decimal(1.2345678901234e28);
\r
673 Assert((decimal)d == 1.2345678901234e28m);
\r
674 Assert(1.2345678901234e28 == (double)d);
\r
676 d = new Decimal(7.2345678901234e28);
\r
677 Assert((decimal)d == 7.2345678901234e28m);
\r
678 Assert(new Decimal((double)d) == d);
\r
680 d = new Decimal(1.2345678901234e-8);
\r
681 Assert((decimal)d == 1.2345678901234e-8m);
\r
683 d = new Decimal(1.2345678901234e-14);
\r
684 Assert((decimal)d == 1.2345678901234e-14m);
\r
685 Assert(1.2345678901234e-14 == (double)d);
\r
687 d = new Decimal(1.2342278901234e-25);
\r
688 Assert((decimal)d == 1.234e-25m);
\r
693 d = new Decimal(8e28);
\r
696 catch (OverflowException)
\r
702 d = new Decimal(8e48);
\r
705 catch (OverflowException)
\r
711 d = new Decimal(Double.NaN);
\r
714 catch (OverflowException)
\r
720 d = new Decimal(Double.PositiveInfinity);
\r
723 catch (OverflowException)
\r
728 public void TestConstructDoubleRound()
\r
734 d = new Decimal(1765.231234567857);
\r
735 AssertEquals("A01", 1765.23123456786m, d);
\r
738 d = new Decimal(1765.2312345678554);
\r
739 AssertEquals("A02, failed banker's rule rounding test 1", 1765.23123456786m, d);
\r
740 AssertEquals("A03", 1765.23123456786, (double)d);
\r
743 d = new Decimal(1765.231234567853);
\r
744 Assert(d == 1765.23123456785m);
\r
747 d = new Decimal(1765.231234567847);
\r
748 Assert(d == 1765.23123456785m);
\r
751 d = new Decimal(1765.231234567843);
\r
752 Assert(d == 1765.23123456784m);
\r
755 d = new Decimal(1.765231234567857e-9);
\r
756 Assert(d == 1.76523123456786e-9m);
\r
759 d = new Decimal(1.7652312345678554e-9);
\r
760 Assert("failed banker's rule rounding test 3", d == 1.76523123456786e-9m);
\r
763 d = new Decimal(1.765231234567853e-9);
\r
764 Assert(d == 1.76523123456785e-9m);
\r
767 d = new Decimal(1.765231234567857e+24);
\r
768 Assert(d == 1.76523123456786e+24m);
\r
771 d = new Decimal(1.7652312345678554e+24);
\r
772 Assert("failed banker's rule rounding test 4", d == 1.76523123456786e+24m);
\r
775 d = new Decimal(1.765231234567853e+24);
\r
776 Assert(d == 1.76523123456785e+24m);
\r
779 d = new Decimal(1765.2312345678454);
\r
780 Assert(d == 1765.23123456785m);
\r
782 catch (Exception e) {
\r
783 Fail("At TestNum = " + TestNum + " unexpected exception. e = " + e);
\r
787 public void TestNegate()
\r
791 d = new Decimal(12345678);
\r
792 Assert((decimal)Decimal.Negate(d) == -12345678m);
\r
795 public void TestPartConstruct()
\r
799 d = new Decimal(parts0);
\r
802 d = new Decimal(parts1);
\r
805 d = new Decimal(parts2);
\r
806 Assert(d == 4294967296m);
\r
808 d = new Decimal(parts3);
\r
809 Assert(d == 18446744073709551616m);
\r
811 d = new Decimal(parts4);
\r
814 d = new Decimal(parts5);
\r
815 Assert(d == 18446744078004518913m);
\r
817 d = new Decimal(partsMaxValue);
\r
818 Assert(d == Decimal.MaxValue);
\r
820 d = new Decimal(partsMinValue);
\r
821 Assert(d == Decimal.MinValue);
\r
823 d = new Decimal(parts6);
\r
824 int[] erg = Decimal.GetBits(d);
\r
825 for (int i = 0; i < 4; i++)
\r
827 Assert(erg[i] == parts6[i]);
\r
831 public void TestFloorTruncate()
\r
833 decimal[,] dtab = {
\r
834 {0m, 0m, 0m}, {1m, 1m, 1m}, {-1m, -1m, -1m}, {1.1m, 1m, 1m},
\r
835 {-1.000000000001m, -2m, -1m}, {12345.67890m,12345m,12345m},
\r
836 {-123456789012345.67890m, -123456789012346m, -123456789012345m},
\r
837 {Decimal.MaxValue, Decimal.MaxValue, Decimal.MaxValue},
\r
838 {Decimal.MinValue, Decimal.MinValue, Decimal.MinValue},
\r
839 {6.999999999m, 6m, 6m}, {-6.999999999m, -7m, -6m},
\r
840 {0.00001m, 0m, 0m}, {-0.00001m, -1m, 0m}
\r
845 for (int i = 0; i < dtab.GetLength(0); i++)
\r
847 d = Decimal.Floor(dtab[i,0]);
\r
848 if (d != dtab[i,1])
\r
850 Fail("Floor: Floor(" + dtab[i,0] + ") != " + d);
\r
852 d = Decimal.Truncate(dtab[i,0]);
\r
853 if (d != dtab[i,2])
\r
855 Fail("Truncate: Truncate(" + dtab[i,0] + ") != " + d);
\r
861 public void Truncate ()
\r
863 decimal dd = 249.9m;
\r
864 decimal dt = Decimal.Truncate (dd);
\r
865 AssertEquals ("Original", 249.9m, dd);
\r
866 AssertEquals ("Truncate", 249m, dt);
\r
867 AssertEquals ("Cast-Byte", 249, (byte)dd);
\r
868 AssertEquals ("Cast-Char", 249, (char)dd);
\r
869 AssertEquals ("Cast-Int16", 249, (short)dd);
\r
870 AssertEquals ("Cast-UInt16", 249, (ushort)dd);
\r
871 AssertEquals ("Cast-Int32", 249, (int)dd);
\r
872 AssertEquals ("Cast-UInt32", 249, (uint)dd);
\r
873 AssertEquals ("Cast-Int64", 249, (long)dd);
\r
874 AssertEquals ("Cast-UInt64", 249, (ulong)dd);
\r
877 public void TestRound()
\r
879 decimal[,] dtab = {
\r
880 {1m, 0, 1m}, {1.234567890m, 1, 1.2m},
\r
881 {1.234567890m, 2, 1.23m}, {1.23450000001m, 3, 1.235m},
\r
882 {1.2355m, 3, 1.236m},
\r
883 {1.234567890m, 4, 1.2346m}, {1.23567890m, 2, 1.24m},
\r
884 {47893764694.4578563236436621m, 7, 47893764694.4578563m},
\r
885 {-47893764694.4578563236436621m, 9, -47893764694.457856324m},
\r
886 {-47893764694.4578m, 5, -47893764694.4578m}
\r
891 for (int i = 0; i < dtab.GetLength(0); i++)
\r
893 d = Decimal.Round(dtab[i,0], (int)dtab[i,1]);
\r
894 if (d != dtab[i,2])
\r
896 Fail("Round: Round(" + dtab[i,0] + "," + (int)dtab[i,1] + ") != " + d);
\r
901 [Ignore ("Bug 37744 - Bankers rounding not implemented")]
\r
902 // When this bug is fixed, this case can be reinserted into the above test.
\r
903 public void TestRoundFailures()
\r
905 decimal[,] dtab = {
\r
906 {1.2345m, 3, 1.234m}
\r
911 for (int i = 0; i < dtab.GetLength(0); i++)
\r
913 d = Decimal.Round(dtab[i,0], (int)dtab[i,1]);
\r
914 if (d != dtab[i,2])
\r
916 Fail("FailRound: Round(" + dtab[i,0] + "," + (int)dtab[i,1] + ") != " + d);
\r
922 public void ParseInt64 ()
\r
924 long max = Int64.MaxValue;
\r
925 Decimal dmax = Decimal.Parse (max.ToString ());
\r
926 AssertEquals ("Int64.MaxValue", Int64.MaxValue, Decimal.ToInt64 (dmax));
\r
928 long min = Int64.MinValue;
\r
929 Decimal dmin = Decimal.Parse (min.ToString ());
\r
930 AssertEquals ("Int64.MinValue", Int64.MinValue, Decimal.ToInt64 (dmin));
\r
933 dmax = Decimal.Parse (dmax.ToString ());
\r
934 AssertEquals ("Int64.MaxValue+1.1", Int64.MaxValue, Decimal.ToInt64 (dmax - 1.1m));
\r
937 dmin = Decimal.Parse (dmin.ToString ());
\r
938 AssertEquals ("Int64.MinValue-1.1", Int64.MinValue, Decimal.ToInt64 (dmin + 1.1m));
\r
942 public void ToByte ()
\r
944 Decimal d = 254.9m;
\r
945 AssertEquals ("Decimal.ToByte", 254, Decimal.ToByte (d));
\r
946 AssertEquals ("Convert.ToByte", 255, Convert.ToByte (d));
\r
947 AssertEquals ("IConvertible.ToByte", 255, (d as IConvertible).ToByte (null));
\r
951 public void ToSByte ()
\r
953 Decimal d = 126.9m;
\r
954 AssertEquals ("Decimal.ToSByte", 126, Decimal.ToSByte (d));
\r
955 AssertEquals ("Convert.ToSByte", 127, Convert.ToSByte (d));
\r
956 AssertEquals ("IConvertible.ToSByte", 127, (d as IConvertible).ToSByte (null));
\r
958 AssertEquals ("-Decimal.ToSByte", -126, Decimal.ToSByte (d));
\r
959 AssertEquals ("-Convert.ToSByte", -127, Convert.ToSByte (d));
\r
960 AssertEquals ("-IConvertible.ToSByte", -127, (d as IConvertible).ToSByte (null));
\r
964 public void ToInt16 ()
\r
966 Decimal d = 254.9m;
\r
967 AssertEquals ("Decimal.ToInt16", 254, Decimal.ToInt16 (d));
\r
968 AssertEquals ("Convert.ToInt16", 255, Convert.ToInt16 (d));
\r
969 AssertEquals ("IConvertible.ToInt16", 255, (d as IConvertible).ToInt16 (null));
\r
971 AssertEquals ("-Decimal.ToInt16", -254, Decimal.ToInt16 (d));
\r
972 AssertEquals ("-Convert.ToInt16", -255, Convert.ToInt16 (d));
\r
973 AssertEquals ("-IConvertible.ToInt16", -255, (d as IConvertible).ToInt16 (null));
\r
977 public void ToUInt16 ()
\r
979 Decimal d = 254.9m;
\r
980 AssertEquals ("Decimal.ToUInt16", 254, Decimal.ToUInt16 (d));
\r
981 AssertEquals ("Convert.ToUInt16", 255, Convert.ToUInt16 (d));
\r
982 AssertEquals ("IConvertible.ToUInt16", 255, (d as IConvertible).ToUInt16 (null));
\r
986 public void ToInt32 ()
\r
988 Decimal d = 254.9m;
\r
989 AssertEquals ("Decimal.ToInt32", 254, Decimal.ToInt32 (d));
\r
990 AssertEquals ("Convert.ToInt32", 255, Convert.ToInt32 (d));
\r
991 AssertEquals ("IConvertible.ToInt32", 255, (d as IConvertible).ToInt32 (null));
\r
993 AssertEquals ("-Decimal.ToInt32", -254, Decimal.ToInt32 (d));
\r
994 AssertEquals ("-Convert.ToInt32", -255, Convert.ToInt32 (d));
\r
995 AssertEquals ("-IConvertible.ToInt32", -255, (d as IConvertible).ToInt32 (null));
\r
999 public void ToUInt32 ()
\r
1001 Decimal d = 254.9m;
\r
1002 AssertEquals ("Decimal.ToUInt32", 254, Decimal.ToUInt32 (d));
\r
1003 AssertEquals ("Convert.ToUInt32", 255, Convert.ToUInt32 (d));
\r
1004 AssertEquals ("IConvertible.ToUInt32", 255, (d as IConvertible).ToUInt32 (null));
\r
1008 public void ToInt64 ()
\r
1010 Decimal d = 254.9m;
\r
1011 AssertEquals ("Decimal.ToInt64", 254, Decimal.ToInt64 (d));
\r
1012 AssertEquals ("Convert.ToInt64", 255, Convert.ToInt64 (d));
\r
1013 AssertEquals ("IConvertible.ToInt64", 255, (d as IConvertible).ToInt64 (null));
\r
1015 AssertEquals ("-Decimal.ToInt64", -254, Decimal.ToInt64 (d));
\r
1016 AssertEquals ("-Convert.ToInt64", -255, Convert.ToInt64 (d));
\r
1017 AssertEquals ("-IConvertible.ToInt64", -255, (d as IConvertible).ToInt64 (null));
\r
1021 [ExpectedException (typeof(OverflowException))]
\r
1022 public void ToInt64_TooBig ()
\r
1024 Decimal d = (Decimal) Int64.MaxValue;
\r
1026 long value = Decimal.ToInt64 (d);
\r
1030 [ExpectedException (typeof(OverflowException))]
\r
1031 public void ToInt64_TooSmall ()
\r
1033 Decimal d = (Decimal) Int64.MinValue;
\r
1035 long value = Decimal.ToInt64 (d);
\r
1039 public void ToUInt64 ()
\r
1041 Decimal d = 254.9m;
\r
1042 AssertEquals ("Decimal.ToUInt64", 254, Decimal.ToUInt64 (d));
\r
1043 AssertEquals ("Convert.ToUInt64", 255, Convert.ToUInt64 (d));
\r
1044 AssertEquals ("IConvertible.ToUInt64", 255, (d as IConvertible).ToUInt64 (null));
\r
1048 public void ToSingle ()
\r
1050 Decimal d = 254.9m;
\r
1051 AssertEquals ("Decimal.ToSingle", 254.9f, Decimal.ToSingle (d));
\r
1052 AssertEquals ("Convert.ToSingle", 254.9f, Convert.ToSingle (d));
\r
1053 AssertEquals ("IConvertible.ToSingle", 254.9f, (d as IConvertible).ToSingle (null));
\r
1055 AssertEquals ("-Decimal.ToSingle", -254.9f, Decimal.ToSingle (d));
\r
1056 AssertEquals ("-Convert.ToSingle", -254.9f, Convert.ToSingle (d));
\r
1057 AssertEquals ("-IConvertible.ToSingle", -254.9f, (d as IConvertible).ToSingle (null));
\r
1061 public void ToDouble ()
\r
1063 Decimal d = 254.9m;
\r
1064 AssertEquals ("Decimal.ToDouble", 254.9d, Decimal.ToDouble (d));
\r
1065 AssertEquals ("Convert.ToDouble", 254.9d, Convert.ToDouble (d));
\r
1066 AssertEquals ("IConvertible.ToDouble", 254.9d, (d as IConvertible).ToDouble (null));
\r
1068 AssertEquals ("-Decimal.ToDouble", -254.9d, Decimal.ToDouble (d));
\r
1069 AssertEquals ("-Convert.ToDouble", -254.9d, Convert.ToDouble (d));
\r
1070 AssertEquals ("-IConvertible.ToDouble", -254.9d, (d as IConvertible).ToDouble (null));
\r
1074 public void ToString_Defaults ()
\r
1076 Decimal d = 254.9m;
\r
1077 // everything defaults to "G"
\r
1078 string def = d.ToString ("G");
\r
1079 AssertEquals ("ToString()", def, d.ToString ());
\r
1080 AssertEquals ("ToString((IFormatProvider)null)", def, d.ToString ((IFormatProvider)null));
\r
1081 AssertEquals ("ToString((string)null)", def, d.ToString ((string)null));
\r
1082 AssertEquals ("ToString(empty)", def, d.ToString (String.Empty));
\r
1083 AssertEquals ("ToString(null,null)", def, d.ToString (null, null));
\r
1084 AssertEquals ("ToString(empty,null)", def, d.ToString (String.Empty, null));
\r
1086 AssertEquals ("ToString()", "254.9", def);
\r
1090 public void CastTruncRounding ()
\r
1092 // casting truncs decimal value (not normal nor banker's rounding)
\r
1093 AssertEquals ("254.9==254", 254, (long)(254.9m));
\r
1094 AssertEquals ("-254.9=-254", -254, (long)(-254.9m));
\r
1095 AssertEquals ("255.9==256", 255, (long)(255.9m));
\r
1096 AssertEquals ("-255.9=-256", -255, (long)(-255.9m));
\r
1100 public void ParseFractions ()
\r
1102 Decimal.Parse ("0.523456789012345467890123456789", CultureInfo.InvariantCulture);
\r
1103 Decimal.Parse ("0.49214206543486529434634231456", CultureInfo.InvariantCulture);
\r
1107 [ExpectedException (typeof (OverflowException))]
\r
1108 public void ParseFractions_TooSmall ()
\r
1110 Decimal.Parse ("0.0000000000000000000000000000001", CultureInfo.InvariantCulture);
\r