2 // ModuleTest - NUnit Test Cases for the Module class
4 // Zoltan Varga (vargaz@freemail.hu)
6 // (C) Ximian, Inc. http://www.ximian.com
12 using System
.Threading
;
13 using System
.Reflection
;
14 using System
.Reflection
.Emit
;
16 using System
.Collections
;
18 using NUnit
.Framework
;
20 namespace MonoTests
.System
.Reflection
24 public class ModuleTest
: Assertion
26 static string TempFolder
= Path
.Combine (Path
.GetTempPath (), "MonoTests.System.Reflection.ModuleTest");
29 public void SetUp () {
30 while (Directory
.Exists (TempFolder
))
31 TempFolder
= Path
.Combine (TempFolder
, "2");
32 Directory
.CreateDirectory (TempFolder
);
36 public void TearDown () {
38 // This throws an exception under MS.NET, since the directory contains loaded
40 Directory
.Delete (TempFolder
, true);
46 // Some of these tests overlap with the tests for ModuleBuilder
49 public void TestGlobalData () {
51 string name
= "moduletest-assembly";
52 string fileName
= name
+ ".dll";
54 AssemblyName assemblyName
= new AssemblyName();
55 assemblyName
.Name
= name
;
58 = Thread
.GetDomain().DefineDynamicAssembly(
59 assemblyName
, AssemblyBuilderAccess
.RunAndSave
, TempFolder
);
61 string resfile
= Path
.Combine (TempFolder
, "res");
62 using (StreamWriter sw
= new StreamWriter (resfile
)) {
66 ab
.AddResourceFile ("res", "res");
68 ModuleBuilder mb
= ab
.DefineDynamicModule(fileName
, fileName
);
70 mb
.DefineInitializedData ("DATA", new byte [100], FieldAttributes
.Public
);
71 mb
.DefineInitializedData ("DATA2", new byte [100], FieldAttributes
.Public
);
72 mb
.DefineInitializedData ("DATA3", new byte [99], FieldAttributes
.Public
);
73 mb
.DefineUninitializedData ("DATA4", 101, FieldAttributes
.Public
);
74 mb
.DefineInitializedData ("DATA_PRIVATE", new byte [100], 0);
75 mb
.CreateGlobalFunctions ();
79 Assembly assembly
= Assembly
.LoadFrom (Path
.Combine (TempFolder
, fileName
));
81 Module module
= assembly
.GetLoadedModules ()[0];
83 string[] expectedFieldNames
= new string [] {
84 "DATA", "DATA2", "DATA3", "DATA4"
86 ArrayList fieldNames
= new ArrayList ();
87 foreach (FieldInfo fi
in module
.GetFields ()) {
88 fieldNames
.Add (fi
.Name
);
90 AssertArrayEqualsSorted (expectedFieldNames
, fieldNames
.ToArray (typeof (string)));
93 module
.GetField (null);
96 catch (ArgumentNullException
) {
100 module
.GetField (null, 0);
103 catch (ArgumentNullException
) {
106 AssertEquals (module
.GetField ("DATA") != null, true);
107 AssertEquals (module
.GetField ("DATA2") != null, true);
108 AssertEquals (module
.GetField ("DATA3") != null, true);
109 AssertEquals (module
.GetField ("DATA4") != null, true);
110 AssertEquals (module
.GetField ("DATA_PRIVATE"), null);
111 AssertEquals (module
.GetField ("DATA_PRIVATE", BindingFlags
.NonPublic
| BindingFlags
.Static
) != null, true);
113 // Check that these methods work correctly on resource modules
114 Module m2
= assembly
.GetModule ("res");
115 AssertEquals (m2
!= null, true);
116 AssertEquals (m2
.GetFields ().Length
, 0);
117 AssertEquals (m2
.GetField ("DATA"), null);
118 AssertEquals (m2
.GetField ("DATA", BindingFlags
.Public
), null);
124 public void ResolveType () {
125 Type t
= typeof (ModuleTest
);
126 Module module
= t
.Module
;
128 AssertEquals (t
, module
.ResolveType (t
.MetadataToken
));
130 /* We currently throw ArgumentException for this one */
132 module
.ResolveType (1234);
135 catch (ArgumentException
) {
139 module
.ResolveType (t
.GetMethod ("ResolveType").MetadataToken
);
142 catch (ArgumentException
) {
146 module
.ResolveType (t
.MetadataToken
+ 10000);
149 catch (ArgumentOutOfRangeException
) {
154 public void ResolveMethod () {
155 Type t
= typeof (ModuleTest
);
156 Module module
= t
.Module
;
158 AssertEquals (t
.GetMethod ("ResolveMethod"), module
.ResolveMethod (t
.GetMethod ("ResolveMethod").MetadataToken
));
161 module
.ResolveMethod (1234);
164 catch (ArgumentException
) {
168 module
.ResolveMethod (t
.MetadataToken
);
171 catch (ArgumentException
) {
175 module
.ResolveMethod (t
.GetMethod ("ResolveMethod").MetadataToken
+ 10000);
178 catch (ArgumentOutOfRangeException
) {
185 public void ResolveField () {
186 Type t
= typeof (ModuleTest
);
187 Module module
= t
.Module
;
189 AssertEquals (t
.GetField ("aField"), module
.ResolveField (t
.GetField ("aField").MetadataToken
));
192 module
.ResolveField (1234);
195 catch (ArgumentException
) {
199 module
.ResolveField (t
.MetadataToken
);
202 catch (ArgumentException
) {
206 module
.ResolveField (t
.GetField ("aField").MetadataToken
+ 10000);
209 catch (ArgumentOutOfRangeException
) {
214 public void ResolveString () {
215 Type t
= typeof (ModuleTest
);
216 Module module
= t
.Module
;
218 for (int i
= 1; i
< 10000; ++i
) {
220 module
.ResolveString (0x70000000 + i
);
227 module
.ResolveString (1234);
230 catch (ArgumentException
) {
234 module
.ResolveString (t
.MetadataToken
);
237 catch (ArgumentException
) {
241 module
.ResolveString (0x70000000 | 10000);
244 catch (ArgumentOutOfRangeException
) {
250 public void ResolveMember () {
251 Type t
= typeof (ModuleTest
);
252 Module module
= t
.Module
;
254 AssertEquals (t
, module
.ResolveMember (t
.MetadataToken
));
255 AssertEquals (t
.GetField ("aField"), module
.ResolveMember (t
.GetField ("aField").MetadataToken
));
256 AssertEquals (t
.GetMethod ("ResolveMember"), module
.ResolveMember (t
.GetMethod ("ResolveMember").MetadataToken
));
259 module
.ResolveMember (module
.MetadataToken
);
261 catch (ArgumentException
) {
267 public void FindTypes () {
268 Module m
= typeof (ModuleTest
).Module
;
272 t
= m
.FindTypes (Module
.FilterTypeName
, "FindTypesTest*");
273 AssertEquals (2, t
.Length
);
274 AssertEquals ("FindTypesTestFirstClass", t
[0].Name
);
275 AssertEquals ("FindTypesTestSecondClass", t
[1].Name
);
276 t
= m
.FindTypes (Module
.FilterTypeNameIgnoreCase
, "findtypestest*");
277 AssertEquals (2, t
.Length
);
278 AssertEquals ("FindTypesTestFirstClass", t
[0].Name
);
279 AssertEquals ("FindTypesTestSecondClass", t
[1].Name
);
282 class FindTypesTestFirstClass
{
285 class FindTypesTestSecondClass
{
288 private static void AssertArrayEqualsSorted (Array o1
, Array o2
) {
289 Array s1
= (Array
)o1
.Clone ();
290 Array s2
= (Array
)o2
.Clone ();
295 AssertEquals (s1
.Length
, s2
.Length
);
296 for (int i
= 0; i
< s1
.Length
; ++i
)
297 AssertEquals (s1
.GetValue (i
), s2
.GetValue (i
));