|
@@ -0,0 +1,256 @@
|
|
|
+unit utcanalytics;
|
|
|
+
|
|
|
+{$mode objfpc}{$H+}
|
|
|
+
|
|
|
+interface
|
|
|
+
|
|
|
+uses
|
|
|
+ Classes, SysUtils, fpcunit, testutils, testregistry, system.analytics;
|
|
|
+
|
|
|
+type
|
|
|
+
|
|
|
+ { TListener }
|
|
|
+
|
|
|
+ TListener = Class(TInterfacedObject,IApplicationActivityListener)
|
|
|
+ private
|
|
|
+ FLastActivity: TAppActivity;
|
|
|
+ FLastContext: TObject;
|
|
|
+ FLastSender: TObject;
|
|
|
+ FLastTimeStamp: TDateTime;
|
|
|
+ Protected
|
|
|
+ procedure TrackAppStart(const TimeStamp: TDateTime);
|
|
|
+ procedure TrackAppExit(const TimeStamp: TDateTime);
|
|
|
+ procedure TrackControlFocused(const TimeStamp: TDateTime; const Sender: TObject);
|
|
|
+ procedure TrackWindowActivated(const TimeStamp: TDateTime; const Sender: TObject);
|
|
|
+ procedure TrackEvent(const TimeStamp: TDateTime; const Sender, Context: TObject);
|
|
|
+ procedure TrackException(const TimeStamp: TDateTime; const E: Exception);
|
|
|
+ Public
|
|
|
+ Procedure Reset;
|
|
|
+ Property LastTimestamp : TDateTime Read FLastTimeStamp;
|
|
|
+ Property LastActivity : TAppActivity Read FLastActivity;
|
|
|
+ Property LastSender : TObject Read FLastSender;
|
|
|
+ Property LastContext : TObject Read FLastContext;
|
|
|
+ end;
|
|
|
+
|
|
|
+ { TTestAnalytics }
|
|
|
+
|
|
|
+ TTestAnalytics= class(TTestCase)
|
|
|
+ private
|
|
|
+ FListener: TListener;
|
|
|
+ FListener2: TListener;
|
|
|
+ FListenerIntf : IApplicationActivityListener;
|
|
|
+ FListener2Intf : IApplicationActivityListener;
|
|
|
+ FManager: TAnalyticsManager;
|
|
|
+ FTime: TDateTime;
|
|
|
+ protected
|
|
|
+ procedure SetUp; override;
|
|
|
+ procedure TearDown; override;
|
|
|
+ Procedure Register;
|
|
|
+ Procedure AssertEquals(const Msg : String; aExpected, aActual : TAppActivity); overload;
|
|
|
+ procedure AssertEvent(const Msg: String; aListener: TListener;
|
|
|
+ aActivity: TAppActivity; aSender: TObject = Nil; aContext: TObject = Nil);
|
|
|
+ property Manager : TAnalyticsManager Read FManager;
|
|
|
+ Property Listener : TListener Read FListener;
|
|
|
+ Property Listener2 : TListener Read FListener2;
|
|
|
+ published
|
|
|
+ procedure TestHookUp;
|
|
|
+ procedure TestRegister;
|
|
|
+ Procedure TestAppStart;
|
|
|
+ procedure TestAppExit;
|
|
|
+ procedure TestFocused;
|
|
|
+ procedure TestWindowActivated;
|
|
|
+ procedure TestEvent;
|
|
|
+ procedure TestException;
|
|
|
+ procedure TestUnRegister;
|
|
|
+ end;
|
|
|
+
|
|
|
+implementation
|
|
|
+
|
|
|
+uses typinfo;
|
|
|
+
|
|
|
+{ TListener }
|
|
|
+
|
|
|
+procedure TListener.TrackAppStart(const TimeStamp: TDateTime);
|
|
|
+begin
|
|
|
+ FLastTimeStamp:=TimeStamp;
|
|
|
+ FLastActivity:=TAppActivity.AppStart;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TListener.TrackAppExit(const TimeStamp: TDateTime);
|
|
|
+begin
|
|
|
+ FLastTimeStamp:=TimeStamp;
|
|
|
+ FLastActivity:=TAppActivity.AppExit;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TListener.TrackControlFocused(const TimeStamp: TDateTime;
|
|
|
+ const Sender: TObject);
|
|
|
+begin
|
|
|
+ FLastTimeStamp:=TimeStamp;
|
|
|
+ FLastActivity:=TAppActivity.ControlFocused;
|
|
|
+ FLastSender:=Sender;
|
|
|
+ FLastContext:=Nil;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TListener.TrackWindowActivated(const TimeStamp: TDateTime;
|
|
|
+ const Sender: TObject);
|
|
|
+begin
|
|
|
+ FLastTimeStamp:=TimeStamp;
|
|
|
+ FLastActivity:=TAppActivity.WindowActivated;
|
|
|
+ FLastSender:=Sender;
|
|
|
+ FLastContext:=Nil;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TListener.TrackEvent(const TimeStamp: TDateTime; const Sender,
|
|
|
+ Context: TObject);
|
|
|
+begin
|
|
|
+ FLastTimeStamp:=TimeStamp;
|
|
|
+ FLastActivity:=TAppActivity.Custom;
|
|
|
+ FLastSender:=Sender;
|
|
|
+ FLastContext:=Context;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TListener.TrackException(const TimeStamp: TDateTime;
|
|
|
+ const E: Exception);
|
|
|
+begin
|
|
|
+ FLastTimeStamp:=TimeStamp;
|
|
|
+ FLastActivity:=TAppActivity.Exception;
|
|
|
+ FLastSender:=E;
|
|
|
+ FLastContext:=Nil;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TListener.Reset;
|
|
|
+begin
|
|
|
+ FLastActivity:=Default(TAppActivity);
|
|
|
+ FLastContext:=Default(TObject);
|
|
|
+ FLastSender:=Default(TObject);
|
|
|
+ FLastTimeStamp:=Default(TDateTime);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TTestAnalytics.TestHookUp;
|
|
|
+begin
|
|
|
+ AssertNotNull('Have manager',Manager);
|
|
|
+ AssertNotNull('Have listener',Listener);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TTestAnalytics.TestRegister;
|
|
|
+begin
|
|
|
+ Register;
|
|
|
+ AssertTrue('Tracking enabled',Manager.TrackingEnabled);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TTestAnalytics.TestAppStart;
|
|
|
+begin
|
|
|
+ Register;
|
|
|
+ Manager.RecordActivity(TAppActivity.AppStart);
|
|
|
+ AssertEvent('Listener 1',Listener,TAppActivity.AppStart);
|
|
|
+ AssertEvent('Listener 2',Listener2,TAppActivity.AppStart);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TTestAnalytics.TestAppExit;
|
|
|
+begin
|
|
|
+ Register;
|
|
|
+ Manager.RecordActivity(TAppActivity.AppExit);
|
|
|
+ AssertEvent('Listener 1',Listener,TAppActivity.AppExit);
|
|
|
+ AssertEvent('Listener 2',Listener2,TAppActivity.AppExit);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TTestAnalytics.TestFocused;
|
|
|
+begin
|
|
|
+ Register;
|
|
|
+ Manager.RecordActivity(TAppActivity.ControlFocused,Self);
|
|
|
+ AssertEvent('Listener 1',Listener,TAppActivity.ControlFocused,Self,Nil);
|
|
|
+ AssertEvent('Listener 2',Listener2,TAppActivity.ControlFocused,Self,Nil);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TTestAnalytics.TestWindowActivated;
|
|
|
+begin
|
|
|
+ Register;
|
|
|
+ Manager.RecordActivity(TAppActivity.WindowActivated,Self,Nil);
|
|
|
+ AssertEvent('Listener 1',Listener,TAppActivity.WindowActivated,Self,Nil);
|
|
|
+ AssertEvent('Listener 2',Listener2,TAppActivity.WindowActivated,Self,Nil);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TTestAnalytics.TestEvent;
|
|
|
+begin
|
|
|
+ Register;
|
|
|
+ Manager.RecordActivity(TAppActivity.Custom,Self,Listener);
|
|
|
+ AssertEvent('Listener 1',Listener,TAppActivity.Custom,Self,Listener);
|
|
|
+ AssertEvent('Listener 2',Listener2,TAppActivity.Custom,Self,Listener);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TTestAnalytics.TestException;
|
|
|
+
|
|
|
+var
|
|
|
+ E : Exception;
|
|
|
+
|
|
|
+begin
|
|
|
+ Register;
|
|
|
+ E:=Exception.Create('Soso');
|
|
|
+ try
|
|
|
+ Manager.RecordActivity(TAppActivity.Exception,E);
|
|
|
+ AssertEvent('Listener 1',Listener,TAppActivity.Exception,E);
|
|
|
+ AssertEvent('Listener 2',Listener2,TAppActivity.Exception,E);
|
|
|
+ finally
|
|
|
+ E.Free;
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TTestAnalytics.TestUnRegister;
|
|
|
+begin
|
|
|
+ Register;
|
|
|
+ Manager.RecordActivity(TAppActivity.AppExit);
|
|
|
+ AssertEvent('Listener 1',Listener,TAppActivity.AppExit);
|
|
|
+ AssertEvent('Listener 2',Listener2,TAppActivity.AppExit);
|
|
|
+ Manager.UnregisterActivityListener(FListener2Intf);
|
|
|
+ Listener2.Reset;
|
|
|
+ Manager.RecordActivity(TAppActivity.AppExit);
|
|
|
+ AssertEvent('Listener 1',Listener,TAppActivity.AppExit);
|
|
|
+ AssertEquals('Listener2',0,Listener2.LastTimestamp);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TTestAnalytics.SetUp;
|
|
|
+begin
|
|
|
+ FManager:=TAnalyticsManager.Create;
|
|
|
+ FListener:=TListener.Create;
|
|
|
+ FListenerIntf:=FListener as IApplicationActivityListener;
|
|
|
+ FListener2:=TListener.Create;
|
|
|
+ FListener2Intf:=FListener2 as IApplicationActivityListener;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TTestAnalytics.TearDown;
|
|
|
+begin
|
|
|
+ FreeAndNil(FManager);
|
|
|
+ // FreeAndNil(FListener);
|
|
|
+ FListenerIntf:=Nil; // Will free
|
|
|
+ FListener:=nil;
|
|
|
+ FListener2Intf:=Nil; // Will free
|
|
|
+ FListener2:=nil;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TTestAnalytics.Register;
|
|
|
+begin
|
|
|
+ Manager.RegisterActivityListener(Listener as IApplicationActivityListener);
|
|
|
+ Manager.RegisterActivityListener(Listener2 as IApplicationActivityListener);
|
|
|
+ FTime:=Now;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TTestAnalytics.AssertEquals(const Msg: String; aExpected, aActual: TAppActivity);
|
|
|
+begin
|
|
|
+ AssertEquals(Msg,GetEnumName(TypeInfo(TAppActivity),Ord(aExpected)),
|
|
|
+ GetEnumName(TypeInfo(TAppActivity),Ord(aActual)));
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TTestAnalytics.AssertEvent(const Msg: String; aListener: TListener;
|
|
|
+ aActivity: TAppActivity; aSender: TObject; aContext: TObject);
|
|
|
+begin
|
|
|
+ AssertEquals(Msg+' activity',aActivity,aListener.LastActivity);
|
|
|
+ AssertTrue(Msg+' timestamp',aListener.LastTimestamp>=FTime);
|
|
|
+ AssertSame(Msg+' sender',aSender,aListener.LastSender);
|
|
|
+ AssertSame(Msg+' context',aContext,aListener.LastContext);
|
|
|
+end;
|
|
|
+
|
|
|
+initialization
|
|
|
+
|
|
|
+ RegisterTest(TTestAnalytics);
|
|
|
+end.
|
|
|
+
|