2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / corlib / Test / System.Runtime.CompilerServices / RuntimeHelpersTest.cs
1 //\r
2 // RuntimeHelpersTest.cs - NUnit Test Cases for the System.Runtime.CompilerServices.RuntimeHelpers class\r
3 //\r
4 // Zoltan Varga (vargaz@freemail.hu)\r
5 //\r
6 // (C) Ximian, Inc.  http://www.ximian.com\r
7 \r
8 using System;\r
9 using System.Runtime.CompilerServices;\r
10 \r
11 using NUnit.Framework;\r
12 \r
13 namespace MonoTests.System.Runtime.CompilerServices {\r
14 \r
15         [TestFixture]\r
16         public class RuntimeHelpersTest : Assertion {\r
17             struct FooStruct {\r
18                         public int i;\r
19                         public string j;\r
20 \r
21                         public override int GetHashCode () {\r
22                                 return 5;\r
23                         }\r
24 \r
25                         public override bool Equals (object o) {\r
26                                 Fail ();\r
27                                 return false;\r
28                         }\r
29                 }\r
30 \r
31                 class FooClass {\r
32                         public static int counter = 0;\r
33 \r
34                         static FooClass () {\r
35                                 counter = counter + 1;\r
36                         }\r
37 \r
38                         public override int GetHashCode () {\r
39                                 return 5;\r
40                         }\r
41 \r
42                         public override bool Equals (object o) {\r
43                                 Fail ();\r
44                                 return true;\r
45                         }\r
46                 }\r
47 \r
48                 public void TestOffsetToStringData () \r
49                 {\r
50                         AssertEquals ("OffsetToStringData is not constant",\r
51                                                   RuntimeHelpers.OffsetToStringData,\r
52                                                   RuntimeHelpers.OffsetToStringData);\r
53                 }\r
54 \r
55                 public void TestGetObjectValue ()\r
56                 {\r
57                         FooStruct s1;\r
58                         FooStruct s2;\r
59 \r
60                         // Test null\r
61                         AssertEquals ("",\r
62                                                   RuntimeHelpers.GetObjectValue (null),\r
63                                                   null);\r
64                         \r
65                         // Test non-valuetype\r
66                         AssertEquals ("",\r
67                                                   RuntimeHelpers.GetObjectValue (this),\r
68                                                   this);\r
69 \r
70                         // Test valuetype\r
71                         s1.i = 42;\r
72                         s1.j = "FOO";\r
73                         s2 = (FooStruct)RuntimeHelpers.GetObjectValue(s1);\r
74                         s1.i = 43;\r
75                         s1.j = "BAR";\r
76                         AssertEquals ("", s2.i, 42);\r
77                         AssertEquals ("", s2.j, "FOO");\r
78                 }\r
79 \r
80                 public void TestRunClassConstructor ()\r
81                 {\r
82                         RuntimeHelpers.RunClassConstructor (typeof(FooClass).TypeHandle);\r
83                         AssertEquals ("", FooClass.counter, 1);\r
84 \r
85                         // Each static constructor should only be run once\r
86                         RuntimeHelpers.RunClassConstructor (typeof(FooClass).TypeHandle);\r
87                         AssertEquals ("", FooClass.counter, 1);\r
88                 }\r
89 \r
90 #if NET_1_1\r
91                 public void TestGetHashCode ()\r
92                 {\r
93                         AssertEquals ("Null has hash code 0", 0, RuntimeHelpers.GetHashCode (null));\r
94                         object o = new object ();\r
95                         AssertEquals ("", o.GetHashCode (), RuntimeHelpers.GetHashCode (o));\r
96                         Assert ("", 5 != RuntimeHelpers.GetHashCode (new FooClass ()));\r
97                 }                       \r
98 \r
99                 public void TestEquals ()\r
100                 {\r
101                         Assert (RuntimeHelpers.Equals (null, null));\r
102                         Assert (!RuntimeHelpers.Equals (new object (), null));\r
103                         Assert (!RuntimeHelpers.Equals (null, new object ()));\r
104 \r
105                         FooStruct f1 = new FooStruct ();\r
106                         f1.i = 5;\r
107                         FooStruct f2 = new FooStruct ();\r
108                         f2.i = 5;\r
109                         object o1 = f1;\r
110                         object o2 = o1;\r
111                         object o3 = f2;\r
112                         object o4 = "AAA";\r
113                         Assert (RuntimeHelpers.Equals (o1, o2));\r
114 \r
115                         // This should do a bit-by-bit comparison for valuetypes\r
116                         Assert (RuntimeHelpers.Equals (o1, o3));\r
117                         Assert (!RuntimeHelpers.Equals (o1, o4));\r
118                 }\r
119 #endif\r
120         }\r
121 }\r