2 // ModuleTest - NUnit Test Cases for the Module class
4 // Zoltan Varga (vargaz@freemail.hu)
6 // (C) Ximian, Inc. http://www.ximian.com
7 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
11 using System.Threading;
12 using System.Reflection;
14 using System.Reflection.Emit;
16 using System.Runtime.Serialization;
18 using System.Collections;
20 using NUnit.Framework;
22 namespace MonoTests.System.Reflection
25 public class ModuleTest
27 static string TempFolder = Path.Combine (Path.GetTempPath (), "MonoTests.System.Reflection.ModuleTest");
32 while (Directory.Exists (TempFolder))
33 TempFolder = Path.Combine (TempFolder, "2");
34 Directory.CreateDirectory (TempFolder);
38 public void TearDown ()
41 // This throws an exception under MS.NET, since the directory contains loaded
43 Directory.Delete (TempFolder, true);
49 public void IsDefined_AttributeType_Null ()
51 Type t = typeof (ModuleTest);
52 Module module = t.Module;
55 module.IsDefined ((Type) null, false);
57 } catch (ArgumentNullException ex) {
58 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
59 Assert.IsNull (ex.InnerException, "#3");
60 Assert.IsNotNull (ex.Message, "#4");
61 Assert.IsNotNull (ex.ParamName, "#5");
62 Assert.AreEqual ("attributeType", ex.ParamName, "#6");
67 public void GetField_Name_Null ()
69 Type t = typeof (ModuleTest);
70 Module module = t.Module;
73 module.GetField (null);
75 } catch (ArgumentNullException ex) {
76 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2");
77 Assert.IsNull (ex.InnerException, "#A3");
78 Assert.IsNotNull (ex.Message, "#A4");
79 Assert.IsNotNull (ex.ParamName, "#A5");
80 Assert.AreEqual ("name", ex.ParamName, "#A6");
84 module.GetField (null, 0);
86 } catch (ArgumentNullException ex) {
87 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2");
88 Assert.IsNull (ex.InnerException, "#B3");
89 Assert.IsNotNull (ex.Message, "#B4");
90 Assert.IsNotNull (ex.ParamName, "#B5");
91 Assert.AreEqual ("name", ex.ParamName, "#B6");
95 // Some of these tests overlap with the tests for ModuleBuilder
98 [Category("NotDotNet")] // path length can cause suprious failures
99 public void TestGlobalData () {
101 string name = "moduletest-assembly";
102 string fileName = name + ".dll";
104 AssemblyName assemblyName = new AssemblyName();
105 assemblyName.Name = name;
108 = Thread.GetDomain().DefineDynamicAssembly(
109 assemblyName, AssemblyBuilderAccess.RunAndSave, TempFolder);
111 string resfile = Path.Combine (TempFolder, "res");
112 using (StreamWriter sw = new StreamWriter (resfile)) {
113 sw.WriteLine ("FOO");
116 ab.AddResourceFile ("res", "res");
118 ModuleBuilder mb = ab.DefineDynamicModule(fileName, fileName);
120 mb.DefineInitializedData ("DATA", new byte [100], FieldAttributes.Public);
121 mb.DefineInitializedData ("DATA2", new byte [100], FieldAttributes.Public);
122 mb.DefineInitializedData ("DATA3", new byte [99], FieldAttributes.Public);
123 mb.DefineUninitializedData ("DATA4", 101, FieldAttributes.Public);
124 mb.DefineInitializedData ("DATA_PRIVATE", new byte [100], 0);
125 mb.CreateGlobalFunctions ();
129 Assembly assembly = Assembly.LoadFrom (Path.Combine (TempFolder, fileName));
131 Module module = assembly.GetLoadedModules ()[0];
133 string[] expectedFieldNames = new string [] {
134 "DATA", "DATA2", "DATA3", "DATA4"
136 ArrayList fieldNames = new ArrayList ();
137 foreach (FieldInfo fi in module.GetFields ()) {
138 fieldNames.Add (fi.Name);
140 AssertArrayEqualsSorted (expectedFieldNames, fieldNames.ToArray (typeof (string)));
142 Assert.IsNotNull (module.GetField ("DATA"), "#A1");
143 Assert.IsNotNull (module.GetField ("DATA2"), "#A2");
144 Assert.IsNotNull (module.GetField ("DATA3"), "#A3");
145 Assert.IsNotNull (module.GetField ("DATA4"), "#A4");
146 Assert.IsNull (module.GetField ("DATA_PRIVATE"), "#A5");
147 Assert.IsNotNull (module.GetField ("DATA_PRIVATE", BindingFlags.NonPublic | BindingFlags.Static), "#A6");
149 // Check that these methods work correctly on resource modules
150 Module m2 = assembly.GetModule ("res");
151 Assert.IsNotNull (m2, "#B1");
152 Assert.AreEqual (0, m2.GetFields ().Length, "#B2");
153 Assert.IsNull (m2.GetField ("DATA"), "#B3");
154 Assert.IsNull (m2.GetField ("DATA", BindingFlags.Public), "#B4");
159 public void ResolveType ()
161 Type t = typeof (ModuleTest);
162 Module module = t.Module;
164 Assert.AreEqual (t, module.ResolveType (t.MetadataToken), "#1");
166 /* We currently throw ArgumentException for this one */
168 module.ResolveType (1234);
170 } catch (ArgumentException) {
174 module.ResolveType (t.GetMethod ("ResolveType").MetadataToken);
176 } catch (ArgumentException) {
180 module.ResolveType (t.MetadataToken + 10000);
182 } catch (ArgumentOutOfRangeException) {
187 public void ResolveMethod ()
189 Type t = typeof (ModuleTest);
190 Module module = t.Module;
192 Assert.AreEqual (t.GetMethod ("ResolveMethod"), module.ResolveMethod (t.GetMethod ("ResolveMethod").MetadataToken));
195 module.ResolveMethod (1234);
197 } catch (ArgumentException) {
201 module.ResolveMethod (t.MetadataToken);
203 } catch (ArgumentException) {
207 module.ResolveMethod (t.GetMethod ("ResolveMethod").MetadataToken + 10000);
209 } catch (ArgumentOutOfRangeException) {
216 public void ResolveField ()
218 Type t = typeof (ModuleTest);
219 Module module = t.Module;
221 Assert.AreEqual (t.GetField ("aField"), module.ResolveField (t.GetField ("aField").MetadataToken));
224 module.ResolveField (1234);
226 } catch (ArgumentException) {
230 module.ResolveField (t.MetadataToken);
232 } catch (ArgumentException) {
236 module.ResolveField (t.GetField ("aField").MetadataToken + 10000);
238 } catch (ArgumentOutOfRangeException) {
242 [Ignore ("it breaks nunit-console.exe execution under .NET 2.0")]
244 public void ResolveString ()
246 Type t = typeof (ModuleTest);
247 Module module = t.Module;
249 for (int i = 1; i < 10000; ++i) {
251 module.ResolveString (0x70000000 + i);
252 } catch (Exception) {
257 module.ResolveString (1234);
259 } catch (ArgumentException) {
263 module.ResolveString (t.MetadataToken);
265 } catch (ArgumentException) {
269 module.ResolveString (0x70000000 | 10000);
271 } catch (ArgumentOutOfRangeException) {
277 public void ResolveMember ()
279 Type t = typeof (ModuleTest);
280 Module module = t.Module;
282 Assert.AreEqual (t, module.ResolveMember (t.MetadataToken), "#1");
283 Assert.AreEqual (t.GetField ("aField"), module.ResolveMember (t.GetField ("aField").MetadataToken), "#2");
284 Assert.AreEqual (t.GetMethod ("ResolveMember"), module.ResolveMember (t.GetMethod ("ResolveMember").MetadataToken), "#3");
287 module.ResolveMember (module.MetadataToken);
289 } catch (ArgumentException) {
293 public class Foo<T> {
294 public void Bar(T t) {}
298 public void ResolveMethodOfGenericClass ()
300 Type type = typeof (Foo<>);
301 Module mod = type.Module;
302 MethodInfo method = type.GetMethod ("Bar");
303 MethodBase res = mod.ResolveMethod (method.MetadataToken);
304 Assert.AreEqual (method, res, "#1");
308 public void FindTypes ()
310 Module m = typeof (ModuleTest).Module;
314 t = m.FindTypes (Module.FilterTypeName, "FindTypesTest*");
315 Assert.AreEqual (2, t.Length, "#A1");
316 Assert.AreEqual ("FindTypesTestFirstClass", t [0].Name, "#A2");
317 Assert.AreEqual ("FindTypesTestSecondClass", t [1].Name, "#A3");
318 t = m.FindTypes (Module.FilterTypeNameIgnoreCase, "findtypestest*");
319 Assert.AreEqual (2, t.Length, "#B1");
320 Assert.AreEqual ("FindTypesTestFirstClass", t [0].Name, "#B2");
321 Assert.AreEqual ("FindTypesTestSecondClass", t [1].Name, "#B3");
325 [ExpectedException (typeof (ArgumentNullException))]
326 public void GetObjectData_Null ()
328 Module m = typeof (ModuleTest).Module;
329 m.GetObjectData (null, new StreamingContext (StreamingContextStates.All));
333 public void GetTypes ()
335 AssemblyName newName = new AssemblyName ();
336 newName.Name = "ModuleTest";
338 AssemblyBuilder ab = Thread.GetDomain().DefineDynamicAssembly (newName, AssemblyBuilderAccess.RunAndSave, TempFolder);
340 ModuleBuilder mb = ab.DefineDynamicModule ("myDynamicModule1", "myDynamicModule" + ".dll", true);
342 TypeBuilder tb = mb.DefineType ("Foo", TypeAttributes.Public);
345 ab.Save ("test_assembly.dll");
347 Assembly ass = Assembly.LoadFrom (Path.Combine (TempFolder, "test_assembly.dll"));
348 ArrayList types = new ArrayList ();
349 // The order of the modules is different between MS.NET and mono
350 foreach (Module m in ass.GetModules ()) {
351 Type[] t = m.GetTypes ();
354 Assert.AreEqual (1, types.Count);
355 Assert.AreEqual ("Foo", ((Type)(types [0])).Name);
358 class FindTypesTestFirstClass {
361 class FindTypesTestSecondClass {
364 private static void AssertArrayEqualsSorted (Array o1, Array o2) {
365 Array s1 = (Array)o1.Clone ();
366 Array s2 = (Array)o2.Clone ();
371 Assert.AreEqual (s1.Length, s2.Length);
372 for (int i = 0; i < s1.Length; ++i)
373 Assert.AreEqual (s1.GetValue (i), s2.GetValue (i));