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;
16 #if !TARGET_JVM && !MONOTOUCH // Reflection.Emit not supported for TARGET_JVM
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");
314 #if !TARGET_JVM && !MONOTOUCH // Reflection.Emit not supported for TARGET_JVM
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);
346 #if !TARGET_JVM // RuntimeArgumentHandle not supported for TARGET_JVM
348 [ExpectedException (typeof (NotSupportedException))]
349 public void CreateInstance_RuntimeArgumentHandle ()
351 Activator.CreateInstance (typeof (RuntimeArgumentHandle), null);
356 [ExpectedException (typeof (NotSupportedException))]
357 public void CreateInstance_NotMarshalByReferenceWithActivationAttributes ()
359 Activator.CreateInstance (typeof (object), null, new object[1] { null });
362 // TODO: Implemente the test methods for all the overriden functions using activationAttribute
365 [ExpectedException(typeof(MissingMethodException))]
366 public void CreateInstanceAbstract1 ()
368 Activator.CreateInstance (typeof (Type));
372 [ExpectedException(typeof(MissingMethodException))]
373 [Category ("TargetJvmNotWorking")]
374 public void CreateInstanceAbstract2 ()
376 Activator.CreateInstance (typeof (Type), true);
380 [ExpectedException(typeof(MissingMethodException))]
381 public void CreateInstanceAbstract3 ()
383 Activator.CreateInstance (typeof (Type), null, null);
387 [ExpectedException(typeof(MissingMethodException))]
388 public void CreateInstanceAbstract4()
390 Activator.CreateInstance (typeof (Type), BindingFlags.CreateInstance | (BindingFlags.Public | BindingFlags.Instance), null, null, CultureInfo.InvariantCulture, null);
394 [ExpectedException (typeof (MissingMethodException))]
395 [Category ("TargetJvmNotWorking")]
396 public void CreateInstanceAbstract5 ()
398 Activator.CreateInstance (typeof (Type), BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, null, CultureInfo.InvariantCulture, null);
402 [Category ("TargetJvmNotWorking")]
403 public void CreateInstance_Nullable ()
405 Assert.AreEqual (5, Activator.CreateInstance (typeof (Nullable<int>), new object [] { 5 }));
406 Assert.AreEqual (typeof (int), Activator.CreateInstance (typeof (Nullable<int>), new object [] { 5 }).GetType ());
407 Assert.AreEqual (0, Activator.CreateInstance (typeof (Nullable<int>), new object [] { null }));
408 Assert.AreEqual (typeof (int), Activator.CreateInstance (typeof (Nullable<int>), new object [] { null }).GetType ());
409 Assert.AreEqual (null, Activator.CreateInstance (typeof (Nullable<int>)));
413 [ExpectedException (typeof (ArgumentNullException))]
414 public void GetObject_TypeNull ()
416 Activator.GetObject (null, "tcp://localhost:1234/COMTestUri");
421 [ExpectedException (typeof (ArgumentNullException))]
422 [Category ("TargetJvmNotWorking")]
423 public void GetObject_UrlNull ()
425 Activator.GetObject (typeof (COMTest), null);
429 /* This test is now executed in System.Runtime.Remoting unit tests
431 public void GetObject ()
433 // This will provide a COMTest object on tcp://localhost:1234/COMTestUri
434 COMTest objCOMTest = new COMTest (8);
435 TcpChannel chnServer = new TcpChannel (1234);
436 ChannelServices.RegisterChannel (chnServer);
437 RemotingServices.SetObjectUriForMarshal (objCOMTest, "COMTestUri");
438 RemotingServices.Marshal (objCOMTest);
440 // This will get the remoting object
441 object objRem = Activator.GetObject (typeof (COMTest), "tcp://localhost:1234/COMTestUri");
442 Assert.IsNotNull (objRem, "#A07");
443 COMTest remCOMTest = (COMTest) objRem;
444 Assert.AreEqual (8, remCOMTest.Id, "#A08");
446 ChannelServices.UnregisterChannel(chnServer);
449 // TODO: Implemente the test methods for all the overriden function using activationAttribute
452 public void CreateInstanceFrom ()
454 ObjectHandle objHandle = Activator.CreateInstanceFrom (testLocation, "MonoTests.System.ActivatorTestInternal.COMTest");
455 Assert.IsNotNull (objHandle, "#A09");
457 // TODO: Implement the test methods for all the overriden function using activationAttribute
462 // note: this only ensure that the ECMA key support unification (more test required, outside corlib, for other keys, like MS final).
463 private const string CorlibPermissionPattern = "System.Security.Permissions.FileDialogPermission, mscorlib, Version={0}, Culture=neutral, PublicKeyToken=b77a5c561934e089";
464 private const string SystemPermissionPattern = "System.Net.DnsPermission, System, Version={0}, Culture=neutral, PublicKeyToken=b77a5c561934e089";
465 private const string fx10version = "1.0.3300.0";
466 private const string fx11version = "1.0.5000.0";
467 private const string fx20version = "2.0.0.0";
469 private static object[] psNone = new object [1] { PermissionState.None };
471 private void Unification (string fullname)
473 Type t = Type.GetType (fullname);
474 IPermission p = (IPermission)Activator.CreateInstance (t, psNone);
475 string currentVersion = typeof (string).Assembly.GetName ().Version.ToString ();
476 Assert.IsTrue ((p.ToString ().IndexOf (currentVersion) > 0), currentVersion);
480 [Category ("TargetJvmNotSupported")] // No support under TARGET_JVM for assemlies versioning
481 public void Unification_FromFx10 ()
483 Unification (String.Format (CorlibPermissionPattern, fx10version));
484 Unification (String.Format (SystemPermissionPattern, fx10version));
488 [Category ("TargetJvmNotSupported")] // No support under TARGET_JVM for assemlies versioning
489 public void Unification_FromFx11 ()
491 Unification (String.Format (CorlibPermissionPattern, fx11version));
492 Unification (String.Format (SystemPermissionPattern, fx11version));
496 [Category ("TargetJvmNotSupported")] // No support under TARGET_JVM for assemlies versioning
497 public void Unification_FromFx20 ()
499 Unification (String.Format (CorlibPermissionPattern, fx20version));
500 Unification (String.Format (SystemPermissionPattern, fx20version));
504 [Category ("TargetJvmNotSupported")] // No support under TARGET_JVM for assemlies versioning
505 public void Unification_FromFx99_Corlib ()
507 Unification (String.Format (CorlibPermissionPattern, "9.99.999.9999"));
511 [Category ("TargetJvmNotSupported")] // No support under TARGET_JVM for assemlies versioning
512 [Category ("NotWorking")]
513 public void Unification_FromFx99_System ()
515 Assert.IsNull (Type.GetType (String.Format (SystemPermissionPattern, "9.99.999.9999")));
519 class foo1<T> : foo2<T, int> {}
521 [Test, ExpectedException (typeof (ArgumentException))]
522 public void GenericType_Open1 ()
524 Activator.CreateInstance (typeof (foo2<,>));
526 [Test, ExpectedException (typeof (ArgumentException))]
527 public void GenericType_Open2 ()
529 Activator.CreateInstance (typeof (foo1<>));
532 public void GenericTypes_Closed ()
534 Assert.IsNotNull (Activator.CreateInstance (typeof (foo1<int>)), "foo1<int>");
535 Assert.IsNotNull (Activator.CreateInstance (typeof (foo2<long, int>)), "foo2<long, int>");
539 public void CreateInstanceCrossDomain ()
541 Activator.CreateInstance (AppDomain.CurrentDomain, "mscorlib.dll", "System.Object");
542 Activator.CreateInstance (AppDomain.CurrentDomain, "mscorlib.dll", "System.Object", false,
543 BindingFlags.Public | BindingFlags.Instance, null, null, CultureInfo.InvariantCulture,
549 public void CreateInstanceCustomDomain ()
551 // FIXME: below works as a standalone case, but does not as a unit test (causes JIT error).
552 Activator.CreateInstance (AppDomain.CreateDomain ("foo"), "mscorlib.dll", "System.Object", false,
553 BindingFlags.Public | BindingFlags.Instance, null, null, null,
558 public void CreateInstanceCrossDomainNonSerializableArgs ()
560 // I'm not sure why this is possible ...
561 Activator.CreateInstance (AppDomain.CurrentDomain, "mscorlib.dll", "System.WeakReference", false,
562 BindingFlags.Public | BindingFlags.Instance, null, new object [] {ModuleHandle.EmptyHandle}, null, null, null);
566 [ExpectedException (typeof (NotSupportedException))]
567 public void CreateInstanceNonSerializableAtts ()
569 // even on invalid success it causes different exception though.
570 Activator.CreateInstance ("mscorlib.dll", "System.Object", false,
571 BindingFlags.Public | BindingFlags.Instance, null, null, null,
572 new object [] {ModuleHandle.EmptyHandle}, null);
576 [ExpectedException (typeof (NotSupportedException))]
577 public void CreateInstanceCrossDomainNonSerializableAtts ()
579 // even on invalid success it causes different exception though.
580 Activator.CreateInstance (AppDomain.CurrentDomain, "mscorlib.dll", "System.Object", false,
581 BindingFlags.Public | BindingFlags.Instance, null, null, null,
582 new object [] {ModuleHandle.EmptyHandle}, null);
585 public class ParamsConstructor {
591 public ParamsConstructor (int a, params string [] s)
595 Assert.IsNotNull (s);
610 public void CreateInstanceParamsConstructor ()
612 var a = (ParamsConstructor) Activator.CreateInstance (
613 typeof (ParamsConstructor), new object [] { 42, "foo", "bar" });
615 Assert.AreEqual (42, a.A);
616 Assert.AreEqual ("foo", a.X);
617 Assert.AreEqual ("bar", a.Y);
619 a = (ParamsConstructor) Activator.CreateInstance (
620 typeof (ParamsConstructor), new object [] { 42, "foo" });
622 Assert.AreEqual (42, a.A);
623 Assert.AreEqual ("foo", a.X);
624 Assert.AreEqual (null, a.Y);
626 a = (ParamsConstructor) Activator.CreateInstance (
627 typeof (ParamsConstructor), new object [] { 42 });
629 Assert.AreEqual (42, a.A);
630 Assert.AreEqual (null, a.X);
631 Assert.AreEqual (null, a.Y);
634 class SimpleParamsConstructor {
639 public SimpleParamsConstructor (params string [] s)
641 Assert.IsNotNull (s);
656 public void CreateInstanceSimpleParamsConstructor ()
658 var a = (SimpleParamsConstructor) Activator.CreateInstance (
659 typeof (SimpleParamsConstructor), new object [] { "foo", "bar" });
661 Assert.AreEqual ("foo", a.X);
662 Assert.AreEqual ("bar", a.Y);
664 a = (SimpleParamsConstructor) Activator.CreateInstance (
665 typeof (SimpleParamsConstructor), new object [0]);
667 Assert.AreEqual (null, a.X);
668 Assert.AreEqual (null, a.Y);