2 // ActivatorTest.cs - NUnit Test Cases for System.Activator
5 // Nick Drochak <ndrochak@gol.com>
6 // Gert Driesen <drieseng@users.sourceforge.net>
7 // Sebastien Pouliot <sebastien@ximian.com>
9 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
13 using System.Globalization;
15 using System.Reflection;
17 using System.Reflection.Emit;
19 using System.Runtime.InteropServices;
20 using System.Runtime.Remoting;
21 using System.Runtime.Remoting.Channels;
22 using System.Security;
23 using System.Security.Permissions;
25 using NUnit.Framework;
27 // The class in this namespace is used by the main test class
28 namespace MonoTests.System.ActivatorTestInternal {
30 // We need a COM class to test the Activator class
32 public class COMTest : MarshalByRefObject {
35 public bool constructorFlag = false;
42 public COMTest (int id)
47 // This property is visible
56 public class NonCOMTest : COMTest {
60 namespace MonoTests.System {
62 using MonoTests.System.ActivatorTestInternal;
64 class CustomUserType : Type
66 public override Assembly Assembly
68 get { throw new NotImplementedException (); }
71 public override string AssemblyQualifiedName
73 get { throw new NotImplementedException (); }
76 public override Type BaseType
78 get { throw new NotImplementedException (); }
81 public override string FullName
83 get { throw new NotImplementedException (); }
86 public override Guid GUID
88 get { throw new NotImplementedException (); }
91 protected override TypeAttributes GetAttributeFlagsImpl ()
93 throw new NotImplementedException ();
96 protected override ConstructorInfo GetConstructorImpl (BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
98 throw new NotImplementedException ();
101 public override ConstructorInfo[] GetConstructors (BindingFlags bindingAttr)
103 throw new NotImplementedException ();
106 public override Type GetElementType ()
108 throw new NotImplementedException ();
111 public override EventInfo GetEvent (string name, BindingFlags bindingAttr)
113 throw new NotImplementedException ();
116 public override EventInfo[] GetEvents (BindingFlags bindingAttr)
118 throw new NotImplementedException ();
121 public override FieldInfo GetField (string name, BindingFlags bindingAttr)
123 throw new NotImplementedException ();
126 public override FieldInfo[] GetFields (BindingFlags bindingAttr)
128 throw new NotImplementedException ();
131 public override Type GetInterface (string name, bool ignoreCase)
133 throw new NotImplementedException ();
136 public override Type[] GetInterfaces ()
138 throw new NotImplementedException ();
141 public override MemberInfo[] GetMembers (BindingFlags bindingAttr)
143 throw new NotImplementedException ();
146 protected override MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
148 throw new NotImplementedException ();
151 public override MethodInfo[] GetMethods (BindingFlags bindingAttr)
153 throw new NotImplementedException ();
156 public override Type GetNestedType (string name, BindingFlags bindingAttr)
158 throw new NotImplementedException ();
161 public override Type[] GetNestedTypes (BindingFlags bindingAttr)
163 throw new NotImplementedException ();
166 public override PropertyInfo[] GetProperties (BindingFlags bindingAttr)
168 throw new NotImplementedException ();
171 protected override PropertyInfo GetPropertyImpl (string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers)
173 throw new NotImplementedException ();
176 protected override bool HasElementTypeImpl ()
178 throw new NotImplementedException ();
181 public override object InvokeMember (string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters)
183 throw new NotImplementedException ();
186 protected override bool IsArrayImpl ()
188 throw new NotImplementedException ();
191 protected override bool IsByRefImpl ()
193 throw new NotImplementedException ();
196 protected override bool IsCOMObjectImpl ()
198 throw new NotImplementedException ();
201 protected override bool IsPointerImpl ()
203 throw new NotImplementedException ();
206 protected override bool IsPrimitiveImpl ()
208 throw new NotImplementedException ();
211 public override Module Module
213 get { throw new NotImplementedException (); }
216 public override string Namespace
218 get { throw new NotImplementedException (); }
221 public override Type UnderlyingSystemType
228 public override object[] GetCustomAttributes (Type attributeType, bool inherit)
230 throw new NotImplementedException ();
233 public override object[] GetCustomAttributes (bool inherit)
235 throw new NotImplementedException ();
238 public override bool IsDefined (Type attributeType, bool inherit)
240 throw new NotImplementedException ();
243 public override string Name
245 get { throw new NotImplementedException (); }
251 public class ActivatorTest {
253 private string testLocation = typeof (ActivatorTest).Assembly.Location;
256 public void CreateInstance_Type()
258 COMTest objCOMTest = (COMTest) Activator.CreateInstance (typeof (COMTest));
259 Assert.AreEqual ("MonoTests.System.ActivatorTestInternal.COMTest", (objCOMTest.GetType ()).ToString (), "#A02");
263 [ExpectedException (typeof (ArgumentNullException))]
264 public void CreateInstance_TypeNull ()
266 Activator.CreateInstance ((Type)null);
270 [ExpectedException (typeof (ArgumentException))]
271 public void CreateInstance_CustomType ()
273 Activator.CreateInstance (new CustomUserType ());
277 public void CreateInstance_StringString ()
279 ObjectHandle objHandle = Activator.CreateInstance (null, "MonoTests.System.ActivatorTestInternal.COMTest");
280 COMTest objCOMTest = (COMTest)objHandle.Unwrap ();
282 Assert.AreEqual (2, objCOMTest.Id, "#A03");
286 [ExpectedException (typeof (ArgumentNullException))]
287 public void CreateInstance_StringNull ()
289 Activator.CreateInstance ((string)null, null);
293 [ExpectedException (typeof (TypeLoadException))]
294 public void CreateInstance_StringTypeNameDoesNotExists ()
296 Activator.CreateInstance ((string)null, "MonoTests.System.ActivatorTestInternal.DoesntExistsCOMTest");
300 public void CreateInstance_TypeBool ()
302 COMTest objCOMTest = (COMTest)Activator.CreateInstance (typeof (COMTest), false);
303 Assert.AreEqual ("MonoTests.System.ActivatorTestInternal.COMTest", objCOMTest.GetType ().ToString (), "#A04");
307 public void CreateInstance_TypeObjectArray ()
309 object[] objArray = new object[1] { 7 };
310 COMTest objCOMTest = (COMTest)Activator.CreateInstance (typeof (COMTest), objArray);
311 Assert.AreEqual (7, objCOMTest.Id, "#A05");
316 [ExpectedException (typeof (MissingMethodException))]
317 public void CreateInstance_TypeBuilder ()
319 Type tb = typeof (TypeBuilder); // no public ctor - but why is it documented as NotSupportedException ?
320 ConstructorInfo[] ctors = tb.GetConstructors (BindingFlags.Instance | BindingFlags.NonPublic);
321 Activator.CreateInstance (tb, new object [ctors [0].GetParameters ().Length]);
325 [ExpectedException (typeof (NotSupportedException))]
326 public void CreateInstance_TypedReference ()
328 Activator.CreateInstance (typeof (TypedReference), null);
332 [ExpectedException (typeof (NotSupportedException))]
333 public void CreateInstance_ArgIterator ()
335 Activator.CreateInstance (typeof (ArgIterator), null);
340 [ExpectedException (typeof (NotSupportedException))]
341 public void CreateInstance_Void ()
343 Activator.CreateInstance (typeof (void), null);
347 [ExpectedException (typeof (NotSupportedException))]
348 public void CreateInstance_RuntimeArgumentHandle ()
350 Activator.CreateInstance (typeof (RuntimeArgumentHandle), null);
354 [ExpectedException (typeof (NotSupportedException))]
355 public void CreateInstance_NotMarshalByReferenceWithActivationAttributes ()
357 Activator.CreateInstance (typeof (object), null, new object[1] { null });
360 // TODO: Implemente the test methods for all the overriden functions using activationAttribute
363 [ExpectedException(typeof(MissingMethodException))]
364 public void CreateInstanceAbstract1 ()
366 Activator.CreateInstance (typeof (Type));
370 [ExpectedException(typeof(MissingMethodException))]
371 public void CreateInstanceAbstract2 ()
373 Activator.CreateInstance (typeof (Type), true);
377 [ExpectedException(typeof(MissingMethodException))]
378 public void CreateInstanceAbstract3 ()
380 Activator.CreateInstance (typeof (Type), null, null);
384 [ExpectedException(typeof(MissingMethodException))]
385 public void CreateInstanceAbstract4()
387 Activator.CreateInstance (typeof (Type), BindingFlags.CreateInstance | (BindingFlags.Public | BindingFlags.Instance), null, null, CultureInfo.InvariantCulture, null);
391 [ExpectedException (typeof (MissingMethodException))]
392 public void CreateInstanceAbstract5 ()
394 Activator.CreateInstance (typeof (Type), BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, null, CultureInfo.InvariantCulture, null);
398 public void CreateInstance_Nullable ()
400 Assert.AreEqual (5, Activator.CreateInstance (typeof (Nullable<int>), new object [] { 5 }));
401 Assert.AreEqual (typeof (int), Activator.CreateInstance (typeof (Nullable<int>), new object [] { 5 }).GetType ());
402 Assert.AreEqual (0, Activator.CreateInstance (typeof (Nullable<int>), new object [] { null }));
403 Assert.AreEqual (typeof (int), Activator.CreateInstance (typeof (Nullable<int>), new object [] { null }).GetType ());
404 Assert.AreEqual (null, Activator.CreateInstance (typeof (Nullable<int>)));
408 [ExpectedException (typeof (ArgumentNullException))]
409 public void GetObject_TypeNull ()
411 Activator.GetObject (null, "tcp://localhost:1234/COMTestUri");
415 [ExpectedException (typeof (ArgumentNullException))]
416 public void GetObject_UrlNull ()
418 Activator.GetObject (typeof (COMTest), null);
422 // TODO: Implemente the test methods for all the overriden function using activationAttribute
425 public void CreateInstanceFrom ()
427 ObjectHandle objHandle = Activator.CreateInstanceFrom (testLocation, "MonoTests.System.ActivatorTestInternal.COMTest");
428 Assert.IsNotNull (objHandle, "#A09");
430 // TODO: Implement the test methods for all the overriden function using activationAttribute
435 // note: this only ensure that the ECMA key support unification (more test required, outside corlib, for other keys, like MS final).
436 private const string CorlibPermissionPattern = "System.Security.Permissions.FileDialogPermission, mscorlib, Version={0}, Culture=neutral, PublicKeyToken=b77a5c561934e089";
437 private const string SystemPermissionPattern = "System.Net.DnsPermission, System, Version={0}, Culture=neutral, PublicKeyToken=b77a5c561934e089";
438 private const string fx10version = "1.0.3300.0";
439 private const string fx11version = "1.0.5000.0";
440 private const string fx20version = "2.0.0.0";
442 private static object[] psNone = new object [1] { PermissionState.None };
444 private void Unification (string fullname)
446 Type t = Type.GetType (fullname);
447 IPermission p = (IPermission)Activator.CreateInstance (t, psNone);
448 string currentVersion = typeof (string).Assembly.GetName ().Version.ToString ();
449 Assert.IsTrue ((p.ToString ().IndexOf (currentVersion) > 0), currentVersion);
453 public void Unification_FromFx10 ()
455 Unification (String.Format (CorlibPermissionPattern, fx10version));
456 Unification (String.Format (SystemPermissionPattern, fx10version));
460 public void Unification_FromFx11 ()
462 Unification (String.Format (CorlibPermissionPattern, fx11version));
463 Unification (String.Format (SystemPermissionPattern, fx11version));
467 public void Unification_FromFx20 ()
469 Unification (String.Format (CorlibPermissionPattern, fx20version));
470 Unification (String.Format (SystemPermissionPattern, fx20version));
474 public void Unification_FromFx99_Corlib ()
476 Unification (String.Format (CorlibPermissionPattern, "9.99.999.9999"));
480 [Category ("NotWorking")]
481 public void Unification_FromFx99_System ()
483 Assert.IsNull (Type.GetType (String.Format (SystemPermissionPattern, "9.99.999.9999")));
487 class foo1<T> : foo2<T, int> {}
489 [Test, ExpectedException (typeof (ArgumentException))]
490 public void GenericType_Open1 ()
492 Activator.CreateInstance (typeof (foo2<,>));
494 [Test, ExpectedException (typeof (ArgumentException))]
495 public void GenericType_Open2 ()
497 Activator.CreateInstance (typeof (foo1<>));
500 public void GenericTypes_Closed ()
502 Assert.IsNotNull (Activator.CreateInstance (typeof (foo1<int>)), "foo1<int>");
503 Assert.IsNotNull (Activator.CreateInstance (typeof (foo2<long, int>)), "foo2<long, int>");
507 public void CreateInstanceCrossDomain ()
509 Activator.CreateInstance (AppDomain.CurrentDomain, "mscorlib.dll", "System.Object");
510 Activator.CreateInstance (AppDomain.CurrentDomain, "mscorlib.dll", "System.Object", false,
511 BindingFlags.Public | BindingFlags.Instance, null, null, CultureInfo.InvariantCulture,
517 public void CreateInstanceCustomDomain ()
519 // FIXME: below works as a standalone case, but does not as a unit test (causes JIT error).
520 Activator.CreateInstance (AppDomain.CreateDomain ("foo"), "mscorlib.dll", "System.Object", false,
521 BindingFlags.Public | BindingFlags.Instance, null, null, null,
526 public void CreateInstanceCrossDomainNonSerializableArgs ()
528 // I'm not sure why this is possible ...
529 Activator.CreateInstance (AppDomain.CurrentDomain, "mscorlib.dll", "System.WeakReference", false,
530 BindingFlags.Public | BindingFlags.Instance, null, new object [] {ModuleHandle.EmptyHandle}, null, null, null);
534 [ExpectedException (typeof (NotSupportedException))]
535 public void CreateInstanceNonSerializableAtts ()
537 // even on invalid success it causes different exception though.
538 Activator.CreateInstance ("mscorlib.dll", "System.Object", false,
539 BindingFlags.Public | BindingFlags.Instance, null, null, null,
540 new object [] {ModuleHandle.EmptyHandle}, null);
544 [ExpectedException (typeof (NotSupportedException))]
545 public void CreateInstanceCrossDomainNonSerializableAtts ()
547 // even on invalid success it causes different exception though.
548 Activator.CreateInstance (AppDomain.CurrentDomain, "mscorlib.dll", "System.Object", false,
549 BindingFlags.Public | BindingFlags.Instance, null, null, null,
550 new object [] {ModuleHandle.EmptyHandle}, null);
553 public class ParamsConstructor {
559 public ParamsConstructor (int a, params string [] s)
563 Assert.IsNotNull (s);
578 public void CreateInstanceParamsConstructor ()
580 var a = (ParamsConstructor) Activator.CreateInstance (
581 typeof (ParamsConstructor), new object [] { 42, "foo", "bar" });
583 Assert.AreEqual (42, a.A);
584 Assert.AreEqual ("foo", a.X);
585 Assert.AreEqual ("bar", a.Y);
587 a = (ParamsConstructor) Activator.CreateInstance (
588 typeof (ParamsConstructor), new object [] { 42, "foo" });
590 Assert.AreEqual (42, a.A);
591 Assert.AreEqual ("foo", a.X);
592 Assert.AreEqual (null, a.Y);
594 a = (ParamsConstructor) Activator.CreateInstance (
595 typeof (ParamsConstructor), new object [] { 42 });
597 Assert.AreEqual (42, a.A);
598 Assert.AreEqual (null, a.X);
599 Assert.AreEqual (null, a.Y);
601 var b = Activator.CreateInstance (typeof (SimpleParamsObjectConstructor), 1, 2, 3, 4, 5);
602 Assert.IsNotNull (b);
605 class SimpleParamsObjectConstructor
607 public SimpleParamsObjectConstructor (params object[] parameters)
612 class SimpleParamsConstructor {
617 public SimpleParamsConstructor (params string [] s)
619 Assert.IsNotNull (s);
634 public void CreateInstanceSimpleParamsConstructor ()
636 var a = (SimpleParamsConstructor) Activator.CreateInstance (
637 typeof (SimpleParamsConstructor), new object [] { "foo", "bar" });
639 Assert.AreEqual ("foo", a.X);
640 Assert.AreEqual ("bar", a.Y);
642 a = (SimpleParamsConstructor) Activator.CreateInstance (
643 typeof (SimpleParamsConstructor), new object [0]);
645 Assert.AreEqual (null, a.X);
646 Assert.AreEqual (null, a.Y);
649 class ParamsConstructorWithObjectConversion
651 public ParamsConstructorWithObjectConversion (params int[] x)
657 public void CreateInstanceParamsConstructorWithObjectConversion ()
659 var a = Activator.CreateInstance (typeof(ParamsConstructorWithObjectConversion), new object[] { (object) 2 });
660 Assert.IsNotNull (a);