utcanalytics.pas 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. unit utcanalytics;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testutils, testregistry, system.analytics;
  6. type
  7. { TListener }
  8. TListener = Class(TInterfacedObject,IApplicationActivityListener)
  9. private
  10. FLastActivity: TAppActivity;
  11. FLastContext: TObject;
  12. FLastSender: TObject;
  13. FLastTimeStamp: TDateTime;
  14. Protected
  15. procedure TrackAppStart(const TimeStamp: TDateTime);
  16. procedure TrackAppExit(const TimeStamp: TDateTime);
  17. procedure TrackControlFocused(const TimeStamp: TDateTime; const Sender: TObject);
  18. procedure TrackWindowActivated(const TimeStamp: TDateTime; const Sender: TObject);
  19. procedure TrackEvent(const TimeStamp: TDateTime; const Sender, Context: TObject);
  20. procedure TrackException(const TimeStamp: TDateTime; const E: Exception);
  21. Public
  22. Procedure Reset;
  23. Property LastTimestamp : TDateTime Read FLastTimeStamp;
  24. Property LastActivity : TAppActivity Read FLastActivity;
  25. Property LastSender : TObject Read FLastSender;
  26. Property LastContext : TObject Read FLastContext;
  27. end;
  28. { TTestAnalytics }
  29. TTestAnalytics= class(TTestCase)
  30. private
  31. FListener: TListener;
  32. FListener2: TListener;
  33. FListenerIntf : IApplicationActivityListener;
  34. FListener2Intf : IApplicationActivityListener;
  35. FManager: TAnalyticsManager;
  36. FTime: TDateTime;
  37. protected
  38. procedure SetUp; override;
  39. procedure TearDown; override;
  40. Procedure Register;
  41. Procedure AssertEquals(const Msg : String; aExpected, aActual : TAppActivity); overload;
  42. procedure AssertEvent(const Msg: String; aListener: TListener;
  43. aActivity: TAppActivity; aSender: TObject = Nil; aContext: TObject = Nil);
  44. property Manager : TAnalyticsManager Read FManager;
  45. Property Listener : TListener Read FListener;
  46. Property Listener2 : TListener Read FListener2;
  47. published
  48. procedure TestHookUp;
  49. procedure TestRegister;
  50. Procedure TestAppStart;
  51. procedure TestAppExit;
  52. procedure TestFocused;
  53. procedure TestWindowActivated;
  54. procedure TestEvent;
  55. procedure TestException;
  56. procedure TestUnRegister;
  57. end;
  58. implementation
  59. uses typinfo;
  60. { TListener }
  61. procedure TListener.TrackAppStart(const TimeStamp: TDateTime);
  62. begin
  63. FLastTimeStamp:=TimeStamp;
  64. FLastActivity:=TAppActivity.AppStart;
  65. end;
  66. procedure TListener.TrackAppExit(const TimeStamp: TDateTime);
  67. begin
  68. FLastTimeStamp:=TimeStamp;
  69. FLastActivity:=TAppActivity.AppExit;
  70. end;
  71. procedure TListener.TrackControlFocused(const TimeStamp: TDateTime;
  72. const Sender: TObject);
  73. begin
  74. FLastTimeStamp:=TimeStamp;
  75. FLastActivity:=TAppActivity.ControlFocused;
  76. FLastSender:=Sender;
  77. FLastContext:=Nil;
  78. end;
  79. procedure TListener.TrackWindowActivated(const TimeStamp: TDateTime;
  80. const Sender: TObject);
  81. begin
  82. FLastTimeStamp:=TimeStamp;
  83. FLastActivity:=TAppActivity.WindowActivated;
  84. FLastSender:=Sender;
  85. FLastContext:=Nil;
  86. end;
  87. procedure TListener.TrackEvent(const TimeStamp: TDateTime; const Sender,
  88. Context: TObject);
  89. begin
  90. FLastTimeStamp:=TimeStamp;
  91. FLastActivity:=TAppActivity.Custom;
  92. FLastSender:=Sender;
  93. FLastContext:=Context;
  94. end;
  95. procedure TListener.TrackException(const TimeStamp: TDateTime;
  96. const E: Exception);
  97. begin
  98. FLastTimeStamp:=TimeStamp;
  99. FLastActivity:=TAppActivity.Exception;
  100. FLastSender:=E;
  101. FLastContext:=Nil;
  102. end;
  103. procedure TListener.Reset;
  104. begin
  105. FLastActivity:=Default(TAppActivity);
  106. FLastContext:=Default(TObject);
  107. FLastSender:=Default(TObject);
  108. FLastTimeStamp:=Default(TDateTime);
  109. end;
  110. procedure TTestAnalytics.TestHookUp;
  111. begin
  112. AssertNotNull('Have manager',Manager);
  113. AssertNotNull('Have listener',Listener);
  114. end;
  115. procedure TTestAnalytics.TestRegister;
  116. begin
  117. Register;
  118. AssertTrue('Tracking enabled',Manager.TrackingEnabled);
  119. end;
  120. procedure TTestAnalytics.TestAppStart;
  121. begin
  122. Register;
  123. Manager.RecordActivity(TAppActivity.AppStart);
  124. AssertEvent('Listener 1',Listener,TAppActivity.AppStart);
  125. AssertEvent('Listener 2',Listener2,TAppActivity.AppStart);
  126. end;
  127. procedure TTestAnalytics.TestAppExit;
  128. begin
  129. Register;
  130. Manager.RecordActivity(TAppActivity.AppExit);
  131. AssertEvent('Listener 1',Listener,TAppActivity.AppExit);
  132. AssertEvent('Listener 2',Listener2,TAppActivity.AppExit);
  133. end;
  134. procedure TTestAnalytics.TestFocused;
  135. begin
  136. Register;
  137. Manager.RecordActivity(TAppActivity.ControlFocused,Self);
  138. AssertEvent('Listener 1',Listener,TAppActivity.ControlFocused,Self,Nil);
  139. AssertEvent('Listener 2',Listener2,TAppActivity.ControlFocused,Self,Nil);
  140. end;
  141. procedure TTestAnalytics.TestWindowActivated;
  142. begin
  143. Register;
  144. Manager.RecordActivity(TAppActivity.WindowActivated,Self,Nil);
  145. AssertEvent('Listener 1',Listener,TAppActivity.WindowActivated,Self,Nil);
  146. AssertEvent('Listener 2',Listener2,TAppActivity.WindowActivated,Self,Nil);
  147. end;
  148. procedure TTestAnalytics.TestEvent;
  149. begin
  150. Register;
  151. Manager.RecordActivity(TAppActivity.Custom,Self,Listener);
  152. AssertEvent('Listener 1',Listener,TAppActivity.Custom,Self,Listener);
  153. AssertEvent('Listener 2',Listener2,TAppActivity.Custom,Self,Listener);
  154. end;
  155. procedure TTestAnalytics.TestException;
  156. var
  157. E : Exception;
  158. begin
  159. Register;
  160. E:=Exception.Create('Soso');
  161. try
  162. Manager.RecordActivity(TAppActivity.Exception,E);
  163. AssertEvent('Listener 1',Listener,TAppActivity.Exception,E);
  164. AssertEvent('Listener 2',Listener2,TAppActivity.Exception,E);
  165. finally
  166. E.Free;
  167. end;
  168. end;
  169. procedure TTestAnalytics.TestUnRegister;
  170. begin
  171. Register;
  172. Manager.RecordActivity(TAppActivity.AppExit);
  173. AssertEvent('Listener 1',Listener,TAppActivity.AppExit);
  174. AssertEvent('Listener 2',Listener2,TAppActivity.AppExit);
  175. Manager.UnregisterActivityListener(FListener2Intf);
  176. Listener2.Reset;
  177. Manager.RecordActivity(TAppActivity.AppExit);
  178. AssertEvent('Listener 1',Listener,TAppActivity.AppExit);
  179. AssertEquals('Listener2',0,Listener2.LastTimestamp);
  180. end;
  181. procedure TTestAnalytics.SetUp;
  182. begin
  183. FManager:=TAnalyticsManager.Create;
  184. FListener:=TListener.Create;
  185. FListenerIntf:=FListener as IApplicationActivityListener;
  186. FListener2:=TListener.Create;
  187. FListener2Intf:=FListener2 as IApplicationActivityListener;
  188. end;
  189. procedure TTestAnalytics.TearDown;
  190. begin
  191. FreeAndNil(FManager);
  192. // FreeAndNil(FListener);
  193. FListenerIntf:=Nil; // Will free
  194. FListener:=nil;
  195. FListener2Intf:=Nil; // Will free
  196. FListener2:=nil;
  197. end;
  198. procedure TTestAnalytics.Register;
  199. begin
  200. Manager.RegisterActivityListener(Listener as IApplicationActivityListener);
  201. Manager.RegisterActivityListener(Listener2 as IApplicationActivityListener);
  202. FTime:=Now;
  203. end;
  204. procedure TTestAnalytics.AssertEquals(const Msg: String; aExpected, aActual: TAppActivity);
  205. begin
  206. AssertEquals(Msg,GetEnumName(TypeInfo(TAppActivity),Ord(aExpected)),
  207. GetEnumName(TypeInfo(TAppActivity),Ord(aActual)));
  208. end;
  209. procedure TTestAnalytics.AssertEvent(const Msg: String; aListener: TListener;
  210. aActivity: TAppActivity; aSender: TObject; aContext: TObject);
  211. begin
  212. AssertEquals(Msg+' activity',aActivity,aListener.LastActivity);
  213. AssertTrue(Msg+' timestamp',aListener.LastTimestamp>=FTime);
  214. AssertSame(Msg+' sender',aSender,aListener.LastSender);
  215. AssertSame(Msg+' context',aContext,aListener.LastContext);
  216. end;
  217. initialization
  218. RegisterTest(TTestAnalytics);
  219. end.