--- /dev/null
+//\r
+// TypeBuilderTest.cs - NUnit Test Cases for the TypeBuilder class\r
+//\r
+// Zoltan Varga (vargaz@freemail.hu)\r
+//\r
+// (C) Ximian, Inc. http://www.ximian.com\r
+\r
+using System;\r
+using System.Threading;\r
+using System.Reflection;\r
+using System.Reflection.Emit;\r
+\r
+using NUnit.Framework;\r
+\r
+namespace MonoTests.System.Reflection.Emit\r
+{\r
+\r
+public class TypeBuilderTest : TestCase\r
+{ \r
+ private AssemblyBuilder assembly;\r
+\r
+ private ModuleBuilder module;\r
+\r
+ static string ASSEMBLY_NAME = "MonoTests.System.Reflection.Emit.TypeBuilderTest";\r
+\r
+ protected override void SetUp () {\r
+ AssemblyName assemblyName = new AssemblyName();\r
+ assemblyName.Name = ASSEMBLY_NAME;\r
+\r
+ assembly = \r
+ Thread.GetDomain().DefineDynamicAssembly(\r
+ assemblyName, AssemblyBuilderAccess.Run);\r
+\r
+ module = assembly.DefineDynamicModule("module1");\r
+ }\r
+\r
+ static int typeIndexer = 0;\r
+\r
+ // Return a unique type name\r
+ private string genTypeName () {\r
+ return "t" + (typeIndexer ++);\r
+ }\r
+\r
+ public void TestAssembly () {\r
+ TypeBuilder tb = module.DefineType (genTypeName (), TypeAttributes.Public);\r
+ AssertEquals ("Assembly works",\r
+ tb.Assembly, assembly);\r
+ }\r
+\r
+ public void TestAssemblyQualifiedName () {\r
+ TypeBuilder tb = module.DefineType ("A.B.C.D", TypeAttributes.Public);\r
+\r
+ AssertEquals ("AssemblyQualifiedName works",\r
+ tb.AssemblyQualifiedName, "A.B.C.D, " + assembly.GetName ().FullName);\r
+ }\r
+\r
+ public void TestAttributes () {\r
+ TypeAttributes attrs = TypeAttributes.Public | TypeAttributes.BeforeFieldInit;\r
+ TypeBuilder tb = module.DefineType (genTypeName (), attrs);\r
+\r
+ AssertEquals ("Attributes works",\r
+ tb.Attributes, attrs);\r
+ }\r
+\r
+ public void TestBaseType () {\r
+ TypeAttributes attrs = TypeAttributes.Public;\r
+ TypeBuilder tb = module.DefineType (genTypeName (), attrs);\r
+ AssertEquals ("BaseType defaults to Object",\r
+ tb.BaseType, typeof (object));\r
+\r
+ TypeBuilder tb2 = module.DefineType (genTypeName (), attrs, tb);\r
+ AssertEquals ("BaseType works",\r
+ tb2.BaseType, tb);\r
+\r
+ /* This does not run under mono\r
+ TypeBuilder tb3 = module.DefineType (genTypeName (),\r
+ TypeAttributes.Interface |\r
+ TypeAttributes.Abstract);\r
+ AssertEquals ("Interfaces default to no base type",\r
+ null, tb3.BaseType);\r
+ */\r
+ }\r
+\r
+ public void TestDeclaringType () {\r
+ TypeAttributes attrs = 0;\r
+ TypeBuilder tb = module.DefineType (genTypeName (), attrs);\r
+\r
+ AssertEquals ("Has no declaring type",\r
+ null, tb.DeclaringType);\r
+\r
+ attrs = TypeAttributes.NestedPublic;\r
+ TypeBuilder tb2 = tb.DefineNestedType (genTypeName (), attrs);\r
+ TypeBuilder tb3 = tb2.DefineNestedType (genTypeName (), attrs);\r
+ AssertEquals ("DeclaringType works",\r
+ tb, tb3.DeclaringType.DeclaringType);\r
+ }\r
+\r
+ public void TestFullName () {\r
+ string name = genTypeName ();\r
+ TypeAttributes attrs = 0;\r
+ TypeBuilder tb = module.DefineType (name, attrs);\r
+ AssertEquals ("FullName works",\r
+ name, tb.FullName);\r
+\r
+ string name2 = genTypeName ();\r
+ attrs = TypeAttributes.NestedPublic;\r
+ TypeBuilder tb2 = tb.DefineNestedType (name2, attrs);\r
+\r
+ string name3 = genTypeName ();\r
+ attrs = TypeAttributes.NestedPublic;\r
+ TypeBuilder tb3 = tb2.DefineNestedType (name3, attrs);\r
+\r
+ AssertEquals ("FullName works on nested types",\r
+ name + "+" + name2 + "+" + name3, tb3.FullName);\r
+ }\r
+\r
+ public void TestGUID () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ try {\r
+ Guid g = tb.GUID;\r
+ Fail ();\r
+ }\r
+ catch (NotSupportedException) {\r
+ }\r
+ }\r
+\r
+ public void TestHasElementType () {\r
+ // According to the MSDN docs, this member works, but in reality, it\r
+ // returns a NotSupportedException\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ try {\r
+ bool b = tb.HasElementType;\r
+ Fail ();\r
+ }\r
+ catch (NotSupportedException) {\r
+ }\r
+ }\r
+\r
+ public void TestIsAbstract () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("",\r
+ false, tb.IsAbstract);\r
+\r
+ TypeBuilder tb2 = module.DefineType (genTypeName (), TypeAttributes.Abstract);\r
+ AssertEquals ("",\r
+ true, tb2.IsAbstract);\r
+ }\r
+\r
+ public void TestIsAnsiClass () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("",\r
+ true, tb.IsAnsiClass);\r
+\r
+ TypeBuilder tb2 = module.DefineType (genTypeName (), TypeAttributes.UnicodeClass);\r
+ AssertEquals ("",\r
+ false, tb2.IsAnsiClass);\r
+ }\r
+\r
+ public void TestIsArray () {\r
+ // How can a TypeBuilder be an array ?\r
+ string name = genTypeName ();\r
+ TypeBuilder tb = module.DefineType (name);\r
+ AssertEquals ("IsArray works",\r
+ false, tb.IsArray);\r
+ }\r
+\r
+ public void TestIsAutoClass () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("",\r
+ false, tb.IsAutoClass);\r
+\r
+ TypeBuilder tb2 = module.DefineType (genTypeName (), TypeAttributes.AutoClass);\r
+ AssertEquals ("",\r
+ true, tb2.IsAutoClass);\r
+ } \r
+\r
+ public void TestIsAutoLayout () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("AutoLayout defaults to true",\r
+ true, tb.IsAutoLayout);\r
+\r
+ TypeBuilder tb2 = module.DefineType (genTypeName (), TypeAttributes.ExplicitLayout);\r
+ AssertEquals ("",\r
+ false, tb2.IsAutoLayout);\r
+ }\r
+\r
+ public void TestIsByRef () {\r
+ // How can a TypeBuilder be ByRef ?\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("IsByRef works",\r
+ false, tb.IsByRef);\r
+ }\r
+\r
+ public void TestIsClass () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("Most types are classes",\r
+ true, tb.IsClass);\r
+\r
+ TypeBuilder tb2 = module.DefineType (genTypeName (), TypeAttributes.Interface | TypeAttributes.Abstract);\r
+ AssertEquals ("Interfaces are not classes",\r
+ false, tb2.IsClass);\r
+\r
+ TypeBuilder tb3 = module.DefineType (genTypeName (), 0, typeof (ValueType));\r
+ AssertEquals ("value types are not classes",\r
+ false, tb3.IsClass);\r
+\r
+ TypeBuilder tb4 = module.DefineType (genTypeName (), 0, typeof (Enum));\r
+ AssertEquals ("enums are not classes",\r
+ false, tb4.IsClass);\r
+ }\r
+\r
+ public void TestIsCOMObject () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("Probably not",\r
+ false, tb.IsCOMObject);\r
+ }\r
+\r
+ public void TestIsContextful () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("",\r
+ false, tb.IsContextful);\r
+\r
+ TypeBuilder tb2 = module.DefineType (genTypeName (), 0, typeof (ContextBoundObject));\r
+ AssertEquals ("",\r
+ true, tb2.IsContextful);\r
+ }\r
+\r
+ public void TestIsEnum () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("",\r
+ false, tb.IsEnum);\r
+\r
+ // This returns true under both mono and MS .NET ???\r
+ TypeBuilder tb2 = module.DefineType (genTypeName (), 0, typeof (ValueType));\r
+ AssertEquals ("value types are not necessary enums",\r
+ false, tb2.IsEnum);\r
+\r
+ TypeBuilder tb3 = module.DefineType (genTypeName (), 0, typeof (Enum));\r
+ AssertEquals ("enums are enums",\r
+ true, tb3.IsEnum);\r
+ }\r
+\r
+ public void TestIsExplicitLayout () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("ExplicitLayout defaults to false",\r
+ false, tb.IsExplicitLayout);\r
+\r
+ TypeBuilder tb2 = module.DefineType (genTypeName (), TypeAttributes.ExplicitLayout);\r
+ AssertEquals ("",\r
+ true, tb2.IsExplicitLayout);\r
+ }\r
+\r
+ public void TestIsImport () {\r
+ // How can this be true ?\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("",\r
+ false, tb.IsImport);\r
+ }\r
+\r
+ public void TestIsInterface () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("Most types are not interfaces",\r
+ false, tb.IsInterface);\r
+\r
+ TypeBuilder tb2 = module.DefineType (genTypeName (), TypeAttributes.Interface | TypeAttributes.Abstract);\r
+ AssertEquals ("Interfaces are interfaces",\r
+ true, tb2.IsInterface);\r
+\r
+ TypeBuilder tb3 = module.DefineType (genTypeName (), 0, typeof (ValueType));\r
+ AssertEquals ("value types are not interfaces",\r
+ false, tb3.IsInterface);\r
+ }\r
+\r
+ public void TestIsLayoutSequential () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("SequentialLayout defaults to false",\r
+ false, tb.IsLayoutSequential);\r
+\r
+ TypeBuilder tb2 = module.DefineType (genTypeName (), TypeAttributes.SequentialLayout);\r
+ AssertEquals ("",\r
+ true, tb2.IsLayoutSequential);\r
+ }\r
+\r
+ public void TestIsMarshalByRef () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("",\r
+ false, tb.IsMarshalByRef);\r
+\r
+ TypeBuilder tb2 = module.DefineType (genTypeName (), 0, typeof (MarshalByRefObject));\r
+ AssertEquals ("",\r
+ true, tb2.IsMarshalByRef);\r
+\r
+ TypeBuilder tb3 = module.DefineType (genTypeName (), 0, typeof (ContextBoundObject));\r
+ AssertEquals ("",\r
+ true, tb3.IsMarshalByRef);\r
+ }\r
+\r
+ // TODO: Visibility properties\r
+\r
+ public void TestIsPointer () {\r
+ // How can this be true?\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("",\r
+ false, tb.IsPointer);\r
+ }\r
+\r
+ public void TestIsPrimitive () {\r
+ TypeBuilder tb = module.DefineType ("int");\r
+ AssertEquals ("",\r
+ false, tb.IsPrimitive);\r
+ }\r
+\r
+ public void IsSealed () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("Sealed defaults to false",\r
+ false, tb.IsSealed);\r
+\r
+ TypeBuilder tb2 = module.DefineType (genTypeName (), TypeAttributes.Sealed);\r
+ AssertEquals ("IsSealed works",\r
+ true, tb2.IsSealed);\r
+ }\r
+\r
+ public void IsSerializable () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("",\r
+ false, tb.IsSerializable);\r
+\r
+ tb.SetCustomAttribute (new CustomAttributeBuilder (typeof (SerializableAttribute).GetConstructors (BindingFlags.Public)[0], null));\r
+ AssertEquals ("",\r
+ true, tb.IsSerializable);\r
+ }\r
+\r
+ public void TestIsSpecialName () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("SpecialName defaults to false",\r
+ false, tb.IsSpecialName);\r
+\r
+ TypeBuilder tb2 = module.DefineType (genTypeName (), TypeAttributes.SpecialName);\r
+ AssertEquals ("IsSpecialName works",\r
+ true, tb2.IsSpecialName);\r
+ }\r
+\r
+ public void TestIsUnicodeClass () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("",\r
+ false, tb.IsUnicodeClass);\r
+\r
+ TypeBuilder tb2 = module.DefineType (genTypeName (), TypeAttributes.UnicodeClass);\r
+ AssertEquals ("",\r
+ true, tb2.IsUnicodeClass);\r
+ }\r
+\r
+ public void TestIsValueType () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("Most types are not value types",\r
+ false, tb.IsValueType);\r
+\r
+ TypeBuilder tb2 = module.DefineType (genTypeName (), TypeAttributes.Interface | TypeAttributes.Abstract);\r
+ AssertEquals ("Interfaces are not value types",\r
+ false, tb2.IsValueType);\r
+\r
+ TypeBuilder tb3 = module.DefineType (genTypeName (), 0, typeof (ValueType));\r
+ AssertEquals ("value types are value types",\r
+ true, tb3.IsValueType);\r
+\r
+ TypeBuilder tb4 = module.DefineType (genTypeName (), 0, typeof (Enum));\r
+ AssertEquals ("enums are value types",\r
+ true, tb4.IsValueType);\r
+ }\r
+\r
+ public void TestMemberType () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("A type is a type",\r
+ MemberTypes.TypeInfo, tb.MemberType);\r
+ }\r
+\r
+ public void TestModule () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("Module works",\r
+ module, tb.Module);\r
+ }\r
+\r
+ public void TestName () {\r
+ TypeBuilder tb = module.DefineType ("A");\r
+ AssertEquals ("",\r
+ "A", tb.Name);\r
+\r
+ TypeBuilder tb2 = module.DefineType ("A.B.C.D.E");\r
+ AssertEquals ("",\r
+ "E", tb2.Name);\r
+\r
+ TypeBuilder tb3 = tb2.DefineNestedType ("A");\r
+ AssertEquals ("",\r
+ "A", tb3.Name);\r
+\r
+ /* Is .E a valid name ?\r
+ TypeBuilder tb4 = module.DefineType (".E");\r
+ AssertEquals ("",\r
+ "E", tb4.Name);\r
+ */\r
+ }\r
+\r
+ public void TestNamespace () {\r
+ TypeBuilder tb = module.DefineType ("A");\r
+ AssertEquals ("",\r
+ "", tb.Namespace);\r
+\r
+ TypeBuilder tb2 = module.DefineType ("A.B.C.D.E");\r
+ AssertEquals ("",\r
+ "A.B.C.D", tb2.Namespace);\r
+\r
+ TypeBuilder tb3 = tb2.DefineNestedType ("A");\r
+ AssertEquals ("",\r
+ "", tb3.Namespace);\r
+\r
+ /* Is .E a valid name ?\r
+ TypeBuilder tb4 = module.DefineType (".E");\r
+ AssertEquals ("",\r
+ "E", tb4.Name);\r
+ */ \r
+ }\r
+\r
+ public void TestPackingSize () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("",\r
+ PackingSize.Unspecified, tb.PackingSize);\r
+\r
+ TypeBuilder tb2 = module.DefineType (genTypeName (), 0, typeof (object),\r
+ PackingSize.Size16, 16);\r
+ AssertEquals ("",\r
+ PackingSize.Size16, tb2.PackingSize);\r
+ }\r
+\r
+ public void TestReflectedType () {\r
+ // It is the same as DeclaringType, but why?\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("",\r
+ null, tb.ReflectedType);\r
+\r
+ TypeBuilder tb2 = tb.DefineNestedType (genTypeName ());\r
+ AssertEquals ("",\r
+ tb, tb2.ReflectedType);\r
+ }\r
+\r
+ public void TestSize () {\r
+ {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("",\r
+ 0, tb.Size);\r
+ tb.CreateType ();\r
+ AssertEquals ("",\r
+ 0, tb.Size);\r
+ }\r
+\r
+ {\r
+ TypeBuilder tb = module.DefineType (genTypeName (), 0, typeof (object),\r
+ PackingSize.Size16, 32);\r
+ AssertEquals ("",\r
+ 32, tb.Size);\r
+ }\r
+ }\r
+\r
+ public void TestTypeHandle () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ try {\r
+ RuntimeTypeHandle handle = tb.TypeHandle;\r
+ Fail ();\r
+ }\r
+ catch (NotSupportedException) {\r
+ }\r
+ }\r
+\r
+ public void TestTypeInitializer () {\r
+ // According to the MSDN docs, this works, but it doesn't\r
+ /* TODO:\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ try {\r
+ ConstructorInfo cb = tb.TypeInitializer;\r
+ Fail ();\r
+ }\r
+ catch (NotSupportedException) {\r
+ }\r
+ */\r
+ }\r
+\r
+ public void TestTypeToken () {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ TypeToken token = tb.TypeToken;\r
+ }\r
+\r
+ public void TestUnderlyingSystemType () {\r
+ //\r
+ // For non-enum types, UnderlyingSystemType should return itself.\r
+ // But if I modify the code to do this, I get an exception in mcs.\r
+ // Reason: the enums created during corlib compilation do not seem\r
+ // to be an enum according to IsEnum.\r
+ //\r
+ /*\r
+ {\r
+ TypeBuilder tb = module.DefineType (genTypeName ());\r
+ AssertEquals ("For non-enums this equals itself",\r
+ tb, tb.UnderlyingSystemType);\r
+ }\r
+ {\r
+ TypeBuilder tb = module.DefineType (genTypeName (), TypeAttributes.Interface | TypeAttributes.Abstract);\r
+ AssertEquals ("",\r
+ tb, tb.UnderlyingSystemType);\r
+ }\r
+ {\r
+ TypeBuilder tb = module.DefineType (genTypeName (), 0, typeof (ValueType));\r
+ AssertEquals ("",\r
+ tb, tb.UnderlyingSystemType);\r
+ }\r
+ */\r
+ {\r
+ TypeBuilder tb = module.DefineType (genTypeName (), 0, typeof (Enum));\r
+ try {\r
+ Type t = tb.UnderlyingSystemType;\r
+ Fail ();\r
+ }\r
+ catch (InvalidOperationException) {\r
+ }\r
+\r
+ tb.DefineField ("val", typeof (int), 0);\r
+ AssertEquals ("",\r
+ typeof (int), tb.UnderlyingSystemType);\r
+ }\r
+ }\r
+}\r
+}\r