1 // DoubleTest.cs - NUnit Test Cases for the System.Double class
3 // Bob Doan <bdoan@sicompos.com>
5 // (C) Ximian, Inc. http://www.ximian.com
6 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
10 using System.Collections;
11 using System.Globalization;
12 using System.Threading;
14 using NUnit.Framework;
16 namespace MonoTests.System {
19 public class DoubleTest : Assertion {
21 private const Double d_zero = 0.0;
22 private const Double d_neg = -1234.5678;
23 private const Double d_pos = 1234.9999;
24 private const Double d_pos2 = 1234.9999;
25 private const Double d_nan = Double.NaN;
26 private const Double d_pinf = Double.PositiveInfinity;
27 private const Double d_ninf = Double.NegativeInfinity;
28 private const String s = "What Ever";
29 private NumberFormatInfo Nfi = NumberFormatInfo.InvariantInfo;
32 private string[] string_values = {
33 "1", ".1", "1.1", "-12", "44.444432", ".000021121",
34 " .00001", " .223 ", " -221.3233",
35 " 1.7976931348623157e308 ", "+1.7976931348623157E308", "-1.7976931348623157e308",
36 "4.9406564584124650e-324",
37 "6.28318530717958647692528676655900577",
39 "6363883797383966.2933E-726",
42 private string[] string_values_fail = {
44 "- 1.0" // Inner whitespace
47 private double[] double_values = {
48 1, .1, 1.1, -12, 44.444432, .000021121,
49 .00001, .223, -221.3233,
50 1.7976931348623157e308, 1.7976931348623157e308, -1.7976931348623157e308,
51 4.9406564584124650e-324,
52 6.28318530717958647692528676655900577,
58 public void GetReady()
60 string sep = NumberFormatInfo.CurrentInfo.NumberDecimalSeparator;
61 string_values [0] = "1";
62 string_values [1] = sep + "1";
63 string_values [2] = "1" + sep + "1";
64 string_values [3] = "-12";
65 string_values [4] = "44" + sep + "444432";
66 string_values [5] = sep + "000021121";
67 string_values [6] = " " + sep + "00001";
68 string_values [7] = " " + sep + "223 ";
69 string_values [8] = " -221" + sep + "3233";
70 string_values [9] = " 1" + sep + "7976931348623157e308 ";
71 string_values [10] = "+1" + sep + "7976931348623157E308";
72 string_values [11] = "-1" + sep + "7976931348623157e308";
73 string_values [12] = "4" + sep + "9406564584124650e-324";
74 string_values [13] = "6" + sep + "28318530717958647692528676655900577";
75 string_values [14] = "1e-05";
79 public void PublicFields ()
81 Assertion.AssertEquals("Epsilon Field has wrong value", 3.9406564584124654e-324, Double.Epsilon);
82 Assertion.AssertEquals("MaxValue Field has wrong value", 1.7976931348623157e+308, Double.MaxValue);
83 Assertion.AssertEquals("MinValue Field has wrong value", -1.7976931348623157e+308, Double.MinValue);
84 Assertion.AssertEquals("NegativeInfinity Field has wrong value", (double)-1.0 / (double)(0.0), Double.NegativeInfinity);
85 Assertion.AssertEquals("PositiveInfinity Field has wrong value", (double)1.0 / (double)(0.0), Double.PositiveInfinity);
89 public void CompareTo () {
90 //If you do int foo = d_ninf.CompareTo(d_pinf); Assertion.Assert(".." foo < 0, true) this works.... WHY???
91 Assertion.Assert("CompareTo Infinity failed", d_ninf.CompareTo(d_pinf) < 0);
93 Assertion.Assert("CompareTo Failed01", d_neg.CompareTo(d_pos) < 0);
94 Assertion.Assert("CompareTo NaN Failed", d_nan.CompareTo(d_neg) < 0);
96 Assertion.AssertEquals("CompareTo Failed02", 0, d_pos.CompareTo(d_pos2));
97 Assertion.AssertEquals("CompareTo Failed03", 0, d_pinf.CompareTo(d_pinf));
98 Assertion.AssertEquals("CompareTo Failed04", 0, d_ninf.CompareTo(d_ninf));
99 Assertion.AssertEquals("CompareTo Failed05", 0, d_nan.CompareTo(d_nan));
101 Assertion.Assert("CompareTo Failed06", d_pos.CompareTo(d_neg) > 0);
102 Assertion.Assert("CompareTo Failed07", d_pos.CompareTo(d_nan) > 0);
103 Assertion.Assert("CompareTo Failed08", d_pos.CompareTo(null) > 0);
107 Assertion.Fail("CompareTo should raise a System.ArgumentException");
109 catch (Exception e) {
110 Assertion.AssertEquals("CompareTo should be a System.ArgumentException", typeof(ArgumentException), e.GetType());
116 public void Equals () {
117 Assertion.AssertEquals("Equals Failed", true, d_pos.Equals(d_pos2));
118 Assertion.AssertEquals("Equals Failed", false, d_pos.Equals(d_neg));
119 Assertion.AssertEquals("Equals Failed", false, d_pos.Equals(s));
124 public void TestTypeCode () {
125 Assertion.AssertEquals("GetTypeCode Failed", TypeCode.Double, d_pos.GetTypeCode());
129 public void IsInfinity() {
130 Assertion.AssertEquals("IsInfinity Failed", true, Double.IsInfinity(Double.PositiveInfinity));
131 Assertion.AssertEquals("IsInfinity Failed", true, Double.IsInfinity(Double.NegativeInfinity));
132 Assertion.AssertEquals("IsInfinity Failed", false, Double.IsInfinity(12));
136 public void IsNan() {
137 Assertion.AssertEquals("IsNan Failed", true, Double.IsNaN(Double.NaN));
138 Assertion.AssertEquals("IsNan Failed", false, Double.IsNaN(12));
139 Assertion.AssertEquals("IsNan Failed", false, Double.IsNaN(Double.PositiveInfinity));
143 public void IsNegativeInfinity() {
144 Assertion.AssertEquals("IsNegativeInfinity Failed", true, Double.IsNegativeInfinity(Double.NegativeInfinity));
145 Assertion.AssertEquals("IsNegativeInfinity Failed", false, Double.IsNegativeInfinity(12));
149 public void IsPositiveInfinity() {
150 Assertion.AssertEquals("IsPositiveInfinity Failed", true, Double.IsPositiveInfinity(Double.PositiveInfinity));
151 Assertion.AssertEquals("IsPositiveInfinity Failed", false, Double.IsPositiveInfinity(12));
155 public void Parse() {
158 for(i=0;i<string_values.Length;i++) {
159 Assertion.AssertEquals("Parse Failed", double_values[i], Double.Parse(string_values[i]));
161 } catch (Exception e) {
162 Assertion.Fail("TestParse: i=" + i + " failed with e = " + e.ToString());
166 Assertion.AssertEquals("Parse Failed NumberStyles.Float", 10.1111, Double.Parse(" 10.1111 ", NumberStyles.Float, Nfi));
167 } catch (Exception e) {
168 Assertion.Fail("TestParse: Parse Failed NumberStyles.Float with e = " + e.ToString());
172 Assertion.AssertEquals("Parse Failed NumberStyles.AllowThousands", 1234.5678, Double.Parse("1,234.5678", NumberStyles.Float | NumberStyles.AllowThousands, Nfi));
173 } catch (Exception e) {
174 Assertion.Fail("TestParse: Parse Failed NumberStyles.AllowThousands with e = " + e.ToString());
179 Assertion.Fail("Parse should raise a ArgumentNullException");
181 catch (Exception e) {
182 Assertion.Assert("Parse should be a ArgumentNullException", typeof(ArgumentNullException) == e.GetType());
186 Double.Parse("save the elk");
187 Assertion.Fail("Parse should raise a FormatException");
189 catch (Exception e) {
190 Assertion.Assert("Parse should be a FormatException", typeof(FormatException) == e.GetType());
193 string sep = NumberFormatInfo.CurrentInfo.NumberDecimalSeparator;
196 ovf_plus = Double.Parse("1" + sep + "79769313486232e308");
197 Assertion.Fail("Parse should have raised an OverflowException +");
199 catch (Exception e) {
200 Assertion.AssertEquals("Should be an OverflowException + for " + ovf_plus, typeof(OverflowException), e.GetType());
204 Double.Parse("-1" + sep + "79769313486232e308");
205 Assertion.Fail("Parse should have raised an OverflowException -");
207 catch (Exception e) {
208 Assertion.AssertEquals("Should be an OverflowException -", typeof(OverflowException), e.GetType());
211 for (i = 0; i < string_values_fail.Length; ++i) {
213 Double.Parse (string_values_fail [i]);
214 Assertion.Fail ("Parse () should fail on '" + string_values_fail [i]);
216 catch (FormatException) {
222 public void TestToString() {
223 //ToString is not yet Implemented......
224 //Assertion.AssertEquals("ToString Failed", "1234.9999", d_pos.ToString());
230 Assertion.Fail("Should have thrown FormatException");
231 } catch (FormatException) {
232 /* do nothing, this is what we expect */
233 } catch (Exception e) {
234 Assertion.Fail("Unexpected exception e: " + e);
237 CustomFormatHelper();
241 private class Element {
243 public string format;
244 public string result;
245 public Element (double value, string format, string result) {
247 this.format = format;
248 this.result = result;
252 public void CustomFormatHelper () {
254 NumberFormatInfo nfi = new NumberFormatInfo();
256 nfi.NaNSymbol = "NaN";
257 nfi.PositiveSign = "+";
258 nfi.NegativeSign = "-";
259 nfi.PerMilleSymbol = "x";
260 nfi.PositiveInfinitySymbol = "Infinity";
261 nfi.NegativeInfinitySymbol = "-Infinity";
263 nfi.NumberDecimalDigits = 5;
264 nfi.NumberDecimalSeparator = ".";
265 nfi.NumberGroupSeparator = ",";
266 nfi.NumberGroupSizes = new int[] {3};
267 nfi.NumberNegativePattern = 2;
269 nfi.CurrencyDecimalDigits = 2;
270 nfi.CurrencyDecimalSeparator = ".";
271 nfi.CurrencyGroupSeparator = ",";
272 nfi.CurrencyGroupSizes = new int[] {3};
273 nfi.CurrencyNegativePattern = 8;
274 nfi.CurrencyPositivePattern = 3;
275 nfi.CurrencySymbol = "$";
277 nfi.PercentDecimalDigits = 5;
278 nfi.PercentDecimalSeparator = ".";
279 nfi.PercentGroupSeparator = ",";
280 nfi.PercentGroupSizes = new int[] {3};
281 nfi.PercentNegativePattern = 0;
282 nfi.PercentPositivePattern = 0;
283 nfi.PercentSymbol = "%";
285 ArrayList list = new ArrayList();
286 list.Add(new Element(123d, "#####", "123"));
287 list.Add(new Element(123d, "00000", "00123"));
288 list.Add(new Element(123d, "(###) ### - ####", "() - 123"));
289 list.Add(new Element(123d, "#.##", "123"));
290 list.Add(new Element(123d, "0.00", "123.00"));
291 list.Add(new Element(123d, "00.00", "123.00"));
292 list.Add(new Element(123d, "#,#", "123"));
293 list.Add(new Element(123d, "#,,", ""));
294 list.Add(new Element(123d, "#,,,", ""));
295 list.Add(new Element(123d, "#,##0,,", "0"));
296 list.Add(new Element(123d, "#0.##%", "12300%"));
297 list.Add(new Element(123d, "0.###E+0", "1.23E+2"));
298 list.Add(new Element(123d, "0.###E+000", "1.23E+002"));
299 list.Add(new Element(123d, "0.###E-000", "1.23E002"));
300 list.Add(new Element(123d, "[##-##-##]", "[-1-23]"));
301 list.Add(new Element(123d, "##;(##)", "123"));
302 list.Add(new Element(123d, "##;(##)", "123"));
303 list.Add(new Element(1234567890d, "#####", "1234567890"));
304 list.Add(new Element(1234567890d, "00000", "1234567890"));
305 list.Add(new Element(1234567890d,
306 "(###) ### - ####", "(123) 456 - 7890"));
307 list.Add(new Element(1234567890d, "#.##", "1234567890"));
308 list.Add(new Element(1234567890d, "0.00", "1234567890.00"));
309 list.Add(new Element(1234567890d, "00.00", "1234567890.00"));
310 list.Add(new Element(1234567890d, "#,#", "1,234,567,890"));
311 list.Add(new Element(1234567890d, "#,,", "1235"));
312 list.Add(new Element(1234567890d, "#,,,", "1"));
313 list.Add(new Element(1234567890d, "#,##0,,", "1,235"));
314 list.Add(new Element(1234567890d, "#0.##%", "123456789000%"));
315 list.Add(new Element(1234567890d, "0.###E+0", "1.235E+9"));
316 list.Add(new Element(1234567890d, "0.###E+000", "1.235E+009"));
317 list.Add(new Element(1234567890d, "0.###E-000", "1.235E009"));
318 list.Add(new Element(1234567890d, "[##-##-##]", "[123456-78-90]"));
319 list.Add(new Element(1234567890d, "##;(##)", "1234567890"));
320 list.Add(new Element(1234567890d, "##;(##)", "1234567890"));
321 list.Add(new Element(1.2d, "#####", "1"));
322 list.Add(new Element(1.2d, "00000", "00001"));
323 list.Add(new Element(1.2d, "(###) ### - ####", "() - 1"));
324 list.Add(new Element(1.2d, "#.##", "1.2"));
325 list.Add(new Element(1.2d, "0.00", "1.20"));
326 list.Add(new Element(1.2d, "00.00", "01.20"));
327 list.Add(new Element(1.2d, "#,#", "1"));
328 list.Add(new Element(1.2d, "#,,", ""));
329 list.Add(new Element(1.2d, "#,,,", ""));
330 list.Add(new Element(1.2d, "#,##0,,", "0"));
331 list.Add(new Element(1.2d, "#0.##%", "120%"));
332 list.Add(new Element(1.2d, "0.###E+0", "1.2E+0"));
333 list.Add(new Element(1.2d, "0.###E+000", "1.2E+000"));
334 list.Add(new Element(1.2d, "0.###E-000", "1.2E000"));
335 list.Add(new Element(1.2d, "[##-##-##]", "[--1]"));
336 list.Add(new Element(1.2d, "##;(##)", "1"));
337 list.Add(new Element(1.2d, "##;(##)", "1"));
338 list.Add(new Element(0.086d, "#####", ""));
339 list.Add(new Element(0.086d, "00000", "00000"));
340 list.Add(new Element(0.086d, "(###) ### - ####", "() - "));
341 list.Add(new Element(0.086d, "#.##", ".09"));
342 list.Add(new Element(0.086d, "0.00", "0.09"));
343 list.Add(new Element(0.086d, "00.00", "00.09"));
344 list.Add(new Element(0.086d, "#,#", ""));
345 list.Add(new Element(0.086d, "#,,", ""));
346 list.Add(new Element(0.086d, "#,,,", ""));
347 list.Add(new Element(0.086d, "#,##0,,", "0"));
348 list.Add(new Element(0.086d, "#0.##%", "8.6%"));
349 list.Add(new Element(0.086d, "0.###E+0", "8.6E-2"));
350 list.Add(new Element(0.086d, "0.###E+000", "8.6E-002"));
351 list.Add(new Element(0.086d, "0.###E-000", "8.6E-002"));
352 list.Add(new Element(0.086d, "[##-##-##]", "[--]"));
353 list.Add(new Element(0.086d, "##;(##)", ""));
354 list.Add(new Element(0.086d, "##;(##)", ""));
355 list.Add(new Element(86000d, "#####", "86000"));
356 list.Add(new Element(86000d, "00000", "86000"));
357 list.Add(new Element(86000d, "(###) ### - ####", "() 8 - 6000"));
358 list.Add(new Element(86000d, "#.##", "86000"));
359 list.Add(new Element(86000d, "0.00", "86000.00"));
360 list.Add(new Element(86000d, "00.00", "86000.00"));
361 list.Add(new Element(86000d, "#,#", "86,000"));
362 list.Add(new Element(86000d, "#,,", ""));
363 list.Add(new Element(86000d, "#,,,", ""));
364 list.Add(new Element(86000d, "#,##0,,", "0"));
365 list.Add(new Element(86000d, "#0.##%", "8600000%"));
366 list.Add(new Element(86000d, "0.###E+0", "8.6E+4"));
367 list.Add(new Element(86000d, "0.###E+000", "8.6E+004"));
368 list.Add(new Element(86000d, "0.###E-000", "8.6E004"));
369 list.Add(new Element(86000d, "[##-##-##]", "[8-60-00]"));
370 list.Add(new Element(86000d, "##;(##)", "86000"));
371 list.Add(new Element(86000d, "##;(##)", "86000"));
372 list.Add(new Element(123456d, "#####", "123456"));
373 list.Add(new Element(123456d, "00000", "123456"));
374 list.Add(new Element(123456d, "(###) ### - ####", "() 12 - 3456"));
375 list.Add(new Element(123456d, "#.##", "123456"));
376 list.Add(new Element(123456d, "0.00", "123456.00"));
377 list.Add(new Element(123456d, "00.00", "123456.00"));
378 list.Add(new Element(123456d, "#,#", "123,456"));
379 list.Add(new Element(123456d, "#,,", ""));
380 list.Add(new Element(123456d, "#,,,", ""));
381 list.Add(new Element(123456d, "#,##0,,", "0"));
382 list.Add(new Element(123456d, "#0.##%", "12345600%"));
383 list.Add(new Element(123456d, "0.###E+0", "1.235E+5"));
384 list.Add(new Element(123456d, "0.###E+000", "1.235E+005"));
385 list.Add(new Element(123456d, "0.###E-000", "1.235E005"));
386 list.Add(new Element(123456d, "[##-##-##]", "[12-34-56]"));
387 list.Add(new Element(123456d, "##;(##)", "123456"));
388 list.Add(new Element(123456d, "##;(##)", "123456"));
389 list.Add(new Element(1234d, "#####", "1234"));
390 list.Add(new Element(1234d, "00000", "01234"));
391 list.Add(new Element(1234d, "(###) ### - ####", "() - 1234"));
392 list.Add(new Element(1234d, "#.##", "1234"));
393 list.Add(new Element(1234d, "0.00", "1234.00"));
394 list.Add(new Element(1234d, "00.00", "1234.00"));
395 list.Add(new Element(1234d, "#,#", "1,234"));
396 list.Add(new Element(1234d, "#,,", ""));
397 list.Add(new Element(1234d, "#,,,", ""));
398 list.Add(new Element(1234d, "#,##0,,", "0"));
399 list.Add(new Element(1234d, "#0.##%", "123400%"));
400 list.Add(new Element(1234d, "0.###E+0", "1.234E+3"));
401 list.Add(new Element(1234d, "0.###E+000", "1.234E+003"));
402 list.Add(new Element(1234d, "0.###E-000", "1.234E003"));
403 list.Add(new Element(1234d, "[##-##-##]", "[-12-34]"));
404 list.Add(new Element(1234d, "##;(##)", "1234"));
405 list.Add(new Element(1234d, "##;(##)", "1234"));
406 list.Add(new Element(-1234d, "#####", "-1234"));
407 list.Add(new Element(-1234d, "00000", "-01234"));
408 list.Add(new Element(-1234d, "(###) ### - ####", "-() - 1234"));
409 list.Add(new Element(-1234d, "#.##", "-1234"));
410 list.Add(new Element(-1234d, "0.00", "-1234.00"));
411 list.Add(new Element(-1234d, "00.00", "-1234.00"));
412 list.Add(new Element(-1234d, "#,#", "-1,234"));
413 list.Add(new Element(-1234d, "#,,", ""));
414 list.Add(new Element(-1234d, "#,,,", ""));
415 list.Add(new Element(-1234d, "#,##0,,", "0"));
416 list.Add(new Element(-1234d, "#0.##%", "-123400%"));
417 list.Add(new Element(-1234d, "0.###E+0", "-1.234E+3"));
418 list.Add(new Element(-1234d, "0.###E+000", "-1.234E+003"));
419 list.Add(new Element(-1234d, "0.###E-000", "-1.234E003"));
420 list.Add(new Element(-1234d, "[##-##-##]", "-[-12-34]"));
421 list.Add(new Element(-1234d, "##;(##)", "(1234)"));
422 list.Add(new Element(-1234d, "##;(##)", "(1234)"));
423 list.Add(new Element(12345678901234567890.123d,
424 "#####", "12345678901234600000"));
425 list.Add(new Element(12345678901234567890.123d,
426 "00000", "12345678901234600000"));
427 list.Add(new Element(12345678901234567890.123d,
428 "(###) ### - ####", "(1234567890123) 460 - 0000"));
429 list.Add(new Element(12345678901234567890.123d,
430 "#.##", "12345678901234600000"));
431 list.Add(new Element(12345678901234567890.123d,
432 "0.00", "12345678901234600000.00"));
433 list.Add(new Element(12345678901234567890.123d,
434 "00.00", "12345678901234600000.00"));
435 list.Add(new Element(12345678901234567890.123d,
436 "#,#", "12,345,678,901,234,600,000"));
437 list.Add(new Element(12345678901234567890.123d,
438 "#,,", "12345678901235"));
439 list.Add(new Element(12345678901234567890.123d,
440 "#,,,", "12345678901"));
441 list.Add(new Element(12345678901234567890.123d,
442 "#,##0,,", "12,345,678,901,235"));
443 list.Add(new Element(12345678901234567890.123d,
444 "#0.##%", "1234567890123460000000%"));
445 list.Add(new Element(12345678901234567890.123d,
446 "0.###E+0", "1.235E+19"));
447 list.Add(new Element(12345678901234567890.123d,
448 "0.###E+000", "1.235E+019"));
449 list.Add(new Element(12345678901234567890.123d,
450 "0.###E-000", "1.235E019"));
451 list.Add(new Element(12345678901234567890.123d,
452 "[##-##-##]", "[1234567890123460-00-00]"));
453 list.Add(new Element(12345678901234567890.123d,
454 "##;(##)", "12345678901234600000"));
455 list.Add(new Element(12345678901234567890.123d,
456 "##;(##)", "12345678901234600000"));
457 foreach (Element e in list) {
458 Assertion.AssertEquals(
459 "ToString Failed: '" + e.value + "' Should be \"" + e.result + "\" with \"" + e.format + "\"",
460 e.result, e.value.ToString(e.format, nfi));
466 public void ToString_Defaults ()
469 // everything defaults to "G"
470 string def = i.ToString ("G");
471 AssertEquals ("ToString()", def, i.ToString ());
472 AssertEquals ("ToString((IFormatProvider)null)", def, i.ToString ((IFormatProvider)null));
473 AssertEquals ("ToString((string)null)", def, i.ToString ((string)null));
474 AssertEquals ("ToString(empty)", def, i.ToString (String.Empty));
475 AssertEquals ("ToString(null,null)", def, i.ToString (null, null));
476 AssertEquals ("ToString(empty,null)", def, i.ToString (String.Empty, null));
478 AssertEquals ("ToString(G)", "254.9", def);
482 public void LongLongValueRoundtrip ()
485 double d = 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000222;
486 AssertEquals ("1.97626258336499E-323", d.ToString ("R"));
491 [ExpectedException (typeof (ArgumentException))]
493 [Category ("NotWorking")]
494 // MS accept hex values under 1.x but the results neither match the long value
495 // nor the value of a 64bits double
497 public void HexNumber_WithHexToParse ()
501 Assert ("parse", Double.TryParse ("0dead", NumberStyles.HexNumber, null, out d));
502 AssertEquals ("value", 57842, d, 0);
507 [ExpectedException (typeof (ArgumentException))]
509 [Category ("NotWorking")]
510 // MS accept hex values under 1.x but the results neither match the long value
511 // nor the value of a 64bits double
513 public void HexNumber_NoHexToParse ()
516 Assert ("parse", Double.TryParse ("0", NumberStyles.HexNumber, null, out d));
517 AssertEquals ("value", 0, d, 0);
521 public void TryParseBug78546 ()
524 Assert (!Double.TryParse ("error",
525 NumberStyles.Integer, null, out value));
529 public void ParseCurrency ()
531 Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US");
532 NumberFormatInfo f = NumberFormatInfo.CurrentInfo;
533 double dMin = double.Parse ("$0.00", NumberStyles.Currency, f);