2003-06-15 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / corlib / Test / System.Reflection.Emit / ModuleBuilderTest.cs
1 //\r
2 // ModuleBuilderTest - NUnit Test Cases for the ModuleBuilder class\r
3 //\r
4 // Zoltan Varga (vargaz@freemail.hu)\r
5 //\r
6 // (C) Ximian, Inc.  http://www.ximian.com\r
7 //\r
8 //\r
9 \r
10 \r
11 using System;\r
12 using System.Threading;\r
13 using System.Reflection;\r
14 using System.Reflection.Emit;\r
15 using System.IO;\r
16 using System.Collections;\r
17 \r
18 using NUnit.Framework;\r
19 \r
20 namespace MonoTests.System.Reflection.Emit\r
21 {\r
22 \r
23 [TestFixture]\r
24 public class ModuleBuilderTest : Assertion\r
25 {       \r
26         static string TempFolder = Path.Combine (Path.GetTempPath (), "MonoTests.System.Reflection.Emit.ModuleBuilderTest");\r
27 \r
28         [SetUp]\r
29         public void SetUp () {\r
30                 while (Directory.Exists (TempFolder))\r
31                         TempFolder = Path.Combine (TempFolder, "2");\r
32                 Directory.CreateDirectory (TempFolder);\r
33         }               \r
34 \r
35         [TearDown]\r
36         public void TearDown () {\r
37                 try {\r
38                         // This throws an exception under MS.NET, since the directory contains loaded\r
39                         // assemblies.\r
40                         Directory.Delete (TempFolder, true);\r
41                 }\r
42                 catch (Exception) {\r
43                 }\r
44         }\r
45 \r
46         // Some of these tests overlap with the tests for Module\r
47 \r
48         [Test]\r
49         public void TestGlobalData () {\r
50 \r
51                 AssemblyName assemblyName = new AssemblyName();\r
52                 assemblyName.Name = "foo";\r
53 \r
54                 AssemblyBuilder ab\r
55                         = Thread.GetDomain().DefineDynamicAssembly(\r
56                                 assemblyName, AssemblyBuilderAccess.RunAndSave, TempFolder);\r
57 \r
58                 string resfile = Path.Combine (TempFolder, "res");\r
59                 using (StreamWriter sw = new StreamWriter (resfile)) {\r
60                         sw.WriteLine ("FOO");\r
61                 }\r
62 \r
63                 ModuleBuilder mb = ab.DefineDynamicModule("foo.dll", "foo.dll");\r
64 \r
65                 mb.DefineInitializedData ("DATA", new byte [100], FieldAttributes.Public);\r
66                 mb.DefineInitializedData ("DATA2", new byte [100], FieldAttributes.Public);\r
67                 mb.DefineInitializedData ("DATA3", new byte [99], FieldAttributes.Public);\r
68                 mb.DefineUninitializedData ("DATA4", 101, FieldAttributes.Public);\r
69                 mb.DefineInitializedData ("DATA_PRIVATE", new byte [100], 0);\r
70                 mb.CreateGlobalFunctions ();\r
71 \r
72                 ab.Save ("foo.dll");\r
73 \r
74                 Assembly assembly = Assembly.LoadFrom (Path.Combine (TempFolder, "foo.dll"));\r
75 \r
76                 Module module = assembly.GetLoadedModules ()[0];\r
77 \r
78                 string[] expectedFieldNames = new string [] {\r
79                         "DATA", "DATA2", "DATA3", "DATA4"\r
80                 };\r
81                 ArrayList fieldNames = new ArrayList ();\r
82                 foreach (FieldInfo fi in module.GetFields ()) {\r
83                         fieldNames.Add (fi.Name);\r
84                 }\r
85                 AssertArrayEqualsSorted (expectedFieldNames, fieldNames.ToArray (typeof (string)));\r
86 \r
87                 AssertEquals (module.GetField ("DATA") != null, true);\r
88                 AssertEquals (module.GetField ("DATA2") != null, true);\r
89                 AssertEquals (module.GetField ("DATA3") != null, true);\r
90                 AssertEquals (module.GetField ("DATA4") != null, true);\r
91                 AssertEquals (module.GetField ("DATA_PRIVATE"), null);\r
92                 AssertEquals (module.GetField ("DATA_PRIVATE", BindingFlags.NonPublic | BindingFlags.Static) != null, true);\r
93         }\r
94         \r
95     private static void AssertArrayEqualsSorted (Array o1, Array o2) {\r
96                 Array s1 = (Array)o1.Clone ();\r
97                 Array s2 = (Array)o2.Clone ();\r
98 \r
99                 Array.Sort (s1);\r
100                 Array.Sort (s2);\r
101 \r
102                 AssertEquals (s1.Length, s2.Length);\r
103                 for (int i = 0; i < s1.Length; ++i)\r
104                         AssertEquals (s1.GetValue (i), s2.GetValue (i));\r
105         }\r
106 }\r
107 }\r
108 \r