Merge branch 'master' of github.com:tgiphil/mono
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Windows.Forms / EventLogger.cs
1 //\r
2 // Copyright (c) 2007 Novell, Inc.\r
3 //\r
4 // Authors:\r
5 //      Rolf Bjarne Kvinge  (RKvinge@novell.com)\r
6 //\r
7 \r
8 using System;\r
9 using System.Text;\r
10 using System.IO;\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
18 \r
19 namespace MonoTests.System.Windows.Forms\r
20 {\r
21         public class EventLogger\r
22         {\r
23                 public class EventLog : ArrayList\r
24                 {\r
25                         public bool PrintAdds = false;\r
26                         \r
27                         new public int Add (object obj)\r
28                         {\r
29                                 if (PrintAdds)\r
30                                         Console.WriteLine ("{1} EventLog: {0}", obj, DateTime.Now.ToLongTimeString ());\r
31                                 return base.Add (obj);\r
32                         }\r
33                 }\r
34         \r
35                 private EventLog log;\r
36                 private object instance;\r
37 \r
38                 public bool PrintAdds {\r
39                         get { return log.PrintAdds; }\r
40                         set { log.PrintAdds = value; }\r
41                 }\r
42 \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
45                 {\r
46                         if (Names.Length == 0)\r
47                                 return true;\r
48                 \r
49                         int n = 0;\r
50                         for (int i = 0; i < log.Count; i++) {\r
51                                 if ((string) log [i] == Names [n]) {\r
52                                         n++;\r
53                                         if (n == Names.Length)\r
54                                                 return true;\r
55                                 }\r
56                         }\r
57                         \r
58                         if (n == Names.Length) {\r
59                                 return true;\r
60                         } else {\r
61                                 Console.WriteLine ("ContainsEventsOrdered: logged events '" + EventsJoined () + "' didn't match correct events '" + string.Join (";", Names) + "'");\r
62                                 return false;\r
63                         }\r
64                 }\r
65                 \r
66                 public int CountEvents (string Name)\r
67                 {\r
68                         int count = 0;\r
69                         foreach (string str in log) {\r
70                                 if (Name.Equals (str)) {\r
71                                         count++;        \r
72                                 }\r
73                         }\r
74                         return count;\r
75                 }\r
76                 \r
77                 public bool EventRaised (string Name) \r
78                 {\r
79                         return log.Contains (Name);\r
80                 }\r
81                 \r
82                 public int EventsRaised {\r
83                         get {\r
84                                 return log.Count;\r
85                         }\r
86                 }\r
87 \r
88                 public string EventsJoined ()\r
89                 {\r
90                         return EventsJoined (";");\r
91                 }\r
92                 \r
93                 public string EventsJoined (string separator)\r
94                 {\r
95                         return string.Join (";", ToArray ());\r
96                 }\r
97                 \r
98                 public void Clear ()\r
99                 {\r
100                         log.Clear ();\r
101                 }\r
102                 \r
103                 public string [] ToArray ()\r
104                 {\r
105                         string [] result = new string [log.Count];\r
106                         log.CopyTo (result);\r
107                         return result;\r
108                 }\r
109                 \r
110                 public EventLogger (object item)\r
111                 {\r
112                         if (item == null) {\r
113                                 throw new ArgumentNullException ("item");\r
114                         }\r
115 \r
116                         log = new EventLog ();\r
117                         \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
123                         \r
124                         Type ListType = log.GetType ();\r
125                         \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
135 \r
136                         \r
137                         foreach (EventInfo Event in itemType.GetEvents ()) {\r
138                                 ILGenerator il;\r
139 \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
151                                 \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
158                         }\r
159 \r
160                         logIL.Emit (OpCodes.Ret);               \r
161                         Type builtLogType = logType.CreateType ();\r
162                         \r
163                         instance = builtLogType.GetConstructors () [0].Invoke (new object [] { log, item });\r
164                         TestHelper.RemoveWarning (instance);\r
165                         \r
166                         //assembly.Save ("EventLoggerAssembly.dll");\r
167                 }\r
168         }\r
169 }\r