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
12 using System.Threading;
\r
13 using System.Reflection;
\r
14 using System.Reflection.Emit;
\r
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 public void TestGlobalData () {
\r
51 string name = "moduletest-assembly";
\r
52 string fileName = name + ".dll";
\r
54 AssemblyName assemblyName = new AssemblyName();
\r
55 assemblyName.Name = name;
\r
58 = Thread.GetDomain().DefineDynamicAssembly(
\r
59 assemblyName, AssemblyBuilderAccess.RunAndSave, TempFolder);
\r
61 string resfile = Path.Combine (TempFolder, "res");
\r
62 using (StreamWriter sw = new StreamWriter (resfile)) {
\r
63 sw.WriteLine ("FOO");
\r
66 ab.AddResourceFile ("res", "res");
\r
68 ModuleBuilder mb = ab.DefineDynamicModule(fileName, fileName);
\r
70 mb.DefineInitializedData ("DATA", new byte [100], FieldAttributes.Public);
\r
71 mb.DefineInitializedData ("DATA2", new byte [100], FieldAttributes.Public);
\r
72 mb.DefineInitializedData ("DATA3", new byte [99], FieldAttributes.Public);
\r
73 mb.DefineUninitializedData ("DATA4", 101, FieldAttributes.Public);
\r
74 mb.DefineInitializedData ("DATA_PRIVATE", new byte [100], 0);
\r
75 mb.CreateGlobalFunctions ();
\r
79 Assembly assembly = Assembly.LoadFrom (Path.Combine (TempFolder, fileName));
\r
81 Module module = assembly.GetLoadedModules ()[0];
\r
83 string[] expectedFieldNames = new string [] {
\r
84 "DATA", "DATA2", "DATA3", "DATA4"
\r
86 ArrayList fieldNames = new ArrayList ();
\r
87 foreach (FieldInfo fi in module.GetFields ()) {
\r
88 fieldNames.Add (fi.Name);
\r
90 AssertArrayEqualsSorted (expectedFieldNames, fieldNames.ToArray (typeof (string)));
\r
93 module.GetField (null);
\r
96 catch (ArgumentNullException) {
\r
100 module.GetField (null, 0);
\r
103 catch (ArgumentNullException) {
\r
106 AssertEquals (module.GetField ("DATA") != null, true);
\r
107 AssertEquals (module.GetField ("DATA2") != null, true);
\r
108 AssertEquals (module.GetField ("DATA3") != null, true);
\r
109 AssertEquals (module.GetField ("DATA4") != null, true);
\r
110 AssertEquals (module.GetField ("DATA_PRIVATE"), null);
\r
111 AssertEquals (module.GetField ("DATA_PRIVATE", BindingFlags.NonPublic | BindingFlags.Static) != null, true);
\r
113 // Check that these methods work correctly on resource modules
\r
114 Module m2 = assembly.GetModule ("res");
\r
115 AssertEquals (m2 != null, true);
\r
116 AssertEquals (m2.GetFields ().Length, 0);
\r
117 AssertEquals (m2.GetField ("DATA"), null);
\r
118 AssertEquals (m2.GetField ("DATA", BindingFlags.Public), null);
\r
121 private static void AssertArrayEqualsSorted (Array o1, Array o2) {
\r
122 Array s1 = (Array)o1.Clone ();
\r
123 Array s2 = (Array)o2.Clone ();
\r
128 AssertEquals (s1.Length, s2.Length);
\r
129 for (int i = 0; i < s1.Length; ++i)
\r
130 AssertEquals (s1.GetValue (i), s2.GetValue (i));
\r