fpc/packages/vcl-compat/tests/utcanalytics.pas
2023-11-03 17:09:28 +01:00

257 lines
7.1 KiB
ObjectPascal

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.