[runtime] Fix Empty generic enumerator equality
[mono.git] / mcs / class / corlib / Test / System / MathTest.cs
1 // MathTest.cs
2 //
3 // Jon Guymon (guymon@slackworks.com)
4 // Pedro Martínez Juliá (yoros@wanadoo.es)
5 //
6 // (C) 2002 Jon Guymon
7 // Copyright (C) 2003 Pedro Martínez Juliá <yoros@wanadoo.es>
8 // Copyright (C) 2004 Novell (http://www.novell.com)
9 // 
10
11 using System;
12 using NUnit.Framework;
13
14 namespace MonoTests.System
15 {
16         [TestFixture]
17         public class MathTest
18         {
19                 private static double double_epsilon = 2.2204460492503131e-16; /* DBL_EPSILON = 2^-52 */
20
21                 static double x = 0.1234;
22                 static double y = 12.345;
23
24                 [Test]
25                 public void TestDecimalAbs ()
26                 {
27                         decimal a = -9.0M;
28
29                         Assert.IsTrue (9.0M == Math.Abs (a), "#1");
30                         Assert.IsTrue (Decimal.MaxValue == Math.Abs (Decimal.MaxValue), "#2");
31                         Assert.IsTrue (Decimal.MaxValue == Math.Abs (Decimal.MinValue), "#3");
32                         Assert.IsTrue (Decimal.Zero == Math.Abs (Decimal.Zero), "#4");
33                         Assert.IsTrue (Decimal.One == Math.Abs (Decimal.One), "#5");
34                         Assert.IsTrue (Decimal.One == Math.Abs (Decimal.MinusOne), "#6");
35                 }
36
37                 [Test]
38                 public void TestDoubleAbs ()
39                 {
40                         double a = -9.0D;
41
42                         Assert.IsTrue (9.0D == Math.Abs (a), "#1");
43                         Assert.IsTrue (0.0D == Math.Abs (0.0D), "#2");
44                         Assert.IsTrue (Double.MaxValue == Math.Abs (Double.MaxValue), "#3");
45                         Assert.IsTrue (Double.MaxValue == Math.Abs (Double.MinValue), "#4");
46                         Assert.IsTrue (Double.IsPositiveInfinity (Math.Abs (Double.PositiveInfinity)), "#5");
47                         Assert.IsTrue (Double.IsPositiveInfinity (Math.Abs (Double.NegativeInfinity)), "#6");
48                         Assert.IsTrue (Double.IsNaN (Math.Abs (Double.NaN)), "#7");
49                 }
50
51                 [Test]
52                 public void TestFloatAbs ()
53                 {
54                         float a = -9.0F;
55
56                         Assert.IsTrue (9.0F == Math.Abs (a), "#1");
57                         Assert.IsTrue (0.0F == Math.Abs (0.0F), "#2");
58                         Assert.IsTrue (Single.MaxValue == Math.Abs (Single.MaxValue), "#3");
59                         Assert.IsTrue (Single.MaxValue == Math.Abs (Single.MinValue), "#4");
60                         Assert.IsTrue (Single.PositiveInfinity == Math.Abs (Single.PositiveInfinity), "#5");
61                         Assert.IsTrue (Single.PositiveInfinity == Math.Abs (Single.NegativeInfinity), "#6");
62                         Assert.IsTrue (Single.IsNaN (Math.Abs (Single.NaN)), "#7");
63                 }
64
65                 [Test]
66                 public void TestLongAbs ()
67                 {
68                         long a = -9L;
69                         long b = Int64.MinValue;
70
71                         Assert.IsTrue (9L == Math.Abs (a), "#1");
72                         try {
73                                 Math.Abs (b);
74                                 Assert.Fail ("#2");
75                         } catch (Exception e) {
76                                 Assert.AreEqual (typeof (OverflowException), e.GetType (), "#3");
77                         }
78                         Assert.IsTrue (Int64.MaxValue == Math.Abs (Int64.MaxValue), "#4");
79                 }
80
81                 [Test]
82                 public void TestIntAbs ()
83                 {
84                         int a = -9;
85                         int b = Int32.MinValue;
86
87                         Assert.IsTrue (9 == Math.Abs (a), "#1");
88                         try {
89                                 Math.Abs (b);
90                                 Assert.Fail ("#2");
91                         } catch (Exception e) {
92                                 Assert.AreEqual (typeof (OverflowException), e.GetType (), "#3");
93                         }
94                         Assert.IsTrue (Int32.MaxValue == Math.Abs (Int32.MaxValue), "#4");
95                 }
96
97                 [Test]
98                 public void TestSbyteAbs ()
99                 {
100                         sbyte a = -9;
101                         sbyte b = SByte.MinValue;
102
103                         Assert.IsTrue (9 == Math.Abs (a), "#1");
104                         try {
105                                 Math.Abs (b);
106                                 Assert.Fail ("#2");
107                         } catch (Exception e) {
108                                 Assert.AreEqual (typeof (OverflowException), e.GetType (), "#3");
109                         }
110                         Assert.IsTrue (SByte.MaxValue == Math.Abs (SByte.MaxValue), "#4");
111                 }
112
113                 [Test]
114                 public void TestShortAbs ()
115                 {
116                         short a = -9;
117                         short b = Int16.MinValue;
118
119                         Assert.IsTrue (9 == Math.Abs (a), "#1");
120                         try {
121                                 Math.Abs (b);
122                                 Assert.Fail ("#2");
123                         } catch (Exception e) {
124                                 Assert.AreEqual (typeof (OverflowException), e.GetType (), "#3");
125                         }
126                         Assert.IsTrue (Int16.MaxValue == Math.Abs (Int16.MaxValue), "#4");
127                 }
128
129                 [Test]
130                 public void TestAcos ()
131                 {
132                         double a = Math.Acos (x);
133                         double b = 1.4470809809523457;
134
135                         bool regularTest = (Math.Abs (a - b) <= double_epsilon);
136                         if (!regularTest){
137                                 //
138                                 // On MacOS X libc acos (0.1234) returns
139                                 // 1.4470809809523455 (hex 0x3ff7273e62fda9ab) instead
140                                 // of 1.4470809809523457 (hex 0x3ff7273e62fda9ac)
141                                 //
142                                 // For now, let it go
143                                 //
144                                 if (a == 1.4470809809523455)
145                                         regularTest = true;
146                         }
147                         
148                         Assert.IsTrue (regularTest, a.ToString ("G99") + " != " + b.ToString ("G99"));
149                         
150                         Assert.IsTrue (double.IsNaN (Math.Acos (-1.01D)));
151                         Assert.IsTrue (double.IsNaN (Math.Acos (1.01D)));
152                         Assert.IsTrue (double.IsNaN (Math.Acos (Double.MinValue)));
153                         Assert.IsTrue (double.IsNaN (Math.Acos (Double.MaxValue)));
154                         Assert.IsTrue (double.IsNaN (Math.Acos (Double.NegativeInfinity)));
155                         Assert.IsTrue (double.IsNaN (Math.Acos (Double.PositiveInfinity)));
156                 }
157
158                 [Test]
159                 public void TestAsin ()
160                 {
161                         double a = Math.Asin (x);
162                         double b = 0.12371534584255098;
163
164                         Assert.IsTrue ((Math.Abs (a - b) <= double_epsilon), a.ToString ("G99")
165                                 + " != " + b.ToString ("G99"));
166                         Assert.IsTrue (double.IsNaN (Math.Asin (-1.01D)));
167                         Assert.IsTrue (double.IsNaN (Math.Asin (1.01D)));
168                         Assert.IsTrue (double.IsNaN (Math.Asin (Double.MinValue)));
169                         Assert.IsTrue (double.IsNaN (Math.Asin (Double.MaxValue)));
170                         Assert.IsTrue (double.IsNaN (Math.Asin (Double.NegativeInfinity)));
171                         Assert.IsTrue (double.IsNaN (Math.Asin (Double.PositiveInfinity)));
172                 }
173
174                 [Test]
175                 public void TestAtan ()
176                 {
177                         double a = Math.Atan (x);
178                         double b = 0.12277930094473837;
179                         double c = 1.5707963267948966;
180                         double d = -1.5707963267948966;
181
182                         Assert.IsTrue ((Math.Abs (a - b) <= double_epsilon), "#1: " + a.ToString ("G99")
183                                 + " != " + b.ToString ("G99"));
184                         Assert.IsTrue (double.IsNaN (Math.Atan (double.NaN)), "should return NaN");
185                         Assert.IsTrue (Math.Abs ((double) Math.Atan (double.PositiveInfinity) - c) <= 0.0000000000000001,
186                                 "#2: " + Math.Atan (double.PositiveInfinity).ToString ("G99") + " != " + c.ToString ("G99"));
187                         Assert.IsTrue (Math.Abs ((double) Math.Atan (double.NegativeInfinity) - d) <= 0.0000000000000001,
188                                 "#3: " + Math.Atan (double.NegativeInfinity).ToString ("G99") + " != " + d.ToString ("G99"));
189                 }
190
191                 [Test]
192                 public void TestAtan2 ()
193                 {
194                         double a = Math.Atan2 (x, y);
195                         double b = 0.0099956168687207747;
196
197                         Assert.IsTrue ((Math.Abs (a - b) <= double_epsilon), a.ToString ("G99")
198                                 + " != " + b.ToString ("G99"));
199                         Assert.IsTrue (double.IsNaN (Math.Acos (-2D)));
200                         Assert.IsTrue (double.IsNaN (Math.Acos (2D)));
201                 }
202
203                 // The following test is for methods that are in ECMA but they are
204                 // not implemented in MS.NET. I leave them commented.
205                 /*
206                 public void TestBigMul () {
207                         int a = int.MaxValue;
208                         int b = int.MaxValue;
209
210                         Assert(((long)a * (long)b) == Math.BigMul(a,b));
211                 }
212                 */
213
214                 [Test]
215                 public void TestCos ()
216                 {
217                         double a = Math.Cos (x);
218                         double b = 0.99239587670489104;
219
220                         Assert.IsTrue ((Math.Abs (a - b) <= double_epsilon), a.ToString ("G99")
221                                 + " != " + b.ToString ("G99"));
222                         Assert.IsTrue (double.IsNaN (Math.Cos (Double.NaN)));
223                         Assert.IsTrue (double.IsNaN (Math.Cos (Double.NegativeInfinity)));
224                         Assert.IsTrue (double.IsNaN (Math.Cos (Double.PositiveInfinity)));
225                 }
226
227                 [Test]
228                 public void TestCosh ()
229                 {
230                         double a = Math.Cosh (x);
231                         double b = 1.0076234465130722;
232
233                         Assert.IsTrue ((Math.Abs (a - b) <= double_epsilon), a.ToString ("G99")
234                                 + " != " + b.ToString ("G99"));
235                         Assert.IsTrue (Math.Cosh (double.NegativeInfinity) == double.PositiveInfinity);
236                         Assert.IsTrue (Math.Cosh (double.PositiveInfinity) == double.PositiveInfinity);
237                         Assert.IsTrue (double.IsNaN (Math.Cosh (double.NaN)));
238                 }
239
240                 // The following test is for methods that are in ECMA but they are
241                 // not implemented in MS.NET. I leave them commented.
242                 /*
243                 public void TestIntDivRem () {
244                         int a = 5;
245                         int b = 2;
246                         int div = 0, rem = 0;
247
248                         div = Math.DivRem (a, b, out rem);
249
250                         Assert.IsTrue (rem == 1);
251                         Assert.IsTrue (div == 2);
252                 }
253
254                 public void TestLongDivRem () {
255                         long a = 5;
256                         long b = 2;
257                         long div = 0, rem = 0;
258
259                         div = Math.DivRem (a, b, out rem);
260
261                         Assert.IsTrue (rem == 1);
262                         Assert.IsTrue (div == 2);
263                 }
264                 */
265
266                 [Test]
267                 public void TestSin ()
268                 {
269                         double a = Math.Sin (x);
270                         double b = 0.12308705821137626;
271
272                         Assert.IsTrue ((Math.Abs (a - b) <= double_epsilon), a.ToString ("G99")
273                                 + " != " + b.ToString ("G99"));
274                         Assert.IsTrue (double.IsNaN (Math.Sin (Double.NaN)));
275                         Assert.IsTrue (double.IsNaN (Math.Sin (Double.NegativeInfinity)));
276                         Assert.IsTrue (double.IsNaN (Math.Sin (Double.PositiveInfinity)));
277                 }
278
279                 [Test]
280                 public void TestSinh ()
281                 {
282                         double a = Math.Sinh (x);
283                         double b = 0.12371341868561381;
284
285                         Assert.IsTrue (Math.Abs (a - b) <= 0.0000000000000001, a.ToString ("G99")
286                                 + " != " + b.ToString ("G99"));
287                         Assert.IsTrue (double.IsNaN (Math.Sinh (Double.NaN)));
288                         Assert.IsTrue (double.IsNegativeInfinity (Math.Sinh (Double.NegativeInfinity)));
289                         Assert.IsTrue (double.IsPositiveInfinity (Math.Sinh (Double.PositiveInfinity)));
290                 }
291
292                 [Test]
293                 public void TestTan ()
294                 {
295                         double a = Math.Tan (x);
296                         double b = 0.12403019913793806;
297
298                         Assert.IsTrue ((Math.Abs (a - b) <= double_epsilon), a.ToString ("G99")
299                                 + " != " + b.ToString ("G99"));
300                         Assert.IsTrue (Double.IsNaN (Math.Tan (Double.NaN)));
301                         Assert.IsTrue (Double.IsNaN (Math.Tan (Double.PositiveInfinity)));
302                         Assert.IsTrue (Double.IsNaN (Math.Tan (Double.NegativeInfinity)));
303                 }
304
305                 [Test]
306                 public void TestTanh ()
307                 {
308                         double a = Math.Tanh (x);
309                         double b = 0.12277743150353424;
310
311                         Assert.IsTrue ((Math.Abs (a - b) <= double_epsilon), a.ToString ("G99")
312                                 + " != " + b.ToString ("G99"));
313                         Assert.IsTrue (Double.IsNaN (Math.Tanh (Double.NaN)),
314                                 "Tanh(NaN) should be NaN");
315                         Assert.IsTrue (1 == Math.Tanh (Double.PositiveInfinity),
316                                 "Tanh(+Infinity) should be 1");
317                         Assert.IsTrue (-1 == Math.Tanh (Double.NegativeInfinity),
318                                 "Tanh(-Infinity) should be -1");
319                 }
320
321                 [Test]
322                 public void TestSqrt ()
323                 {
324                         double a = Math.Sqrt (x);
325                         double b = 0.35128336140500593;
326
327                         Assert.IsTrue ((Math.Abs (a - b) <= double_epsilon), a.ToString ("G99")
328                                 + " != " + b.ToString ("G99"));
329                         Assert.IsTrue (Double.IsNaN (Math.Sqrt (Double.NaN)));
330                         Assert.IsTrue (Double.IsPositiveInfinity (Math.Sqrt (Double.PositiveInfinity)));
331                         Assert.IsTrue (Double.IsNaN (Math.Sqrt (Double.NegativeInfinity)));
332                 }
333
334                 [Test]
335                 public void TestExp ()
336                 {
337                         double a = Math.Exp (x);
338                         double b = 1.1313368651986859;
339
340                         Assert.IsTrue ((Math.Abs (a - b) <= double_epsilon), a.ToString ("G99")
341                                 + " != " + b.ToString ("G99"));
342                         Assert.IsTrue (double.IsNaN (Math.Exp (double.NaN)));
343                         Assert.IsTrue (Math.Exp (double.NegativeInfinity) == 0);
344                         Assert.IsTrue (Math.Exp (double.PositiveInfinity) == double.PositiveInfinity);
345                 }
346
347                 [Test]
348                 public void TestCeiling ()
349                 {
350                         int iTest = 1;
351                         try {
352                                 double a = Math.Ceiling (1.5);
353                                 double b = 2;
354
355                                 iTest++;
356                                 Assert.IsTrue ((Math.Abs (a - b) <= double_epsilon), a.ToString ("G99")
357                                         + " != " + b.ToString ("G99"));
358                                 iTest++;
359                                 Assert.IsTrue (Math.Ceiling (double.NegativeInfinity) == double.NegativeInfinity);
360                                 iTest++;
361                                 Assert.IsTrue (Math.Ceiling (double.PositiveInfinity) == double.PositiveInfinity);
362                                 iTest++;
363                                 Assert.IsTrue (double.IsNaN (Math.Ceiling (double.NaN)));
364
365                                 iTest++;
366                                 Assert.IsTrue (Double.MaxValue == Math.Ceiling (Double.MaxValue));
367
368                                 iTest++;
369                                 Assert.IsTrue (Double.MinValue == Math.Ceiling (Double.MinValue));
370                         } catch (Exception e) {
371                                 Assert.Fail ("Unexpected Exception at iTest=" + iTest + ": " + e);
372                         }
373                 }
374
375                 [Test]
376                 public void TestDecimalCeiling()
377                 {
378                         decimal a = Math.Ceiling(1.5M);
379                         decimal b = 2M;
380
381                         Assert.IsTrue (a == b, "#1");
382                         Assert.IsTrue (Decimal.MaxValue == Math.Ceiling(Decimal.MaxValue), "#2");
383                         Assert.IsTrue (Decimal.MinValue == Math.Ceiling(Decimal.MinValue), "#3");
384                 }
385
386                 [Test]
387                 public void TestFloor ()
388                 {
389                         double a = Math.Floor (1.5);
390                         double b = 1;
391
392                         Assert.IsTrue ((Math.Abs (a - b) <= double_epsilon), a.ToString ("G99")
393                                 + " != " + b.ToString ("G99"));
394                         Assert.IsTrue (Math.Floor (double.NegativeInfinity) == double.NegativeInfinity);
395                         Assert.IsTrue (Math.Floor (double.PositiveInfinity) == double.PositiveInfinity);
396                         Assert.IsTrue (double.IsNaN (Math.Floor (double.NaN)));
397
398                         Assert.IsTrue (Double.MaxValue == Math.Floor (Double.MaxValue));
399
400                         Assert.IsTrue (Double.MinValue == Math.Floor (Double.MinValue));
401                 }
402
403                 [Test]
404                 public void TestIEEERemainder ()
405                 {
406                         double a = Math.IEEERemainder (y, x);
407                         double b = 0.0050000000000010592;
408
409                         Assert.IsTrue ((Math.Abs (a - b) <= double_epsilon), a.ToString ("G99")
410                                 + " != " + b.ToString ("G99"));
411
412                         Assert.IsTrue (double.IsNaN (Math.IEEERemainder (y, 0)), "Positive 0");
413
414                         // http://www.obtuse.com/resources/negative_zero.html
415                         double n0 = BitConverter.Int64BitsToDouble (Int64.MinValue);
416                         Assert.IsTrue (double.IsNaN (Math.IEEERemainder (n0, 0)), "Negative 0");
417
418                         // the "zero" remainder of negative number is negative
419                         long result = BitConverter.DoubleToInt64Bits (Math.IEEERemainder (-1, 1));
420                         Assert.AreEqual (Int64.MinValue, result, "Negative Dividend");
421                 }
422
423                 [Test]
424                 public void TestLog ()
425                 {
426                         double a = Math.Log (y);
427                         double b = 2.513251122797143;
428
429                         Assert.IsTrue ((Math.Abs (a - b) <= double_epsilon), a.ToString ("G99")
430                                 + " != " + b.ToString ("G99"));
431                         Assert.IsTrue (double.IsNaN (Math.Log (-1)));
432                         Assert.IsTrue (double.IsNaN (Math.Log (double.NaN)));
433
434                         // MS docs say this should be PositiveInfinity
435                         Assert.IsTrue (Math.Log (0) == double.NegativeInfinity);
436                         Assert.IsTrue (Math.Log (double.PositiveInfinity) == double.PositiveInfinity);
437                 }
438
439                 [Test]
440                 public void TestLog2 ()
441                 {
442                         double a = Math.Log (x, y);
443                         double b = -0.83251695325303621;
444
445                         Assert.IsTrue ((Math.Abs (a - b) <= 1e-14), a + " != " + b
446                                 + " because diff is " + Math.Abs (a - b));
447                         Assert.IsTrue (double.IsNaN (Math.Log (-1, y)));
448                         Assert.IsTrue (double.IsNaN (Math.Log (double.NaN, y)));
449                         Assert.IsTrue (double.IsNaN (Math.Log (x, double.NaN)));
450                         Assert.IsTrue (double.IsNaN (Math.Log (double.NegativeInfinity, y)));
451                         Assert.IsTrue (double.IsNaN (Math.Log (x, double.NegativeInfinity)));
452                         Assert.IsTrue (double.IsNaN (Math.Log (double.PositiveInfinity, double.PositiveInfinity)));
453                         Assert.IsTrue (double.IsNaN (Math.Log (2, 1)));
454
455                         // MS docs say this should be PositiveInfinity
456                         Assert.IsTrue (Math.Log (0, y) == double.NegativeInfinity);
457                         Assert.IsTrue (Math.Log (double.PositiveInfinity, y) == double.PositiveInfinity);
458
459                         Assert.IsTrue (Double.IsNaN (Math.Log (x, double.PositiveInfinity)));
460                 }
461
462                 [Test]
463                 public void TestLog10 ()
464                 {
465                         double a = Math.Log10 (x);
466                         double b = -0.90868484030277719;
467
468                         Assert.IsTrue ((Math.Abs (a - b) <= double_epsilon), a.ToString ("G99")
469                                 + " != " + b.ToString ("G99"));
470                         Assert.IsTrue (double.IsNaN (Math.Log10 (-1)));
471                         Assert.IsTrue (double.IsNaN (Math.Log10 (double.NaN)));
472
473                         // MS docs say this should be PositiveInfinity
474                         Assert.IsTrue (Math.Log10 (0) == double.NegativeInfinity);
475                         Assert.IsTrue (Math.Log10 (double.PositiveInfinity) == double.PositiveInfinity);
476
477                 }
478
479                 [Test]
480                 public void TestPow ()
481                 {
482                         double precision;
483 #if MONODROID
484                         // It fails on Nexus 9 with
485                         //
486                         //   1.3636094460602122 != 1.3636094460602119
487                         //
488                         // when using double_epsilon. Precision differs between different ARM CPUs, so we
489                         // will just use a more conservative value
490                         precision = double_epsilon * 10;
491 #else
492                         precision = double_epsilon;
493 #endif
494
495                         /* documentation cases : https://msdn.microsoft.com/en-us/library/system.math.pow%28v=vs.110%29.aspx */
496
497                         /* x or y = NaN -> NaN */
498                         Assert.IsTrue (double.IsNaN (Math.Pow (             double.NaN,              double.NaN)), "#1");
499                         Assert.IsTrue (double.IsNaN (Math.Pow (             double.NaN, double.NegativeInfinity)), "#2");
500                         Assert.IsTrue (double.IsNaN (Math.Pow (             double.NaN,                      -2)), "#2");
501                         Assert.IsTrue (double.IsNaN (Math.Pow (             double.NaN,                      -1)), "#3");
502                         Assert.IsTrue (double.IsNaN (Math.Pow (             double.NaN,                       0)), "#4");
503                         Assert.IsTrue (double.IsNaN (Math.Pow (             double.NaN,                       1)), "#5");
504                         Assert.IsTrue (double.IsNaN (Math.Pow (             double.NaN,                       2)), "#6");
505                         Assert.IsTrue (double.IsNaN (Math.Pow (             double.NaN, double.PositiveInfinity)), "#7");
506                         Assert.IsTrue (double.IsNaN (Math.Pow (double.NegativeInfinity,              double.NaN)), "#8");
507                         Assert.IsTrue (double.IsNaN (Math.Pow (                     -2,              double.NaN)), "#9");
508                         Assert.IsTrue (double.IsNaN (Math.Pow (                     -1,              double.NaN)), "#10");
509                         Assert.IsTrue (double.IsNaN (Math.Pow (                      0,              double.NaN)), "#11");
510                         Assert.IsTrue (double.IsNaN (Math.Pow (                      1,              double.NaN)), "#12");
511                         Assert.IsTrue (double.IsNaN (Math.Pow (                      2,              double.NaN)), "#13");
512                         Assert.IsTrue (double.IsNaN (Math.Pow (double.PositiveInfinity,              double.NaN)), "#14");
513
514                         /* x = Any value except NaN; y = 0 -> 1 */
515                         Assert.AreEqual ((double) 1, Math.Pow (2, 0), "#15");
516
517                         /* x = NegativeInfinity; y < 0 -> 0 */
518                         Assert.AreEqual ((double) 0, Math.Pow (double.NegativeInfinity, -2), "#16");
519
520                         /* x = NegativeInfinity; y is a positive odd integer -> NegativeInfinity */
521                         Assert.AreEqual (double.NegativeInfinity, Math.Pow (double.NegativeInfinity, 3), "#17");
522
523                         /* x = NegativeInfinity; y is positive but not an odd integer -> PositiveInfinity */
524                         Assert.AreEqual (double.PositiveInfinity, Math.Pow (double.NegativeInfinity, 2), "#18");
525
526                         /* x < 0 but not NegativeInfinity; y is not an integer, NegativeInfinity, or PositiveInfinity -> NaN */
527                         Assert.IsTrue (double.IsNaN (Math.Pow (-1, 2.5)), "#19");
528
529                         /* x = -1; y = NegativeInfinity or PositiveInfinity -> NaN */
530                         Assert.IsTrue (double.IsNaN (Math.Pow (-1, double.PositiveInfinity)), "#20");
531                         Assert.IsTrue (double.IsNaN (Math.Pow (-1, double.NegativeInfinity)), "#21");
532
533                         /* -1 < x < 1; y = NegativeInfinity -> PositiveInfinity */
534                         Assert.AreEqual (double.PositiveInfinity, Math.Pow (-0.5, double.NegativeInfinity), "#22");
535                         Assert.AreEqual (double.PositiveInfinity, Math.Pow (+0.5, double.NegativeInfinity), "#23");
536
537                         /* -1 < x < 1; y = PositiveInfinity -> 0 */
538                         Assert.AreEqual ((double) 0, Math.Pow (-0.5, double.PositiveInfinity), "#24");
539                         Assert.AreEqual ((double) 0, Math.Pow (+0.5, double.PositiveInfinity), "#25");
540
541                         /* x < -1 or x > 1; y = NegativeInfinity -> 0 */
542                         Assert.AreEqual ((double) 0, Math.Pow (-2, double.NegativeInfinity), "#26");
543                         Assert.AreEqual ((double) 0, Math.Pow (+2, double.NegativeInfinity), "#27");
544
545                         /* x < -1 or x > 1; y = PositiveInfinity -> PositiveInfinity */
546                         Assert.AreEqual (double.PositiveInfinity, Math.Pow (-2, double.PositiveInfinity), "#28");
547                         Assert.AreEqual (double.PositiveInfinity, Math.Pow (+2, double.PositiveInfinity), "#29");
548
549                         /* x = 0; y < 0 -> PositiveInfinity */
550                         Assert.AreEqual (double.PositiveInfinity, Math.Pow (0, -2), "#30");
551
552                         /* x = 0; y > 0 -> PositiveInfinity */
553                         Assert.AreEqual ((double) 0, Math.Pow (0, +2), "#31");
554
555                         /* x = 1; y is any value except NaN -> 1 */
556                         Assert.AreEqual ((double) 1, Math.Pow (1, double.NegativeInfinity), "#32");
557                         Assert.AreEqual ((double) 1, Math.Pow (1,                      -2), "#33");
558                         Assert.AreEqual ((double) 1, Math.Pow (1,                       0), "#34");
559                         Assert.AreEqual ((double) 1, Math.Pow (1,                      +2), "#35");
560                         Assert.AreEqual ((double) 1, Math.Pow (1, double.PositiveInfinity), "#36");
561
562                         /* x = PositiveInfinity; y < 0 -> 0 */
563                         Assert.AreEqual ((double) 0, Math.Pow (double.PositiveInfinity, -1), "#37");
564                         Assert.AreEqual ((double) 0, Math.Pow (double.PositiveInfinity, -2), "#38");
565
566                         /* x = PositiveInfinity; y > 0 -> PositiveInfinity */
567                         Assert.AreEqual (double.PositiveInfinity, Math.Pow (double.PositiveInfinity, 1), "#39");
568                         Assert.AreEqual (double.PositiveInfinity, Math.Pow (double.PositiveInfinity, 2), "#40");
569
570                         /* other cases */
571
572                         double a = Math.Pow (y, x);
573                         double b = 1.363609446060212;
574
575                         Assert.IsTrue (Math.Abs (a - b) <= precision, "#41 " + a.ToString ("G99") + " != " + b.ToString ("G99") + " +/- " + precision.ToString ("G99"));
576                         Assert.AreEqual (double.NegativeInfinity, Math.Pow (double.NegativeInfinity, 1), "#42");
577                         Assert.AreEqual (double.PositiveInfinity, Math.Pow (double.NegativeInfinity, 2), "#43");
578
579                         Assert.AreEqual (Math.Pow (double.PositiveInfinity, double.NegativeInfinity), (double) 0, "#44");
580
581                         Assert.AreEqual ((double) 1, Math.Pow (-1, Double.MaxValue), "#45");
582                         Assert.AreEqual ((double) 1, Math.Pow (-1, Double.MinValue), "#46");
583                         Assert.AreEqual ((double) 0, Math.Pow (Double.MinValue, Double.MinValue), "#47");
584                         Assert.AreEqual (double.PositiveInfinity, Math.Pow (Double.MinValue, Double.MaxValue), "#48");
585
586                         double infinity = double.PositiveInfinity;
587                         Assert.AreEqual ((double) 0, Math.Pow (      0.5,  infinity), "#49");
588                         Assert.AreEqual (  infinity, Math.Pow (      0.5, -infinity), "#50");
589                         Assert.AreEqual (  infinity, Math.Pow (        2,  infinity), "#51");
590                         Assert.AreEqual ((double) 0, Math.Pow (        2, -infinity), "#52");
591                         Assert.AreEqual ((double) 1, Math.Pow ( infinity,         0), "#53");
592                         Assert.AreEqual ((double) 1, Math.Pow (-infinity,         0), "#54");
593                 }
594
595                 [Test]
596                 public void TestByteMax ()
597                 {
598                         byte a = 1;
599                         byte b = 2;
600
601                         Assert.IsTrue (b == Math.Max (a, b), "#1");
602                         Assert.IsTrue (b == Math.Max (b, a), "#2");
603                 }
604
605                 [Test]
606                 public void TestDecimalMax ()
607                 {
608                         decimal a = 1.5M;
609                         decimal b = 2.5M;
610
611                         Assert.IsTrue (b == Math.Max (a, b), "#1");
612                         Assert.IsTrue (b == Math.Max (b, a), "#2");
613                 }
614
615                 [Test]
616                 public void TestDoubleMax ()
617                 {
618                         double a = 1.5D;
619                         double b = 2.5D;
620
621                         Assert.IsTrue (b == Math.Max (a, b), "#1");
622                         Assert.IsTrue (b == Math.Max (b, a), "#2");
623
624                         Assert.IsTrue (Double.IsNaN (Math.Max (Double.NaN, Double.NaN)), "#3");
625                         Assert.IsTrue (Double.IsNaN (Math.Max (Double.NaN, a)), "#4");
626                         Assert.IsTrue (Double.IsNaN (Math.Max (b, Double.NaN)), "#5");
627                 }
628
629                 [Test]
630                 public void TestFloatMax ()
631                 {
632                         float a = 1.5F;
633                         float b = 2.5F;
634
635                         Assert.IsTrue (b == Math.Max (a, b), "#1");
636                         Assert.IsTrue (b == Math.Max (b, a), "#2");
637                         Assert.IsTrue (Single.IsNaN (Math.Max (Single.NaN, Single.NaN)), "#3");
638                         Assert.IsTrue (Single.IsNaN (Math.Max (Single.NaN, a)), "#4");
639                         Assert.IsTrue (Single.IsNaN (Math.Max (b, Single.NaN)), "#5");
640                 }
641
642                 [Test]
643                 public void TestIntMax ()
644                 {
645                         int a = 1;
646                         int b = 2;
647                         int c = 100;
648                         int d = -2147483647;
649
650                         Assert.AreEqual (b, Math.Max (a, b), "#1");
651                         Assert.AreEqual (b, Math.Max (b, a), "#2");
652                         Assert.AreEqual (c, Math.Max (c, d), "#3");
653                         Assert.AreEqual (c, Math.Max (d, c), "#4");
654                 }
655
656                 [Test]
657                 public void TestLongMax ()
658                 {
659                         long a = 1L;
660                         long b = 2L;
661
662                         Assert.IsTrue (b == Math.Max (a, b), "#1");
663                         Assert.IsTrue (b == Math.Max (b, a), "#2");
664                 }
665
666                 [Test]
667                 public void TestSbyteMax ()
668                 {
669                         sbyte a = 1;
670                         sbyte b = 2;
671
672                         Assert.IsTrue (b == Math.Max (a, b), "#1");
673                         Assert.IsTrue (b == Math.Max (b, a), "#2");
674                 }
675
676                 [Test]
677                 public void TestShortMax ()
678                 {
679                         short a = 1;
680                         short b = 2;
681
682                         Assert.IsTrue (b == Math.Max (a, b), "#1");
683                         Assert.IsTrue (b == Math.Max (b, a), "#2");
684                 }
685
686                 [Test]
687                 public void TestUintMax ()
688                 {
689                         uint a = 1U;
690                         uint b = 2U;
691
692                         Assert.IsTrue (b == Math.Max (a, b), "#1");
693                         Assert.IsTrue (b == Math.Max (b, a), "#2");
694                 }
695
696                 [Test]
697                 public void TestUlongMax ()
698                 {
699                         ulong a = 1UL;
700                         ulong b = 2UL;
701
702                         Assert.IsTrue (b == Math.Max (a, b), "#1");
703                         Assert.IsTrue (b == Math.Max (b, a), "#2");
704                 }
705
706                 [Test]
707                 public void TestUshortMax ()
708                 {
709                         ushort a = 1;
710                         ushort b = 2;
711
712                         Assert.IsTrue (b == Math.Max (a, b), "#1");
713                         Assert.IsTrue (b == Math.Max (b, a), "#2");
714                 }
715
716                 [Test]
717                 public void TestByteMin ()
718                 {
719                         byte a = 1;
720                         byte b = 2;
721
722                         Assert.IsTrue (a == Math.Min (a, b), "#1");
723                         Assert.IsTrue (a == Math.Min (b, a), "#2");
724                 }
725
726                 [Test]
727                 public void TestDecimalMin ()
728                 {
729                         decimal a = 1.5M;
730                         decimal b = 2.5M;
731
732                         Assert.IsTrue (a == Math.Min (a, b), "#1");
733                         Assert.IsTrue (a == Math.Min (b, a), "#2");
734                 }
735
736                 [Test]
737                 public void TestDoubleMin ()
738                 {
739                         double a = 1.5D;
740                         double b = 2.5D;
741
742                         Assert.IsTrue (a == Math.Min (a, b), "#1");
743                         Assert.IsTrue (a == Math.Min (b, a), "#2");
744                         Assert.IsTrue (Double.IsNaN (Math.Min (Double.NaN, Double.NaN)), "#3");
745                         Assert.IsTrue (Double.IsNaN (Math.Min (Double.NaN, a)), "#4");
746                         Assert.IsTrue (Double.IsNaN (Math.Min (b, Double.NaN)), "#5");
747                 }
748
749                 [Test]
750                 public void TestFloatMin ()
751                 {
752                         float a = 1.5F;
753                         float b = 2.5F;
754
755                         Assert.IsTrue (a == Math.Min (a, b), "#1");
756                         Assert.IsTrue (a == Math.Min (b, a), "#2");
757                         Assert.IsTrue (Single.IsNaN (Math.Min (Single.NaN, Single.NaN)), "#3");
758                         Assert.IsTrue (Single.IsNaN (Math.Min (Single.NaN, a)), "#4");
759                         Assert.IsTrue (Single.IsNaN (Math.Min (b, Single.NaN)), "#5");
760                 }
761
762                 [Test]
763                 public void TestIntMin ()
764                 {
765                         int a = 1;
766                         int b = 2;
767
768                         Assert.IsTrue (a == Math.Min (a, b), "#1");
769                         Assert.IsTrue (a == Math.Min (b, a), "#2");
770                 }
771
772                 [Test]
773                 public void TestLongMin ()
774                 {
775                         long a = 1L;
776                         long b = 2L;
777
778                         Assert.IsTrue (a == Math.Min (a, b), "#1");
779                         Assert.IsTrue (a == Math.Min (b, a), "#2");
780                 }
781
782                 [Test]
783                 public void TestSbyteMin ()
784                 {
785                         sbyte a = 1;
786                         sbyte b = 2;
787
788                         Assert.IsTrue (a == Math.Min (a, b), "#1");
789                         Assert.IsTrue (a == Math.Min (b, a), "#2");
790                 }
791
792                 [Test]
793                 public void TestShortMin ()
794                 {
795                         short a = 1;
796                         short b = 2;
797
798                         Assert.IsTrue (a == Math.Min (a, b), "#1");
799                         Assert.IsTrue (a == Math.Min (b, a), "#2");
800                 }
801
802                 [Test]
803                 public void TestUintMin ()
804                 {
805                         uint a = 1U;
806                         uint b = 2U;
807
808                         Assert.IsTrue (a == Math.Min (a, b), "#1");
809                         Assert.IsTrue (a == Math.Min (b, a), "#2");
810                 }
811
812                 [Test]
813                 public void TestUlongMin ()
814                 {
815                         ulong a = 1UL;
816                         ulong b = 2UL;
817
818                         Assert.IsTrue (a == Math.Min (a, b), "#1");
819                         Assert.IsTrue (a == Math.Min (b, a), "#2");
820                 }
821
822                 [Test]
823                 public void TestUshortMin ()
824                 {
825                         ushort a = 1;
826                         ushort b = 2;
827
828                         Assert.IsTrue (a == Math.Min (a, b), "#1");
829                         Assert.IsTrue (a == Math.Min (b, a), "#2");
830                 }
831
832                 [Test]
833                 public void TestDecimalRound ()
834                 {
835                         decimal a = 1.5M;
836                         decimal b = 2.5M;
837
838                         Assert.IsTrue (Math.Round (a) == 2, "#1");
839                         Assert.IsTrue (Math.Round (b) == 2, "#2");
840                         Assert.IsTrue (Decimal.MaxValue == Math.Round (Decimal.MaxValue), "#3");
841                         Assert.IsTrue (Decimal.MinValue == Math.Round (Decimal.MinValue), "#4");
842                 }
843
844                 [Test]
845                 public void TestDecimalRound2 ()
846                 {
847                         decimal a = 3.45M;
848                         decimal b = 3.46M;
849
850                         Assert.AreEqual (3.4M, Math.Round (a, 1), "#1");
851                         Assert.AreEqual (3.5M, Math.Round (b, 1), "#2");
852                 }
853
854                 [Test]
855                 public void TestDoubleRound ()
856                 {
857                         double a = 1.5D;
858                         double b = 2.5D;
859
860                         Assert.AreEqual (2D, Math.Round (a), "#1");
861                         Assert.AreEqual (2D, Math.Round (b), "#2");
862                         Assert.IsTrue (Double.MaxValue == Math.Round (Double.MaxValue), "#3");
863                         Assert.IsTrue (Double.MinValue == Math.Round (Double.MinValue), "#4");
864                 }
865
866                 [Test]
867                 public void TestDoubleTruncate ()
868                 {
869                         double a = 1.2D;
870                         double b = 2.8D;
871                         double c = 0D;
872
873                         Assert.AreEqual (1D, Math.Truncate (a), "#1");
874                         Assert.AreEqual (2D, Math.Truncate (b), "#2");
875
876                         Assert.AreEqual (-1D, Math.Truncate (a * -1D), "#3");
877                         Assert.AreEqual (-2D, Math.Truncate (b * -1D), "#4");
878
879                         Assert.AreEqual (0D, Math.Truncate (c), "#5");
880
881                         Assert.IsTrue (Double.MaxValue == Math.Truncate (Double.MaxValue), "#6");
882                         Assert.IsTrue (Double.MinValue == Math.Truncate (Double.MinValue), "#7");
883                 }
884
885                 [Test]
886                 public void TestDecimalTruncate ()
887                 {
888                         decimal a = 1.2M;
889                         decimal b = 2.8M;
890                         decimal c = 0M;
891
892                         Assert.AreEqual (1M, Math.Truncate (a), "#1");
893                         Assert.AreEqual (2M, Math.Truncate (b), "#2");
894
895                         Assert.AreEqual (-1M, Math.Truncate (a * -1M), "#3");
896                         Assert.AreEqual (-2M, Math.Truncate (b * -1M), "#4");
897
898                         Assert.AreEqual (0M, Math.Truncate (c), "#5");
899
900                         Assert.IsTrue (Decimal.MaxValue == Math.Truncate (Decimal.MaxValue), "#6");
901                         Assert.IsTrue (Decimal.MinValue == Math.Truncate (Decimal.MinValue), "#7");
902                 }
903
904                 [Test]
905                 public void TestDoubleRound2 ()
906                 {
907                         double a = 3.45D;
908                         double b = 3.46D;
909
910                         Assert.AreEqual (3.4D, Math.Round (a, 1), "#1");
911                         Assert.AreEqual (3.5D, Math.Round (b, 1), "#2");
912                         Assert.AreEqual (-0.1, Math.Round (-0.123456789, 1), "#3");
913                 }
914
915                 [Test]
916                 public void TestDoubleRound3 ()
917                 {
918                         Assert.AreEqual (1D, Math.Round (1D, 0, MidpointRounding.ToEven), "#1");
919                         Assert.AreEqual (1D, Math.Round (1D, 0, MidpointRounding.AwayFromZero), "#2");
920
921                         Assert.AreEqual (-1D, Math.Round (-1D, 0, MidpointRounding.ToEven), "#3");
922                         Assert.AreEqual (-1D, Math.Round (-1D, 0, MidpointRounding.AwayFromZero), "#4");
923
924                         Assert.AreEqual (1D, Math.Round (1D, 1, MidpointRounding.ToEven), "#5");
925                         Assert.AreEqual (1D, Math.Round (1D, 1, MidpointRounding.AwayFromZero), "#6");
926
927                         Assert.AreEqual (-1D, Math.Round (-1D, 1, MidpointRounding.ToEven), "#7");
928                         Assert.AreEqual (-1D, Math.Round (-1D, 1, MidpointRounding.AwayFromZero), "#8");
929
930                         Assert.AreEqual (1D, Math.Round (1.2345D, 0, MidpointRounding.ToEven), "#9");
931                         Assert.AreEqual (1D, Math.Round (1.2345D, 0, MidpointRounding.AwayFromZero), "#A");
932
933                         Assert.AreEqual (-1D, Math.Round (-1.2345D, 0, MidpointRounding.ToEven), "#B");
934                         Assert.AreEqual (-1D, Math.Round (-1.2345D, 0, MidpointRounding.AwayFromZero), "#C");
935
936                         Assert.AreEqual (1.2D, Math.Round (1.2345D, 1, MidpointRounding.ToEven), "#D");
937                         Assert.AreEqual (1.2D, Math.Round (1.2345D, 1, MidpointRounding.AwayFromZero), "#E");
938
939                         Assert.AreEqual (-1.2D, Math.Round (-1.2345D, 1, MidpointRounding.ToEven), "#F");
940                         Assert.AreEqual (-1.2D, Math.Round (-1.2345D, 1, MidpointRounding.AwayFromZero), "#10");
941
942                         Assert.AreEqual (1.23D, Math.Round (1.2345D, 2, MidpointRounding.ToEven), "#11");
943                         Assert.AreEqual (1.23D, Math.Round (1.2345D, 2, MidpointRounding.AwayFromZero), "#12");
944
945                         Assert.AreEqual (-1.23D, Math.Round (-1.2345D, 2, MidpointRounding.ToEven), "#13");
946                         Assert.AreEqual (-1.23D, Math.Round (-1.2345D, 2, MidpointRounding.AwayFromZero), "#14");
947
948                         Assert.AreEqual (1.234D, Math.Round (1.2345D, 3, MidpointRounding.ToEven), "#15");
949                         Assert.AreEqual (1.235D, Math.Round (1.2345D, 3, MidpointRounding.AwayFromZero), "#16");
950
951                         Assert.AreEqual (-1.234D, Math.Round (-1.2345D, 3, MidpointRounding.ToEven), "#17");
952                         Assert.AreEqual (-1.235D, Math.Round (-1.2345D, 3, MidpointRounding.AwayFromZero), "#18");
953
954                         Assert.AreEqual (1.2345D, Math.Round (1.2345D, 4, MidpointRounding.ToEven), "#19");
955                         Assert.AreEqual (1.2345D, Math.Round (1.2345D, 4, MidpointRounding.AwayFromZero), "#1A");
956
957                         Assert.AreEqual (-1.2345D, Math.Round (-1.2345D, 4, MidpointRounding.ToEven), "#1B");
958                         Assert.AreEqual (-1.2345D, Math.Round (-1.2345D, 4, MidpointRounding.AwayFromZero), "#1C");
959
960                         Assert.AreEqual (2D, Math.Round (1.5432D, 0, MidpointRounding.ToEven), "#1D");
961                         Assert.AreEqual (2D, Math.Round (1.5432D, 0, MidpointRounding.AwayFromZero), "#1E");
962
963                         Assert.AreEqual (-2D, Math.Round (-1.5432D, 0, MidpointRounding.ToEven), "#1F");
964                         Assert.AreEqual (-2D, Math.Round (-1.5432D, 0, MidpointRounding.AwayFromZero), "#20");
965
966                         Assert.AreEqual (1.5D, Math.Round (1.5432D, 1, MidpointRounding.ToEven), "#21");
967                         Assert.AreEqual (1.5D, Math.Round (1.5432D, 1, MidpointRounding.AwayFromZero), "#22");
968
969                         Assert.AreEqual (-1.5D, Math.Round (-1.5432D, 1, MidpointRounding.ToEven), "#23");
970                         Assert.AreEqual (-1.5D, Math.Round (-1.5432D, 1, MidpointRounding.AwayFromZero), "#24");
971
972                         Assert.AreEqual (1.54D, Math.Round (1.5432D, 2, MidpointRounding.ToEven), "#25");
973                         Assert.AreEqual (1.54D, Math.Round (1.5432D, 2, MidpointRounding.AwayFromZero), "#26");
974
975                         Assert.AreEqual (-1.54D, Math.Round (-1.5432D, 2, MidpointRounding.ToEven), "#27");
976                         Assert.AreEqual (-1.54D, Math.Round (-1.5432D, 2, MidpointRounding.AwayFromZero), "#28");
977
978                         Assert.AreEqual (1.543D, Math.Round (1.5432D, 3, MidpointRounding.ToEven), "#29");
979                         Assert.AreEqual (1.543D, Math.Round (1.5432D, 3, MidpointRounding.AwayFromZero), "#2A");
980
981                         Assert.AreEqual (-1.543D, Math.Round (-1.5432D, 3, MidpointRounding.ToEven), "#2B");
982                         Assert.AreEqual (-1.543D, Math.Round (-1.5432D, 3, MidpointRounding.AwayFromZero), "#2C");
983
984                         Assert.AreEqual (1.5432D, Math.Round (1.5432D, 4, MidpointRounding.ToEven), "#2D");
985                         Assert.AreEqual (1.5432D, Math.Round (1.5432D, 4, MidpointRounding.AwayFromZero), "#2E");
986
987                         Assert.AreEqual (-1.5432D, Math.Round (-1.5432D, 4, MidpointRounding.ToEven), "#2F");
988                         Assert.AreEqual (-1.5432D, Math.Round (-1.5432D, 4, MidpointRounding.AwayFromZero), "#30");
989
990                         Assert.AreEqual (63988D, Math.Round (63987.83593942D, 0, MidpointRounding.ToEven), "#31");
991                         Assert.AreEqual (63988D, Math.Round (63987.83593942D, 0, MidpointRounding.AwayFromZero), "#32");
992
993                         Assert.AreEqual (-63988D, Math.Round (-63987.83593942D, 0, MidpointRounding.ToEven), "#33");
994                         Assert.AreEqual (-63988D, Math.Round (-63987.83593942D, 0, MidpointRounding.AwayFromZero), "#34");
995
996                         Assert.AreEqual (63987.83594D, Math.Round (63987.83593942D, 5, MidpointRounding.ToEven), "#35");
997                         Assert.AreEqual (63987.83594D, Math.Round (63987.83593942D, 5, MidpointRounding.AwayFromZero), "#36");
998
999                         Assert.AreEqual (-63987.83594D, Math.Round (-63987.83593942D, 5, MidpointRounding.ToEven), "#37");
1000                         Assert.AreEqual (-63987.83594D, Math.Round (-63987.83593942D, 5, MidpointRounding.AwayFromZero), "#38");
1001
1002                         Assert.AreEqual (63987.83593942D, Math.Round (63987.83593942D, 8, MidpointRounding.ToEven), "#39");
1003                         Assert.AreEqual (63987.83593942D, Math.Round (63987.83593942D, 8, MidpointRounding.AwayFromZero), "#3A");
1004
1005                         Assert.AreEqual (-63987.83593942D, Math.Round (-63987.83593942D, 8, MidpointRounding.ToEven), "#3B");
1006                         Assert.AreEqual (-63987.83593942D, Math.Round (-63987.83593942D, 8, MidpointRounding.AwayFromZero), "#3C");
1007
1008                         Assert.AreEqual (1, Math.Round (0.5, 0, MidpointRounding.AwayFromZero));
1009                 }
1010                 
1011                 [Test]
1012                 public void TestDecimalSign ()
1013                 {
1014                         decimal a = -5M;
1015                         decimal b = 5M;
1016
1017                         Assert.IsTrue (Math.Sign (a) == -1, "#1");
1018                         Assert.IsTrue (Math.Sign (b) == 1, "#2");
1019                         Assert.IsTrue (Math.Sign (0M) == 0, "#3");
1020                 }
1021
1022                 [Test]
1023                 public void TestDoubleSign ()
1024                 {
1025                         double a = -5D;
1026                         double b = 5D;
1027
1028                         Assert.IsTrue (Math.Sign (a) == -1, "#1");
1029                         Assert.IsTrue (Math.Sign (b) == 1, "#2");
1030                         Assert.IsTrue (Math.Sign (0D) == 0, "#3");
1031                 }
1032
1033                 [Test]
1034                 public void TestFloatSign ()
1035                 {
1036                         float a = -5F;
1037                         float b = 5F;
1038
1039                         Assert.IsTrue (Math.Sign (a) == -1, "#1");
1040                         Assert.IsTrue (Math.Sign (b) == 1, "#2");
1041                         Assert.IsTrue (Math.Sign (0F) == 0, "#3");
1042                 }
1043
1044                 [Test]
1045                 public void TestIntSign ()
1046                 {
1047                         int a = -5;
1048                         int b = 5;
1049
1050                         Assert.IsTrue (Math.Sign (a) == -1, "#1");
1051                         Assert.IsTrue (Math.Sign (b) == 1, "#2");
1052                         Assert.IsTrue (Math.Sign (0) == 0, "#3");
1053                 }
1054
1055                 [Test]
1056                 public void TestLongSign ()
1057                 {
1058                         long a = -5L;
1059                         long b = 5L;
1060
1061                         Assert.IsTrue (Math.Sign (a) == -1, "#1");
1062                         Assert.IsTrue (Math.Sign (b) == 1, "#2");
1063                         Assert.IsTrue (Math.Sign (0L) == 0, "#3");
1064                 }
1065
1066                 [Test]
1067                 public void TestSbyteSign ()
1068                 {
1069                         sbyte a = -5;
1070                         sbyte b = 5;
1071
1072                         Assert.IsTrue (Math.Sign (a) == -1, "#1");
1073                         Assert.IsTrue (Math.Sign (b) == 1, "#2");
1074                         Assert.IsTrue (Math.Sign (0) == 0, "#3");
1075                 }
1076
1077                 [Test]
1078                 public void TestShortSign ()
1079                 {
1080                         short a = -5;
1081                         short b = 5;
1082
1083                         Assert.IsTrue (Math.Sign (a) == -1, "#1");
1084                         Assert.IsTrue (Math.Sign (b) == 1, "#2");
1085                         Assert.IsTrue (Math.Sign (0) == 0, "#3");
1086                 }
1087         }
1088 }