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 int CountEvents (string Name)
\r
52 foreach (string str in log) {
\r
53 if (Name.Equals (str, StringComparison.Ordinal)) {
\r
60 public bool EventRaised (string Name)
\r
62 return log.Contains (Name);
\r
65 public int EventsRaised {
\r
71 public string EventsJoined ()
\r
73 return EventsJoined (";");
\r
76 public string EventsJoined (string separator)
\r
78 return string.Join (";", ToArray ());
\r
81 public void Clear ()
\r
86 public string [] ToArray ()
\r
88 string [] result = new string [log.Count];
\r
89 log.CopyTo (result);
\r
93 public EventLogger (object item)
\r
96 throw new ArgumentNullException ("item");
\r
99 log = new ArrayList ();
\r
101 Type itemType = item.GetType ();
\r
102 AssemblyName name = new AssemblyName ();
\r
103 name.Name = "EventLoggerAssembly";
\r
104 AssemblyBuilder assembly = AppDomain.CurrentDomain.DefineDynamicAssembly (name, AssemblyBuilderAccess.RunAndSave);
\r
105 ModuleBuilder module = assembly.DefineDynamicModule ("EventLoggerAssembly", "EventLoggerAssembly.dll");
\r
107 Type ListType = typeof (ArrayList);
\r
109 TypeBuilder logType = module.DefineType ("Logger");
\r
110 FieldBuilder logField = logType.DefineField ("log", ListType, FieldAttributes.Public);
\r
111 ConstructorBuilder logCtor = logType.DefineConstructor (MethodAttributes.Public, CallingConventions.HasThis, new Type [] {ListType, typeof (object)});
\r
112 logCtor.DefineParameter (1, ParameterAttributes.None, "test");
\r
113 logCtor.DefineParameter (2, ParameterAttributes.None, "obj");
\r
114 ILGenerator logIL = logCtor.GetILGenerator ();
\r
115 logIL.Emit (OpCodes.Ldarg_0);
\r
116 logIL.Emit (OpCodes.Ldarg_1);
\r
117 logIL.Emit (OpCodes.Stfld, logField);
\r
120 foreach (EventInfo Event in itemType.GetEvents ()) {
\r
123 MethodInfo invoke = Event.EventHandlerType.GetMethod ("Invoke");
\r
124 MethodBuilder method = logType.DefineMethod (Event.Name, MethodAttributes.Public, null, new Type [] { invoke.GetParameters () [0].ParameterType, invoke.GetParameters () [1].ParameterType });
\r
125 method.DefineParameter (1, ParameterAttributes.None, "test");
\r
126 method.DefineParameter (2, ParameterAttributes.None, "test2");
\r
127 il = method.GetILGenerator ();
\r
128 il.Emit (OpCodes.Ldarg_0);
\r
129 il.Emit (OpCodes.Ldfld, logField);
\r
130 il.Emit (OpCodes.Ldstr, Event.Name);
\r
131 il.Emit (OpCodes.Callvirt, ListType.GetMethod ("Add"));
\r
132 il.Emit (OpCodes.Pop);
\r
133 il.Emit (OpCodes.Ret);
\r
135 logIL.Emit (OpCodes.Ldarg_2);
\r
136 logIL.Emit (OpCodes.Ldarg_0);
\r
137 logIL.Emit (OpCodes.Dup);
\r
138 logIL.Emit (OpCodes.Ldvirtftn, method);
\r
139 logIL.Emit (OpCodes.Newobj, Event.EventHandlerType.GetConstructor (new Type [] {typeof(object), typeof(IntPtr)}));
\r
140 logIL.Emit (OpCodes.Call, Event.GetAddMethod ());
\r
143 logIL.Emit (OpCodes.Ret);
\r
144 Type builtLogType = logType.CreateType ();
\r
146 instance = builtLogType.GetConstructors () [0].Invoke (new object [] { log, item });
\r
147 TestHelper.RemoveWarning (instance);
\r
149 //assembly.Save ("EventLoggerAssembly.dll");
\r