* EventLogger.cs: Add CountEvents.
[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         class EventLogger\r
22         {\r
23                 private ArrayList log;\r
24                 private object instance;\r
25                 \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
28                 {\r
29                         if (Names.Length == 0)\r
30                                 return true;\r
31                 \r
32                         int n = 0;\r
33                         for (int i = 0; i < log.Count; i++) {\r
34                                 if ((string) log [i] == Names [n]) {\r
35                                         n++;\r
36                                         if (n == Names.Length)\r
37                                                 return true;\r
38                                 }\r
39                         }\r
40                         \r
41                         if (n == Names.Length) {\r
42                                 return true;\r
43                         } else {\r
44                                 Console.WriteLine ("ContainsEventsOrdered: logged events '" + EventsJoined () + "' didn't match correct events '" + string.Join (";", Names) + "'");\r
45                                 return false;\r
46                         }\r
47                 }\r
48                 \r
49                 public int CountEvents (string Name)\r
50                 {\r
51                         int count = 0;\r
52                         foreach (string str in log) {\r
53                                 if (Name.Equals (str, StringComparison.Ordinal)) {\r
54                                         count++;        \r
55                                 }\r
56                         }\r
57                         return count;\r
58                 }\r
59                 \r
60                 public bool EventRaised (string Name) \r
61                 {\r
62                         return log.Contains (Name);\r
63                 }\r
64                 \r
65                 public int EventsRaised {\r
66                         get {\r
67                                 return log.Count;\r
68                         }\r
69                 }\r
70 \r
71                 public string EventsJoined ()\r
72                 {\r
73                         return EventsJoined (";");\r
74                 }\r
75                 \r
76                 public string EventsJoined (string separator)\r
77                 {\r
78                         return string.Join (";", ToArray ());\r
79                 }\r
80                 \r
81                 public void Clear ()\r
82                 {\r
83                         log.Clear ();\r
84                 }\r
85                 \r
86                 public string [] ToArray ()\r
87                 {\r
88                         string [] result = new string [log.Count];\r
89                         log.CopyTo (result);\r
90                         return result;\r
91                 }\r
92                 \r
93                 public EventLogger (object item)\r
94                 {\r
95                         if (item == null) {\r
96                                 throw new ArgumentNullException ("item");\r
97                         }\r
98                 \r
99                         log = new ArrayList ();\r
100                         \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
106                         \r
107                         Type ListType = typeof (ArrayList);\r
108                         \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
118 \r
119                         \r
120                         foreach (EventInfo Event in itemType.GetEvents ()) {\r
121                                 ILGenerator il;\r
122 \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
134                                 \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
141                         }\r
142 \r
143                         logIL.Emit (OpCodes.Ret);               \r
144                         Type builtLogType = logType.CreateType ();\r
145                         \r
146                         instance = builtLogType.GetConstructors () [0].Invoke (new object [] { log, item });\r
147                         TestHelper.RemoveWarning (instance);\r
148                         \r
149                         //assembly.Save ("EventLoggerAssembly.dll");\r
150                 }\r
151         }\r
152 }\r