* DateTimePickerTest.cs: Some culture dependant tests are only supposed
[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 bool EventRaised (string Name) \r
50                 {\r
51                         return log.Contains (Name);\r
52                 }\r
53                 \r
54                 public int EventsRaised {\r
55                         get {\r
56                                 return log.Count;\r
57                         }\r
58                 }\r
59 \r
60                 public string EventsJoined ()\r
61                 {\r
62                         return EventsJoined (";");\r
63                 }\r
64                 \r
65                 public string EventsJoined (string separator)\r
66                 {\r
67                         return string.Join (";", ToArray ());\r
68                 }\r
69                 \r
70                 public void Clear ()\r
71                 {\r
72                         log.Clear ();\r
73                 }\r
74                 \r
75                 public string [] ToArray ()\r
76                 {\r
77                         string [] result = new string [log.Count];\r
78                         log.CopyTo (result);\r
79                         return result;\r
80                 }\r
81                 \r
82                 public EventLogger (object item)\r
83                 {\r
84                         if (item == null) {\r
85                                 throw new ArgumentNullException ("item");\r
86                         }\r
87                 \r
88                         log = new ArrayList ();\r
89                         \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
95                         \r
96                         Type ListType = typeof (ArrayList);\r
97                         \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
107 \r
108                         \r
109                         foreach (EventInfo Event in itemType.GetEvents ()) {\r
110                                 ILGenerator il;\r
111 \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
123                                 \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
130                         }\r
131 \r
132                         logIL.Emit (OpCodes.Ret);               \r
133                         Type builtLogType = logType.CreateType ();\r
134                         \r
135                         instance = builtLogType.GetConstructors () [0].Invoke (new object [] { log, item });\r
136                         TestHelper.RemoveWarning (instance);\r
137                         \r
138                         //assembly.Save ("EventLoggerAssembly.dll");\r
139                 }\r
140         }\r
141 }\r