This commit was manufactured by cvs2svn to create branch 'mono-1-0'.
[mono.git] / mcs / class / corlib / Test / System.Reflection / ModuleTest.cs
1 //\r
2 // ModuleTest - NUnit Test Cases for the Module 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\r
21 {\r
22 \r
23 [TestFixture]\r
24 public class ModuleTest : Assertion\r
25 {       \r
26         static string TempFolder = Path.Combine (Path.GetTempPath (), "MonoTests.System.Reflection.ModuleTest");\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 ModuleBuilder\r
47 \r
48         [Test]\r
49         public void TestGlobalData () {\r
50 \r
51                 string name = "moduletest-assembly";\r
52                 string fileName = name + ".dll";\r
53 \r
54                 AssemblyName assemblyName = new AssemblyName();\r
55                 assemblyName.Name = name;\r
56 \r
57                 AssemblyBuilder ab\r
58                         = Thread.GetDomain().DefineDynamicAssembly(\r
59                                 assemblyName, AssemblyBuilderAccess.RunAndSave, TempFolder);\r
60 \r
61                 string resfile = Path.Combine (TempFolder, "res");\r
62                 using (StreamWriter sw = new StreamWriter (resfile)) {\r
63                         sw.WriteLine ("FOO");\r
64                 }\r
65 \r
66                 ab.AddResourceFile ("res", "res");\r
67 \r
68                 ModuleBuilder mb = ab.DefineDynamicModule(fileName, fileName);\r
69 \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
76 \r
77                 ab.Save (fileName);\r
78 \r
79                 Assembly assembly = Assembly.LoadFrom (Path.Combine (TempFolder, fileName));\r
80 \r
81                 Module module = assembly.GetLoadedModules ()[0];\r
82 \r
83                 string[] expectedFieldNames = new string [] {\r
84                         "DATA", "DATA2", "DATA3", "DATA4"\r
85                 };\r
86                 ArrayList fieldNames = new ArrayList ();\r
87                 foreach (FieldInfo fi in module.GetFields ()) {\r
88                         fieldNames.Add (fi.Name);\r
89                 }\r
90                 AssertArrayEqualsSorted (expectedFieldNames, fieldNames.ToArray (typeof (string)));\r
91 \r
92                 try {\r
93                         module.GetField (null);\r
94                         Fail ();\r
95                 }\r
96                 catch (ArgumentNullException) {\r
97                 }\r
98 \r
99                 try {\r
100                         module.GetField (null, 0);\r
101                         Fail ();\r
102                 }\r
103                 catch (ArgumentNullException) {\r
104                 }\r
105 \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
112 \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
119         }\r
120         \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
124 \r
125                 Array.Sort (s1);\r
126                 Array.Sort (s2);\r
127 \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
131         }\r
132 }\r
133 }\r
134 \r