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 {
22 public class EnumBuilderTest : Assertion {
23 private static string _assemblyName = "MonoTests.System.Reflection.Emit.EnumBuilder";
24 private static string _moduleName = "EmittedModule";
25 private static string _enumNamespace = "MyNameSpace";
26 private static string _enumName = "MyEnum";
27 private static Type _enumType = typeof(Int32);
28 private static string _fieldName = "MyField";
29 private static object _fieldValue = 1;
32 public void TestEnumBuilder()
34 EnumBuilder enumBuilder = GenerateEnum ();
35 VerifyType (enumBuilder);
37 AssertNotNull (enumBuilder.TypeToken);
38 AssertNotNull (enumBuilder.UnderlyingField);
39 AssertNull ("type.DeclaringType of toplevel type should be null", enumBuilder.DeclaringType);
40 AssertNull ("type.ReflectedType should be null", enumBuilder.ReflectedType);
41 AssertEquals (_enumType, enumBuilder.UnderlyingSystemType);
44 [Test][Category("ValueAdd")]
45 public void TestEnumBuilder_NotInMono ()
47 // If we decide to fix this (I dont see why we should),
48 // move to the routine above
50 EnumBuilder enumBuilder = GenerateEnum ();
51 AssertEquals ("Comparing the IsSerializable field", false, enumBuilder.IsSerializable);
56 [ExpectedException (typeof(NotSupportedException))]
57 public void TestHasElementTypeEnumBuilderIncomplete ()
59 EnumBuilder enumBuilder = GenerateEnum ();
60 bool hasElementType = enumBuilder.HasElementType;
64 [ExpectedException (typeof(NotSupportedException))]
65 [Category("ValueAdd")]
66 // Is this worth fixing, or is this considered, "extra value"?
67 public void TestHasElementTypeEnumBuilderComplete ()
69 EnumBuilder enumBuilder = GenerateEnum ();
70 enumBuilder.CreateType ();
71 bool hasElementType = enumBuilder.HasElementType;
75 [ExpectedException (typeof(InvalidOperationException))]
76 public void TestDefineLiteralTypeComplete ()
78 EnumBuilder enumBuilder = GenerateEnum ();
79 Type enumType = enumBuilder.CreateType ();
80 // you should not be able to define literal after type
82 FieldBuilder fieldBuilder = enumBuilder.DefineLiteral (_fieldName, _fieldValue);
86 public void TestDefineLiteralTypeIncomplete ()
88 EnumBuilder enumBuilder = GenerateEnum ();
89 FieldBuilder fieldBuilder = enumBuilder.DefineLiteral (_fieldName, _fieldValue);
90 Type enumType = enumBuilder.CreateType ();
92 AssertEquals (enumType, fieldBuilder.DeclaringType);
93 AssertEquals (_enumType, fieldBuilder.FieldType);
94 AssertEquals (true, fieldBuilder.IsPublic);
95 AssertEquals (true, fieldBuilder.IsStatic);
96 AssertEquals (true, fieldBuilder.IsLiteral);
97 AssertEquals (_fieldName, fieldBuilder.Name);
101 public void TestEnumType()
103 AssemblyBuilder assemblyBuilder = GenerateAssembly ();
105 ModuleBuilder modBuilder = GenerateModule (assemblyBuilder);
106 EnumBuilder enumBuilder = GenerateEnum (modBuilder);
107 enumBuilder.CreateType ();
109 Type enumType = assemblyBuilder.GetType (_enumNamespace + "." + _enumName, true);
111 VerifyType (enumType);
115 [ExpectedException (typeof(NotSupportedException))]
116 public void TestEnumBuilderGUIDIncomplete ()
118 EnumBuilder enumBuilder = GenerateEnum ();
119 Guid guid = enumBuilder.GUID;
123 [Category("NotWorking")] // Bug:71299
124 public void TestEnumBuilderGUIDComplete ()
126 EnumBuilder enumBuilder = GenerateEnum ();
127 enumBuilder.CreateType ();
128 Assert (enumBuilder.GUID != Guid.Empty);
132 public void TestEnumTypeGUID ()
134 AssemblyBuilder assemblyBuilder = GenerateAssembly ();
135 ModuleBuilder modBuilder = GenerateModule (assemblyBuilder);
136 EnumBuilder enumBuilder = GenerateEnum (modBuilder);
137 enumBuilder.CreateType ();
139 Type enumType = assemblyBuilder.GetType (_enumNamespace + "." + _enumName, true);
141 // Tested in above test: Assert (enumType.GUID != Guid.Empty);
142 AssertNull ("type.DeclaringType of toplevel type should be null", enumType.DeclaringType);
146 public void TestFieldProperties() {
147 AssemblyBuilder assemblyBuilder = GenerateAssembly ();
148 ModuleBuilder modBuilder = GenerateModule (assemblyBuilder);
149 EnumBuilder enumBuilder = GenerateEnum (modBuilder);
150 FieldBuilder fieldBuilder = GenerateField (enumBuilder);
151 enumBuilder.CreateType ();
153 Type enumType = assemblyBuilder.GetType (_enumNamespace + "." + _enumName, true);
154 FieldInfo fi = enumType.GetField (_fieldName);
155 Object o = fi.GetValue(enumType);
157 AssertEquals ("Checking the value of the Field to be 1", _fieldValue, fi.GetValue (enumType));
158 AssertEquals ("Checking if the field is a Literal", true, fi.IsLiteral);
159 AssertEquals ("Checking if the field is Public", true, fi.IsPublic);
160 AssertEquals ("Checking if the field is Static", true, fi.IsStatic);
164 public void TestFindInterfaces ()
166 EnumBuilder enumBuilder = GenerateEnum ();
168 Type[] interfaces = enumBuilder.FindInterfaces (
169 new TypeFilter (MyInterfaceFilter),
170 "System.Collections.IEnumerable");
171 AssertEquals (0, interfaces.Length);
175 [ExpectedException (typeof(NotSupportedException))]
176 [Category("ValueAdd")]
177 public void TestFindMembersIncomplete ()
179 EnumBuilder enumBuilder = GenerateEnum ();
180 GenerateField (enumBuilder);
182 MemberInfo[] members = enumBuilder.FindMembers (
183 MemberTypes.All, BindingFlags.Static |
184 BindingFlags.Public, new MemberFilter (MemberNameFilter),
189 public void TestFindMembersComplete ()
191 EnumBuilder enumBuilder = GenerateEnum ();
192 GenerateField (enumBuilder);
193 enumBuilder.CreateType ();
195 MemberInfo[] members = enumBuilder.FindMembers (
196 MemberTypes.Field, BindingFlags.Static |
197 BindingFlags.Public, new MemberFilter (MemberNameFilter),
199 AssertEquals (1, members.Length);
201 members = enumBuilder.FindMembers (
202 MemberTypes.Field, BindingFlags.Static |
203 BindingFlags.Public, new MemberFilter (MemberNameFilter),
205 AssertEquals (0, members.Length);
209 [ExpectedException (typeof(NotSupportedException))]
210 [Category("ValueAdd")]
211 public void TestGetConstructorIncomplete ()
213 EnumBuilder enumBuilder = GenerateEnum ();
214 enumBuilder.GetConstructor (BindingFlags.Public, null,
215 CallingConventions.Any, Type.EmptyTypes, new ParameterModifier[0]);
219 public void TestGetConstructorComplete ()
221 EnumBuilder enumBuilder = GenerateEnum ();
222 enumBuilder.CreateType ();
223 ConstructorInfo ctor = enumBuilder.GetConstructor (
224 BindingFlags.Public, null, CallingConventions.Any,
225 Type.EmptyTypes, new ParameterModifier[0]);
230 [ExpectedException (typeof(ArgumentNullException))]
231 public void TestGetConstructorNullTypes ()
233 EnumBuilder enumBuilder = GenerateEnum ();
234 enumBuilder.CreateType ();
235 ConstructorInfo ctor = enumBuilder.GetConstructor (
236 BindingFlags.Public, null, CallingConventions.Any,
237 null, new ParameterModifier[0]);
241 [Category ("NotWorking")]
242 [ExpectedException (typeof(ArgumentNullException))]
243 public void TestGetConstructorNullElementType ()
245 EnumBuilder enumBuilder = GenerateEnum ();
246 enumBuilder.CreateType ();
247 ConstructorInfo ctor = enumBuilder.GetConstructor (
248 BindingFlags.Public, null, CallingConventions.Any,
249 new Type[] { null }, new ParameterModifier[0]);
253 [ExpectedException (typeof(NotSupportedException))]
254 [Category("NotWorking")]
255 public void TestGetConstructorsIncomplete ()
257 EnumBuilder enumBuilder = GenerateEnum ();
259 ConstructorInfo[] ctors = enumBuilder.GetConstructors (
260 BindingFlags.Instance | BindingFlags.Public);
261 AssertEquals (0, ctors.Length);
265 public void TestGetConstructorsComplete ()
267 EnumBuilder enumBuilder = GenerateEnum ();
268 enumBuilder.CreateType ();
270 ConstructorInfo[] ctors = enumBuilder.GetConstructors (
271 BindingFlags.Instance | BindingFlags.Public);
272 AssertEquals (0, ctors.Length);
276 public void TestIsValue__SpecialName ()
278 EnumBuilder enumBuilder = GenerateEnum ();
279 Type enumType = enumBuilder.CreateType ();
280 FieldInfo value = enumType.GetField ("value__", BindingFlags.Instance | BindingFlags.NonPublic);
281 AssertEquals ("value__ must have FieldAttributes.RTSpecialName set", FieldAttributes.RTSpecialName, value.Attributes & FieldAttributes.RTSpecialName);
284 private static void VerifyType (Type type)
286 AssertNotNull ("type.Assembly should not be null", type.Assembly);
287 AssertNotNull ("type.AssemblyQualifiedName should not be null", type.AssemblyQualifiedName);
288 AssertNotNull ("type.BaseType should not be null", type.BaseType);
289 AssertNotNull ("type.FullName should not be null", type.FullName);
290 AssertNotNull ("type.Module should not be null", type.Module);
291 AssertNotNull ("type.Name should not be null", type.Name);
292 AssertNotNull ("type.Namespace should not be null", type.Namespace);
293 AssertNotNull ("type.UnderlyingSystemType should not be null", type.UnderlyingSystemType);
295 AssertEquals (_moduleName, type.Module.Name);
296 AssertEquals (_enumNamespace, type.Namespace);
297 AssertEquals (_enumName, type.Name);
298 AssertEquals (typeof(Enum), type.BaseType);
299 AssertEquals (MemberTypes.TypeInfo, type.MemberType);
300 AssertEquals (typeof(int), Enum.GetUnderlyingType (type));
302 AssertEquals ("Comparing the IsArray field", false, type.IsArray);
303 AssertEquals ("Comparing the IsAutoClass field", false, type.IsAutoClass);
304 AssertEquals ("Comparing the IsAutoLayout field", true, type.IsAutoLayout);
305 AssertEquals ("Comparing the IsByRef field", false, type.IsByRef);
306 AssertEquals ("Comparing the IsClass field", false, type.IsClass);
307 AssertEquals ("Comparing the IsComObject field", false, type.IsCOMObject);
308 AssertEquals ("Comparing the IsContextful field", false, type.IsContextful);
309 AssertEquals ("Comparing the IsEnum field", true, type.IsEnum);
310 AssertEquals ("Comparing the IsExplicitLayout field", false, type.IsExplicitLayout);
311 AssertEquals ("Comparing the IsImport field", false, type.IsImport);
312 AssertEquals ("Comparing the IsInterface field", false, type.IsInterface);
313 AssertEquals ("Comparing the IsLayoutSequential field", false, type.IsLayoutSequential);
314 AssertEquals ("Comparing the IsMarshalByRef field", false, type.IsMarshalByRef);
315 AssertEquals ("Comparing the IsNestedAssembly field", false, type.IsNestedAssembly);
316 AssertEquals ("Comparing the IsNestedFamily field", false, type.IsNestedFamily);
317 AssertEquals ("Comparing the IsNestedPublic field", false, type.IsNestedPublic);
318 AssertEquals ("Comparing the IsNestedPrivate field", false, type.IsNestedPrivate);
319 AssertEquals ("Comparing the IsNotPublic field", false, type.IsNotPublic);
320 AssertEquals ("Comparing the IsPrimitive field", false, type.IsPrimitive);
321 AssertEquals ("Comparing the IsPointer field", false, type.IsPointer);
322 AssertEquals ("Comparing the IsPublic field", true, type.IsPublic);
323 AssertEquals ("Comparing the IsSealed field", true, type.IsSealed);
324 AssertEquals ("Comparing the IsUnicode field", false, type.IsUnicodeClass);
325 AssertEquals ("Comparing the requires special handling field", false, type.IsSpecialName);
326 AssertEquals ("Comparing the IsValueType field", true, type.IsValueType);
329 public static bool MyInterfaceFilter (Type t, object filterCriteria)
331 if (t.ToString () == filterCriteria.ToString ())
337 public static bool MemberNameFilter (MemberInfo m, object filterCriteria)
339 if (m.Name == filterCriteria.ToString ())
345 private static AssemblyName GetAssemblyName ()
347 AssemblyName assemblyName = new AssemblyName ();
348 assemblyName.Name = _assemblyName;
352 private static AssemblyBuilder GenerateAssembly ()
354 return AppDomain.CurrentDomain.DefineDynamicAssembly (
355 GetAssemblyName (), AssemblyBuilderAccess.RunAndSave);
358 private static ModuleBuilder GenerateModule ()
360 AssemblyBuilder assemblyBuilder = GenerateAssembly ();
361 return assemblyBuilder.DefineDynamicModule (_moduleName);
364 private static ModuleBuilder GenerateModule (AssemblyBuilder assemblyBuilder)
366 return assemblyBuilder.DefineDynamicModule (_moduleName);
369 private static EnumBuilder GenerateEnum ()
371 ModuleBuilder modBuilder = GenerateModule ();
372 return modBuilder.DefineEnum (_enumNamespace + "."
373 + _enumName, TypeAttributes.Public, _enumType);
376 private static EnumBuilder GenerateEnum (ModuleBuilder modBuilder)
378 return modBuilder.DefineEnum (_enumNamespace + "."
379 + _enumName, TypeAttributes.Public, _enumType);
382 private static FieldBuilder GenerateField ()
384 EnumBuilder enumBuilder = GenerateEnum ();
385 return enumBuilder.DefineLiteral (_fieldName, _fieldValue);
388 private static FieldBuilder GenerateField (EnumBuilder enumBuilder)
390 return enumBuilder.DefineLiteral (_fieldName, _fieldValue);