2 // ModuleTest - NUnit Test Cases for the Module class
\r
4 // Zoltan Varga (vargaz@freemail.hu)
\r
6 // (C) Ximian, Inc. http://www.ximian.com
\r
7 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
11 using System.Threading;
\r
12 using System.Reflection;
\r
13 using System.Reflection.Emit;
\r
14 using System.Runtime.Serialization;
16 using System.Collections;
\r
18 using NUnit.Framework;
\r
20 namespace MonoTests.System.Reflection
\r
24 public class ModuleTest : Assertion
\r
26 static string TempFolder = Path.Combine (Path.GetTempPath (), "MonoTests.System.Reflection.ModuleTest");
\r
29 public void SetUp () {
\r
30 while (Directory.Exists (TempFolder))
\r
31 TempFolder = Path.Combine (TempFolder, "2");
\r
32 Directory.CreateDirectory (TempFolder);
\r
36 public void TearDown () {
\r
38 // This throws an exception under MS.NET, since the directory contains loaded
\r
40 Directory.Delete (TempFolder, true);
\r
46 // Some of these tests overlap with the tests for ModuleBuilder
\r
49 [Category("NotDotNet")] // path length can cause suprious failures
\r
50 public void TestGlobalData () {
\r
52 string name = "moduletest-assembly";
\r
53 string fileName = name + ".dll";
\r
55 AssemblyName assemblyName = new AssemblyName();
\r
56 assemblyName.Name = name;
\r
59 = Thread.GetDomain().DefineDynamicAssembly(
\r
60 assemblyName, AssemblyBuilderAccess.RunAndSave, TempFolder);
\r
62 string resfile = Path.Combine (TempFolder, "res");
\r
63 using (StreamWriter sw = new StreamWriter (resfile)) {
\r
64 sw.WriteLine ("FOO");
\r
67 ab.AddResourceFile ("res", "res");
\r
69 ModuleBuilder mb = ab.DefineDynamicModule(fileName, fileName);
\r
71 mb.DefineInitializedData ("DATA", new byte [100], FieldAttributes.Public);
\r
72 mb.DefineInitializedData ("DATA2", new byte [100], FieldAttributes.Public);
\r
73 mb.DefineInitializedData ("DATA3", new byte [99], FieldAttributes.Public);
\r
74 mb.DefineUninitializedData ("DATA4", 101, FieldAttributes.Public);
\r
75 mb.DefineInitializedData ("DATA_PRIVATE", new byte [100], 0);
\r
76 mb.CreateGlobalFunctions ();
\r
80 Assembly assembly = Assembly.LoadFrom (Path.Combine (TempFolder, fileName));
\r
82 Module module = assembly.GetLoadedModules ()[0];
\r
84 string[] expectedFieldNames = new string [] {
\r
85 "DATA", "DATA2", "DATA3", "DATA4"
\r
87 ArrayList fieldNames = new ArrayList ();
\r
88 foreach (FieldInfo fi in module.GetFields ()) {
\r
89 fieldNames.Add (fi.Name);
\r
91 AssertArrayEqualsSorted (expectedFieldNames, fieldNames.ToArray (typeof (string)));
\r
94 module.GetField (null);
\r
97 catch (ArgumentNullException) {
\r
101 module.GetField (null, 0);
\r
104 catch (ArgumentNullException) {
\r
107 AssertEquals (module.GetField ("DATA") != null, true);
\r
108 AssertEquals (module.GetField ("DATA2") != null, true);
\r
109 AssertEquals (module.GetField ("DATA3") != null, true);
\r
110 AssertEquals (module.GetField ("DATA4") != null, true);
\r
111 AssertEquals (module.GetField ("DATA_PRIVATE"), null);
\r
112 AssertEquals (module.GetField ("DATA_PRIVATE", BindingFlags.NonPublic | BindingFlags.Static) != null, true);
\r
114 // Check that these methods work correctly on resource modules
\r
115 Module m2 = assembly.GetModule ("res");
\r
116 AssertEquals (m2 != null, true);
\r
117 AssertEquals (m2.GetFields ().Length, 0);
\r
118 AssertEquals (m2.GetField ("DATA"), null);
\r
119 AssertEquals (m2.GetField ("DATA", BindingFlags.Public), null);
\r
125 public void ResolveType () {
\r
126 Type t = typeof (ModuleTest);
\r
127 Module module = t.Module;
\r
129 AssertEquals (t, module.ResolveType (t.MetadataToken));
\r
131 /* We currently throw ArgumentException for this one */
\r
133 module.ResolveType (1234);
\r
136 catch (ArgumentException) {
\r
140 module.ResolveType (t.GetMethod ("ResolveType").MetadataToken);
\r
143 catch (ArgumentException) {
\r
147 module.ResolveType (t.MetadataToken + 10000);
\r
150 catch (ArgumentOutOfRangeException) {
\r
155 public void ResolveMethod () {
\r
156 Type t = typeof (ModuleTest);
\r
157 Module module = t.Module;
\r
159 AssertEquals (t.GetMethod ("ResolveMethod"), module.ResolveMethod (t.GetMethod ("ResolveMethod").MetadataToken));
\r
162 module.ResolveMethod (1234);
\r
165 catch (ArgumentException) {
\r
169 module.ResolveMethod (t.MetadataToken);
\r
172 catch (ArgumentException) {
\r
176 module.ResolveMethod (t.GetMethod ("ResolveMethod").MetadataToken + 10000);
\r
179 catch (ArgumentOutOfRangeException) {
\r
186 public void ResolveField () {
\r
187 Type t = typeof (ModuleTest);
\r
188 Module module = t.Module;
\r
190 AssertEquals (t.GetField ("aField"), module.ResolveField (t.GetField ("aField").MetadataToken));
\r
193 module.ResolveField (1234);
\r
196 catch (ArgumentException) {
\r
200 module.ResolveField (t.MetadataToken);
\r
203 catch (ArgumentException) {
\r
207 module.ResolveField (t.GetField ("aField").MetadataToken + 10000);
\r
210 catch (ArgumentOutOfRangeException) {
\r
214 [Category ("NotWorking")]
\r
216 public void ResolveString () {
\r
217 Type t = typeof (ModuleTest);
\r
218 Module module = t.Module;
\r
220 for (int i = 1; i < 10000; ++i) {
\r
222 module.ResolveString (0x70000000 + i);
\r
224 catch (Exception) {
\r
229 module.ResolveString (1234);
\r
232 catch (ArgumentException) {
\r
236 module.ResolveString (t.MetadataToken);
\r
239 catch (ArgumentException) {
\r
243 module.ResolveString (0x70000000 | 10000);
\r
246 catch (ArgumentOutOfRangeException) {
\r
252 public void ResolveMember () {
\r
253 Type t = typeof (ModuleTest);
\r
254 Module module = t.Module;
\r
256 AssertEquals (t, module.ResolveMember (t.MetadataToken));
\r
257 AssertEquals (t.GetField ("aField"), module.ResolveMember (t.GetField ("aField").MetadataToken));
\r
258 AssertEquals (t.GetMethod ("ResolveMember"), module.ResolveMember (t.GetMethod ("ResolveMember").MetadataToken));
\r
261 module.ResolveMember (module.MetadataToken);
\r
263 catch (ArgumentException) {
\r
269 public void FindTypes () {
\r
270 Module m = typeof (ModuleTest).Module;
\r
274 t = m.FindTypes (Module.FilterTypeName, "FindTypesTest*");
\r
275 AssertEquals (2, t.Length);
\r
276 AssertEquals ("FindTypesTestFirstClass", t [0].Name);
\r
277 AssertEquals ("FindTypesTestSecondClass", t [1].Name);
\r
278 t = m.FindTypes (Module.FilterTypeNameIgnoreCase, "findtypestest*");
\r
279 AssertEquals (2, t.Length);
\r
280 AssertEquals ("FindTypesTestFirstClass", t [0].Name);
\r
281 AssertEquals ("FindTypesTestSecondClass", t [1].Name);
\r
285 [ExpectedException (typeof (ArgumentNullException))]
286 public void GetObjectData_Null ()
288 Module m = typeof (ModuleTest).Module;
\r
289 m.GetObjectData (null, new StreamingContext (StreamingContextStates.All));
\r
292 class FindTypesTestFirstClass {
\r
295 class FindTypesTestSecondClass {
\r
298 private static void AssertArrayEqualsSorted (Array o1, Array o2) {
\r
299 Array s1 = (Array)o1.Clone ();
\r
300 Array s2 = (Array)o2.Clone ();
\r
305 AssertEquals (s1.Length, s2.Length);
\r
306 for (int i = 0; i < s1.Length; ++i)
\r
307 AssertEquals (s1.GetValue (i), s2.GetValue (i));
\r