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);
58 [Category ("NotWorking")]
59 public void TestHasElementTypeEnumBuilderIncomplete ()
61 EnumBuilder enumBuilder = GenerateEnum ();
62 bool hasElementType = enumBuilder.HasElementType;
63 Assert.IsFalse (hasElementType);
67 public void TestHasElementTypeEnumBuilderComplete ()
69 EnumBuilder enumBuilder = GenerateEnum ();
70 enumBuilder.CreateType ();
71 bool hasElementType = enumBuilder.HasElementType;
72 Assert.IsFalse (hasElementType);
76 [ExpectedException (typeof (InvalidOperationException))]
77 public void TestDefineLiteralTypeComplete ()
79 EnumBuilder enumBuilder = GenerateEnum ();
80 Type enumType = enumBuilder.CreateType ();
81 // you should not be able to define literal after type
83 enumBuilder.DefineLiteral (_fieldName, _fieldValue);
87 public void TestDefineLiteralTypeIncomplete ()
89 EnumBuilder enumBuilder = GenerateEnum ();
90 FieldBuilder fieldBuilder = enumBuilder.DefineLiteral (_fieldName, _fieldValue);
91 Type enumType = enumBuilder.CreateType ();
93 Assert.IsTrue (fieldBuilder.IsPublic, "#1");
94 Assert.IsTrue (fieldBuilder.IsStatic, "#2");
95 Assert.IsTrue (fieldBuilder.IsLiteral, "#3");
96 Assert.AreEqual (_fieldName, fieldBuilder.Name, "#4");
97 Assert.IsFalse (enumType == fieldBuilder.DeclaringType, "#5");
98 Assert.IsFalse (enumBuilder == fieldBuilder.DeclaringType, "#6");
99 Assert.AreEqual (enumType.FullName, fieldBuilder.DeclaringType.FullName, "#7");
100 Assert.IsFalse (enumType == fieldBuilder.FieldType, "#8");
101 Assert.AreEqual (enumBuilder, fieldBuilder.FieldType, "#9");
105 public void TestEnumType ()
107 AssemblyBuilder assemblyBuilder = GenerateAssembly ();
109 ModuleBuilder modBuilder = GenerateModule (assemblyBuilder);
110 EnumBuilder enumBuilder = GenerateEnum (modBuilder);
111 enumBuilder.CreateType ();
113 Type enumType = assemblyBuilder.GetType (_enumNamespace + "." + _enumName, true);
115 VerifyType (enumType);
119 [ExpectedException (typeof (NotSupportedException))]
120 public void TestEnumBuilderGUIDIncomplete ()
122 EnumBuilder enumBuilder = GenerateEnum ();
123 Guid guid = enumBuilder.GUID;
127 [Category ("NotWorking")] // Bug:71299
128 public void TestEnumBuilderGUIDComplete ()
130 EnumBuilder enumBuilder = GenerateEnum ();
131 enumBuilder.CreateType ();
132 Assert.IsTrue (enumBuilder.GUID != Guid.Empty);
136 public void TestEnumTypeGUID ()
138 AssemblyBuilder assemblyBuilder = GenerateAssembly ();
139 ModuleBuilder modBuilder = GenerateModule (assemblyBuilder);
140 EnumBuilder enumBuilder = GenerateEnum (modBuilder);
141 enumBuilder.CreateType ();
143 Type enumType = assemblyBuilder.GetType (_enumNamespace + "." + _enumName, true);
145 // Tested in above test: Assert (enumType.GUID != Guid.Empty);
146 Assert.IsNull (enumType.DeclaringType);
150 public void TestFieldProperties ()
152 AssemblyBuilder assemblyBuilder = GenerateAssembly ();
153 ModuleBuilder modBuilder = GenerateModule (assemblyBuilder);
154 EnumBuilder enumBuilder = GenerateEnum (modBuilder);
155 FieldBuilder fieldBuilder = GenerateField (enumBuilder);
156 enumBuilder.CreateType ();
158 Type enumType = assemblyBuilder.GetType (_enumNamespace + "." + _enumName, true);
159 FieldInfo fi = enumType.GetField (_fieldName);
160 Object o = fi.GetValue (enumType);
162 Assert.IsTrue (fi.IsLiteral, "#1");
163 Assert.IsTrue (fi.IsPublic, "#2");
164 Assert.IsTrue (fi.IsStatic, "#3");
165 Assert.AreEqual (enumBuilder, fieldBuilder.FieldType, "#4");
166 Assert.IsFalse (enumType == fieldBuilder.FieldType, "#5");
167 Assert.AreEqual (enumType.FullName, fieldBuilder.FieldType.FullName, "#6");
168 Assert.IsFalse (_enumType == fieldBuilder.FieldType, "#7");
170 object fieldValue = fi.GetValue (enumType);
171 Assert.IsFalse (_fieldValue == fieldValue, "#8");
172 Assert.IsTrue (fieldValue.GetType ().IsEnum, "#9");
173 Assert.AreEqual (enumType, fieldValue.GetType (), "#10");
174 Assert.AreEqual (_fieldValue, (int) fieldValue, "#11");
178 public void TestFindInterfaces ()
180 EnumBuilder enumBuilder = GenerateEnum ();
182 Type [] interfaces = enumBuilder.FindInterfaces (
183 new TypeFilter (MyInterfaceFilter),
184 "System.Collections.IEnumerable");
185 Assert.AreEqual (0, interfaces.Length);
189 [ExpectedException (typeof (NotSupportedException))]
190 [Category ("ValueAdd")]
191 public void TestFindMembersIncomplete ()
193 EnumBuilder enumBuilder = GenerateEnum ();
194 GenerateField (enumBuilder);
196 MemberInfo [] members = enumBuilder.FindMembers (
197 MemberTypes.All, BindingFlags.Static |
198 BindingFlags.Public, new MemberFilter (MemberNameFilter),
204 public void GetEnumUnderlyingType ()
206 var @enum = GenerateEnum ();
208 Assert.AreEqual (_enumType, @enum.GetEnumUnderlyingType ());
213 public void TestFindMembersComplete ()
215 EnumBuilder enumBuilder = GenerateEnum ();
216 GenerateField (enumBuilder);
217 enumBuilder.CreateType ();
219 MemberInfo [] members = enumBuilder.FindMembers (
220 MemberTypes.Field, BindingFlags.Static |
221 BindingFlags.Public, new MemberFilter (MemberNameFilter),
223 Assert.AreEqual (1, members.Length, "#1");
225 members = enumBuilder.FindMembers (
226 MemberTypes.Field, BindingFlags.Static |
227 BindingFlags.Public, new MemberFilter (MemberNameFilter),
229 Assert.AreEqual (0, members.Length, "#2");
233 [ExpectedException (typeof (NotSupportedException))]
234 [Category ("ValueAdd")]
235 public void TestGetConstructorIncomplete ()
237 EnumBuilder enumBuilder = GenerateEnum ();
238 enumBuilder.GetConstructor (BindingFlags.Public, null,
239 CallingConventions.Any, Type.EmptyTypes, new ParameterModifier [0]);
243 public void TestGetConstructorComplete ()
245 EnumBuilder enumBuilder = GenerateEnum ();
246 enumBuilder.CreateType ();
247 ConstructorInfo ctor = enumBuilder.GetConstructor (
248 BindingFlags.Public, null, CallingConventions.Any,
249 Type.EmptyTypes, new ParameterModifier [0]);
250 Assert.IsNull (ctor);
254 [ExpectedException (typeof (ArgumentNullException))]
255 public void TestGetConstructorNullTypes ()
257 EnumBuilder enumBuilder = GenerateEnum ();
258 enumBuilder.CreateType ();
259 ConstructorInfo ctor = enumBuilder.GetConstructor (
260 BindingFlags.Public, null, CallingConventions.Any,
261 null, new ParameterModifier [0]);
265 [Category ("NotWorking")]
266 [ExpectedException (typeof (ArgumentNullException))]
267 public void TestGetConstructorNullElementType ()
269 EnumBuilder enumBuilder = GenerateEnum ();
270 enumBuilder.CreateType ();
271 ConstructorInfo ctor = enumBuilder.GetConstructor (
272 BindingFlags.Public, null, CallingConventions.Any,
273 new Type [] { null }, new ParameterModifier [0]);
277 [ExpectedException (typeof (NotSupportedException))]
278 [Category ("NotWorking")]
279 public void TestGetConstructorsIncomplete ()
281 EnumBuilder enumBuilder = GenerateEnum ();
283 ConstructorInfo [] ctors = enumBuilder.GetConstructors (
284 BindingFlags.Instance | BindingFlags.Public);
285 Assert.AreEqual (0, ctors.Length);
289 public void TestGetConstructorsComplete ()
291 EnumBuilder enumBuilder = GenerateEnum ();
292 enumBuilder.CreateType ();
294 ConstructorInfo [] ctors = enumBuilder.GetConstructors (
295 BindingFlags.Instance | BindingFlags.Public);
296 Assert.AreEqual (0, ctors.Length);
300 public void TestIsValue__SpecialName ()
302 EnumBuilder enumBuilder = GenerateEnum ();
303 Type enumType = enumBuilder.CreateType ();
304 FieldInfo value = enumType.GetField ("value__", BindingFlags.Instance | BindingFlags.NonPublic);
305 Assert.AreEqual (FieldAttributes.RTSpecialName, value.Attributes & FieldAttributes.RTSpecialName);
308 private static void VerifyType (Type type)
310 Assert.IsNotNull (type.Assembly, "#V1");
311 Assert.IsNotNull (type.AssemblyQualifiedName, "#V2");
312 Assert.IsNotNull (type.BaseType, "#V3");
313 Assert.IsNotNull (type.FullName, "#V4");
314 Assert.IsNotNull (type.Module, "#V5");
315 Assert.IsNotNull (type.Name, "#V6");
316 Assert.IsNotNull (type.Namespace, "#V7");
317 Assert.IsNotNull (type.UnderlyingSystemType, "#V8");
319 Assert.AreEqual (_enumNamespace, type.Namespace, "#V10");
320 Assert.AreEqual (_enumName, type.Name, "#V11");
321 Assert.AreEqual (typeof (Enum), type.BaseType, "#V12");
322 Assert.AreEqual (MemberTypes.TypeInfo, type.MemberType, "#V13");
323 Assert.AreEqual (typeof (int), Enum.GetUnderlyingType (type), "#V14");
325 Assert.IsFalse (type.IsArray, "#V15");
326 Assert.IsFalse (type.IsAutoClass, "#V16");
327 Assert.IsTrue (type.IsAutoLayout, "#V17");
328 Assert.IsFalse (type.IsByRef, "#V18");
329 Assert.IsFalse (type.IsClass, "#V19");
330 Assert.IsFalse (type.IsCOMObject, "#V20");
331 Assert.IsFalse (type.IsContextful, "#V21");
332 Assert.IsTrue (type.IsEnum, "#V22");
333 Assert.IsFalse (type.IsExplicitLayout, "#V23");
334 Assert.IsFalse (type.IsImport, "#V24");
335 Assert.IsFalse (type.IsInterface, "#V25");
336 Assert.IsFalse (type.IsLayoutSequential, "#V26");
337 Assert.IsFalse (type.IsMarshalByRef, "#V27");
338 Assert.IsFalse (type.IsNestedAssembly, "#V28");
339 Assert.IsFalse (type.IsNestedFamily, "#V29");
340 Assert.IsFalse (type.IsNestedPublic, "#V30");
341 Assert.IsFalse (type.IsNestedPrivate, "#V31");
342 Assert.IsFalse (type.IsNotPublic, "#V32");
343 Assert.IsFalse (type.IsPrimitive, "#V33");
344 Assert.IsFalse (type.IsPointer, "#V34");
345 Assert.IsTrue (type.IsPublic, "#V35");
346 Assert.IsTrue (type.IsSealed, "#V36");
347 Assert.IsFalse (type.IsUnicodeClass, "#V37");
348 Assert.IsFalse (type.IsSpecialName, "#V38");
349 Assert.IsTrue (type.IsValueType, "#V39");
352 public static bool MyInterfaceFilter (Type t, object filterCriteria)
354 if (t.ToString () == filterCriteria.ToString ())
360 public static bool MemberNameFilter (MemberInfo m, object filterCriteria)
362 if (m.Name == filterCriteria.ToString ())
368 private static AssemblyName GetAssemblyName ()
370 AssemblyName assemblyName = new AssemblyName ();
371 assemblyName.Name = _assemblyName;
375 private static AssemblyBuilder GenerateAssembly ()
377 return AppDomain.CurrentDomain.DefineDynamicAssembly (
378 GetAssemblyName (), AssemblyBuilderAccess.RunAndSave);
381 private static ModuleBuilder GenerateModule ()
383 AssemblyBuilder assemblyBuilder = GenerateAssembly ();
384 return assemblyBuilder.DefineDynamicModule (_moduleName);
387 private static ModuleBuilder GenerateModule (AssemblyBuilder assemblyBuilder)
389 return assemblyBuilder.DefineDynamicModule (_moduleName);
392 private static EnumBuilder GenerateEnum ()
394 ModuleBuilder modBuilder = GenerateModule ();
395 return modBuilder.DefineEnum (_enumNamespace + "."
396 + _enumName, TypeAttributes.Public, _enumType);
399 private static EnumBuilder GenerateEnum (ModuleBuilder modBuilder)
401 return modBuilder.DefineEnum (_enumNamespace + "."
402 + _enumName, TypeAttributes.Public, _enumType);
405 private static FieldBuilder GenerateField ()
407 EnumBuilder enumBuilder = GenerateEnum ();
408 return enumBuilder.DefineLiteral (_fieldName, _fieldValue);
411 private static FieldBuilder GenerateField (EnumBuilder enumBuilder)
413 return enumBuilder.DefineLiteral (_fieldName, _fieldValue);