2005-04-12 Dick Porter <dick@ximian.com>
[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 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
8 //\r
9 \r
10 using System;\r
11 using System.Threading;\r
12 using System.Reflection;\r
13 using System.Reflection.Emit;\r
14 using System.Runtime.Serialization;
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         [Category("NotDotNet")] // path length can cause suprious failures\r
50         public void TestGlobalData () {\r
51 \r
52                 string name = "moduletest-assembly";\r
53                 string fileName = name + ".dll";\r
54 \r
55                 AssemblyName assemblyName = new AssemblyName();\r
56                 assemblyName.Name = name;\r
57 \r
58                 AssemblyBuilder ab\r
59                         = Thread.GetDomain().DefineDynamicAssembly(\r
60                                 assemblyName, AssemblyBuilderAccess.RunAndSave, TempFolder);\r
61 \r
62                 string resfile = Path.Combine (TempFolder, "res");\r
63                 using (StreamWriter sw = new StreamWriter (resfile)) {\r
64                         sw.WriteLine ("FOO");\r
65                 }\r
66 \r
67                 ab.AddResourceFile ("res", "res");\r
68 \r
69                 ModuleBuilder mb = ab.DefineDynamicModule(fileName, fileName);\r
70 \r
71                 mb.DefineInitializedData ("DATA", new byte [100], FieldAttributes.Public);\r
72                 mb.DefineInitializedData ("DATA2", new byte [100], FieldAttributes.Public);\r
73                 mb.DefineInitializedData ("DATA3", new byte [99], FieldAttributes.Public);\r
74                 mb.DefineUninitializedData ("DATA4", 101, FieldAttributes.Public);\r
75                 mb.DefineInitializedData ("DATA_PRIVATE", new byte [100], 0);\r
76                 mb.CreateGlobalFunctions ();\r
77 \r
78                 ab.Save (fileName);\r
79 \r
80                 Assembly assembly = Assembly.LoadFrom (Path.Combine (TempFolder, fileName));\r
81 \r
82                 Module module = assembly.GetLoadedModules ()[0];\r
83 \r
84                 string[] expectedFieldNames = new string [] {\r
85                         "DATA", "DATA2", "DATA3", "DATA4"\r
86                 };\r
87                 ArrayList fieldNames = new ArrayList ();\r
88                 foreach (FieldInfo fi in module.GetFields ()) {\r
89                         fieldNames.Add (fi.Name);\r
90                 }\r
91                 AssertArrayEqualsSorted (expectedFieldNames, fieldNames.ToArray (typeof (string)));\r
92 \r
93                 try {\r
94                         module.GetField (null);\r
95                         Fail ();\r
96                 }\r
97                 catch (ArgumentNullException) {\r
98                 }\r
99 \r
100                 try {\r
101                         module.GetField (null, 0);\r
102                         Fail ();\r
103                 }\r
104                 catch (ArgumentNullException) {\r
105                 }\r
106 \r
107                 AssertEquals (module.GetField ("DATA") != null, true);\r
108                 AssertEquals (module.GetField ("DATA2") != null, true);\r
109                 AssertEquals (module.GetField ("DATA3") != null, true);\r
110                 AssertEquals (module.GetField ("DATA4") != null, true);\r
111                 AssertEquals (module.GetField ("DATA_PRIVATE"), null);\r
112                 AssertEquals (module.GetField ("DATA_PRIVATE", BindingFlags.NonPublic | BindingFlags.Static) != null, true);\r
113 \r
114                 // Check that these methods work correctly on resource modules\r
115                 Module m2 = assembly.GetModule ("res");\r
116                 AssertEquals (m2 != null, true);\r
117                 AssertEquals (m2.GetFields ().Length, 0);\r
118                 AssertEquals (m2.GetField ("DATA"), null);\r
119                 AssertEquals (m2.GetField ("DATA", BindingFlags.Public), null);\r
120         }\r
121 \r
122 #if NET_2_0\r
123 \r
124         [Test]\r
125         public void ResolveType () {\r
126                 Type t = typeof (ModuleTest);\r
127                 Module module = t.Module;\r
128 \r
129                 AssertEquals (t, module.ResolveType (t.MetadataToken));\r
130 \r
131                 /* We currently throw ArgumentException for this one */\r
132                 try {\r
133                         module.ResolveType (1234);\r
134                         Fail ();\r
135                 }\r
136                 catch (ArgumentException) {\r
137                 }\r
138 \r
139                 try {\r
140                         module.ResolveType (t.GetMethod ("ResolveType").MetadataToken);\r
141                         Fail ();\r
142                 }\r
143                 catch (ArgumentException) {\r
144                 }\r
145 \r
146                 try {\r
147                         module.ResolveType (t.MetadataToken + 10000);\r
148                         Fail ();\r
149                 }\r
150                 catch (ArgumentOutOfRangeException) {\r
151                 }\r
152         }\r
153 \r
154         [Test]\r
155         public void ResolveMethod () {\r
156                 Type t = typeof (ModuleTest);\r
157                 Module module = t.Module;\r
158 \r
159                 AssertEquals (t.GetMethod ("ResolveMethod"), module.ResolveMethod (t.GetMethod ("ResolveMethod").MetadataToken));\r
160 \r
161                 try {\r
162                         module.ResolveMethod (1234);\r
163                         Fail ();\r
164                 }\r
165                 catch (ArgumentException) {\r
166                 }\r
167 \r
168                 try {\r
169                         module.ResolveMethod (t.MetadataToken);\r
170                         Fail ();\r
171                 }\r
172                 catch (ArgumentException) {\r
173                 }\r
174 \r
175                 try {\r
176                         module.ResolveMethod (t.GetMethod ("ResolveMethod").MetadataToken + 10000);\r
177                         Fail ();\r
178                 }\r
179                 catch (ArgumentOutOfRangeException) {\r
180                 }\r
181         }\r
182 \r
183         public int aField;\r
184 \r
185         [Test]\r
186         public void ResolveField () {\r
187                 Type t = typeof (ModuleTest);\r
188                 Module module = t.Module;\r
189 \r
190                 AssertEquals (t.GetField ("aField"), module.ResolveField (t.GetField ("aField").MetadataToken));\r
191 \r
192                 try {\r
193                         module.ResolveField (1234);\r
194                         Fail ();\r
195                 }\r
196                 catch (ArgumentException) {\r
197                 }\r
198 \r
199                 try {\r
200                         module.ResolveField (t.MetadataToken);\r
201                         Fail ();\r
202                 }\r
203                 catch (ArgumentException) {\r
204                 }\r
205 \r
206                 try {\r
207                         module.ResolveField (t.GetField ("aField").MetadataToken + 10000);\r
208                         Fail ();\r
209                 }\r
210                 catch (ArgumentOutOfRangeException) {\r
211                 }\r
212         }\r
213
214         [Category ("NotWorking")]\r
215         [Test]\r
216         public void ResolveString () {\r
217                 Type t = typeof (ModuleTest);\r
218                 Module module = t.Module;\r
219 \r
220                 for (int i = 1; i < 10000; ++i) {\r
221                         try {\r
222                                 module.ResolveString (0x70000000 + i);\r
223                         }\r
224                         catch (Exception) {\r
225                         }\r
226                 }\r
227 \r
228                 try {\r
229                         module.ResolveString (1234);\r
230                         Fail ();\r
231                 }\r
232                 catch (ArgumentException) {\r
233                 }\r
234 \r
235                 try {\r
236                         module.ResolveString (t.MetadataToken);\r
237                         Fail ();\r
238                 }\r
239                 catch (ArgumentException) {\r
240                 }\r
241 \r
242                 try {\r
243                         module.ResolveString (0x70000000 | 10000);\r
244                         Fail ();\r
245                 }\r
246                 catch (ArgumentOutOfRangeException) {\r
247                 }\r
248         }\r
249 \r
250 \r
251         [Test]\r
252         public void ResolveMember () {\r
253                 Type t = typeof (ModuleTest);\r
254                 Module module = t.Module;\r
255 \r
256                 AssertEquals (t, module.ResolveMember (t.MetadataToken));\r
257                 AssertEquals (t.GetField ("aField"), module.ResolveMember (t.GetField ("aField").MetadataToken));\r
258                 AssertEquals (t.GetMethod ("ResolveMember"), module.ResolveMember (t.GetMethod ("ResolveMember").MetadataToken));\r
259 \r
260                 try {\r
261                         module.ResolveMember (module.MetadataToken);\r
262                 }\r
263                 catch (ArgumentException) {\r
264                 }\r
265         }\r
266 #endif\r
267 \r
268         [Test]\r
269         public void FindTypes () {\r
270                 Module m = typeof (ModuleTest).Module;\r
271 \r
272                 Type[] t;\r
273 \r
274                 t = m.FindTypes (Module.FilterTypeName, "FindTypesTest*");\r
275                 AssertEquals (2, t.Length);\r
276                 AssertEquals ("FindTypesTestFirstClass", t [0].Name);\r
277                 AssertEquals ("FindTypesTestSecondClass", t [1].Name);\r
278                 t = m.FindTypes (Module.FilterTypeNameIgnoreCase, "findtypestest*");\r
279                 AssertEquals (2, t.Length);\r
280                 AssertEquals ("FindTypesTestFirstClass", t [0].Name);\r
281                 AssertEquals ("FindTypesTestSecondClass", t [1].Name);\r
282         }\r
283
284         [Test]
285         [ExpectedException (typeof (ArgumentNullException))]
286         public void GetObjectData_Null ()
287         {
288                 Module m = typeof (ModuleTest).Module;\r
289                 m.GetObjectData (null, new StreamingContext (StreamingContextStates.All));\r
290         }\r
291 \r
292         class FindTypesTestFirstClass { \r
293         }\r
294 \r
295         class FindTypesTestSecondClass {\r
296         }\r
297 \r
298     private static void AssertArrayEqualsSorted (Array o1, Array o2) {\r
299                 Array s1 = (Array)o1.Clone ();\r
300                 Array s2 = (Array)o2.Clone ();\r
301 \r
302                 Array.Sort (s1);\r
303                 Array.Sort (s2);\r
304 \r
305                 AssertEquals (s1.Length, s2.Length);\r
306                 for (int i = 0; i < s1.Length; ++i)\r
307                         AssertEquals (s1.GetValue (i), s2.GetValue (i));\r
308         }\r
309 }\r
310 }\r
311 \r