Merge pull request #1516 from DavidKarlas/getThreadsHang
[mono.git] / mcs / class / corlib / Test / System / EnumTest.cs
1 // EnumTest.cs - NUnit Test Cases for the System.Enum class
2 //
3 // David Brandt (bucky@keystreams.com)
4 // Gert Driesen (drieseng@users.sourceforge.net)
5 //
6 // (C) Ximian, Inc.  http://www.ximian.com
7 // 
8
9 using System;
10 using System.IO;
11 using System.Reflection;
12
13 using NUnit.Framework;
14
15 namespace MonoTests.System
16 {
17         [TestFixture]
18         public class EnumTest
19         {
20                 [Test]
21                 public void TestCompareTo ()
22                 {
23                         Enum e1 = new TestingEnum ();
24                         Enum e2 = new TestingEnum ();
25                         Enum e3 = new TestingEnum2 ();
26
27                         Assert.AreEqual (0, e1.CompareTo (e1), "#A1");
28                         Assert.AreEqual (0, e1.CompareTo (e2), "#A2");
29
30                         TestingEnum x = TestingEnum.This;
31                         TestingEnum y = TestingEnum.Is;
32                         Assert.AreEqual (0, x.CompareTo (x), "#B1");
33                         Assert.AreEqual (-1, x.CompareTo (y), "#B2");
34                         Assert.AreEqual (1, y.CompareTo (x), "#B3");
35
36                         try {
37                                 e1.CompareTo (e3);
38                                 Assert.Fail ("#C1");
39                         } catch (ArgumentException ex) {
40                                 // Object must be the same type as the enum.
41                                 // The type passed in was MonoTests.System.EnumTest+TestingEnum2;
42                                 // the enum type was MonoTests.System.EnumTest+TestingEnum
43                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
44                                 Assert.IsNull (ex.InnerException, "#A3");
45                                 Assert.IsNotNull (ex.Message, "#A4");
46                                 Assert.IsTrue (ex.Message.IndexOf (typeof (TestingEnum).FullName) != -1, "#A5");
47                                 Assert.IsTrue (ex.Message.IndexOf (typeof (TestingEnum2).FullName) != -1, "#A6");
48                                 Assert.IsNull (ex.ParamName, "#A7");
49                         }
50
51                         try {
52                                 ((Enum) e1).CompareTo ((Enum) e3);
53                                 Assert.Fail ("#D1");
54                         } catch (ArgumentException ex) {
55                                 // Object must be the same type as the enum.
56                                 // The type passed in was MonoTests.System.EnumTest+TestingEnum2;
57                                 // the enum type was MonoTests.System.EnumTest+TestingEnum
58                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#D2");
59                                 Assert.IsNull (ex.InnerException, "#D3");
60                                 Assert.IsNotNull (ex.Message, "#D4");
61                                 Assert.IsTrue (ex.Message.IndexOf (typeof (TestingEnum).FullName) != -1, "#D5");
62                                 Assert.IsTrue (ex.Message.IndexOf (typeof (TestingEnum2).FullName) != -1, "#D6");
63                                 Assert.IsNull (ex.ParamName, "#D7");
64                         }
65                 }
66
67                 [Test]
68                 public void TestEquals ()
69                 {
70                         Enum e1 = new TestingEnum ();
71                         Enum e2 = new TestingEnum ();
72                         Enum e3 = new TestingEnum2 ();
73
74                         Assert.IsTrue (e1.Equals (e1), "#1");
75                         Assert.IsTrue (e1.Equals (e2), "#2");
76                         Assert.IsFalse (e1.Equals (e3), "#3");
77                         Assert.IsFalse (e1.Equals (null), "#4");
78                 }
79
80                 [Test]
81                 public void TestFormat_Args ()
82                 {
83                         try {
84                                 TestingEnum x = TestingEnum.Test;
85                                 Enum.Format (null, x, "G");
86                                 Assert.Fail ("#A1");
87                         } catch (ArgumentNullException ex) {
88                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2");
89                                 Assert.IsNull (ex.InnerException, "#A3");
90                                 Assert.IsNotNull (ex.Message, "#A4");
91                                 Assert.IsNotNull (ex.ParamName, "#A5");
92                                 Assert.AreEqual ("enumType", ex.ParamName, "#A6");
93                         }
94
95                         try {
96                                 Enum.Format (typeof (TestingEnum), null, "G");
97                                 Assert.Fail ("#B1");
98                         } catch (ArgumentNullException ex) {
99                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2");
100                                 Assert.IsNull (ex.InnerException, "#B3");
101                                 Assert.IsNotNull (ex.Message, "#B4");
102                                 Assert.IsNotNull (ex.ParamName, "#B5");
103                                 Assert.AreEqual ("value", ex.ParamName, "#B6");
104                         }
105
106                         try {
107                                 TestingEnum x = TestingEnum.Test;
108                                 Enum.Format (x.GetType (), x, null);
109                                 Assert.Fail ("#C1");
110                         } catch (ArgumentNullException ex) {
111                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#C2");
112                                 Assert.IsNull (ex.InnerException, "#C3");
113                                 Assert.IsNotNull (ex.Message, "#C4");
114                                 Assert.IsNotNull (ex.ParamName, "#C5");
115                                 Assert.AreEqual ("format", ex.ParamName, "#C6");
116                         }
117
118                         try {
119                                 TestingEnum x = TestingEnum.Test;
120                                 Enum.Format (typeof (string), x, "G");
121                                 Assert.Fail ("#D1");
122                         } catch (ArgumentException ex) {
123                                 // Type provided must be an Enum
124                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
125                                 Assert.IsNull (ex.InnerException, "#A3");
126                                 Assert.IsNotNull (ex.Message, "#A4");
127                                 Assert.IsNotNull (ex.ParamName, "#A5");
128                                 Assert.AreEqual ("enumType", ex.ParamName, "#A6");
129                         }
130
131                         try {
132                                 TestingEnum x = TestingEnum.Test;
133                                 TestingEnum2 y = TestingEnum2.Test;
134                                 Enum.Format (y.GetType (), x, "G");
135                                 Assert.Fail ("#E1");
136                         } catch (ArgumentException ex) {
137                                 // Object must be the same type as the enum. The type passed in was
138                                 // MonoTests.System.EnumTest.TestingEnum2; the enum type was
139                                 // MonoTests.System.EnumTest.TestingEnum
140                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#E2");
141                                 Assert.IsNull (ex.InnerException, "#E3");
142                                 Assert.IsNotNull (ex.Message, "#E4");
143                                 Assert.IsTrue (ex.Message.IndexOf (typeof (TestingEnum2).FullName) != -1, "#E5");
144                                 Assert.IsTrue (ex.Message.IndexOf (typeof (TestingEnum).FullName) != -1, "#E6");
145                                 Assert.IsNull (ex.ParamName, "#A7");
146                         }
147
148                         try {
149                                 String bad = "huh?";
150                                 TestingEnum x = TestingEnum.Test;
151                                 Enum.Format (x.GetType (), bad, "G");
152                                 Assert.Fail ("#F1");
153                         } catch (ArgumentException ex) {
154                                 // Enum underlying type and the object must be the same type or
155                                 // object. Type passed in was String.String; the enum underlying
156                                 // was System.Int32
157                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#F2");
158                                 Assert.IsNull (ex.InnerException, "#F3");
159                                 Assert.IsNotNull (ex.Message, "#F4");
160                                 Assert.IsTrue (ex.Message.IndexOf (typeof (string).FullName) != -1, "#F5");
161                                 Assert.IsTrue (ex.Message.IndexOf (typeof (int).FullName) != -1, "#F6");
162                                 Assert.IsNull (ex.ParamName, "#F7");
163                         }
164
165                         string [] codes = {"a", "b", "c", "ad", "e", "af", "ag", "h", 
166                                   "i", "j", "k", "l", "m", "n", "o", "p", 
167                                   "q", "r", "s", "t", "u", "v", "w", "ax", 
168                                   "y", "z"};
169                         foreach (string code in codes) {
170                                 try {
171                                         TestingEnum x = TestingEnum.Test;
172                                         Enum.Format (x.GetType (), x, code);
173                                         Assert.Fail ("#G1:" + code);
174                                 } catch (FormatException ex) {
175                                         // Format String can be only "G","g","X","x","F","f","D" or "d"
176                                         Assert.AreEqual (typeof (FormatException), ex.GetType (), "#G2");
177                                         Assert.IsNull (ex.InnerException, "#G3");
178                                         Assert.IsNotNull (ex.Message, "#G4");
179                                 }
180                         }
181
182                         TestingEnum test = TestingEnum.Test;
183                         Assert.AreEqual ("3", Enum.Format (test.GetType (), test, "d"), "#H1");
184                         Assert.AreEqual ("18446744073709551615", Enum.Format (typeof (TestingEnum3), TestingEnum3.Test, "d"), "#H2");
185                         Assert.AreEqual ("Test", Enum.Format (test.GetType (), test, "g"), "#H3");
186                         Assert.AreEqual ("00000003", Enum.Format (test.GetType (), test, "x"), "#H4");
187                         Assert.AreEqual ("Test", Enum.Format (test.GetType (), test, "f"), "#H5");
188                 }
189
190                 [Test]
191                 public void TestFormat_FormatSpecifier ()
192                 {
193                         ParameterAttributes pa =
194                                 ParameterAttributes.In | ParameterAttributes.HasDefault;
195                         const string fFormatOutput = "In, HasDefault";
196                         const string xFormatOutput = "00001001";
197                         string fOutput = Enum.Format (pa.GetType (), pa, "f");
198                         Assert.AreEqual (fFormatOutput, fOutput, "#A1");
199                         string xOutput = Enum.Format (pa.GetType (), pa, "x");
200                         Assert.AreEqual (xFormatOutput, xOutput, "#A2");
201
202                         Assert.AreEqual ("00", TestingEnum4.This.ToString ("x"), "#B1");
203                         Assert.AreEqual ("00", TestingEnum4.This.ToString ("X"), "#B2");
204                         Assert.AreEqual ("ff", TestingEnum4.Test.ToString ("x"), "#B3");
205                         Assert.AreEqual ("FF", TestingEnum4.Test.ToString ("X"), "#B4");
206
207                         Assert.AreEqual ("0000", TestingEnum5.This.ToString ("x"), "#C1");
208                         Assert.AreEqual ("0000", TestingEnum5.This.ToString ("X"), "#C2");
209                         Assert.AreEqual ("7fff", TestingEnum5.Test.ToString ("x"), "#C3");
210                         Assert.AreEqual ("7FFF", TestingEnum5.Test.ToString ("X"), "#C4");
211
212                         Assert.AreEqual ("00000000", TestingEnum6.This.ToString ("x"), "#D1");
213                         Assert.AreEqual ("00000000", TestingEnum6.This.ToString ("X"), "#D2");
214                         Assert.AreEqual ("7fffffff", TestingEnum6.Test.ToString ("x"), "#D3");
215                         Assert.AreEqual ("7FFFFFFF", TestingEnum6.Test.ToString ("X"), "#D4");
216
217                         Assert.AreEqual ("0000000000000000", TestingEnum3.This.ToString ("x"), "#E1");
218                         Assert.AreEqual ("0000000000000000", TestingEnum3.This.ToString ("X"), "#E2");
219                         Assert.AreEqual ("ffffffffffffffff", TestingEnum3.Test.ToString ("x"), "#E3");
220                         Assert.AreEqual ("FFFFFFFFFFFFFFFF", TestingEnum3.Test.ToString ("X"), "#E4");
221                 }
222
223                 [Test]
224                 public void TestGetHashCode ()
225                 {
226                         Enum e1 = new TestingEnum ();
227                         Enum e2 = new TestingEnum2 ();
228
229                         Assert.AreEqual (e1.GetHashCode (), e1.GetHashCode ());
230                 }
231
232                 [Test]
233                 public void GetName ()
234                 {
235                         try {
236                                 TestingEnum x = TestingEnum.Test;
237                                 Enum.GetName (null, x);
238                                 Assert.Fail ("#A1");
239                         } catch (ArgumentNullException ex) {
240                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2");
241                                 Assert.IsNull (ex.InnerException, "#A3");
242                                 Assert.IsNotNull (ex.Message, "#A4");
243                                 Assert.IsNotNull (ex.ParamName, "#A5");
244                                 Assert.AreEqual ("enumType", ex.ParamName, "#A6");
245                         }
246
247                         try {
248                                 TestingEnum x = TestingEnum.Test;
249                                 Enum.GetName (x.GetType (), null);
250                                 Assert.Fail ("#B1");
251                         } catch (ArgumentNullException ex) {
252                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2");
253                                 Assert.IsNull (ex.InnerException, "#B3");
254                                 Assert.IsNotNull (ex.Message, "#B4");
255                                 Assert.IsNotNull (ex.ParamName, "#B5");
256                                 Assert.AreEqual ("value", ex.ParamName, "#B6");
257                         }
258
259                         try {
260                                 String bad = "huh?";
261                                 TestingEnum x = TestingEnum.Test;
262                                 Enum.GetName (bad.GetType (), x);
263                                 Assert.Fail ("#C1");
264                         } catch (ArgumentException ex) {
265                                 // Type provided must be an Enum
266                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#C2");
267                                 Assert.IsNull (ex.InnerException, "#C3");
268                                 Assert.IsNotNull (ex.Message, "#C4");
269                                 Assert.IsNotNull (ex.ParamName, "#C5");
270                                 Assert.AreEqual ("enumType", ex.ParamName, "#C6");
271                         }
272
273                         try {
274                                 String bad = "huh?";
275                                 TestingEnum x = TestingEnum.Test;
276                                 Enum.GetName (x.GetType (), bad);
277                                 Assert.Fail ("#D1");
278                         } catch (ArgumentException ex) {
279                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#D2");
280                                 Assert.IsNull (ex.InnerException, "#D3");
281                                 Assert.IsNotNull (ex.Message, "#D4");
282                                 Assert.IsNotNull (ex.ParamName, "#D5");
283                                 Assert.AreEqual ("value", ex.ParamName, "#D6");
284                         }
285
286                         TestingEnum a = TestingEnum.This;
287                         TestingEnum b = TestingEnum.Is;
288                         TestingEnum c = TestingEnum.A;
289                         TestingEnum2 d = TestingEnum2.Test;
290
291                         Assert.AreEqual ("This", Enum.GetName (a.GetType (), a), "#E1");
292                         Assert.AreEqual ("Is", Enum.GetName (b.GetType (), b), "#E2");
293                         Assert.AreEqual ("A", Enum.GetName (c.GetType (), c), "#E3");
294                         Assert.AreEqual ("Test", Enum.GetName (c.GetType (), d), "#E4");
295                 }
296
297                 [Test]
298                 public void GetNameIdenticalToGetEnumName ()
299                 {
300                         Assert.AreEqual (typeof (EnumOverlap).GetEnumName (0), Enum.GetName (typeof(EnumOverlap), 0), "#1");
301                         Assert.AreEqual ("First", Enum.GetName (typeof(EnumOverlap), 0), "#2");
302                 }
303
304                 [Test]
305                 public void TestGetNames ()
306                 {
307                         try {
308                                 Enum.GetNames (null);
309                                 Assert.Fail ("#A1");
310                         } catch (ArgumentNullException ex) {
311                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2");
312                                 Assert.IsNull (ex.InnerException, "#A3");
313                                 Assert.IsNotNull (ex.Message, "#A4");
314                                 Assert.IsNotNull (ex.ParamName, "#A5");
315                                 Assert.AreEqual ("enumType", ex.ParamName, "#A6");
316                         }
317
318                         TestingEnum x = TestingEnum.This;
319                         string [] match = { "This", "Is", "A", "Test" };
320                         string [] names = Enum.GetNames (x.GetType ());
321                         Assert.IsNotNull (names, "#B1");
322                         Assert.AreEqual (match.Length, names.Length, "#B2");
323                         for (int i = 0; i < names.Length; i++)
324                                 Assert.AreEqual (match [i], names [i], "#B3");
325                 }
326
327                 [Test]
328                 public void TestGetTypeCode ()
329                 {
330                         TestingEnum x = TestingEnum.This;
331                         TestingEnum y = new TestingEnum ();
332                         Assert.AreEqual (TypeCode.Int32, x.GetTypeCode (), "#1");
333                         Assert.AreEqual (TypeCode.Int32, y.GetTypeCode (), "#2");
334                 }
335
336                 [Test]
337                 public void TestGetUnderlyingType ()
338                 {
339                         try {
340                                 Enum.GetUnderlyingType (null);
341                                 Assert.Fail ("#A1");
342                         } catch (ArgumentNullException ex) {
343                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2");
344                                 Assert.IsNull (ex.InnerException, "#A3");
345                                 Assert.IsNotNull (ex.Message, "#A4");
346                                 Assert.IsNotNull (ex.ParamName, "#A5");
347                                 Assert.AreEqual ("enumType", ex.ParamName, "#A6");
348                         }
349
350                         try {
351                                 String bad = "huh?";
352                                 Enum.GetUnderlyingType (bad.GetType ());
353                                 Assert.Fail ("#B1");
354                         } catch (ArgumentException ex) {
355                                 // Type provided must be an Enum
356                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
357                                 Assert.IsNull (ex.InnerException, "#B3");
358                                 Assert.IsNotNull (ex.Message, "#B4");
359                                 Assert.IsNotNull (ex.ParamName, "#B5");
360                                 Assert.AreEqual ("enumType", ex.ParamName, "#B6");
361                         }
362
363                         short sh = 5;
364                         int i = 5;
365                         Enum t1 = new TestingEnum ();
366                         Enum t2 = new TestShortEnum ();
367                         Assert.AreEqual (i.GetType (), Enum.GetUnderlyingType (t1.GetType ()), "#C1");
368                         Assert.AreEqual (sh.GetType (), Enum.GetUnderlyingType (t2.GetType ()), "#C2");
369                 }
370
371                 [Test]
372                 public void TestGetValues ()
373                 {
374                         try {
375                                 Enum.GetValues (null);
376                                 Assert.Fail ("#A1");
377                         } catch (ArgumentNullException ex) {
378                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2");
379                                 Assert.IsNull (ex.InnerException, "#A3");
380                                 Assert.IsNotNull (ex.Message, "#A4");
381                                 Assert.IsNotNull (ex.ParamName, "#A5");
382                                 Assert.AreEqual ("enumType", ex.ParamName, "#A6");
383                         }
384
385                         try {
386                                 String bad = "huh?";
387                                 Enum.GetValues (bad.GetType ());
388                                 Assert.Fail ("#B1");
389                         } catch (ArgumentException ex) {
390                                 // Type provided must be an Enum
391                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
392                                 Assert.IsNull (ex.InnerException, "#B3");
393                                 Assert.IsNotNull (ex.Message, "#B4");
394                                 Assert.IsNotNull (ex.ParamName, "#B5");
395                                 Assert.AreEqual ("enumType", ex.ParamName, "#B6");
396                         }
397
398                         Enum t1 = new TestingEnum ();
399                         Array a1 = Enum.GetValues (t1.GetType ());
400                         for (int i = 0; i < a1.Length; i++)
401                                 Assert.AreEqual ((TestingEnum) i, a1.GetValue (i), "#C1");
402
403                         Enum t2 = new TestShortEnum ();
404                         Array a2 = Enum.GetValues (t2.GetType ());
405                         for (short i = 0; i < a1.Length; i++)
406                                 Assert.AreEqual ((TestShortEnum) i, a2.GetValue (i), "#C2");
407                 }
408
409                 [Test]
410                 public void TestIsDefined ()
411                 {
412                         try {
413                                 Enum.IsDefined (null, 1);
414                                 Assert.Fail ("#A1");
415                         } catch (ArgumentNullException ex) {
416                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2");
417                                 Assert.IsNull (ex.InnerException, "#A3");
418                                 Assert.IsNotNull (ex.Message, "#A4");
419                                 Assert.IsNotNull (ex.ParamName, "#A5");
420                                 Assert.AreEqual ("enumType", ex.ParamName, "#A6");
421                         }
422
423                         try {
424                                 TestingEnum x = TestingEnum.Test;
425                                 Enum.IsDefined (x.GetType (), null);
426                                 Assert.Fail ("#B1");
427                         } catch (ArgumentNullException ex) {
428                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2");
429                                 Assert.IsNull (ex.InnerException, "#B3");
430                                 Assert.IsNotNull (ex.Message, "#B4");
431                                 Assert.IsNotNull (ex.ParamName, "#B5");
432                                 Assert.AreEqual ("value", ex.ParamName, "#B6");
433                         }
434
435                         try {
436                                 String bad = "huh?";
437                                 int i = 4;
438                                 Enum.IsDefined (bad.GetType (), i);
439                                 Assert.Fail ("#C1");
440                         } catch (ArgumentException ex) {
441                                 // Type provided must be an Enum
442                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#C2");
443                                 Assert.IsNull (ex.InnerException, "#C3");
444                                 Assert.IsNotNull (ex.Message, "#C4");
445                                 Assert.IsNotNull (ex.ParamName, "#C5");
446                                 Assert.AreEqual ("enumType", ex.ParamName, "#C6");
447                         }
448
449                         try {
450                                 TestingEnum x = TestingEnum.Test;
451                                 short i = 4;
452                                 Enum.IsDefined (x.GetType (), i);
453                                 Assert.Fail ("#D1");
454                         } catch (ArgumentException ex) {
455                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#D2");
456                                 Assert.IsNull (ex.InnerException, "#D3");
457                                 Assert.IsNotNull (ex.Message, "#D4");
458                                 Assert.IsNull (ex.ParamName, "#D5");
459                         }
460
461                         Enum t1 = new TestingEnum ();
462                         int valCount = Enum.GetValues (t1.GetType ()).Length;
463                         for (int i = 0; i < valCount; i++)
464                                 Assert.IsTrue (Enum.IsDefined (t1.GetType (), i), "#F1:" + i);
465                         Assert.IsFalse (Enum.IsDefined (t1.GetType (), valCount), "#F2");
466                         Assert.IsFalse (Enum.IsDefined (typeof (TestingEnum), "huh?"), "#F3");
467                 }
468
469                 [Test]
470                 public void TestParse1 ()
471                 {
472                         try {
473                                 String name = "huh?";
474                                 Enum.Parse (null, name);
475                                 Assert.Fail ("#A1");
476                         } catch (ArgumentNullException ex) {
477                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2");
478                                 Assert.IsNull (ex.InnerException, "#A3");
479                                 Assert.IsNotNull (ex.Message, "#A4");
480                                 Assert.IsNotNull (ex.ParamName, "#A5");
481                                 Assert.AreEqual ("enumType", ex.ParamName, "#A6");
482                         }
483
484                         try {
485                                 TestingEnum x = TestingEnum.Test;
486                                 Enum.Parse (x.GetType (), null);
487                                 Assert.Fail ("#B1");
488                         } catch (ArgumentNullException ex) {
489                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2");
490                                 Assert.IsNull (ex.InnerException, "#B3");
491                                 Assert.IsNotNull (ex.Message, "#B4");
492                                 Assert.IsNotNull (ex.ParamName, "#B5");
493                                 Assert.AreEqual ("value", ex.ParamName, "#B6");
494                         }
495
496                         try {
497                                 String bad = "huh?";
498                                 Enum.Parse (bad.GetType (), bad);
499                                 Assert.Fail ("#C1");
500                         } catch (ArgumentException ex) {
501                                 // Type provided must be an Enum
502                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#C2");
503                                 Assert.IsNull (ex.InnerException, "#C3");
504                                 Assert.IsNotNull (ex.Message, "#C4");
505                                 Assert.IsNotNull (ex.ParamName, "#C5");
506                                 Assert.AreEqual ("enumType", ex.ParamName, "#C6");
507                         }
508
509                         try {
510                                 TestingEnum x = TestingEnum.Test;
511                                 String bad = "";
512                                 Enum.Parse (x.GetType (), bad);
513                                 Assert.Fail ("#D1");
514                         } catch (ArgumentException ex) {
515                                 // Must specify valid information for parsing
516                                 // in the string
517                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#D2");
518                                 Assert.IsNull (ex.InnerException, "#D3");
519                                 Assert.IsNotNull (ex.Message, "#D4");
520                                 Assert.IsNull (ex.ParamName, "#D5");
521                         }
522
523                         try {
524                                 TestingEnum x = TestingEnum.Test;
525                                 String bad = " ";
526                                 Enum.Parse (x.GetType (), bad);
527                                 Assert.Fail ("#E1");
528                         } catch (ArgumentException ex) {
529                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#E2");
530                                 Assert.IsNull (ex.InnerException, "#E3");
531                                 Assert.IsNotNull (ex.Message, "#E4");
532                                 Assert.IsNull (ex.ParamName, "#E5");
533                         }
534
535                         try {
536                                 String bad = "huh?";
537                                 TestingEnum x = TestingEnum.Test;
538                                 Enum.Parse (x.GetType (), bad);
539                                 Assert.Fail ("#F1");
540                         } catch (ArgumentException ex) {
541                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#F2");
542                                 Assert.IsNull (ex.InnerException, "#F3");
543                                 Assert.IsNotNull (ex.Message, "#F4");
544                                 Assert.IsNull (ex.ParamName, "#F5");
545                         }
546
547                         TestingEnum t1 = new TestingEnum ();
548                         Assert.AreEqual (TestingEnum.This, Enum.Parse (t1.GetType (), "This"), "#G1");
549                         Assert.AreEqual (TestingEnum.Is, Enum.Parse (t1.GetType (), "Is"), "#G2");
550                         Assert.AreEqual (TestingEnum.A, Enum.Parse (t1.GetType (), "A"), "#G3");
551                         Assert.AreEqual (TestingEnum.Test, Enum.Parse (t1.GetType (), "Test"), "#G4");
552                         Assert.AreEqual (TestingEnum.Test, Enum.Parse (t1.GetType (), "    \n\nTest\t"), "#G5");
553                         Assert.AreEqual (TestingEnum.Is, Enum.Parse (t1.GetType (), "This,Is"), "#G6");
554                         Assert.AreEqual (TestingEnum.Test, Enum.Parse (t1.GetType (), "This,Test"), "#G7");
555                         Assert.AreEqual (TestingEnum.Test, Enum.Parse (t1.GetType (), "This,Is,A"), "#G8");
556                         Assert.AreEqual (TestingEnum.Test, Enum.Parse (t1.GetType (), "   \n\tThis \t\n,    Is,A \n"), "#G9");
557                 }
558
559                 [Test]
560                 public void TestParse2 ()
561                 {
562                         try {
563                                 String name = "huh?";
564                                 Enum.Parse (null, name, true);
565                                 Assert.Fail ("#A1");
566                         } catch (ArgumentNullException ex) {
567                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2");
568                                 Assert.IsNull (ex.InnerException, "#A3");
569                                 Assert.IsNotNull (ex.Message, "#A4");
570                                 Assert.IsNotNull (ex.ParamName, "#A5");
571                                 Assert.AreEqual ("enumType", ex.ParamName, "#A6");
572                         }
573
574                         try {
575                                 TestingEnum x = TestingEnum.Test;
576                                 Enum.Parse (x.GetType (), null, true);
577                                 Assert.Fail ("#B1");
578                         } catch (ArgumentNullException ex) {
579                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2");
580                                 Assert.IsNull (ex.InnerException, "#B3");
581                                 Assert.IsNotNull (ex.Message, "#B4");
582                                 Assert.IsNotNull (ex.ParamName, "#B5");
583                                 Assert.AreEqual ("value", ex.ParamName, "#B6");
584                         }
585
586                         try {
587                                 String bad = "huh?";
588                                 Enum.Parse (bad.GetType (), bad, true);
589                                 Assert.Fail ("#C1");
590                         } catch (ArgumentException ex) {
591                                 // Type provided must be an Enum
592                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#D2");
593                                 Assert.IsNull (ex.InnerException, "#D3");
594                                 Assert.IsNotNull (ex.Message, "#D4");
595                                 Assert.IsNotNull (ex.ParamName, "#D5");
596                                 Assert.AreEqual ("enumType", ex.ParamName, "#D6");
597                         }
598
599                         try {
600                                 TestingEnum x = TestingEnum.Test;
601                                 String bad = "";
602                                 Enum.Parse (x.GetType (), bad, true);
603                                 Assert.Fail ("#E1");
604                         } catch (ArgumentException ex) {
605                                 // Must specify valid information for parsing
606                                 // in the string
607                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#E2");
608                                 Assert.IsNull (ex.InnerException, "#E3");
609                                 Assert.IsNotNull (ex.Message, "#E4");
610                                 Assert.IsNull (ex.ParamName, "#E5");
611                         }
612
613                         try {
614                                 TestingEnum x = TestingEnum.Test;
615                                 String bad = " ";
616                                 Enum.Parse (x.GetType (), bad, true);
617                                 Assert.Fail ("#F1");
618                         } catch (ArgumentException ex) {
619                                 // Must specify valid information for parsing
620                                 // in the string
621                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#F2");
622                                 Assert.IsNull (ex.InnerException, "#F3");
623                                 Assert.IsNotNull (ex.Message, "#F4");
624                                 Assert.IsFalse (ex.Message.IndexOf ("' '") != -1, "#F5");
625                                 Assert.IsNull (ex.ParamName, "#F6");
626                         }
627
628                         try {
629                                 String bad = "huh?";
630                                 TestingEnum x = TestingEnum.Test;
631                                 Enum.Parse (x.GetType (), bad, true);
632                                 Assert.Fail ("#G1");
633                         } catch (ArgumentException ex) {
634                                 // Requested value 'huh?' was not found
635                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#G2");
636                                 Assert.IsNull (ex.InnerException, "#G3");
637                                 Assert.IsNotNull (ex.Message, "#G4");
638                                 Assert.IsTrue (ex.Message.IndexOf ("'huh?'") != -1, "#G5");
639                                 Assert.IsNull (ex.ParamName, "#G6");
640                         }
641
642                         try {
643                                 String bad = "test";
644                                 TestingEnum x = TestingEnum.Test;
645                                 Enum.Parse (x.GetType (), bad, false);
646                                 Assert.Fail ("#H1");
647                         } catch (ArgumentException ex) {
648                                 // Requested value 'test' was not found
649                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#H2");
650                                 Assert.IsNull (ex.InnerException, "#H3");
651                                 Assert.IsNotNull (ex.Message, "#H4");
652                                 Assert.IsTrue (ex.Message.IndexOf ("'test'") != -1, "#H5");
653                                 Assert.IsNull (ex.ParamName, "#H6");
654                         }
655
656                         TestingEnum t1 = new TestingEnum ();
657                         Assert.AreEqual (TestingEnum.This, Enum.Parse (t1.GetType (), "this", true), "#I1");
658                         Assert.AreEqual (TestingEnum.Is, Enum.Parse (t1.GetType (), "is", true), "#I2");
659                         Assert.AreEqual (TestingEnum.A, Enum.Parse (t1.GetType (), "a", true), "#I3");
660                         Assert.AreEqual (TestingEnum.Test, Enum.Parse (t1.GetType (), "test", true), "#I4");
661                         Assert.AreEqual (TestingEnum.Test, Enum.Parse (t1.GetType (), "    \n\ntest\t", true), "#I5");
662
663                         Assert.AreEqual (TestingEnum.Is, Enum.Parse (t1.GetType (), "This,is", true), "#J1");
664                         Assert.AreEqual (TestingEnum.Test, Enum.Parse (t1.GetType (), "This,test", true), "#J2");
665                         Assert.AreEqual (TestingEnum.Test, Enum.Parse (t1.GetType (), "This,is,A", true), "#J3");
666                         Assert.AreEqual (TestingEnum.Test, Enum.Parse (t1.GetType (), "   \n\tThis \t\n,    is,a \n", true), "#J4");
667                 }
668
669                 [Test]
670                 public void ParseValue ()
671                 {
672                         TestingEnum3 t1 = new TestingEnum3 ();
673                         Assert.AreEqual (TestingEnum3.Test, Enum.Parse (t1.GetType (), "18446744073709551615", false));
674                 }
675
676 #if NET_4_0
677                 [Test]
678                 public void TryParseErrors ()
679                 {
680                         TestingEnum result;
681                         bool success;
682
683                         success = Enum.TryParse<TestingEnum> (null, out result);
684                         Assert.AreEqual (false, success, "#A1");
685                         Assert.AreEqual (TestingEnum.This, result, "#A2");
686
687                         success = Enum.TryParse<TestingEnum> ("WrongValue", out result);
688                         Assert.AreEqual (false, success, "#B1");
689                         Assert.AreEqual (TestingEnum.This, result, "#B2");
690
691                         success = Enum.TryParse<TestingEnum> (String.Empty, out result);
692                         Assert.AreEqual (false, success, "#C1");
693                         Assert.AreEqual (TestingEnum.This, result, "#C2");
694
695                         success = Enum.TryParse<TestingEnum> (" ", out result);
696                         Assert.AreEqual (false, success, "#D1");
697                         Assert.AreEqual (TestingEnum.This, result, "#D2");
698
699                         // TryParse throws ArgumentException if TEnum is not an enumeration type
700                         try {
701                                 int n;
702                                 Enum.TryParse<int> ("31416", out n);
703                                 Assert.Fail ("#E1");
704                         } catch (ArgumentException ex) {
705                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#E2");
706                                 Assert.IsNull (ex.InnerException, "#E3");
707                                 Assert.IsNotNull (ex.Message, "#E4");
708                                 Assert.IsNotNull (ex.ParamName, "#E5");
709                                 Assert.AreEqual ("enumType", ex.ParamName, "#E6");
710                         }
711                 }
712
713                 [Test]
714                 public void TryParse ()
715                 {
716                         TestingEnum result;
717                         bool success;
718
719                         success = Enum.TryParse<TestingEnum> ("Is", out result);
720                         Assert.AreEqual (true, success, "#A1");
721                         Assert.AreEqual (TestingEnum.Is, result, "#A2");
722
723                         success = Enum.TryParse<TestingEnum> ("100", out result);
724                         Assert.AreEqual (true, success, "#C1");
725                         Assert.AreEqual (((TestingEnum)100), result, "#C2");
726
727                         success = Enum.TryParse<TestingEnum> ("is", out result);
728                         Assert.AreEqual (false, success, "#D1");
729                         Assert.AreEqual (TestingEnum.This, result, "#D2");
730
731                         success = Enum.TryParse<TestingEnum> ("is", true, out result);
732                         Assert.AreEqual (true, success, "#D1");
733                         Assert.AreEqual (TestingEnum.Is, result, "#D2");
734
735                         success = Enum.TryParse<TestingEnum> ("  Is  ", out result);
736                         Assert.AreEqual (true, success, "#E1");
737                         Assert.AreEqual (TestingEnum.Is, result, "#E2");
738                 }
739 #endif
740
741                 [Test]
742                 public void ToObject_EnumType_Int32 ()
743                 {
744                         object value = Enum.ToObject (typeof (TestingEnum), 0);
745                         Assert.AreEqual (TestingEnum.This, value, "#1");
746                         value = Enum.ToObject (typeof (TestingEnum), 2);
747                         Assert.AreEqual (TestingEnum.A, value, "#2");
748                 }
749
750                 [Test]
751 #if ONLY_1_1
752                 [Category ("NotDotNet")]
753 #endif
754                 public void ToObject_EnumType_UInt64 ()
755                 {
756                         object value = Enum.ToObject (typeof (TestingEnum3), 0);
757                         Assert.AreEqual (TestingEnum3.This, value, "#1");
758                         value = Enum.ToObject (typeof (TestingEnum3), 1);
759                         Assert.AreEqual (TestingEnum3.Is, value, "#2");
760                         value = Enum.ToObject (typeof (TestingEnum3), ulong.MaxValue);
761                         Assert.AreEqual (TestingEnum3.Test, value, "#3");
762                 }
763
764                 [Test]
765                 public void ToObject_EnumType_Byte ()
766                 {
767                         object value = Enum.ToObject (typeof (TestingEnum4), 0);
768                         Assert.AreEqual (TestingEnum4.This, value, "#1");
769                         value = Enum.ToObject (typeof (TestingEnum4), byte.MaxValue);
770                         Assert.AreEqual (TestingEnum4.Test, value, "#2");
771                 }
772
773                 [Test]
774                 public void ToObject_EnumType_Int16 ()
775                 {
776                         object value = Enum.ToObject (typeof (TestingEnum5), 0);
777                         Assert.AreEqual (TestingEnum5.This, value, "#1");
778                         value = Enum.ToObject (typeof (TestingEnum5), short.MaxValue);
779                         Assert.AreEqual (TestingEnum5.Test, value, "#2");
780                 }
781
782                 [Test]
783                 public void ToObject_EnumType_Bool ()
784                 {
785                         object value = Enum.ToObject (typeof (TestingEnum5), true);
786                         Assert.AreEqual (TestingEnum5.Is, value, "#1");
787                 }
788
789                 [Test]
790                 public void ToObject_EnumType_Char ()
791                 {
792                         object value = Enum.ToObject (typeof (TestingEnum3), (object) '\0');
793                         Assert.AreEqual (TestingEnum3.This, value, "#1");
794                 }
795
796                 [Test]
797                 public void ToObject_EnumType_Invalid ()
798                 {
799                         try {
800                                 Enum.ToObject (typeof (string), 1);
801                                 Assert.Fail ("#1");
802                         } catch (ArgumentException ex) {
803                                 // Type provided must be an Enum
804                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
805                                 Assert.IsNull (ex.InnerException, "#3");
806                                 Assert.IsNotNull (ex.Message, "#4");
807                                 Assert.IsNotNull (ex.ParamName, "#5");
808                                 Assert.AreEqual ("enumType", ex.ParamName, "#6");
809                         }
810                 }
811
812                 [Test]
813                 public void ToObject_EnumType_Null ()
814                 {
815                         try {
816                                 Enum.ToObject (null, 1);
817                                 Assert.Fail ("#1");
818                         } catch (ArgumentNullException ex) {
819                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
820                                 Assert.IsNull (ex.InnerException, "#3");
821                                 Assert.IsNotNull (ex.Message, "#4");
822                                 Assert.IsNotNull (ex.ParamName, "#5");
823                                 Assert.AreEqual ("enumType", ex.ParamName, "#6");
824                         }
825                 }
826
827                 [Test]
828                 public void ToObject_Value_Null ()
829                 {
830                         try {
831                                 Enum.ToObject (typeof (TestingEnum), (object) null);
832                                 Assert.Fail ("#1");
833                         } catch (ArgumentNullException ex) {
834                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
835                                 Assert.IsNull (ex.InnerException, "#3");
836                                 Assert.IsNotNull (ex.Message, "#4");
837                                 Assert.IsNotNull (ex.ParamName, "#5");
838                                 Assert.AreEqual ("value", ex.ParamName, "#6");
839                         }
840                 }
841
842                 [Test]
843                 public void ToObject_Value_Invalid ()
844                 {
845                         try {
846                                 Enum.ToObject (typeof (TestingEnum), "This");
847                                 Assert.Fail ("#1");
848                         } catch (ArgumentException ex) {
849                                 // The value passed in must be an enum base or
850                                 // an underlying type for an enum, such as an
851                                 // Int32
852                                 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
853                                 Assert.IsNull (ex.InnerException, "#3");
854                                 Assert.IsNotNull (ex.Message, "#4");
855                                 Assert.IsNotNull (ex.ParamName, "#5");
856                                 Assert.AreEqual ("value", ex.ParamName, "#6");
857                         }
858                 }
859
860                 [Test]
861                 public void IConvertible_Valid ()
862                 {
863                         IConvertible ic = TestingEnum.This;
864                         Assert.AreEqual ("This", ic.ToType (typeof (string), null), "#1");
865                         Assert.AreEqual (TestingEnum.This, ic.ToType (typeof (TestingEnum), null), "#2");
866                         Assert.AreEqual (TestingEnum.This, ic.ToType (typeof (Enum), null), "#3");
867                 }
868
869                 [Test]
870                 public void TestToString ()
871                 {
872                         Assert.AreEqual ("This", TestingEnum.This.ToString (), "#A1");
873                         Assert.AreEqual ("Is", TestingEnum.Is.ToString (), "#A2");
874                         Assert.AreEqual ("A", TestingEnum.A.ToString (), "#A3");
875                         Assert.AreEqual ("Test", TestingEnum.Test.ToString (), "#A4");
876
877                         Enum is1 = TestingEnum.Is;
878
879                         Assert.AreEqual ("1", is1.ToString ("d"), "#B1");
880                         Assert.AreEqual ("Is", is1.ToString ("g"), "#B2");
881                         Assert.AreEqual ("00000001", is1.ToString ("x"), "#B3");
882                         Assert.AreEqual ("Is", is1.ToString ("f"), "#B4");
883
884                         Assert.AreEqual ("b, c", ((SomeEnum) 3).ToString ("f"), "#C1");
885                         Assert.AreEqual ("b, c", ((SomeByteEnum) 3).ToString ("f"), "#C2");
886                         Assert.AreEqual ("b, c", ((SomeInt64Enum) 3).ToString ("f"), "#C3");
887
888                         Assert.AreEqual ("12", ((SomeEnum) 12).ToString ("f"), "#D1");
889                         Assert.AreEqual ("12", ((SomeByteEnum) 12).ToString ("f"), "#D2");
890                         Assert.AreEqual ("12", ((SomeInt64Enum) 12).ToString ("f"), "#D3");
891                 }
892
893                 [Test]
894                 public void FlagTest ()
895                 {
896                         int [] evalues = new int [4] { 0, 1, 2, 3 };
897                         E [] e = new E [4] { E.Aa, E.Bb, E.Cc, E.Dd };
898
899                         for (int i = 0; i < 4; ++i)
900                                 Assert.AreEqual (e [i].ToString (),
901                                         Enum.Format (typeof (E), evalues [i], "f"),
902                                         "#1" + i);
903
904                         int invalidValue = 1000;
905
906                         Assert.AreEqual (invalidValue.ToString (),
907                                 Enum.Format (typeof (E2), invalidValue, "g"),
908                                 "#2");
909                 }
910
911                 [Test]
912                 public void FlagTest_Negative ()
913                 {
914                         FlagsNegativeTestEnum t;
915
916                         t = FlagsNegativeTestEnum.None;
917                         Assert.AreEqual ("None", t.ToString (), "#01");
918                         t = FlagsNegativeTestEnum.One;
919                         Assert.AreEqual ("One", t.ToString (), "#02");
920                 }
921
922                 [Test]
923                 public void AnotherFormatBugPinned ()
924                 {
925                         Assert.AreEqual ("100", Enum.Format (typeof (E3), 100, "f"));
926                 }
927
928                 [Test]
929                 public void LogicBugPinned ()
930                 {
931                         string format = null;
932                         string [] names = new string [] { "A", "B", "C", "D", };
933                         string [] fmtSpl = null;
934                         UE ue = UE.A | UE.B | UE.C | UE.D;
935
936                         //all flags must be in format return
937                         format = Enum.Format (typeof (UE), ue, "f");
938                         fmtSpl = format.Split (',');
939                         for (int i = 0; i < fmtSpl.Length; ++i)
940                                 fmtSpl [i] = fmtSpl [i].Trim ();
941
942                         foreach (string nval in fmtSpl)
943                                 Assert.IsTrue (Array.IndexOf (names, nval) >= 0, "#1:" + nval);
944
945                         foreach (string nval in names)
946                                 Assert.IsTrue (Array.IndexOf (fmtSpl, nval) >= 0, "#2:" + nval);
947                 }
948                 // TODO - ToString with IFormatProviders
949
950                 [Test]
951                 public void GetHashCode_ShouldBeEqualToUnderlyingType ()
952                 {
953                         Assert.AreEqual (EnInt8.A.GetHashCode(), SByte.MinValue, "i8#0");
954                         Assert.AreEqual (EnInt8.B.GetHashCode(), 44, "i8#1");
955                         Assert.AreEqual (EnInt8.C.GetHashCode(), SByte.MaxValue, "i8#2");
956         
957                         Assert.AreEqual (EnUInt8.A.GetHashCode(), Byte.MinValue, "u8#0");
958                         Assert.AreEqual (EnUInt8.B.GetHashCode(), 55, "u8#1");
959                         Assert.AreEqual (EnUInt8.C.GetHashCode(), Byte.MaxValue, "u8#2");
960         
961                         Assert.AreEqual (EnInt16.A.GetHashCode(), Int16.MinValue, "i16#0");
962                         Assert.AreEqual (EnInt16.B.GetHashCode(), 66, "i16#1");
963                         Assert.AreEqual (EnInt16.C.GetHashCode(), Int16.MaxValue, "i16#2");
964         
965                         Assert.AreEqual (EnUInt16.A.GetHashCode(), UInt16.MinValue, "u16#0");
966                         Assert.AreEqual (EnUInt16.B.GetHashCode(), 77, "u16#1");
967                         Assert.AreEqual (EnUInt16.C.GetHashCode(), UInt16.MaxValue, "u16#2");
968         
969                         Assert.AreEqual (EnInt32.A.GetHashCode(), Int32.MinValue, "i32#0");
970                         Assert.AreEqual (EnInt32.B.GetHashCode(), 88, "i32#1");
971                         Assert.AreEqual (EnInt32.C.GetHashCode(), Int32.MaxValue, "i32#2");
972         
973                         Assert.AreEqual (EnUInt32.A.GetHashCode(), UInt32.MinValue, "u32#0");
974                         Assert.AreEqual (EnUInt32.B.GetHashCode(), 99, "u32#1");
975                         Assert.AreEqual (EnUInt32.C.GetHashCode(), UInt32.MaxValue.GetHashCode (), "u32#2");
976         
977                         Assert.AreEqual (EnInt64.A.GetHashCode(), Int64.MinValue.GetHashCode (), "i64#0");
978                         Assert.AreEqual (EnInt64.B.GetHashCode(), 3488924689489L.GetHashCode (), "i64#1");
979                         Assert.AreEqual (EnInt64.C.GetHashCode(), Int64.MaxValue.GetHashCode (), "i64#2");
980         
981                         Assert.AreEqual (EnUInt64.A.GetHashCode(), UInt64.MinValue.GetHashCode (), "u64#0");
982                         Assert.AreEqual (EnUInt64.B.GetHashCode(), 3488924689489L.GetHashCode (), "u64#1");
983                         Assert.AreEqual (EnUInt64.C.GetHashCode(), UInt64.MaxValue.GetHashCode (), "u64#2");
984                 }
985
986                 [Test]
987                 public void CompareTo_NotEqualToUnderlyingType ()
988                 {
989                         Assert.AreEqual (0, EnInt8.A.CompareTo (EnInt8.A), "i8#0");
990                         Assert.AreEqual (-1, EnInt8.A.CompareTo (EnInt8.B), "i8#1");
991                         Assert.AreEqual (1, EnInt8.B.CompareTo (EnInt8.A), "i8#2");
992         
993                         Assert.AreEqual (0, EnUInt8.A.CompareTo (EnUInt8.A), "ui8#0");
994                         Assert.AreEqual (-1,  EnUInt8.A.CompareTo (EnUInt8.B), "ui8#1");
995                         Assert.AreEqual (1, EnUInt8.B.CompareTo (EnUInt8.A),"ui8#2");
996
997                         Assert.AreEqual (0, EnInt16.A.CompareTo (EnInt16.A), "i16#0");
998                         Assert.AreEqual (-1, EnInt16.A.CompareTo (EnInt16.B), "i16#1");
999                         Assert.AreEqual (1, EnInt16.B.CompareTo (EnInt16.A), "i16#2");
1000
1001                         Assert.AreEqual (0, EnUInt16.A.CompareTo (EnUInt16.A), "ui16#0");
1002                         Assert.AreEqual (-1, EnUInt16.A.CompareTo (EnUInt16.B), "ui16#1");
1003                         Assert.AreEqual (1, EnUInt16.B.CompareTo (EnUInt16.A), "ui16#2");
1004
1005                         Assert.AreEqual (int.MinValue.CompareTo (int.MinValue), EnInt32.A.CompareTo (EnInt32.A), "i32#0");
1006                         Assert.AreEqual (int.MinValue.CompareTo ((int)88), EnInt32.A.CompareTo (EnInt32.B), "i32#1");
1007                         Assert.AreEqual (((int)88).CompareTo (int.MinValue), EnInt32.B.CompareTo (EnInt32.A), "i32#2");
1008         
1009                         Assert.AreEqual (uint.MinValue.CompareTo (uint.MinValue), EnUInt32.A.CompareTo (EnUInt32.A), "u32#0");
1010                         Assert.AreEqual (uint.MinValue.CompareTo ((uint)99), EnUInt32.A.CompareTo (EnUInt32.B), "u32#1");
1011                         Assert.AreEqual (((uint)99).CompareTo (uint.MinValue), EnUInt32.B.CompareTo (EnUInt32.A), "u32#2");
1012         
1013                         Assert.AreEqual (long.MinValue.CompareTo (long.MinValue), EnInt64.A.CompareTo (EnInt64.A), "i64#0");
1014                         Assert.AreEqual (long.MinValue.CompareTo ((long)456), EnInt64.A.CompareTo (EnInt64.D), "i64#1");
1015                         Assert.AreEqual (((long)456).CompareTo (long.MinValue), EnInt64.D.CompareTo (EnInt64.A), "i64#2");
1016         
1017                         Assert.AreEqual (ulong.MinValue.CompareTo (ulong.MinValue), EnUInt64.A.CompareTo (EnUInt64.A), "u64#0");
1018                         Assert.AreEqual (ulong.MinValue.CompareTo ((ulong)789),  EnUInt64.A.CompareTo (EnUInt64.D), "u64#1");
1019                         Assert.AreEqual (((ulong)789).CompareTo (ulong.MinValue), EnUInt64.D.CompareTo (EnUInt64.A), "u64#2");
1020                 }
1021
1022                 //
1023                 // This is used to verify that the output matches the specified behavior
1024                 // See bug #371559 for details.
1025                 //
1026                 [Test]
1027                 public void CompareOrder_FromGetNames ()
1028                 {
1029                         Array r = Enum.GetValues (typeof (EnumByte));
1030                         Assert.AreEqual (5, r.Length);
1031                         Assert.AreEqual ("byte_Cc", Enum.GetName (typeof (EnumByte), (EnumByte)(0x00)));
1032                         Assert.AreEqual ("byte_Cc", r.GetValue (0).ToString ());
1033                         Assert.AreEqual ("byte_Aa", Enum.GetName (typeof (EnumByte), (EnumByte)(0x05)));
1034                         Assert.AreEqual ("byte_Aa", r.GetValue (1).ToString ());
1035                         Assert.AreEqual ("byte_Ff", Enum.GetName (typeof (EnumByte), (EnumByte)(0x64)));
1036                         Assert.AreEqual ("byte_Ff", r.GetValue (2).ToString ());
1037                         Assert.AreEqual ("byte_Dd", Enum.GetName (typeof (EnumByte), (EnumByte)(0x7F)));
1038                         Assert.AreEqual ("byte_Dd", r.GetValue (3).ToString ());
1039                         Assert.AreEqual ("byte_Bb", Enum.GetName (typeof (EnumByte), (EnumByte)(0xFF)));
1040                         Assert.AreEqual ("byte_Bb", r.GetValue (4).ToString ());
1041                         
1042                         r = Enum.GetValues (typeof (EnumSByte));
1043                         Assert.AreEqual (6, r.Length);
1044                         Assert.AreEqual ("sbyte_Cc", Enum.GetName (typeof (EnumSByte), (EnumSByte)(0x00)));
1045                         Assert.AreEqual ("sbyte_Cc", r.GetValue (0).ToString ());
1046                         Assert.AreEqual ("sbyte_Aa", Enum.GetName (typeof (EnumSByte), (EnumSByte)(0x05)));
1047                         Assert.AreEqual ("sbyte_Aa", r.GetValue (1).ToString ());
1048                         Assert.AreEqual ("sbyte_Ff", Enum.GetName (typeof (EnumSByte), (EnumSByte)(0x64)));
1049                         Assert.AreEqual ("sbyte_Ff", r.GetValue (2).ToString ());
1050                         Assert.AreEqual ("sbyte_Ee", Enum.GetName (typeof (EnumSByte), (EnumSByte)(0x7F)));
1051                         Assert.AreEqual ("sbyte_Ee", r.GetValue (3).ToString ());
1052                         Assert.AreEqual ("sbyte_Bb", Enum.GetName (typeof (EnumSByte), unchecked ((EnumSByte)(0xF0))));
1053                         Assert.AreEqual ("sbyte_Bb", r.GetValue (4).ToString ());
1054                         Assert.AreEqual ("sbyte_Dd", Enum.GetName (typeof (EnumSByte), unchecked ((EnumSByte)(0xFF))));
1055                         Assert.AreEqual ("sbyte_Dd", r.GetValue (5).ToString ());
1056                         
1057                         r = Enum.GetValues (typeof (EnumUShort));
1058                         Assert.AreEqual (5, r.Length);
1059                         Assert.AreEqual ("ushort_Cc", Enum.GetName (typeof (EnumUShort), (EnumUShort)(0x0000)));
1060                         Assert.AreEqual ("ushort_Cc", r.GetValue (0).ToString ());
1061                         Assert.AreEqual ("ushort_Aa", Enum.GetName (typeof (EnumUShort), (EnumUShort)(0x0005)));
1062                         Assert.AreEqual ("ushort_Aa", r.GetValue (1).ToString ());
1063                         Assert.AreEqual ("ushort_Ff", Enum.GetName (typeof (EnumUShort), (EnumUShort)(0x0064)));
1064                         Assert.AreEqual ("ushort_Ff", r.GetValue (2).ToString ());
1065                         Assert.AreEqual ("ushort_Ee", Enum.GetName (typeof (EnumUShort), (EnumUShort)(0x7FFF)));
1066                         Assert.AreEqual ("ushort_Ee", r.GetValue (3).ToString ());
1067                         Assert.AreEqual ("ushort_Bb", Enum.GetName (typeof (EnumUShort), (EnumUShort)(0xFF00)));
1068                         Assert.AreEqual ("ushort_Bb", r.GetValue (4).ToString ());
1069                         
1070                         r = Enum.GetValues (typeof (EnumShort));
1071                         Assert.AreEqual (6, r.Length);
1072                         Assert.AreEqual ("short_Cc", Enum.GetName (typeof (EnumShort), (EnumShort)(0x0000)));
1073                         Assert.AreEqual ("short_Cc", r.GetValue (0).ToString ());
1074                         Assert.AreEqual ("short_Aa", Enum.GetName (typeof (EnumShort), (EnumShort)(0x0005)));
1075                         Assert.AreEqual ("short_Aa", r.GetValue (1).ToString ());
1076                         Assert.AreEqual ("short_Ff", Enum.GetName (typeof (EnumShort), (EnumShort)(0x0064)));
1077                         Assert.AreEqual ("short_Ff", r.GetValue (2).ToString ());
1078                         Assert.AreEqual ("short_Ee", Enum.GetName (typeof (EnumShort), (EnumShort)(0x7FFF)));
1079                         Assert.AreEqual ("short_Ee", r.GetValue (3).ToString ());
1080                         Assert.AreEqual ("short_Bb", Enum.GetName (typeof (EnumShort), unchecked ((EnumShort)(0xFF00))));
1081                         Assert.AreEqual ("short_Bb", r.GetValue (4).ToString ());
1082                         Assert.AreEqual ("short_Dd", Enum.GetName (typeof (EnumShort), unchecked ((EnumShort)(0xFFFF))));
1083                         Assert.AreEqual ("short_Dd", r.GetValue (5).ToString ());
1084                         
1085                         r = Enum.GetValues (typeof (EnumUInt));
1086                         Assert.AreEqual (4, r.Length);
1087                         Assert.AreEqual ("uint_Cc", Enum.GetName (typeof (EnumUInt), (EnumUInt)(0x00000000)));
1088                         Assert.AreEqual ("uint_Cc", r.GetValue (0).ToString ());
1089                         Assert.AreEqual ("uint_Aa", Enum.GetName (typeof (EnumUInt), (EnumUInt)(0x00000005)));
1090                         Assert.AreEqual ("uint_Aa", r.GetValue (1).ToString ());
1091                         Assert.AreEqual ("uint_Ff", Enum.GetName (typeof (EnumUInt), (EnumUInt)(0x00000064)));
1092                         Assert.AreEqual ("uint_Ff", r.GetValue (2).ToString ());
1093                         Assert.AreEqual ("uint_Ee", Enum.GetName (typeof (EnumUInt), (EnumUInt)(0x7FFFFFFF)));
1094                         Assert.AreEqual ("uint_Ee", r.GetValue (3).ToString ());
1095                         
1096                         r = Enum.GetValues (typeof (EnumInt));
1097                         Assert.AreEqual (6, r.Length);
1098                         Assert.AreEqual ("int_Cc", Enum.GetName (typeof (EnumInt), (EnumInt)(0x00000000)));
1099                         Assert.AreEqual ("int_Cc", r.GetValue (0).ToString ());
1100                         Assert.AreEqual ("int_Aa", Enum.GetName (typeof (EnumInt), (EnumInt)(0x00000005)));
1101                         Assert.AreEqual ("int_Aa", r.GetValue (1).ToString ());
1102                         Assert.AreEqual ("int_Ff", Enum.GetName (typeof (EnumInt), (EnumInt)(0x00000064)));
1103                         Assert.AreEqual ("int_Ff", r.GetValue (2).ToString ());
1104                         Assert.AreEqual ("int_Ee", Enum.GetName (typeof (EnumInt), (EnumInt)(0x7FFFFFFF)));
1105                         Assert.AreEqual ("int_Ee", r.GetValue (3).ToString ());
1106                         Assert.AreEqual ("int_Bb", Enum.GetName (typeof (EnumInt), unchecked ((EnumInt)(0xFFFF0000))));
1107                         Assert.AreEqual ("int_Bb", r.GetValue (4).ToString ());
1108                         Assert.AreEqual ("int_Dd", Enum.GetName (typeof (EnumInt), unchecked ((EnumInt)(0xFFFFFFFF))));
1109                         Assert.AreEqual ("int_Dd", r.GetValue (5).ToString ());
1110                         
1111                         r = Enum.GetValues (typeof (EnumULong));
1112                         Assert.AreEqual (5, r.Length);
1113                         Assert.AreEqual ("ulong_Cc", Enum.GetName (typeof (EnumULong), (EnumULong)(0x0000000000000000)));
1114                         Assert.AreEqual ("ulong_Cc", r.GetValue (0).ToString ());
1115                         Assert.AreEqual ("ulong_Cc", Enum.GetName (typeof (EnumULong), (EnumULong)(0x0000000000000000)));
1116                         Assert.AreEqual ("ulong_Aa", r.GetValue (1).ToString ());
1117                         Assert.AreEqual ("ulong_Aa", Enum.GetName (typeof (EnumULong), (EnumULong)(0x0000000000000005)));
1118                         Assert.AreEqual ("ulong_Ff", r.GetValue (2).ToString ());
1119                         Assert.AreEqual ("ulong_Ff", Enum.GetName (typeof (EnumULong), (EnumULong)(0x0000000000000064)));
1120                         Assert.AreEqual ("ulong_Ee", r.GetValue (3).ToString ());
1121                         Assert.AreEqual ("ulong_Ee", Enum.GetName (typeof (EnumULong), (EnumULong)(0x7FFFFFFFFFFFFFFF)));
1122                         Assert.AreEqual ("ulong_Bb", r.GetValue (4).ToString ());
1123                         
1124                         r = Enum.GetValues (typeof (EnumLong));
1125                         Assert.AreEqual (6, r.Length);
1126                         Assert.AreEqual ("long_Cc", Enum.GetName (typeof (EnumLong), (EnumLong)(0x0000000000000000)));
1127                         Assert.AreEqual ("long_Cc", r.GetValue (0).ToString ());
1128                         Assert.AreEqual ("long_Aa", Enum.GetName (typeof (EnumLong), (EnumLong)(0x0000000000000005)));
1129                         Assert.AreEqual ("long_Aa", r.GetValue (1).ToString ());
1130                         Assert.AreEqual ("long_Ff", Enum.GetName (typeof (EnumLong), (EnumLong)(0x0000000000000064)));
1131                         Assert.AreEqual ("long_Ff", r.GetValue (2).ToString ());
1132                         Assert.AreEqual ("long_Ee", Enum.GetName (typeof (EnumLong), (EnumLong)(0x7FFFFFFFFFFFFFFF)));
1133                         Assert.AreEqual ("long_Ee", r.GetValue (3).ToString ());
1134                         Assert.AreEqual ("long_Bb", Enum.GetName (typeof (EnumLong), unchecked ((EnumLong)(0xFFFFFFFF00000000))));
1135                         Assert.AreEqual ("long_Bb", r.GetValue (4).ToString ());
1136                         Assert.AreEqual ("long_Dd", Enum.GetName (typeof (EnumLong), unchecked ((EnumLong)(0xFFFFFFFFFFFFFFFF))));
1137                         Assert.AreEqual ("long_Dd", r.GetValue (5).ToString ());
1138                 }
1139
1140                 [Flags]
1141                 enum Foo {
1142                         negative = -1
1143                 }
1144
1145 #if NET_4_0
1146                 // Our first implementation used to crash
1147                 [Test]
1148                 public void HasFlagTest ()
1149                 {
1150                         Foo f = Foo.negative;
1151                         bool has = f.HasFlag (Foo.negative);
1152                 }
1153 #endif
1154
1155                 [Flags]
1156                 enum SomeEnum
1157                 {
1158                         a,
1159                         b,
1160                         c
1161                 }
1162
1163                 [Flags]
1164                 enum SomeByteEnum : byte
1165                 {
1166                         a,
1167                         b,
1168                         c
1169                 }
1170
1171                 [Flags]
1172                 enum SomeInt64Enum : long
1173                 {
1174                         a,
1175                         b,
1176                         c
1177                 }
1178
1179                 enum TestShortEnum : short
1180                 {
1181                         zero,
1182                         one,
1183                         two,
1184                         three,
1185                         four,
1186                         five,
1187                         six
1188                 }
1189
1190                 enum E
1191                 {
1192                         Aa = 0,
1193                         Bb = 1,
1194                         Cc = 2,
1195                         Dd = 3,
1196                 }
1197
1198                 [Flags]
1199                 enum E2
1200                 {
1201                         Aa,
1202                         Bb,
1203                         Cc,
1204                         Dd,
1205                 }
1206
1207                 [Flags]
1208                 enum FlagsNegativeTestEnum
1209                 {
1210                         None = 0,
1211                         One = 1,
1212                         Two = 2,
1213                         Negative = unchecked ((int) 0xFFFF0000)
1214                 }
1215
1216                 enum TestingEnum
1217                 {
1218                         This,
1219                         Is,
1220                         A,
1221                         Test
1222                 }
1223
1224                 enum TestingEnum2
1225                 {
1226                         This,
1227                         Is,
1228                         A,
1229                         Test
1230                 }
1231
1232                 enum TestingEnum3 : ulong
1233                 {
1234                         This,
1235                         Is,
1236                         A,
1237                         Test = ulong.MaxValue
1238                 }
1239
1240                 enum TestingEnum4 : byte
1241                 {
1242                         This,
1243                         Is,
1244                         A,
1245                         Test = byte.MaxValue
1246                 }
1247
1248                 enum TestingEnum5 : short
1249                 {
1250                         This,
1251                         Is,
1252                         A,
1253                         Test = short.MaxValue
1254                 }
1255
1256                 enum TestingEnum6
1257                 {
1258                         This,
1259                         Is,
1260                         A,
1261                         Test = int.MaxValue
1262                 }
1263
1264                 enum E3
1265                 {
1266                         A = 0,
1267                         B = 1,
1268                         C = 2,
1269                         D = 3
1270                 }
1271
1272                 enum UE : ulong
1273                 {
1274                         A = 1,
1275                         B = 2,
1276                         C = 4,
1277                         D = 8
1278                 }
1279
1280                 enum EA
1281                 {
1282                         A = 0,
1283                         B = 2,
1284                         C = 3,
1285                         D = 4
1286                 }
1287                 
1288                 enum EnInt8 : sbyte{
1289                         A = SByte.MinValue,
1290                         B = 44,
1291                         C = SByte.MaxValue,
1292                 }
1293                 
1294                 enum EnUInt8 : byte {
1295                         A = Byte.MinValue,
1296                         B = 55,
1297                         C = Byte.MaxValue,
1298                 }
1299                 
1300                 enum EnInt16 : short{
1301                         A = Int16.MinValue,
1302                         B = 66,
1303                         C = Int16.MaxValue,
1304                 }
1305                 
1306                 enum EnUInt16 : ushort {
1307                         A = UInt16.MinValue,
1308                         B = 77,
1309                         C = UInt16.MaxValue,
1310                 }
1311
1312                 enum EnInt32 : int{
1313                         A = Int32.MinValue,
1314                         B = 88,
1315                         C = Int32.MaxValue,
1316                 }
1317                 
1318                 enum EnUInt32 : uint {
1319                         A = UInt32.MinValue,
1320                         B = 99,
1321                         C = UInt32.MaxValue,
1322                 }
1323                 
1324                 enum EnInt64 : long{
1325                         A = Int64.MinValue,
1326                         B = 3488924689489L,
1327                         C = Int64.MaxValue,
1328                         D = 456L
1329                 }
1330                 
1331                 enum EnUInt64 : ulong {
1332                         A = UInt64.MinValue,
1333                         B = 3488924689489L,
1334                         C = UInt64.MaxValue,
1335                         D = 789L
1336                 }
1337                 
1338                 enum EnumByte : byte {
1339                   byte_Aa = 5,
1340                   byte_Bb = 0xff,
1341                   byte_Cc = 0,
1342                   byte_Dd = 0x7f,
1343                   byte_Ff = 100
1344                 }
1345                 
1346                 enum EnumSByte : sbyte {
1347                   sbyte_Aa = 5,
1348                   sbyte_Bb = unchecked ((sbyte) 0xf0),
1349                   sbyte_Cc = 0,
1350                   sbyte_Dd = -1,
1351                   sbyte_Ee = 0x7F,
1352                   sbyte_Ff = 100
1353                 }
1354                 
1355                 enum EnumShort : short
1356                 {
1357                   short_Aa = 5,
1358                   short_Bb = unchecked((short)0xFF00),
1359                   short_Cc = 0,
1360                   short_Dd = -1,
1361                   short_Ee = 0x7FFF,
1362                   short_Ff = 100
1363                 }
1364                 
1365                 enum EnumUShort : ushort
1366                 {
1367                   ushort_Aa = 5,
1368                   ushort_Bb = unchecked((int)0xFF00),
1369                   ushort_Cc = 0,
1370                   ushort_Ee = 0x7FFF,
1371                   ushort_Ff = 100
1372                 }
1373                 
1374                 enum EnumInt
1375                 {
1376                   int_Aa = 5,
1377                   int_Bb = unchecked((int)0xFFFF0000),
1378                   int_Cc = 0,
1379                   int_Dd = -1,
1380                   int_Ee = 0x7FFFFFFF,
1381                   int_Ff = 100
1382                 }
1383                 
1384                 enum EnumUInt : uint
1385                 {
1386                   uint_Aa = 5,
1387                   uint_Cc = 0,
1388                   uint_Ee = 0x7FFFFFFF,
1389                   uint_Ff = 100
1390                 }
1391                 
1392                 enum EnumLong : long
1393                 {
1394                   long_Aa = 5,
1395                   long_Bb = unchecked((long)0xffffFFFF00000000),
1396                   long_Cc = 0,
1397                   long_Dd = -1,
1398                   long_Ee = 0x7FFFFFFFffffffff,
1399                   long_Ff = 100
1400                 }
1401                 
1402                 enum EnumULong : ulong
1403                 {
1404                   ulong_Aa = 5,
1405                   ulong_Bb = unchecked((ulong)0xffffFFFF00000000),
1406                   ulong_Cc = 0,
1407                   ulong_Ee = 0x7FFFFFFFffffffff,
1408                   ulong_Ff = 100
1409                 }
1410
1411                 enum EnumOverlap
1412                 {
1413                         Unknown = 0,
1414                         First = 0,
1415                         System_Math = First,
1416                 }       
1417         }
1418 }