2 // RuntimeHelpersTest.cs - NUnit Test Cases for the System.Runtime.CompilerServices.RuntimeHelpers class
4 // Zoltan Varga (vargaz@freemail.hu)
6 // (C) Ximian, Inc. http://www.ximian.com
9 using System.Runtime.CompilerServices;
11 using NUnit.Framework;
13 namespace MonoTests.System.Runtime.CompilerServices {
16 public class RuntimeHelpersTest {
21 public override int GetHashCode () {
25 public override bool Equals (object o) {
32 public static int counter = 0;
35 counter = counter + 1;
38 public override int GetHashCode () {
42 public override bool Equals (object o) {
48 public void TestOffsetToStringData ()
51 RuntimeHelpers.OffsetToStringData,
52 RuntimeHelpers.OffsetToStringData, "OffsetToStringData is not constant");
55 public void TestGetObjectValue ()
61 Assert.AreEqual (RuntimeHelpers.GetObjectValue (null),
65 Assert.AreEqual (RuntimeHelpers.GetObjectValue (this),
71 s2 = (FooStruct)RuntimeHelpers.GetObjectValue(s1);
74 Assert.AreEqual (s2.i, 42);
75 Assert.AreEqual (s2.j, "FOO");
78 public void TestRunClassConstructor ()
80 RuntimeHelpers.RunClassConstructor (typeof(FooClass).TypeHandle);
81 Assert.AreEqual (FooClass.counter, 1);
83 // Each static constructor should only be run once
84 RuntimeHelpers.RunClassConstructor (typeof(FooClass).TypeHandle);
85 Assert.AreEqual (FooClass.counter, 1);
89 [ExpectedException (typeof (ArgumentException))]
90 public void RunClassConstructor_Default ()
92 RuntimeTypeHandle rth = new RuntimeTypeHandle ();
93 Assert.AreEqual (IntPtr.Zero, rth.Value, "Value");
94 RuntimeHelpers.RunClassConstructor (rth);
97 static RuntimeTypeHandle handle;
100 [ExpectedException (typeof (ArgumentException))]
101 public void RunClassConstructor_Uninitialized ()
103 RuntimeHelpers.RunClassConstructor (handle);
109 throw new NotFiniteNumberException ();
114 [ExpectedException (typeof (TypeInitializationException))]
115 public void RunClassConstructor_Throw ()
117 RuntimeHelpers.RunClassConstructor (typeof (Thrower).TypeHandle);
121 public byte [] array = new byte [1];
124 static RuntimeFieldHandle rfh = typeof (Fielder).GetField ("array").FieldHandle;
125 static RuntimeFieldHandle static_rfh;
128 [ExpectedException (typeof (ArgumentNullException))]
129 public void InitializeArray_Null ()
131 RuntimeHelpers.InitializeArray (null, rfh);
135 [ExpectedException (typeof (ArgumentNullException))]
136 public void InitializeArray_Default ()
138 RuntimeFieldHandle h = new RuntimeFieldHandle ();
139 RuntimeHelpers.InitializeArray (new Fielder ().array, h);
143 [ExpectedException (typeof (ArgumentNullException))]
144 public void InitializeArray_Uninitialized ()
146 RuntimeHelpers.InitializeArray (new Fielder ().array, static_rfh);
150 [ExpectedException (typeof (ArgumentException))]
151 public void InitializeArray ()
153 RuntimeHelpers.InitializeArray (new Fielder ().array, rfh);
156 public void TestGetHashCode ()
158 Assert.AreEqual (0, RuntimeHelpers.GetHashCode (null));
159 object o = new object ();
160 Assert.AreEqual (o.GetHashCode (), RuntimeHelpers.GetHashCode (o));
161 Assert.IsTrue (5 != RuntimeHelpers.GetHashCode (new FooClass ()));
164 public void TestEquals ()
166 Assert.IsTrue (RuntimeHelpers.Equals (null, null));
167 Assert.IsTrue (!RuntimeHelpers.Equals (new object (), null));
168 Assert.IsTrue (!RuntimeHelpers.Equals (null, new object ()));
170 FooStruct f1 = new FooStruct ();
172 FooStruct f2 = new FooStruct ();
178 Assert.IsTrue (RuntimeHelpers.Equals (o1, o2));
180 // This should do a bit-by-bit comparison for valuetypes
181 Assert.IsTrue (RuntimeHelpers.Equals (o1, o3));
182 Assert.IsTrue (!RuntimeHelpers.Equals (o1, o4));