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
21 public class EventLogger
\r
23 public class EventLog : ArrayList
\r
25 public bool PrintAdds = false;
\r
27 new public int Add (object obj)
\r
30 Console.WriteLine ("{1} EventLog: {0}", obj, DateTime.Now.ToLongTimeString ());
\r
31 return base.Add (obj);
\r
35 private EventLog log;
\r
36 private object instance;
\r
38 public bool PrintAdds {
\r
39 get { return log.PrintAdds; }
\r
40 set { log.PrintAdds = value; }
\r
43 // Tests if all the names in Names are in log with the order given in Names.
\r
44 public bool ContainsEventsOrdered (params string [] Names)
\r
46 if (Names.Length == 0)
\r
50 for (int i = 0; i < log.Count; i++) {
\r
51 if ((string) log [i] == Names [n]) {
\r
53 if (n == Names.Length)
\r
58 if (n == Names.Length) {
\r
61 Console.WriteLine ("ContainsEventsOrdered: logged events '" + EventsJoined () + "' didn't match correct events '" + string.Join (";", Names) + "'");
\r
66 public int CountEvents (string Name)
\r
69 foreach (string str in log) {
\r
70 if (Name.Equals (str)) {
\r
77 public bool EventRaised (string Name)
\r
79 return log.Contains (Name);
\r
82 public int EventsRaised {
\r
88 public string EventsJoined ()
\r
90 return EventsJoined (";");
\r
93 public string EventsJoined (string separator)
\r
95 return string.Join (";", ToArray ());
\r
98 public void Clear ()
\r
103 public string [] ToArray ()
\r
105 string [] result = new string [log.Count];
\r
106 log.CopyTo (result);
\r
110 public EventLogger (object item)
\r
112 if (item == null) {
\r
113 throw new ArgumentNullException ("item");
\r
116 log = new EventLog ();
\r
118 Type itemType = item.GetType ();
\r
119 AssemblyName name = new AssemblyName ();
\r
120 name.Name = "EventLoggerAssembly";
\r
121 AssemblyBuilder assembly = AppDomain.CurrentDomain.DefineDynamicAssembly (name, AssemblyBuilderAccess.RunAndSave);
\r
122 ModuleBuilder module = assembly.DefineDynamicModule ("EventLoggerAssembly", "EventLoggerAssembly.dll");
\r
124 Type ListType = log.GetType ();
\r
126 TypeBuilder logType = module.DefineType ("Logger");
\r
127 FieldBuilder logField = logType.DefineField ("log", ListType, FieldAttributes.Public);
\r
128 ConstructorBuilder logCtor = logType.DefineConstructor (MethodAttributes.Public, CallingConventions.HasThis, new Type [] {ListType, typeof (object)});
\r
129 logCtor.DefineParameter (1, ParameterAttributes.None, "test");
\r
130 logCtor.DefineParameter (2, ParameterAttributes.None, "obj");
\r
131 ILGenerator logIL = logCtor.GetILGenerator ();
\r
132 logIL.Emit (OpCodes.Ldarg_0);
\r
133 logIL.Emit (OpCodes.Ldarg_1);
\r
134 logIL.Emit (OpCodes.Stfld, logField);
\r
137 foreach (EventInfo Event in itemType.GetEvents ()) {
\r
140 MethodInfo invoke = Event.EventHandlerType.GetMethod ("Invoke");
\r
141 MethodBuilder method = logType.DefineMethod (Event.Name, MethodAttributes.Public, null, new Type [] { invoke.GetParameters () [0].ParameterType, invoke.GetParameters () [1].ParameterType });
\r
142 method.DefineParameter (1, ParameterAttributes.None, "test");
\r
143 method.DefineParameter (2, ParameterAttributes.None, "test2");
\r
144 il = method.GetILGenerator ();
\r
145 il.Emit (OpCodes.Ldarg_0);
\r
146 il.Emit (OpCodes.Ldfld, logField);
\r
147 il.Emit (OpCodes.Ldstr, Event.Name);
\r
148 il.Emit (OpCodes.Callvirt, ListType.GetMethod ("Add"));
\r
149 il.Emit (OpCodes.Pop);
\r
150 il.Emit (OpCodes.Ret);
\r
152 logIL.Emit (OpCodes.Ldarg_2);
\r
153 logIL.Emit (OpCodes.Ldarg_0);
\r
154 logIL.Emit (OpCodes.Dup);
\r
155 logIL.Emit (OpCodes.Ldvirtftn, method);
\r
156 logIL.Emit (OpCodes.Newobj, Event.EventHandlerType.GetConstructor (new Type [] {typeof(object), typeof(IntPtr)}));
\r
157 logIL.Emit (OpCodes.Call, Event.GetAddMethod ());
\r
160 logIL.Emit (OpCodes.Ret);
\r
161 Type builtLogType = logType.CreateType ();
\r
163 instance = builtLogType.GetConstructors () [0].Invoke (new object [] { log, item });
\r
164 TestHelper.RemoveWarning (instance);
\r
166 //assembly.Save ("EventLoggerAssembly.dll");
\r