EventLogger.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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 bool EventRaised (string Name)
  44. {
  45. return log.Contains (Name);
  46. }
  47. public int EventsRaised {
  48. get {
  49. return log.Count;
  50. }
  51. }
  52. public string EventsJoined ()
  53. {
  54. return EventsJoined (";");
  55. }
  56. public string EventsJoined (string separator)
  57. {
  58. return string.Join (";", ToArray ());
  59. }
  60. public void Clear ()
  61. {
  62. log.Clear ();
  63. }
  64. public string [] ToArray ()
  65. {
  66. string [] result = new string [log.Count];
  67. log.CopyTo (result);
  68. return result;
  69. }
  70. public EventLogger (object item)
  71. {
  72. if (item == null) {
  73. throw new ArgumentNullException ("item");
  74. }
  75. log = new ArrayList ();
  76. Type itemType = item.GetType ();
  77. AssemblyName name = new AssemblyName ();
  78. name.Name = "EventLoggerAssembly";
  79. AssemblyBuilder assembly = AppDomain.CurrentDomain.DefineDynamicAssembly (name, AssemblyBuilderAccess.RunAndSave);
  80. ModuleBuilder module = assembly.DefineDynamicModule ("EventLoggerAssembly", "EventLoggerAssembly.dll");
  81. Type ListType = typeof (ArrayList);
  82. TypeBuilder logType = module.DefineType ("Logger");
  83. FieldBuilder logField = logType.DefineField ("log", ListType, FieldAttributes.Public);
  84. ConstructorBuilder logCtor = logType.DefineConstructor (MethodAttributes.Public, CallingConventions.HasThis, new Type [] {ListType, typeof (object)});
  85. logCtor.DefineParameter (1, ParameterAttributes.None, "test");
  86. logCtor.DefineParameter (2, ParameterAttributes.None, "obj");
  87. ILGenerator logIL = logCtor.GetILGenerator ();
  88. logIL.Emit (OpCodes.Ldarg_0);
  89. logIL.Emit (OpCodes.Ldarg_1);
  90. logIL.Emit (OpCodes.Stfld, logField);
  91. foreach (EventInfo Event in itemType.GetEvents ()) {
  92. ILGenerator il;
  93. MethodInfo invoke = Event.EventHandlerType.GetMethod ("Invoke");
  94. MethodBuilder method = logType.DefineMethod (Event.Name, MethodAttributes.Public, null, new Type [] { invoke.GetParameters () [0].ParameterType, invoke.GetParameters () [1].ParameterType });
  95. method.DefineParameter (1, ParameterAttributes.None, "test");
  96. method.DefineParameter (2, ParameterAttributes.None, "test2");
  97. il = method.GetILGenerator ();
  98. il.Emit (OpCodes.Ldarg_0);
  99. il.Emit (OpCodes.Ldfld, logField);
  100. il.Emit (OpCodes.Ldstr, Event.Name);
  101. il.Emit (OpCodes.Callvirt, ListType.GetMethod ("Add"));
  102. il.Emit (OpCodes.Pop);
  103. il.Emit (OpCodes.Ret);
  104. logIL.Emit (OpCodes.Ldarg_2);
  105. logIL.Emit (OpCodes.Ldarg_0);
  106. logIL.Emit (OpCodes.Dup);
  107. logIL.Emit (OpCodes.Ldvirtftn, method);
  108. logIL.Emit (OpCodes.Newobj, Event.EventHandlerType.GetConstructor (new Type [] {typeof(object), typeof(IntPtr)}));
  109. logIL.Emit (OpCodes.Call, Event.GetAddMethod ());
  110. }
  111. logIL.Emit (OpCodes.Ret);
  112. Type builtLogType = logType.CreateType ();
  113. instance = builtLogType.GetConstructors () [0].Invoke (new object [] { log, item });
  114. TestHelper.RemoveWarning (instance);
  115. //assembly.Save ("EventLoggerAssembly.dll");
  116. }
  117. }
  118. }