2003-02-08 Zoltan Varga <vargaz@freemail.hu>
authorZoltan Varga <vargaz@gmail.com>
Sat, 8 Feb 2003 20:32:25 +0000 (20:32 -0000)
committerZoltan Varga <vargaz@gmail.com>
Sat, 8 Feb 2003 20:32:25 +0000 (20:32 -0000)
* TypeBuilderTest.cs: New file.

svn path=/trunk/mcs/; revision=11364

mcs/class/corlib/Test/System.Reflection.Emit/ChangeLog
mcs/class/corlib/Test/System.Reflection.Emit/TypeBuilderTest.cs [new file with mode: 0644]

index b265f1ac947f2b634aa033db7b175e5d70aed557..b5ee43b35a66fe44e9079f0d40a1a97e27781132 100644 (file)
@@ -1,3 +1,5 @@
 2003-02-08  Zoltan Varga  <vargaz@freemail.hu>
 
+       * TypeBuilderTest.cs: New file.
+
        * MethodBuilderTest.cs ChangeLog: New files.
diff --git a/mcs/class/corlib/Test/System.Reflection.Emit/TypeBuilderTest.cs b/mcs/class/corlib/Test/System.Reflection.Emit/TypeBuilderTest.cs
new file mode 100644 (file)
index 0000000..0189350
--- /dev/null
@@ -0,0 +1,530 @@
+//\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