2010-03-05 Rodrigo Kumpera <rkumpera@novell.com>
[mono.git] / mcs / class / System.Numerics / Test / System.Numerics / BigIntegerTest.cs
1 // BigIntegerTest.cs
2 //
3 // Authors:
4 // Rodrigo Kumpera <rkumpera@novell.com>
5 //
6 // Copyright (C) 2010 Novell, Inc (http://www.novell.com)
7 //
8
9 using System;
10 using System.Numerics;
11 using NUnit.Framework;
12
13
14 namespace MonoTests.System.Numerics
15 {
16         [TestFixture]
17         public class BigIntegerTest
18         {
19                 static byte[] huge_a = new byte[] {0x1D, 0x33, 0xFB, 0xFE, 0xB1, 0x2, 0x85, 0x44, 0xCA, 0xDC, 0xFB, 0x70, 0xD, 0x39, 0xB1, 0x47, 0xB6, 0xE6, 0xA2, 0xD1, 0x19, 0x1E, 0x9F, 0xE4, 0x3C, 0x1E, 0x16, 0x56, 0x13, 0x9C, 0x4D, 0xD3, 0x5C, 0x74, 0xC9, 0xBD, 0xFA, 0x56, 0x40, 0x58, 0xAC, 0x20, 0x6B, 0x55, 0xA2, 0xD5, 0x41, 0x38, 0xA4, 0x6D, 0xF6, 0x8C, };
20
21                 static byte[] huge_b = new byte[] {0x96, 0x5, 0xDA, 0xFE, 0x93, 0x17, 0xC1, 0x93, 0xEC, 0x2F, 0x30, 0x2D, 0x8F, 0x28, 0x13, 0x99, 0x70, 0xF4, 0x4C, 0x60, 0xA6, 0x49, 0x24, 0xF9, 0xB3, 0x4A, 0x41, 0x67, 0xDC, 0xDD, 0xB1, 0xA5, 0xA6, 0xC0, 0x3D, 0x57, 0x9A, 0xCB, 0x29, 0xE2, 0x94, 0xAC, 0x6C, 0x7D, 0xEF, 0x3E, 0xC6, 0x7A, 0xC1, 0xA8, 0xC8, 0xB0, 0x20, 0x95, 0xE6, 0x4C, 0xE1, 0xE0, 0x4B, 0x49, 0xD5, 0x5A, 0xB7, };
22
23                 static byte[] huge_add = new byte[] {0xB3, 0x38, 0xD5, 0xFD, 0x45, 0x1A, 0x46, 0xD8, 0xB6, 0xC, 0x2C, 0x9E, 0x9C, 0x61, 0xC4, 0xE0, 0x26, 0xDB, 0xEF, 0x31, 0xC0, 0x67, 0xC3, 0xDD, 0xF0, 0x68, 0x57, 0xBD, 0xEF, 0x79, 0xFF, 0x78, 0x3, 0x35, 0x7, 0x15, 0x95, 0x22, 0x6A, 0x3A, 0x41, 0xCD, 0xD7, 0xD2, 0x91, 0x14, 0x8, 0xB3, 0x65, 0x16, 0xBF, 0x3D, 0x20, 0x95, 0xE6, 0x4C, 0xE1, 0xE0, 0x4B, 0x49, 0xD5, 0x5A, 0xB7, };
24
25                 static byte[] a_m_b = new byte[] { 0x87, 0x2D, 0x21, 0x0, 0x1E, 0xEB, 0xC3, 0xB0, 0xDD, 0xAC, 0xCB, 0x43, 0x7E, 0x10, 0x9E, 0xAE, 0x45, 0xF2, 0x55, 0x71, 0x73, 0xD4, 0x7A, 0xEB, 0x88, 0xD3, 0xD4, 0xEE, 0x36, 0xBE, 0x9B, 0x2D, 0xB6, 0xB3, 0x8B, 0x66, 0x60, 0x8B, 0x16, 0x76, 0x17, 0x74, 0xFE, 0xD7, 0xB2, 0x96, 0x7B, 0xBD, 0xE2, 0xC4, 0x2D, 0xDC, 0xDE, 0x6A, 0x19, 0xB3, 0x1E, 0x1F, 0xB4, 0xB6, 0x2A, 0xA5, 0x48, };\r
26                 static byte[] b_m_a = new byte[] { 0x79, 0xD2, 0xDE, 0xFF, 0xE1, 0x14, 0x3C, 0x4F, 0x22, 0x53, 0x34, 0xBC, 0x81, 0xEF, 0x61, 0x51, 0xBA, 0xD, 0xAA, 0x8E, 0x8C, 0x2B, 0x85, 0x14, 0x77, 0x2C, 0x2B, 0x11, 0xC9, 0x41, 0x64, 0xD2, 0x49, 0x4C, 0x74, 0x99, 0x9F, 0x74, 0xE9, 0x89, 0xE8, 0x8B, 0x1, 0x28, 0x4D, 0x69, 0x84, 0x42, 0x1D, 0x3B, 0xD2, 0x23, 0x21, 0x95, 0xE6, 0x4C, 0xE1, 0xE0, 0x4B, 0x49, 0xD5, 0x5A, 0xB7, };\r
27
28                 static byte[][] add_a = new byte[][] {
29                         new byte[] {1},
30                         new byte[] {0xFF},
31                         huge_a
32                 };
33
34                 static byte[][] add_b = new byte[][] {
35                         new byte[] {1},
36                         new byte[] {1},
37                         huge_b
38                 };
39
40                 static byte[][] add_c = new byte[][] {
41                         new byte[] {2},
42                         new byte[] {0},
43                         huge_add
44                 };
45
46                 [Test]
47                 public void TestAdd () {
48                         for (int i = 0; i < add_a.Length; ++i) {
49                                 var a = new BigInteger (add_a [i]);
50                                 var b = new BigInteger (add_b [i]);
51                                 var c = new BigInteger (add_c [i]);
52
53                                 Assert.AreEqual (c, a + b, "#" + i + "a");
54                                 Assert.AreEqual (c, b + a, "#" + i + "b");
55                                 Assert.AreEqual (c, BigInteger.Add (a, b), "#" + i + "c");
56                                 Assert.AreEqual (add_c [i], (a + b).ToByteArray (), "#" + i + "d");
57                         }
58                 }
59
60                 [Test]
61                 public void TestAdd2 () {
62                         long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
63                         for (int i = 0; i < values.Length; ++i) {
64                                 for (int j = 0; j < values.Length; ++j) {
65                                         var a = new BigInteger (values [i]);
66                                         var b = new BigInteger (values [j]);
67                                         var c = a + b;
68                                         Assert.AreEqual (values [i] + values [j], (long)c, "#_" + i + "_" + j);
69                                 }
70                         }
71                 }
72
73                 [Test]
74                 public void TestHugeSub () {
75                         var a = new BigInteger (huge_a);
76                         var b = new BigInteger (huge_b);
77                         Assert.AreEqual (a_m_b, (a - b).ToByteArray (), "#1");
78                         Assert.AreEqual (b_m_a, (b - a).ToByteArray (), "#2");
79                 }
80
81                 [Test]
82                 public void TestSub () {
83                         long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
84                         for (int i = 0; i < values.Length; ++i) {
85                                 for (int j = 0; j < values.Length; ++j) {
86                                         var a = new BigInteger (values [i]);
87                                         var b = new BigInteger (values [j]);
88                                         var c = a - b;
89                                         var d = BigInteger.Subtract (a, b);
90
91                                         Assert.AreEqual (values [i] - values [j], (long)c, "#_" + i + "_" + j);
92                                         Assert.AreEqual (values [i] - values [j], (long)d, "#_" + i + "_" + j);
93                                 }
94                         }
95                 }
96
97                 [Test]
98                 public void TestMin () {
99                         long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
100                         for (int i = 0; i < values.Length; ++i) {
101                                 for (int j = 0; j < values.Length; ++j) {
102                                         var a = new BigInteger (values [i]);
103                                         var b = new BigInteger (values [j]);
104                                         var c = BigInteger.Min (a, b);
105
106                                         Assert.AreEqual (Math.Min (values [i], values [j]), (long)c, "#_" + i + "_" + j);
107                                 }
108                         }
109                 }
110
111                 [Test]
112                 public void TestMax () {
113                         long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
114                         for (int i = 0; i < values.Length; ++i) {
115                                 for (int j = 0; j < values.Length; ++j) {
116                                         var a = new BigInteger (values [i]);
117                                         var b = new BigInteger (values [j]);
118                                         var c = BigInteger.Max (a, b);
119
120                                         Assert.AreEqual (Math.Max (values [i], values [j]), (long)c, "#_" + i + "_" + j);
121                                 }
122                         }
123                 }
124
125                 [Test]
126                 public void TestAbs () {
127                         long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
128                         for (int i = 0; i < values.Length; ++i) {
129                                 var a = new BigInteger (values [i]);
130                                 var c = BigInteger.Abs (a);
131
132                                 Assert.AreEqual (Math.Abs (values [i]), (long)c, "#_" + i);
133                         }
134                 }
135
136                 [Test]
137                 public void TestNegate () {
138                         long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
139                         for (int i = 0; i < values.Length; ++i) {
140                                 var a = new BigInteger (values [i]);
141                                 var c = -a;
142                                 var d = BigInteger.Negate (a);
143
144                                 Assert.AreEqual (-values [i], (long)c, "#_" + i);
145                                 Assert.AreEqual (-values [i], (long)d, "#_" + i);
146                         }
147                 }
148
149                 [Test]
150                 public void TestInc () {
151                         long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
152                         for (int i = 0; i < values.Length; ++i) {
153                                 var a = new BigInteger (values [i]);
154                                 var b = ++a;
155
156                                 Assert.AreEqual (++values [i], (long)b, "#_" + i);
157                         }
158                 }
159
160                 [Test]
161                 public void TestDec () {
162                         long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
163                         for (int i = 0; i < values.Length; ++i) {
164                                 var a = new BigInteger (values [i]);
165                                 var b = --a;
166
167                                 Assert.AreEqual (--values [i], (long)b, "#_" + i);
168                         }
169                 }
170
171                 [Test]
172                 public void TestBitwiseOps () {
173                         long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L, 0xFFFF00000000L };
174                         for (int i = 0; i < values.Length; ++i) {
175                                 for (int j = 0; j < values.Length; ++j) {
176                                         var a = new BigInteger (values [i]);
177                                         var b = new BigInteger (values [j]);
178
179
180                                         Assert.AreEqual (values [i] | values [j], (long)(a | b) , "#b_" + i + "_" + j);
181                                         Assert.AreEqual (values [i] & values [j], (long)(a & b) , "#a_" + i + "_" + j);
182                                         Assert.AreEqual (values [i] ^ values [j], (long)(a ^ b) , "#c_" + i + "_" + j);
183                                         Assert.AreEqual (~values [i], (long)~a , "#d_" + i + "_" + j);
184                                 }
185                         }
186                 }
187
188                 [Test]
189                 public void CompareOps () {
190                         long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L };
191                         for (int i = 0; i < values.Length; ++i) {
192                                 for (int j = 0; j < values.Length; ++j) {
193                                         var a = new BigInteger (values [i]);
194                                         var b = new BigInteger (values [j]);
195                                         
196                                         Assert.AreEqual (values [i].CompareTo (values [j]), a.CompareTo (b), "#a_" + i + "_" + j);
197                                         Assert.AreEqual (values [i].CompareTo (values [j]), BigInteger.Compare (a, b), "#b_" + i + "_" + j);
198
199                                         Assert.AreEqual (values [i] < values [j], a < b, "#c_" + i + "_" + j);
200                                         Assert.AreEqual (values [i] <= values [j], a <= b, "#d_" + i + "_" + j);
201                                         Assert.AreEqual (values [i] == values [j], a == b, "#e_" + i + "_" + j);
202                                         Assert.AreEqual (values [i] != values [j], a != b, "#f_" + i + "_" + j);
203                                         Assert.AreEqual (values [i] >= values [j], a >= b, "#g_" + i + "_" + j);
204                                         Assert.AreEqual (values [i] > values [j], a > b, "#h_" + i + "_" + j);
205                                 }
206                         }
207                 }
208
209                 [Test]
210                 public void CompareOps2 () {
211                         BigInteger a = new BigInteger (100000000000L);
212                         BigInteger b = new BigInteger (28282828282UL);
213
214                         Assert.IsTrue (a >= b, "#1");
215                         Assert.IsTrue (a >= b, "#2");
216                         Assert.IsFalse (a < b, "#3");
217                         Assert.IsFalse (a <= b, "#4");
218                         Assert.AreEqual (1, a.CompareTo (b), "#5");
219                 }
220
221                 [Test]
222                 public void CompareULong () {
223                         long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 100000000000L, 0xAA00000000L };
224                         ulong[] uvalues = new ulong [] {0, 1, 1000, 100000000000L, 999999, 28282828282, 0xAA00000000, ulong.MaxValue };
225                         for (int i = 0; i < values.Length; ++i) {
226                                 for (int j = 0; j < uvalues.Length; ++j) {
227                                         var a = new BigInteger (values [i]);
228                                         var b = uvalues [j];
229                                         var c = new BigInteger (b);
230                                         
231                                         Assert.AreEqual (a.CompareTo (c), a.CompareTo (b), "#a_" + i + "_" + j);
232
233                                         Assert.AreEqual (a > c, a > b, "#b_" + i + "_" + j);
234                                         Assert.AreEqual (a < c, a < b, "#c_" + i + "_" + j);
235                                         Assert.AreEqual (a <= c, a <= b, "#d_" + i + "_" + j);
236                                         Assert.AreEqual (a == c, a == b, "#e_" + i + "_" + j);
237                                         Assert.AreEqual (a != c, a != b, "#f_" + i + "_" + j);
238                                         Assert.AreEqual (a >= c, a >= b, "#g_" + i + "_" + j);
239
240                                         Assert.AreEqual (c > a, b > a, "#ib_" + i + "_" + j);
241                                         Assert.AreEqual (c < a, b < a, "#ic_" + i + "_" + j);
242                                         Assert.AreEqual (c <= a, b <= a, "#id_" + i + "_" + j);
243                                         Assert.AreEqual (c == a, b == a, "#ie_" + i + "_" + j);
244                                         Assert.AreEqual (c != a, b != a, "#if_" + i + "_" + j);
245                                         Assert.AreEqual (c >= a, b >= a, "#ig_" + i + "_" + j);
246                                 }
247                         }
248                 }
249
250                 [Test]
251                 public void CompareLong () {
252                         long[] values = new long [] { -100000000000L, -1000, -1, 0, 1, 1000, 9999999, 100000000000L, 0xAA00000000, long.MaxValue, long.MinValue };
253
254                         for (int i = 0; i < values.Length; ++i) {
255                                 for (int j = 0; j < values.Length; ++j) {
256                                         var a = new BigInteger (values [i]);
257                                         var b = values [j];
258                                         var c = new BigInteger (b);
259                                         
260                                         Assert.AreEqual (a.CompareTo (c), a.CompareTo (b), "#a_" + i + "_" + j);
261
262                                         Assert.AreEqual (a > c, a > b, "#b_" + i + "_" + j);
263                                         Assert.AreEqual (a < c, a < b, "#c_" + i + "_" + j);
264                                         Assert.AreEqual (a <= c, a <= b, "#d_" + i + "_" + j);
265                                         Assert.AreEqual (a == c, a == b, "#e_" + i + "_" + j);
266                                         Assert.AreEqual (a != c, a != b, "#f_" + i + "_" + j);
267                                         Assert.AreEqual (a >= c, a >= b, "#g_" + i + "_" + j);
268
269                                         Assert.AreEqual (c > a, b > a, "#ib_" + i + "_" + j);
270                                         Assert.AreEqual (c < a, b < a, "#ic_" + i + "_" + j);
271                                         Assert.AreEqual (c <= a, b <= a, "#id_" + i + "_" + j);
272                                         Assert.AreEqual (c == a, b == a, "#ie_" + i + "_" + j);
273                                         Assert.AreEqual (c != a, b != a, "#if_" + i + "_" + j);
274                                         Assert.AreEqual (c >= a, b >= a, "#ig_" + i + "_" + j);
275                                 }
276                         }
277                 }
278
279                 [Test]
280                 public void TestEquals () {
281                                 var a = new BigInteger (10);
282                                 var b = new BigInteger (10);
283                                 var c = new BigInteger (-10);
284
285                                 Assert.AreEqual (a, b, "#1");
286                                 Assert.AreNotEqual (a, c, "#2");
287                                 Assert.AreNotEqual (a, 10, "#3");
288                 }
289
290                 [Test]
291                 public void ByteArrayCtor ()
292                 {
293                         try {
294                                 new BigInteger (null);
295                                 Assert.Fail ("#1");
296                         } catch (ArgumentNullException) {}
297
298                         Assert.AreEqual (0, (int)new BigInteger (new byte [0]), "#2");
299                 }
300
301                 [Test]
302                 public void IntCtorRoundTrip ()
303                 {
304                         int[] values = new int [] {
305                                 int.MinValue, -0x2F33BB, -0x1F33, -0x33, 0, 0x33,
306                                 0x80, 0x8190, 0xFF0011, 0x1234, 0x11BB99, 0x44BB22CC,
307                                 int.MaxValue };
308                         foreach (var val in values) {
309                                 var a = new BigInteger (val);
310                                 var b = new BigInteger (a.ToByteArray ());
311
312                                 Assert.AreEqual (val, (int)a, "#a_" + val);
313                                 Assert.AreEqual (val, (int)b, "#b_" + val);
314                         }
315                 }
316
317                 [Test]
318                 public void LongCtorRoundTrip ()
319                 {
320                         long[] values = new long [] {
321                                 0, long.MinValue, long.MaxValue, -1, 1L + int.MaxValue, -1L + int.MinValue, 0x1234, 0xFFFFFFFFL, 0x1FFFFFFFFL, -0xFFFFFFFFL, -0x1FFFFFFFFL,
322                                 0x100000000L, -0x100000000L, 0x100000001L, -0x100000001L };
323                         foreach (var val in values) {
324                                 var a = new BigInteger (val);
325                                 var b = new BigInteger (a.ToByteArray ());
326
327                                 Assert.AreEqual (val, (long)a, "#a_" + val);
328                                 Assert.AreEqual (val, (long)b, "#b_" + val);
329                         }
330                 }
331
332                 [Test]
333                 public void ByteArrayCtorRoundTrip ()
334                 {
335                         var arr = new byte [] { 1,2,3,4,5,6,7,8,9 };
336                         Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#1");
337
338                         arr = new byte [] { 1,2,3,4,5,6,7,8,0xFF, 0x0};
339                         Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#2");
340
341                         arr = new byte [] { 1,2,3,4,5,6,7,8,9, 0xF0 };
342                         Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#3");
343
344                         arr = new byte [] { 1};
345                         Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#4");
346
347                         arr = new byte [] { 1,2 };
348                         Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#5");
349
350                         arr = new byte [] { 1,2,3 };
351                         Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#6");
352
353                         arr = new byte [] { 1,2,3,4 };
354                         Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#7");
355
356                         arr = new byte [] { 1,2,3,4,5 };
357                         Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#8");
358
359                         arr = new byte [] { 1,2,3,4,5,6 };
360                         Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#9");
361
362                         arr = new byte [] { 1,2,3,4,5,6,7 };
363                         Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#10");
364
365                         arr = new byte [] { 1,2,3,4,5 };
366                         Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#11");
367
368                         arr = new byte [] { 0 };
369                         Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#12");
370
371                         arr = new byte [] { 0xFF, 00 };
372                         Assert.AreEqual (arr, new BigInteger (arr).ToByteArray (), "#13");
373
374                         arr = new byte [] { 1, 0, 0, 0, 0, 0, };
375                         Assert.AreEqual (new byte [1] {1}, new BigInteger (arr).ToByteArray (), "#14");
376                 }
377
378                 [Test]
379                 public void TestIntCtorProperties ()
380                 {
381                         BigInteger a = new BigInteger (10);
382                         Assert.IsTrue (a.IsEven, "#1");
383                         Assert.IsFalse (a.IsOne, "#2");
384                         Assert.IsFalse (a.IsPowerOfTwo, "#3");
385                         Assert.IsFalse (a.IsZero, "#4");
386                         Assert.AreEqual (1, a.Sign, "#5");
387
388                         Assert.IsFalse (new BigInteger (11).IsEven, "#6");
389                         Assert.IsTrue (new BigInteger (1).IsOne, "#7");
390                         Assert.IsTrue (new BigInteger (32).IsPowerOfTwo, "#8");
391                         Assert.IsTrue (new BigInteger (0).IsZero, "#9");
392                         Assert.AreEqual (0, new BigInteger (0).Sign, "#10");
393                         Assert.AreEqual (-1, new BigInteger (-99999).Sign, "#11");
394
395                         Assert.IsFalse (new BigInteger (0).IsPowerOfTwo, "#12");
396                         Assert.IsFalse (new BigInteger (-16).IsPowerOfTwo, "#13");
397                         Assert.IsTrue (new BigInteger (1).IsPowerOfTwo, "#14");
398                 }
399
400                 /*[Test]
401                 public void TestIntCtorToString ()
402                 {
403                         Assert.AreEqual ("5555", new BigInteger (5555).ToString (), "#1");
404                         Assert.AreEqual ("-99999", new BigInteger (-99999).ToString (), "#2");
405                 }*/
406
407                 [Test]
408                 public void TestToIntOperator ()
409                 {
410                         try {
411                                 int v = (int)new BigInteger (huge_a);
412                                 Assert.Fail ("#1");
413                         } catch (OverflowException) {}
414
415                         try {
416                                 int v = (int)new BigInteger (1L + int.MaxValue);
417                                 Assert.Fail ("#2");
418                         } catch (OverflowException) {}
419
420                         try {
421                                 int v = (int)new BigInteger (-1L + int.MinValue);
422                                 Assert.Fail ("#3");
423                         } catch (OverflowException) {}
424
425                         Assert.AreEqual (int.MaxValue, (int)new BigInteger (int.MaxValue), "#4");
426                         Assert.AreEqual (int.MinValue, (int)new BigInteger (int.MinValue), "#5");
427                 }
428
429
430                 [Test]
431                 public void TestToLongOperator ()
432                 {
433                         try {
434                                 long v = (long)new BigInteger (huge_a);
435                                 Assert.Fail ("#1");
436                         } catch (OverflowException) {}
437
438                         //long.MaxValue + 1
439                         try {
440                                 long v = (long)new BigInteger (new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 });
441                                 Assert.Fail ("#2");
442                         } catch (OverflowException) {}
443
444                         //TODO long.MinValue - 1
445                         try {
446                                 long v = (long)new BigInteger (new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF });
447                                 Assert.Fail ("#3");
448                         } catch (OverflowException) {}
449
450                         Assert.AreEqual (long.MaxValue, (long)new BigInteger (long.MaxValue), "#4");
451                         Assert.AreEqual (long.MinValue, (long)new BigInteger (long.MinValue), "#5");
452                 }
453
454                 [Test]
455                 public void TestIntCtorToByteArray ()
456                 {
457                         Assert.AreEqual (new byte[] { 0xFF }, new BigInteger (-1).ToByteArray (), "#1");
458                         Assert.AreEqual (new byte[] { 0xD4, 0xFE }, new BigInteger (-300).ToByteArray (), "#2");
459                         Assert.AreEqual (new byte[] { 0x80, 0x00 }, new BigInteger (128).ToByteArray (), "#3");
460                         Assert.AreEqual (new byte[] { 0x00, 0x60 }, new BigInteger (0x6000).ToByteArray (), "#4");
461                         Assert.AreEqual (new byte[] { 0x00, 0x80, 0x00 }, new BigInteger (0x8000).ToByteArray (), "#5");
462                         Assert.AreEqual (new byte[] { 0xDD, 0xBC, 0x00, 0x7A }, new BigInteger (0x7A00BCDD).ToByteArray (), "#6");
463                         Assert.AreEqual (new byte[] { 0xFF, 0xFF, 0xFF, 0x7F }, new BigInteger (int.MaxValue).ToByteArray (), "#7");
464                         Assert.AreEqual (new byte[] { 0x00, 0x00, 0x00, 0x80 }, new BigInteger (int.MinValue).ToByteArray (), "#8");
465                         Assert.AreEqual (new byte[] { 0x01, 0x00, 0x00, 0x80 }, new BigInteger (int.MinValue + 1).ToByteArray (), "#9");
466                         Assert.AreEqual (new byte[] { 0x7F }, new BigInteger (0x7F).ToByteArray (), "#10");
467                         Assert.AreEqual (new byte[] { 0x45, 0xCC, 0xD0 }, new BigInteger (-0x2F33BB).ToByteArray (), "#11");
468                         Assert.AreEqual (new byte[] { 0 }, new BigInteger (0).ToByteArray (), "#12");
469                 }
470
471                 [Test]
472                 public void TestLongCtorToByteArray ()
473                 {
474                         Assert.AreEqual (new byte[] { 0x01 }, new BigInteger (0x01L).ToByteArray (), "#1");
475                         Assert.AreEqual (new byte[] { 0x02, 0x01 }, new BigInteger (0x0102L).ToByteArray (), "#2");
476                         Assert.AreEqual (new byte[] { 0x03, 0x02, 0x01 }, new BigInteger (0x010203L).ToByteArray (), "#3");
477                         Assert.AreEqual (new byte[] { 0x04, 0x03, 0x2, 0x01 }, new BigInteger (0x01020304L).ToByteArray (), "#4");
478                         Assert.AreEqual (new byte[] { 0x05, 0x04, 0x03, 0x2, 0x01 }, new BigInteger (0x0102030405L).ToByteArray (), "#5");
479                         Assert.AreEqual (new byte[] { 0x06, 0x05, 0x04, 0x03, 0x2, 0x01 }, new BigInteger (0x010203040506L).ToByteArray (), "#6");
480                         Assert.AreEqual (new byte[] { 0x07, 0x06, 0x05, 0x04, 0x03, 0x2, 0x01 }, new BigInteger (0x01020304050607L).ToByteArray (), "#7");
481                         Assert.AreEqual (new byte[] { 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x2, 0x01 }, new BigInteger (0x0102030405060708L).ToByteArray (), "#8");
482
483                         Assert.AreEqual (new byte[] { 0xFF }, new BigInteger (-0x01L).ToByteArray (), "#1m");
484                         Assert.AreEqual (new byte[] { 0xFE, 0xFE}, new BigInteger (-0x0102L).ToByteArray (), "#2m");
485                         Assert.AreEqual (new byte[] { 0xFD, 0xFD, 0xFE }, new BigInteger (-0x010203L).ToByteArray (), "#3m");
486                         Assert.AreEqual (new byte[] { 0xFC, 0xFC, 0xFD, 0xFE}, new BigInteger (-0x01020304L).ToByteArray (), "#4m");
487                         Assert.AreEqual (new byte[] { 0xFB, 0xFB, 0xFC, 0xFD, 0xFE }, new BigInteger (-0x0102030405L).ToByteArray (), "#5m");
488                         Assert.AreEqual (new byte[] { 0xFA, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE }, new BigInteger (-0x010203040506L).ToByteArray (), "#6m");
489                         Assert.AreEqual (new byte[] { 0xF9, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE }, new BigInteger (-0x01020304050607L).ToByteArray (), "#7m");
490                         Assert.AreEqual (new byte[] { 0xF8, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE }, new BigInteger (-0x0102030405060708L).ToByteArray (), "#8m");
491
492
493                         Assert.AreEqual (new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F }, new BigInteger (long.MaxValue).ToByteArray (), "#9");
494                         Assert.AreEqual (new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 }, new BigInteger (long.MinValue).ToByteArray (), "#10");
495
496                         Assert.AreEqual (new byte[] { 0xFF, 0xFF, 0xFF, 0x7F, 0xFF }, new BigInteger (-2147483649L).ToByteArray (), "11");
497
498
499                 }
500
501                 [Test]
502                 public void IComparable () {
503                         var a = new BigInteger (99);
504                         Assert.AreEqual (-1, a.CompareTo (100), "#1");
505                         Assert.AreEqual (1, a.CompareTo (null), "#2");
506                 }
507         }
508 }