--- /dev/null
+//
+// EventBuilder.cs - NUnit Test Cases for the EventBuilder class
+//
+// Zoltan Varga (vargaz@freemail.hu)
+//
+// (C) Ximian, Inc. http://www.ximian.com
+
+using System;
+using System.Threading;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Runtime.CompilerServices;
+
+using NUnit.Framework;
+
+namespace MonoTests.System.Reflection.Emit
+{
+
+[TestFixture]
+public class EventBuilderTest : Assertion
+{
+ public delegate void AnEvent (object o);
+
+ private TypeBuilder tb;
+
+ private ModuleBuilder module;
+
+ private EventBuilder eb;
+
+ private MethodBuilder mb;
+
+ [SetUp]
+ protected void SetUp () {
+ AssemblyName assemblyName = new AssemblyName();
+ assemblyName.Name = GetType().FullName;
+
+ AssemblyBuilder assembly
+ = Thread.GetDomain().DefineDynamicAssembly(
+ assemblyName, AssemblyBuilderAccess.Run);
+
+ module = assembly.DefineDynamicModule("module1");
+
+ tb = module.DefineType("class1",
+ TypeAttributes.Public);
+
+ eb = tb.DefineEvent ("event1", EventAttributes.None, typeof (AnEvent));
+ mb =
+ tb.DefineMethod ("OnAnEvent",
+ MethodAttributes.Public, typeof (void),
+ new Type [] { typeof (AnEvent) });
+ ILGenerator ilgen = mb.GetILGenerator();
+ ilgen.Emit (OpCodes.Ret);
+
+ // These two are required
+ eb.SetAddOnMethod (mb);
+ eb.SetRemoveOnMethod (mb);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentNullException))]
+ public void TestSetAddOnMethod1 () {
+ eb.SetAddOnMethod (null);
+ }
+
+ [Test]
+ [ExpectedException (typeof (InvalidOperationException))]
+ public void TestSetAddOnMethod2 () {
+ tb.CreateType ();
+
+ eb.SetAddOnMethod (mb);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentNullException))]
+ public void TestSetRaiseMethod1 () {
+ eb.SetRaiseMethod (null);
+ }
+
+ [Test]
+ [ExpectedException (typeof (InvalidOperationException))]
+ public void TestSetRaiseMethod2 () {
+ tb.CreateType ();
+
+ eb.SetRaiseMethod (mb);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentNullException))]
+ public void TestSetRemoveAddOnMethod1 () {
+ eb.SetRemoveOnMethod (null);
+ }
+
+ [Test]
+ [ExpectedException (typeof (InvalidOperationException))]
+ public void TestSetRemoveAddOnMethod2 () {
+ tb.CreateType ();
+
+ eb.SetRemoveOnMethod (mb);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentNullException))]
+ public void TestAddOtherMethod1 () {
+ eb.AddOtherMethod (null);
+ }
+
+ [Test]
+ [ExpectedException (typeof (InvalidOperationException))]
+ public void TestAddOtherMethod2 () {
+ tb.CreateType ();
+
+ eb.AddOtherMethod (mb);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentNullException))]
+ public void TestSetCustomAttribute1 () {
+ eb.SetCustomAttribute (null);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentNullException))]
+ public void TestSetCustomAttribute2 () {
+ eb.SetCustomAttribute (null, new byte [1]);
+ }
+
+ [Test]
+ [ExpectedException (typeof (ArgumentNullException))]
+ public void TestSetCustomAttribute3 () {
+ ConstructorInfo con = typeof (String).GetConstructors ()[0];
+ eb.SetCustomAttribute (con, null);
+ }
+
+ [Test]
+ [ExpectedException (typeof (InvalidOperationException))]
+ public void TestSetCustomAttribute4 () {
+ tb.CreateType ();
+
+ byte[] custAttrData = { 1, 0, 0, 0, 0};
+ Type attrType = Type.GetType
+ ("System.Reflection.AssemblyKeyNameAttribute");
+ Type[] paramTypes = new Type[1];
+ paramTypes[0] = typeof(String);
+ ConstructorInfo ctorInfo =
+ attrType.GetConstructor(paramTypes);
+
+ eb.SetCustomAttribute (ctorInfo, custAttrData);
+ }
+
+ [Test]
+ [ExpectedException (typeof (InvalidOperationException))]
+ public void TestSetCustomAttribute5 () {
+ tb.CreateType ();
+
+ eb.SetCustomAttribute (new CustomAttributeBuilder (typeof (MethodImplAttribute).GetConstructor (new Type[1] { typeof (short) }), new object[1] {(short)MethodImplAttributes.Synchronized}));
+ }
+
+ [Test]
+ public void TestCreation () {
+ eb = tb.DefineEvent ("event2", EventAttributes.SpecialName, typeof (AnEvent));
+
+ eb.SetRaiseMethod (mb);
+ eb.SetAddOnMethod (mb);
+ eb.SetRemoveOnMethod (mb);
+ eb.AddOtherMethod (mb);
+ eb.AddOtherMethod (mb);
+
+ Type t = tb.CreateType ();
+
+ MethodInfo mi = t.GetMethod ("OnAnEvent");
+
+ EventInfo[] events = t.GetEvents ();
+ AssertEquals (2, events.Length);
+
+ {
+ EventInfo ev = t.GetEvent ("event1");
+ AssertEquals ("event1", ev.Name);
+ AssertEquals (EventAttributes.None, ev.Attributes);
+ AssertEquals (t, ev.DeclaringType);
+
+ AssertEquals (typeof (AnEvent), ev.EventHandlerType);
+ AssertEquals (true, ev.IsMulticast);
+ AssertEquals (false, ev.IsSpecialName);
+
+ AssertEquals (mi, ev.GetAddMethod ());
+ AssertEquals (null, ev.GetRaiseMethod ());
+ AssertEquals (mi, ev.GetRemoveMethod ());
+ }
+
+ {
+ EventInfo ev = t.GetEvent ("event2");
+ AssertEquals ("event2", ev.Name);
+ AssertEquals (EventAttributes.SpecialName, ev.Attributes);
+ AssertEquals (t, ev.DeclaringType);
+
+ AssertEquals (typeof (AnEvent), ev.EventHandlerType);
+ AssertEquals (true, ev.IsMulticast);
+ AssertEquals (true, ev.IsSpecialName);
+
+ AssertEquals (mi, ev.GetAddMethod ());
+ AssertEquals (mi, ev.GetRaiseMethod ());
+ AssertEquals (mi, ev.GetRemoveMethod ());
+ }
+ }
+
+}
+}