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
);
42 AssertEquals ("Comparing the IsSerializable field", false, enumBuilder
.IsSerializable
);
46 [ExpectedException (typeof(NotSupportedException
))]
47 public void TestHasElementTypeEnumBuilderIncomplete ()
49 EnumBuilder enumBuilder
= GenerateEnum ();
50 bool hasElementType
= enumBuilder
.HasElementType
;
54 [ExpectedException (typeof(NotSupportedException
))]
55 public void TestHasElementTypeEnumBuilderComplete ()
57 EnumBuilder enumBuilder
= GenerateEnum ();
58 enumBuilder
.CreateType ();
59 bool hasElementType
= enumBuilder
.HasElementType
;
63 [ExpectedException (typeof(InvalidOperationException
))]
64 public void TestDefineLiteralTypeComplete ()
66 EnumBuilder enumBuilder
= GenerateEnum ();
67 Type enumType
= enumBuilder
.CreateType ();
68 // you should not be able to define literal after type
70 FieldBuilder fieldBuilder
= enumBuilder
.DefineLiteral (_fieldName
, _fieldValue
);
74 public void TestDefineLiteralTypeIncomplete ()
76 EnumBuilder enumBuilder
= GenerateEnum ();
77 FieldBuilder fieldBuilder
= enumBuilder
.DefineLiteral (_fieldName
, _fieldValue
);
78 Type enumType
= enumBuilder
.CreateType ();
80 AssertEquals (enumType
, fieldBuilder
.DeclaringType
);
81 AssertEquals (_enumType
, fieldBuilder
.FieldType
);
82 AssertEquals (true, fieldBuilder
.IsPublic
);
83 AssertEquals (true, fieldBuilder
.IsStatic
);
84 AssertEquals (true, fieldBuilder
.IsLiteral
);
85 AssertEquals (_fieldName
, fieldBuilder
.Name
);
89 public void TestEnumType()
91 AssemblyBuilder assemblyBuilder
= GenerateAssembly ();
93 ModuleBuilder modBuilder
= GenerateModule (assemblyBuilder
);
94 EnumBuilder enumBuilder
= GenerateEnum (modBuilder
);
95 enumBuilder
.CreateType ();
97 Type enumType
= assemblyBuilder
.GetType (_enumNamespace
+ "." + _enumName
, true);
99 VerifyType (enumType
);
103 [ExpectedException (typeof(NotSupportedException
))]
104 public void TestEnumBuilderGUIDIncomplete ()
106 EnumBuilder enumBuilder
= GenerateEnum ();
107 Guid guid
= enumBuilder
.GUID
;
111 public void TestEnumBuilderGUIDComplete ()
113 EnumBuilder enumBuilder
= GenerateEnum ();
114 enumBuilder
.CreateType ();
115 Assert (enumBuilder
.GUID
!= Guid
.Empty
);
119 public void TestEnumTypeGUID ()
121 AssemblyBuilder assemblyBuilder
= GenerateAssembly ();
122 ModuleBuilder modBuilder
= GenerateModule (assemblyBuilder
);
123 EnumBuilder enumBuilder
= GenerateEnum (modBuilder
);
124 enumBuilder
.CreateType ();
126 Type enumType
= assemblyBuilder
.GetType (_enumNamespace
+ "." + _enumName
, true);
128 Assert (enumType
.GUID
!= Guid
.Empty
);
129 AssertNull ("type.DeclaringType of toplevel type should be null", enumType
.DeclaringType
);
133 public void TestFieldProperties() {
134 AssemblyBuilder assemblyBuilder
= GenerateAssembly ();
135 ModuleBuilder modBuilder
= GenerateModule (assemblyBuilder
);
136 EnumBuilder enumBuilder
= GenerateEnum (modBuilder
);
137 FieldBuilder fieldBuilder
= GenerateField (enumBuilder
);
138 enumBuilder
.CreateType ();
140 Type enumType
= assemblyBuilder
.GetType (_enumNamespace
+ "." + _enumName
, true);
141 FieldInfo fi
= enumType
.GetField (_fieldName
);
142 Object o
= fi
.GetValue(enumType
);
144 AssertEquals ("Checking the value of the Field to be 1", _fieldValue
, fi
.GetValue (enumType
));
145 AssertEquals ("Checking if the field is a Literal", true, fi
.IsLiteral
);
146 AssertEquals ("Checking if the field is Public", true, fi
.IsPublic
);
147 AssertEquals ("Checking if the field is Static", true, fi
.IsStatic
);
151 public void TestFindInterfaces ()
153 EnumBuilder enumBuilder
= GenerateEnum ();
155 Type
[] interfaces
= enumBuilder
.FindInterfaces (
156 new TypeFilter (MyInterfaceFilter
),
157 "System.Collections.IEnumerable");
158 AssertEquals (0, interfaces
.Length
);
162 [ExpectedException (typeof(NotSupportedException
))]
163 public void TestFindMembersIncomplete ()
165 EnumBuilder enumBuilder
= GenerateEnum ();
166 GenerateField (enumBuilder
);
168 MemberInfo
[] members
= enumBuilder
.FindMembers (
169 MemberTypes
.All
, BindingFlags
.Static
|
170 BindingFlags
.Public
, new MemberFilter (MemberNameFilter
),
175 public void TestFindMembersComplete ()
177 EnumBuilder enumBuilder
= GenerateEnum ();
178 GenerateField (enumBuilder
);
179 enumBuilder
.CreateType ();
181 MemberInfo
[] members
= enumBuilder
.FindMembers (
182 MemberTypes
.Field
, BindingFlags
.Static
|
183 BindingFlags
.Public
, new MemberFilter (MemberNameFilter
),
185 AssertEquals (1, members
.Length
);
187 members
= enumBuilder
.FindMembers (
188 MemberTypes
.Field
, BindingFlags
.Static
|
189 BindingFlags
.Public
, new MemberFilter (MemberNameFilter
),
191 AssertEquals (0, members
.Length
);
195 [ExpectedException (typeof(NotSupportedException
))]
196 public void TestGetConstructorIncomplete ()
198 EnumBuilder enumBuilder
= GenerateEnum ();
199 enumBuilder
.GetConstructor (BindingFlags
.Public
, null,
200 CallingConventions
.Any
, Type
.EmptyTypes
, new ParameterModifier
[0]);
204 public void TestGetConstructorComplete ()
206 EnumBuilder enumBuilder
= GenerateEnum ();
207 enumBuilder
.CreateType ();
208 ConstructorInfo ctor
= enumBuilder
.GetConstructor (
209 BindingFlags
.Public
, null, CallingConventions
.Any
,
210 Type
.EmptyTypes
, new ParameterModifier
[0]);
215 [ExpectedException (typeof(ArgumentNullException
))]
216 public void TestGetConstructorNullTypes ()
218 EnumBuilder enumBuilder
= GenerateEnum ();
219 enumBuilder
.CreateType ();
220 ConstructorInfo ctor
= enumBuilder
.GetConstructor (
221 BindingFlags
.Public
, null, CallingConventions
.Any
,
222 null, new ParameterModifier
[0]);
226 [ExpectedException (typeof(ArgumentNullException
))]
227 public void TestGetConstructorNullElementType ()
229 EnumBuilder enumBuilder
= GenerateEnum ();
230 enumBuilder
.CreateType ();
231 ConstructorInfo ctor
= enumBuilder
.GetConstructor (
232 BindingFlags
.Public
, null, CallingConventions
.Any
,
233 new Type
[] { null }
, new ParameterModifier
[0]);
237 [ExpectedException (typeof(NotSupportedException
))]
238 public void TestGetConstructorsIncomplete ()
240 EnumBuilder enumBuilder
= GenerateEnum ();
242 ConstructorInfo
[] ctors
= enumBuilder
.GetConstructors (
243 BindingFlags
.Instance
| BindingFlags
.Public
);
244 AssertEquals (0, ctors
.Length
);
248 public void TestGetConstructorsComplete ()
250 EnumBuilder enumBuilder
= GenerateEnum ();
251 enumBuilder
.CreateType ();
253 ConstructorInfo
[] ctors
= enumBuilder
.GetConstructors (
254 BindingFlags
.Instance
| BindingFlags
.Public
);
255 AssertEquals (0, ctors
.Length
);
258 private static void VerifyType (Type type
)
260 AssertNotNull ("type.Assembly should not be null", type
.Assembly
);
261 AssertNotNull ("type.AssemblyQualifiedName should not be null", type
.AssemblyQualifiedName
);
262 AssertNotNull ("type.BaseType should not be null", type
.BaseType
);
263 AssertNotNull ("type.FullName should not be null", type
.FullName
);
264 AssertNotNull ("type.Module should not be null", type
.Module
);
265 AssertNotNull ("type.Name should not be null", type
.Name
);
266 AssertNotNull ("type.Namespace should not be null", type
.Namespace
);
267 AssertNotNull ("type.UnderlyingSystemType should not be null", type
.UnderlyingSystemType
);
269 AssertEquals (_moduleName
, type
.Module
.Name
);
270 AssertEquals (_enumNamespace
, type
.Namespace
);
271 AssertEquals (_enumName
, type
.Name
);
272 AssertEquals (typeof(Enum
), type
.BaseType
);
273 AssertEquals (MemberTypes
.TypeInfo
, type
.MemberType
);
274 AssertEquals (typeof(int), Enum
.GetUnderlyingType (type
));
276 AssertEquals ("Comparing the IsArray field", false, type
.IsArray
);
277 AssertEquals ("Comparing the IsAutoClass field", false, type
.IsAutoClass
);
278 AssertEquals ("Comparing the IsAutoLayout field", true, type
.IsAutoLayout
);
279 AssertEquals ("Comparing the IsByRef field", false, type
.IsByRef
);
280 AssertEquals ("Comparing the IsClass field", false, type
.IsClass
);
281 AssertEquals ("Comparing the IsComObject field", false, type
.IsCOMObject
);
282 AssertEquals ("Comparing the IsContextful field", false, type
.IsContextful
);
283 AssertEquals ("Comparing the IsEnum field", true, type
.IsEnum
);
284 AssertEquals ("Comparing the IsExplicitLayout field", false, type
.IsExplicitLayout
);
285 AssertEquals ("Comparing the IsImport field", false, type
.IsImport
);
286 AssertEquals ("Comparing the IsInterface field", false, type
.IsInterface
);
287 AssertEquals ("Comparing the IsLayoutSequential field", false, type
.IsLayoutSequential
);
288 AssertEquals ("Comparing the IsMarshalByRef field", false, type
.IsMarshalByRef
);
289 AssertEquals ("Comparing the IsNestedAssembly field", false, type
.IsNestedAssembly
);
290 AssertEquals ("Comparing the IsNestedFamily field", false, type
.IsNestedFamily
);
291 AssertEquals ("Comparing the IsNestedPublic field", false, type
.IsNestedPublic
);
292 AssertEquals ("Comparing the IsNestedPrivate field", false, type
.IsNestedPrivate
);
293 AssertEquals ("Comparing the IsNotPublic field", false, type
.IsNotPublic
);
294 AssertEquals ("Comparing the IsPrimitive field", false, type
.IsPrimitive
);
295 AssertEquals ("Comparing the IsPointer field", false, type
.IsPointer
);
296 AssertEquals ("Comparing the IsPublic field", true, type
.IsPublic
);
297 AssertEquals ("Comparing the IsSealed field", true, type
.IsSealed
);
298 AssertEquals ("Comparing the IsUnicode field", false, type
.IsUnicodeClass
);
299 AssertEquals ("Comparing the requires special handling field", false, type
.IsSpecialName
);
300 AssertEquals ("Comparing the IsValueType field", true, type
.IsValueType
);
303 public static bool MyInterfaceFilter (Type t
, object filterCriteria
)
305 if (t
.ToString () == filterCriteria
.ToString ())
311 public static bool MemberNameFilter (MemberInfo m
, object filterCriteria
)
313 if (m
.Name
== filterCriteria
.ToString ())
319 private static AssemblyName
GetAssemblyName ()
321 AssemblyName assemblyName
= new AssemblyName ();
322 assemblyName
.Name
= _assemblyName
;
326 private static AssemblyBuilder
GenerateAssembly ()
328 return AppDomain
.CurrentDomain
.DefineDynamicAssembly (
329 GetAssemblyName (), AssemblyBuilderAccess
.RunAndSave
);
332 private static ModuleBuilder
GenerateModule ()
334 AssemblyBuilder assemblyBuilder
= GenerateAssembly ();
335 return assemblyBuilder
.DefineDynamicModule (_moduleName
);
338 private static ModuleBuilder
GenerateModule (AssemblyBuilder assemblyBuilder
)
340 return assemblyBuilder
.DefineDynamicModule (_moduleName
);
343 private static EnumBuilder
GenerateEnum ()
345 ModuleBuilder modBuilder
= GenerateModule ();
346 return modBuilder
.DefineEnum (_enumNamespace
+ "."
347 + _enumName
, TypeAttributes
.Public
, _enumType
);
350 private static EnumBuilder
GenerateEnum (ModuleBuilder modBuilder
)
352 return modBuilder
.DefineEnum (_enumNamespace
+ "."
353 + _enumName
, TypeAttributes
.Public
, _enumType
);
356 private static FieldBuilder
GenerateField ()
358 EnumBuilder enumBuilder
= GenerateEnum ();
359 return enumBuilder
.DefineLiteral (_fieldName
, _fieldValue
);
362 private static FieldBuilder
GenerateField (EnumBuilder enumBuilder
)
364 return enumBuilder
.DefineLiteral (_fieldName
, _fieldValue
);