2 // Copyright (c) 2007 Novell, Inc.
\r
5 // Rolf Bjarne Kvinge (RKvinge@novell.com)
\r
11 using NUnit.Framework;
\r
12 using System.Windows.Forms;
\r
13 using System.ComponentModel;
\r
14 using System.Drawing;
\r
15 using System.Collections;
\r
16 using System.Reflection;
\r
17 using System.Reflection.Emit;
\r
19 namespace MonoTests.System.Windows.Forms
\r
23 private ArrayList log;
\r
24 private object instance;
\r
26 // Tests if all the names in Names are in log with the order given in Names.
\r
27 public bool ContainsEventsOrdered (params string [] Names)
\r
29 if (Names.Length == 0)
\r
33 for (int i = 0; i < log.Count; i++) {
\r
34 if ((string) log [i] == Names [n]) {
\r
36 if (n == Names.Length)
\r
41 if (n == Names.Length) {
\r
44 Console.WriteLine ("ContainsEventsOrdered: logged events '" + EventsJoined () + "' didn't match correct events '" + string.Join (";", Names) + "'");
\r
49 public bool EventRaised (string Name)
\r
51 return log.Contains (Name);
\r
54 public int EventsRaised {
\r
60 public string EventsJoined ()
\r
62 return EventsJoined (";");
\r
65 public string EventsJoined (string separator)
\r
67 return string.Join (";", ToArray ());
\r
70 public void Clear ()
\r
75 public string [] ToArray ()
\r
77 string [] result = new string [log.Count];
\r
78 log.CopyTo (result);
\r
82 public EventLogger (object item)
\r
85 throw new ArgumentNullException ("item");
\r
88 log = new ArrayList ();
\r
90 Type itemType = item.GetType ();
\r
91 AssemblyName name = new AssemblyName ();
\r
92 name.Name = "EventLoggerAssembly";
\r
93 AssemblyBuilder assembly = AppDomain.CurrentDomain.DefineDynamicAssembly (name, AssemblyBuilderAccess.RunAndSave);
\r
94 ModuleBuilder module = assembly.DefineDynamicModule ("EventLoggerAssembly", "EventLoggerAssembly.dll");
\r
96 Type ListType = typeof (ArrayList);
\r
98 TypeBuilder logType = module.DefineType ("Logger");
\r
99 FieldBuilder logField = logType.DefineField ("log", ListType, FieldAttributes.Public);
\r
100 ConstructorBuilder logCtor = logType.DefineConstructor (MethodAttributes.Public, CallingConventions.HasThis, new Type [] {ListType, typeof (object)});
\r
101 logCtor.DefineParameter (1, ParameterAttributes.None, "test");
\r
102 logCtor.DefineParameter (2, ParameterAttributes.None, "obj");
\r
103 ILGenerator logIL = logCtor.GetILGenerator ();
\r
104 logIL.Emit (OpCodes.Ldarg_0);
\r
105 logIL.Emit (OpCodes.Ldarg_1);
\r
106 logIL.Emit (OpCodes.Stfld, logField);
\r
109 foreach (EventInfo Event in itemType.GetEvents ()) {
\r
112 MethodInfo invoke = Event.EventHandlerType.GetMethod ("Invoke");
\r
113 MethodBuilder method = logType.DefineMethod (Event.Name, MethodAttributes.Public, null, new Type [] { invoke.GetParameters () [0].ParameterType, invoke.GetParameters () [1].ParameterType });
\r
114 method.DefineParameter (1, ParameterAttributes.None, "test");
\r
115 method.DefineParameter (2, ParameterAttributes.None, "test2");
\r
116 il = method.GetILGenerator ();
\r
117 il.Emit (OpCodes.Ldarg_0);
\r
118 il.Emit (OpCodes.Ldfld, logField);
\r
119 il.Emit (OpCodes.Ldstr, Event.Name);
\r
120 il.Emit (OpCodes.Callvirt, ListType.GetMethod ("Add"));
\r
121 il.Emit (OpCodes.Pop);
\r
122 il.Emit (OpCodes.Ret);
\r
124 logIL.Emit (OpCodes.Ldarg_2);
\r
125 logIL.Emit (OpCodes.Ldarg_0);
\r
126 logIL.Emit (OpCodes.Dup);
\r
127 logIL.Emit (OpCodes.Ldvirtftn, method);
\r
128 logIL.Emit (OpCodes.Newobj, Event.EventHandlerType.GetConstructor (new Type [] {typeof(object), typeof(IntPtr)}));
\r
129 logIL.Emit (OpCodes.Call, Event.GetAddMethod ());
\r
132 logIL.Emit (OpCodes.Ret);
\r
133 Type builtLogType = logType.CreateType ();
\r
135 instance = builtLogType.GetConstructors () [0].Invoke (new object [] { log, item });
\r
136 TestHelper.RemoveWarning (instance);
\r
138 //assembly.Save ("EventLoggerAssembly.dll");
\r