2 // EnumBuiderTest - NUnit Test Cases for the EnumBuider class
4 // Keerti Narayan (keertiln@rediffmail.com)
5 // Gert Driesen (drieseng@users.sourceforge.net)
7 // (C) Ximian, Inc. http://www.ximian.com
13 using System.Reflection;
14 using System.Reflection.Emit;
15 using System.Collections;
16 using System.Threading;
18 using NUnit.Framework;
20 namespace MonoTests.System.Reflection.Emit
23 public class EnumBuilderTest
25 private static string _assemblyName = "MonoTests.System.Reflection.Emit.EnumBuilder";
26 private static string _moduleName = "EmittedModule";
27 private static string _enumNamespace = "MyNameSpace";
28 private static string _enumName = "MyEnum";
29 private static Type _enumType = typeof (Int32);
30 private static string _fieldName = "MyField";
31 private static object _fieldValue = 1;
34 public void TestEnumBuilder ()
36 EnumBuilder enumBuilder = GenerateEnum ();
37 VerifyType (enumBuilder);
39 Assert.IsNotNull (enumBuilder.TypeToken, "#1");
40 Assert.IsNotNull (enumBuilder.UnderlyingField, "#2");
41 Assert.IsNull (enumBuilder.DeclaringType, "#3");
42 Assert.IsNull (enumBuilder.ReflectedType, "#4");
43 Assert.AreEqual (_enumType, enumBuilder.UnderlyingSystemType, "#5");
47 [Category ("ValueAdd")]
48 public void TestEnumBuilder_NotInMono ()
50 // If we decide to fix this (I dont see why we should),
51 // move to the routine above
53 EnumBuilder enumBuilder = GenerateEnum ();
54 Assert.IsFalse (enumBuilder.IsSerializable);
59 [Category ("NotWorking")]
61 [ExpectedException (typeof (NotSupportedException))]
63 public void TestHasElementTypeEnumBuilderIncomplete ()
65 EnumBuilder enumBuilder = GenerateEnum ();
66 bool hasElementType = enumBuilder.HasElementType;
68 Assert.IsFalse (hasElementType);
70 Assert.Fail ("Should have failed: " + hasElementType);
76 [ExpectedException (typeof (NotSupportedException))]
77 [Category ("ValueAdd")] // Is this worth fixing, or is this considered, "extra value"?
79 public void TestHasElementTypeEnumBuilderComplete ()
81 EnumBuilder enumBuilder = GenerateEnum ();
82 enumBuilder.CreateType ();
83 bool hasElementType = enumBuilder.HasElementType;
85 Assert.IsFalse (hasElementType);
87 Assert.Fail ("Should have failed: " + hasElementType);
92 [ExpectedException (typeof (InvalidOperationException))]
93 public void TestDefineLiteralTypeComplete ()
95 EnumBuilder enumBuilder = GenerateEnum ();
96 Type enumType = enumBuilder.CreateType ();
97 // you should not be able to define literal after type
99 enumBuilder.DefineLiteral (_fieldName, _fieldValue);
103 public void TestDefineLiteralTypeIncomplete ()
105 EnumBuilder enumBuilder = GenerateEnum ();
106 FieldBuilder fieldBuilder = enumBuilder.DefineLiteral (_fieldName, _fieldValue);
107 Type enumType = enumBuilder.CreateType ();
109 Assert.IsTrue (fieldBuilder.IsPublic, "#1");
110 Assert.IsTrue (fieldBuilder.IsStatic, "#2");
111 Assert.IsTrue (fieldBuilder.IsLiteral, "#3");
112 Assert.AreEqual (_fieldName, fieldBuilder.Name, "#4");
114 Assert.IsFalse (enumType == fieldBuilder.DeclaringType, "#5");
115 Assert.IsFalse (enumBuilder == fieldBuilder.DeclaringType, "#6");
116 Assert.AreEqual (enumType.FullName, fieldBuilder.DeclaringType.FullName, "#7");
117 Assert.IsFalse (enumType == fieldBuilder.FieldType, "#8");
118 Assert.AreEqual (enumBuilder, fieldBuilder.FieldType, "#9");
120 Assert.AreEqual (enumType, fieldBuilder.DeclaringType, "#5");
121 Assert.AreEqual (_enumType, fieldBuilder.FieldType, "#6");
126 public void TestEnumType ()
128 AssemblyBuilder assemblyBuilder = GenerateAssembly ();
130 ModuleBuilder modBuilder = GenerateModule (assemblyBuilder);
131 EnumBuilder enumBuilder = GenerateEnum (modBuilder);
132 enumBuilder.CreateType ();
134 Type enumType = assemblyBuilder.GetType (_enumNamespace + "." + _enumName, true);
136 VerifyType (enumType);
140 [ExpectedException (typeof (NotSupportedException))]
141 public void TestEnumBuilderGUIDIncomplete ()
143 EnumBuilder enumBuilder = GenerateEnum ();
144 Guid guid = enumBuilder.GUID;
148 [Category ("NotWorking")] // Bug:71299
149 public void TestEnumBuilderGUIDComplete ()
151 EnumBuilder enumBuilder = GenerateEnum ();
152 enumBuilder.CreateType ();
153 Assert.IsTrue (enumBuilder.GUID != Guid.Empty);
157 public void TestEnumTypeGUID ()
159 AssemblyBuilder assemblyBuilder = GenerateAssembly ();
160 ModuleBuilder modBuilder = GenerateModule (assemblyBuilder);
161 EnumBuilder enumBuilder = GenerateEnum (modBuilder);
162 enumBuilder.CreateType ();
164 Type enumType = assemblyBuilder.GetType (_enumNamespace + "." + _enumName, true);
166 // Tested in above test: Assert (enumType.GUID != Guid.Empty);
167 Assert.IsNull (enumType.DeclaringType);
171 public void TestFieldProperties ()
173 AssemblyBuilder assemblyBuilder = GenerateAssembly ();
174 ModuleBuilder modBuilder = GenerateModule (assemblyBuilder);
175 EnumBuilder enumBuilder = GenerateEnum (modBuilder);
176 FieldBuilder fieldBuilder = GenerateField (enumBuilder);
177 enumBuilder.CreateType ();
179 Type enumType = assemblyBuilder.GetType (_enumNamespace + "." + _enumName, true);
180 FieldInfo fi = enumType.GetField (_fieldName);
181 Object o = fi.GetValue (enumType);
183 Assert.IsTrue (fi.IsLiteral, "#1");
184 Assert.IsTrue (fi.IsPublic, "#2");
185 Assert.IsTrue (fi.IsStatic, "#3");
186 Assert.AreEqual (enumBuilder, fieldBuilder.FieldType, "#4");
187 Assert.IsFalse (enumType == fieldBuilder.FieldType, "#5");
189 Assert.AreEqual (enumType.FullName, fieldBuilder.FieldType.FullName, "#6");
190 Assert.IsFalse (_enumType == fieldBuilder.FieldType, "#7");
192 Assert.IsFalse (enumType.FullName == fieldBuilder.FieldType.FullName, "#6");
193 Assert.AreEqual (_enumType, fieldBuilder.FieldType, "#7");
196 object fieldValue = fi.GetValue (enumType);
198 Assert.IsFalse (_fieldValue == fieldValue, "#8");
199 Assert.IsTrue (fieldValue.GetType ().IsEnum, "#9");
200 Assert.AreEqual (enumType, fieldValue.GetType (), "#10");
202 Assert.AreEqual (_fieldValue, fieldValue, "#8");
203 Assert.IsFalse (fieldValue.GetType ().IsEnum, "#9");
204 Assert.AreEqual (_enumType, fieldValue.GetType (), "#10");
206 Assert.AreEqual (_fieldValue, (int) fieldValue, "#11");
210 public void TestFindInterfaces ()
212 EnumBuilder enumBuilder = GenerateEnum ();
214 Type [] interfaces = enumBuilder.FindInterfaces (
215 new TypeFilter (MyInterfaceFilter),
216 "System.Collections.IEnumerable");
217 Assert.AreEqual (0, interfaces.Length);
221 [ExpectedException (typeof (NotSupportedException))]
222 [Category ("ValueAdd")]
223 public void TestFindMembersIncomplete ()
225 EnumBuilder enumBuilder = GenerateEnum ();
226 GenerateField (enumBuilder);
228 MemberInfo [] members = enumBuilder.FindMembers (
229 MemberTypes.All, BindingFlags.Static |
230 BindingFlags.Public, new MemberFilter (MemberNameFilter),
236 public void GetEnumUnderlyingType ()
238 var @enum = GenerateEnum ();
240 Assert.AreEqual (_enumType, @enum.GetEnumUnderlyingType ());
245 public void TestFindMembersComplete ()
247 EnumBuilder enumBuilder = GenerateEnum ();
248 GenerateField (enumBuilder);
249 enumBuilder.CreateType ();
251 MemberInfo [] members = enumBuilder.FindMembers (
252 MemberTypes.Field, BindingFlags.Static |
253 BindingFlags.Public, new MemberFilter (MemberNameFilter),
255 Assert.AreEqual (1, members.Length, "#1");
257 members = enumBuilder.FindMembers (
258 MemberTypes.Field, BindingFlags.Static |
259 BindingFlags.Public, new MemberFilter (MemberNameFilter),
261 Assert.AreEqual (0, members.Length, "#2");
265 [ExpectedException (typeof (NotSupportedException))]
266 [Category ("ValueAdd")]
267 public void TestGetConstructorIncomplete ()
269 EnumBuilder enumBuilder = GenerateEnum ();
270 enumBuilder.GetConstructor (BindingFlags.Public, null,
271 CallingConventions.Any, Type.EmptyTypes, new ParameterModifier [0]);
275 public void TestGetConstructorComplete ()
277 EnumBuilder enumBuilder = GenerateEnum ();
278 enumBuilder.CreateType ();
279 ConstructorInfo ctor = enumBuilder.GetConstructor (
280 BindingFlags.Public, null, CallingConventions.Any,
281 Type.EmptyTypes, new ParameterModifier [0]);
282 Assert.IsNull (ctor);
286 [ExpectedException (typeof (ArgumentNullException))]
287 public void TestGetConstructorNullTypes ()
289 EnumBuilder enumBuilder = GenerateEnum ();
290 enumBuilder.CreateType ();
291 ConstructorInfo ctor = enumBuilder.GetConstructor (
292 BindingFlags.Public, null, CallingConventions.Any,
293 null, new ParameterModifier [0]);
297 [Category ("NotWorking")]
298 [ExpectedException (typeof (ArgumentNullException))]
299 public void TestGetConstructorNullElementType ()
301 EnumBuilder enumBuilder = GenerateEnum ();
302 enumBuilder.CreateType ();
303 ConstructorInfo ctor = enumBuilder.GetConstructor (
304 BindingFlags.Public, null, CallingConventions.Any,
305 new Type [] { null }, new ParameterModifier [0]);
309 [ExpectedException (typeof (NotSupportedException))]
310 [Category ("NotWorking")]
311 public void TestGetConstructorsIncomplete ()
313 EnumBuilder enumBuilder = GenerateEnum ();
315 ConstructorInfo [] ctors = enumBuilder.GetConstructors (
316 BindingFlags.Instance | BindingFlags.Public);
317 Assert.AreEqual (0, ctors.Length);
321 public void TestGetConstructorsComplete ()
323 EnumBuilder enumBuilder = GenerateEnum ();
324 enumBuilder.CreateType ();
326 ConstructorInfo [] ctors = enumBuilder.GetConstructors (
327 BindingFlags.Instance | BindingFlags.Public);
328 Assert.AreEqual (0, ctors.Length);
332 public void TestIsValue__SpecialName ()
334 EnumBuilder enumBuilder = GenerateEnum ();
335 Type enumType = enumBuilder.CreateType ();
336 FieldInfo value = enumType.GetField ("value__", BindingFlags.Instance | BindingFlags.NonPublic);
337 Assert.AreEqual (FieldAttributes.RTSpecialName, value.Attributes & FieldAttributes.RTSpecialName);
340 private static void VerifyType (Type type)
342 Assert.IsNotNull (type.Assembly, "#V1");
343 Assert.IsNotNull (type.AssemblyQualifiedName, "#V2");
344 Assert.IsNotNull (type.BaseType, "#V3");
345 Assert.IsNotNull (type.FullName, "#V4");
346 Assert.IsNotNull (type.Module, "#V5");
347 Assert.IsNotNull (type.Name, "#V6");
348 Assert.IsNotNull (type.Namespace, "#V7");
349 Assert.IsNotNull (type.UnderlyingSystemType, "#V8");
352 // on .NET 2.0, module is name is fixed to
353 Assert.AreEqual (_moduleName, type.Module.Name, "#V9");
355 Assert.AreEqual (_enumNamespace, type.Namespace, "#V10");
356 Assert.AreEqual (_enumName, type.Name, "#V11");
357 Assert.AreEqual (typeof (Enum), type.BaseType, "#V12");
358 Assert.AreEqual (MemberTypes.TypeInfo, type.MemberType, "#V13");
359 Assert.AreEqual (typeof (int), Enum.GetUnderlyingType (type), "#V14");
361 Assert.IsFalse (type.IsArray, "#V15");
362 Assert.IsFalse (type.IsAutoClass, "#V16");
363 Assert.IsTrue (type.IsAutoLayout, "#V17");
364 Assert.IsFalse (type.IsByRef, "#V18");
365 Assert.IsFalse (type.IsClass, "#V19");
366 Assert.IsFalse (type.IsCOMObject, "#V20");
367 Assert.IsFalse (type.IsContextful, "#V21");
368 Assert.IsTrue (type.IsEnum, "#V22");
369 Assert.IsFalse (type.IsExplicitLayout, "#V23");
370 Assert.IsFalse (type.IsImport, "#V24");
371 Assert.IsFalse (type.IsInterface, "#V25");
372 Assert.IsFalse (type.IsLayoutSequential, "#V26");
373 Assert.IsFalse (type.IsMarshalByRef, "#V27");
374 Assert.IsFalse (type.IsNestedAssembly, "#V28");
375 Assert.IsFalse (type.IsNestedFamily, "#V29");
376 Assert.IsFalse (type.IsNestedPublic, "#V30");
377 Assert.IsFalse (type.IsNestedPrivate, "#V31");
378 Assert.IsFalse (type.IsNotPublic, "#V32");
379 Assert.IsFalse (type.IsPrimitive, "#V33");
380 Assert.IsFalse (type.IsPointer, "#V34");
381 Assert.IsTrue (type.IsPublic, "#V35");
382 Assert.IsTrue (type.IsSealed, "#V36");
383 Assert.IsFalse (type.IsUnicodeClass, "#V37");
384 Assert.IsFalse (type.IsSpecialName, "#V38");
385 Assert.IsTrue (type.IsValueType, "#V39");
388 public static bool MyInterfaceFilter (Type t, object filterCriteria)
390 if (t.ToString () == filterCriteria.ToString ())
396 public static bool MemberNameFilter (MemberInfo m, object filterCriteria)
398 if (m.Name == filterCriteria.ToString ())
404 private static AssemblyName GetAssemblyName ()
406 AssemblyName assemblyName = new AssemblyName ();
407 assemblyName.Name = _assemblyName;
411 private static AssemblyBuilder GenerateAssembly ()
413 return AppDomain.CurrentDomain.DefineDynamicAssembly (
414 GetAssemblyName (), AssemblyBuilderAccess.RunAndSave);
417 private static ModuleBuilder GenerateModule ()
419 AssemblyBuilder assemblyBuilder = GenerateAssembly ();
420 return assemblyBuilder.DefineDynamicModule (_moduleName);
423 private static ModuleBuilder GenerateModule (AssemblyBuilder assemblyBuilder)
425 return assemblyBuilder.DefineDynamicModule (_moduleName);
428 private static EnumBuilder GenerateEnum ()
430 ModuleBuilder modBuilder = GenerateModule ();
431 return modBuilder.DefineEnum (_enumNamespace + "."
432 + _enumName, TypeAttributes.Public, _enumType);
435 private static EnumBuilder GenerateEnum (ModuleBuilder modBuilder)
437 return modBuilder.DefineEnum (_enumNamespace + "."
438 + _enumName, TypeAttributes.Public, _enumType);
441 private static FieldBuilder GenerateField ()
443 EnumBuilder enumBuilder = GenerateEnum ();
444 return enumBuilder.DefineLiteral (_fieldName, _fieldValue);
447 private static FieldBuilder GenerateField (EnumBuilder enumBuilder)
449 return enumBuilder.DefineLiteral (_fieldName, _fieldValue);