EventLogger.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. //
  2. // Copyright (c) 2007 Novell, Inc.
  3. //
  4. // Authors:
  5. // Rolf Bjarne Kvinge ([email protected])
  6. //
  7. using System;
  8. using System.Text;
  9. using System.IO;
  10. using NUnit.Framework;
  11. using System.Windows.Forms;
  12. using System.ComponentModel;
  13. using System.Drawing;
  14. using System.Collections;
  15. using System.Reflection;
  16. using System.Reflection.Emit;
  17. namespace MonoTests.System.Windows.Forms
  18. {
  19. class EventLogger
  20. {
  21. private ArrayList log;
  22. private object instance;
  23. // Tests if all the names in Names are in log with the order given in Names.
  24. public bool ContainsEventsOrdered (params string [] Names)
  25. {
  26. if (Names.Length == 0)
  27. return true;
  28. int n = 0;
  29. for (int i = 0; i < log.Count; i++) {
  30. if ((string) log [i] == Names [n]) {
  31. n++;
  32. if (n == Names.Length)
  33. return true;
  34. }
  35. }
  36. if (n == Names.Length) {
  37. return true;
  38. } else {
  39. Console.WriteLine ("ContainsEventsOrdered: logged events '" + EventsJoined () + "' didn't match correct events '" + string.Join (";", Names) + "'");
  40. return false;
  41. }
  42. }
  43. public int CountEvents (string Name)
  44. {
  45. int count = 0;
  46. foreach (string str in log) {
  47. if (Name.Equals (str)) {
  48. count++;
  49. }
  50. }
  51. return count;
  52. }
  53. public bool EventRaised (string Name)
  54. {
  55. return log.Contains (Name);
  56. }
  57. public int EventsRaised {
  58. get {
  59. return log.Count;
  60. }
  61. }
  62. public string EventsJoined ()
  63. {
  64. return EventsJoined (";");
  65. }
  66. public string EventsJoined (string separator)
  67. {
  68. return string.Join (";", ToArray ());
  69. }
  70. public void Clear ()
  71. {
  72. log.Clear ();
  73. }
  74. public string [] ToArray ()
  75. {
  76. string [] result = new string [log.Count];
  77. log.CopyTo (result);
  78. return result;
  79. }
  80. public EventLogger (object item)
  81. {
  82. if (item == null) {
  83. throw new ArgumentNullException ("item");
  84. }
  85. log = new ArrayList ();
  86. Type itemType = item.GetType ();
  87. AssemblyName name = new AssemblyName ();
  88. name.Name = "EventLoggerAssembly";
  89. AssemblyBuilder assembly = AppDomain.CurrentDomain.DefineDynamicAssembly (name, AssemblyBuilderAccess.RunAndSave);
  90. ModuleBuilder module = assembly.DefineDynamicModule ("EventLoggerAssembly", "EventLoggerAssembly.dll");
  91. Type ListType = typeof (ArrayList);
  92. TypeBuilder logType = module.DefineType ("Logger");
  93. FieldBuilder logField = logType.DefineField ("log", ListType, FieldAttributes.Public);
  94. ConstructorBuilder logCtor = logType.DefineConstructor (MethodAttributes.Public, CallingConventions.HasThis, new Type [] {ListType, typeof (object)});
  95. logCtor.DefineParameter (1, ParameterAttributes.None, "test");
  96. logCtor.DefineParameter (2, ParameterAttributes.None, "obj");
  97. ILGenerator logIL = logCtor.GetILGenerator ();
  98. logIL.Emit (OpCodes.Ldarg_0);
  99. logIL.Emit (OpCodes.Ldarg_1);
  100. logIL.Emit (OpCodes.Stfld, logField);
  101. foreach (EventInfo Event in itemType.GetEvents ()) {
  102. ILGenerator il;
  103. MethodInfo invoke = Event.EventHandlerType.GetMethod ("Invoke");
  104. MethodBuilder method = logType.DefineMethod (Event.Name, MethodAttributes.Public, null, new Type [] { invoke.GetParameters () [0].ParameterType, invoke.GetParameters () [1].ParameterType });
  105. method.DefineParameter (1, ParameterAttributes.None, "test");
  106. method.DefineParameter (2, ParameterAttributes.None, "test2");
  107. il = method.GetILGenerator ();
  108. il.Emit (OpCodes.Ldarg_0);
  109. il.Emit (OpCodes.Ldfld, logField);
  110. il.Emit (OpCodes.Ldstr, Event.Name);
  111. il.Emit (OpCodes.Callvirt, ListType.GetMethod ("Add"));
  112. il.Emit (OpCodes.Pop);
  113. il.Emit (OpCodes.Ret);
  114. logIL.Emit (OpCodes.Ldarg_2);
  115. logIL.Emit (OpCodes.Ldarg_0);
  116. logIL.Emit (OpCodes.Dup);
  117. logIL.Emit (OpCodes.Ldvirtftn, method);
  118. logIL.Emit (OpCodes.Newobj, Event.EventHandlerType.GetConstructor (new Type [] {typeof(object), typeof(IntPtr)}));
  119. logIL.Emit (OpCodes.Call, Event.GetAddMethod ());
  120. }
  121. logIL.Emit (OpCodes.Ret);
  122. Type builtLogType = logType.CreateType ();
  123. instance = builtLogType.GetConstructors () [0].Invoke (new object [] { log, item });
  124. TestHelper.RemoveWarning (instance);
  125. //assembly.Save ("EventLoggerAssembly.dll");
  126. }
  127. }
  128. }