const str optimization

This commit is contained in:
2018-06-01 21:07:34 +03:00
parent 6dad5b98a2
commit 258dfbff07
7 changed files with 187 additions and 171 deletions

View File

@@ -2,17 +2,17 @@ unit AG.Logs;
interface interface
{$IFDEF FPC} //{$UNDEF MSWINDOWS}
{$UNDEF MSWINDOWS}
{$ENDIF}
uses uses
{$IFDEF MSWINDOWS}{$IFDEF FPC}Windows{$ELSE}Winapi.Windows{$ENDIF},{$ENDIF} {$IFDEF MSWINDOWS}{$IFDEF FPC}Windows{$ELSE}Winapi.Windows{$ENDIF},{$ENDIF}
{$IFDEF FPC}FGL{$ELSE}System.Generics.Collections{$ENDIF}, {$IFDEF FPC}FGL{$ELSE}System.Generics.Collections{$ENDIF},
{$IFDEF FPC}SysUtils{$ELSE}System.SysUtils{$ENDIF}, {$IFDEF FPC}SysUtils{$ELSE}System.SysUtils{$ENDIF},
{$IFDEF FPC}Classes{$ELSE}System.Classes{$ENDIF}, {$IFDEF FPC}Classes{$ELSE}System.Classes{$ENDIF},
{$IFDEF FPC}DateUtils{$ELSE}System.DateUtils{$ENDIF}, {$IFDEF FPC}DateUtils{$ELSE}System.DateUtils{$ENDIF}
{$IFDEF FPC}SyncObjs{$ELSE}System.SyncObjs{$ENDIF} {$IF defined(MSWINDOWS) and not defined(FPC)},
{$IFDEF FPC}SyncObjs{$ELSE}System.SyncObjs{$ENDIF}
{$ENDIF}
{$IFNDEF MSWINDOWS}{$IFNDEF FPC},System.IOUtils{$ENDIF}{$ENDIF}; {$IFNDEF MSWINDOWS}{$IFNDEF FPC},System.IOUtils{$ENDIF}{$ENDIF};
type type
@@ -24,46 +24,46 @@ type
const const
CBaseTab='--------------------------'; CBaseTab='--------------------------';
public public
class function SisebleWordtoStr(i:word;size:int8):string;static;inline; class function SizeableWordtoStr(i:word;size:int8):string;static;inline;
class function GenerateLogString(s:string;o:TObject=nil):string;static;inline; class function GenerateLogString(const s:string;o:TObject=nil):string;static;inline;
procedure Tab();virtual; procedure Tab();virtual;
procedure UnTab();virtual; procedure UnTab();virtual;
procedure Write(Text:string;o:TObject=nil);overload;virtual;abstract; procedure Write(const Text:string;o:TObject=nil);overload;virtual;abstract;
destructor Destroy();override; destructor Destroy();override;
end; end;
TAGRamLog=class(TAGLog) TAGRamLog=class(TAGLog)
public public
buf:WideString; buf:String;
constructor Create();overload; constructor Create();
procedure Write(Text:string;o:TObject=nil);overload;override; procedure Write(const Text:string;o:TObject=nil);overload;override;
end; end;
TAGDiskLog=class(TAGLog) TAGDiskLog=class(TAGLog)
strict protected strict protected
{$IFNDEF MSWINDOWS} {$IF defined(MSWINDOWS) and not defined(FPC)}
Stream:TFileStream;//TStream; buf1:String;
{$ELSE}
buf1:WideString;
onbuf:boolean; onbuf:boolean;
LogHandle,ThreadHandle:NativeUInt; LogHandle,ThreadHandle:NativeUInt;
ThreadID:cardinal; ThreadID:cardinal;
Lock:TCriticalSection; Lock:TCriticalSection;
WantTerminate:Boolean; WantTerminate:Boolean;
{$ELSE}
Stream:TStream;
{$ENDIF} {$ENDIF}
public public
constructor Create(FileName:WideString);overload; constructor Create(const FileName:String);overload;
{$IFDEF MSWINDOWS} {$IF defined(MSWINDOWS) and not defined(FPC)}
procedure Init();stdcall; procedure Init();stdcall;
{$ENDIF} {$ENDIF}
procedure Write(Text:string;o:TObject=nil);overload;override; procedure Write(const Text:string;o:TObject=nil);overload;override;
destructor Destroy();overload;override; destructor Destroy();overload;override;
end; end;
TAGNullLog=class(TAGLog) TAGNullLog=class(TAGLog)
public public
constructor Create();overload; constructor Create();overload;
procedure Write(Text:string;o:TObject=nil);overload;override; procedure Write(const Text:string;o:TObject=nil);overload;override;
end; end;
{$IFDEF MSWINDOWS} {$IFDEF MSWINDOWS}
@@ -72,7 +72,7 @@ type
CommandLine:THandle; CommandLine:THandle;
public public
constructor Create(Handele:THandle);overload; constructor Create(Handele:THandle);overload;
procedure Write(Text:string;o:TObject=nil);overload;override; procedure Write(const Text:string;o:TObject=nil);overload;override;
destructor Destroy();overload;override; destructor Destroy();overload;override;
end; end;
{$ENDIF} {$ENDIF}
@@ -82,7 +82,7 @@ type
stream:TStream; stream:TStream;
public public
constructor Create(Astream:TStream);overload; constructor Create(Astream:TStream);overload;
procedure Write(Text:string;o:TObject=nil);overload;override; procedure Write(const Text:string;o:TObject=nil);overload;override;
end; end;
TAGCallBackLog=class(TAGLog) TAGCallBackLog=class(TAGLog)
@@ -92,7 +92,7 @@ type
CallBack:TCallBack; CallBack:TCallBack;
public public
constructor Create(ACallBack:TCallBack);overload; constructor Create(ACallBack:TCallBack);overload;
procedure Write(Text:string;o:TObject=nil);overload;override; procedure Write(const Text:string;o:TObject=nil);overload;override;
end; end;
TAGMultiLog=class(TAGLog) TAGMultiLog=class(TAGLog)
@@ -102,7 +102,7 @@ type
var var
Logs:TLogsList; Logs:TLogsList;
constructor Create(Default:TLogsList);overload; constructor Create(Default:TLogsList);overload;
procedure Write(Text:string;o:TObject=nil);overload;override; procedure Write(const Text:string;o:TObject=nil);overload;override;
procedure Tab();override; procedure Tab();override;
procedure UnTab();override; procedure UnTab();override;
destructor Destroy();overload;override; destructor Destroy();overload;override;
@@ -118,7 +118,7 @@ begin
Self.Write(CBaseTab+'Logging init-'+CBaseTab); Self.Write(CBaseTab+'Logging init-'+CBaseTab);
end; end;
class function TAGLog.SisebleWordtoStr(i:word;size:int8):string; class function TAGLog.SizeableWordtoStr(i:word;size:int8):string;
begin begin
Result:=IntToStr(i); Result:=IntToStr(i);
size:=size-Length(Result); size:=size-Length(Result);
@@ -131,7 +131,7 @@ begin
end; end;
end; end;
class function TAGLog.GenerateLogString(s:string;o:TObject=nil):string; class function TAGLog.GenerateLogString(const s:string;o:TObject=nil):string;
var var
D:TDateTime; D:TDateTime;
begin begin
@@ -144,10 +144,10 @@ if o<>nil then
{$ENDIF} {$ENDIF}
else else
Result:=''; Result:='';
Result:='['+Siseblewordtostr(DayOfTheMonth(D),2)+'.'+Siseblewordtostr(MonthOfTheYear(D),2)+'.'+ Result:='['+SizeableWordtoStr(DayOfTheMonth(D),2)+'.'+SizeableWordtoStr(MonthOfTheYear(D),2)+'.'+
Siseblewordtostr(YearOf(D),4)+' '+Siseblewordtostr(HourOfTheDay(D),2)+':'+ SizeableWordtoStr(YearOf(D),4)+' '+SizeableWordtoStr(HourOfTheDay(D),2)+':'+
Siseblewordtostr(MinuteOfTheHour(D),2)+':'+Siseblewordtostr(SecondOfTheMinute(D),2)+'.' SizeableWordtoStr(MinuteOfTheHour(D),2)+':'+SizeableWordtoStr(SecondOfTheMinute(D),2)+'.'
+Siseblewordtostr(MilliSecondOfTheSecond(D),3)+'] '+Result+s+sLineBreak; +SizeableWordtoStr(MilliSecondOfTheSecond(D),3)+'] '+Result+s+sLineBreak;
end; end;
procedure TAGLog.Tab(); procedure TAGLog.Tab();
@@ -158,6 +158,8 @@ end;
procedure TAGLog.UnTab(); procedure TAGLog.UnTab();
begin begin
if tabs=0 then
Exit;
dec(tabs); dec(tabs);
Delete(tabstr,1,2); Delete(tabstr,1,2);
end; end;
@@ -176,13 +178,13 @@ tabstr:='';
inherited Create; inherited Create;
end; end;
procedure TAGRamLog.Write(Text:string;o:TObject=nil); procedure TAGRamLog.Write(const Text:string;o:TObject=nil);
begin begin
buf:=buf+GenerateLogString(tabstr+Text,o); buf:=buf+GenerateLogString(tabstr+Text,o);
end; end;
constructor TAGDiskLog.Create(FileName:WideString); constructor TAGDiskLog.Create(const FileName:String);
{$IFDEF MSWINDOWS} {$IF defined(MSWINDOWS) and not defined(FPC)}
begin begin
Lock:=TCriticalSection.Create; Lock:=TCriticalSection.Create;
WantTerminate:=False; WantTerminate:=False;
@@ -199,7 +201,7 @@ begin
{$IFDEF FPC} {$IFDEF FPC}
Stream:=nil; Stream:=nil;
try try
Stream:=TFileStream.Create('test2.log',fmOpenRead); Stream:=TFileStream.Create('test2.log',fmOpenRead+fmShareDenyNone);
SetLength(s,Stream.Size); SetLength(s,Stream.Size);
Stream.Read(s[0],Stream.Size); Stream.Read(s[0],Stream.Size);
except except
@@ -220,7 +222,7 @@ begin
inherited Create; inherited Create;
end; end;
{$IFDEF MSWINDOWS} {$IF defined(MSWINDOWS) and not defined(FPC)}
procedure TAGDiskLog.Init();stdcall; procedure TAGDiskLog.Init();stdcall;
var var
n:cardinal; n:cardinal;
@@ -254,8 +256,8 @@ end;
end; end;
{$ENDIF} {$ENDIF}
procedure TAGDiskLog.Write(Text:string;o:TObject=nil); procedure TAGDiskLog.Write(const Text:string;o:TObject=nil);
{$IFDEF MSWINDOWS} {$IF defined(MSWINDOWS) and not defined(FPC)}
begin begin
Lock.Enter; Lock.Enter;
buf1:=buf1+GenerateLogString(tabstr+text,o); buf1:=buf1+GenerateLogString(tabstr+text,o);
@@ -276,7 +278,7 @@ end;
destructor TAGDiskLog.Destroy(); destructor TAGDiskLog.Destroy();
begin begin
inherited; inherited;
{$IFDEF MSWINDOWS} {$IF defined(MSWINDOWS) and not defined(FPC)}
WantTerminate:=True; WantTerminate:=True;
While WantTerminate do While WantTerminate do
sleep(0); sleep(0);
@@ -294,7 +296,7 @@ begin
inherited; inherited;
end; end;
procedure TAGNullLog.Write(Text:string;o:TObject=nil); procedure TAGNullLog.Write(const Text:string;o:TObject=nil);
begin begin
end; end;
@@ -307,18 +309,19 @@ CommandLine:=Handele;
inherited Create; inherited Create;
end; end;
procedure TAGCommandLineLog.Write(Text:string;o:TObject=nil); procedure TAGCommandLineLog.Write(const Text:string;o:TObject=nil);
var var
p:PWideChar; p:PChar;
temptext:string;
a,b:cardinal; a,b:cardinal;
begin begin
Text:=GenerateLogString(tabstr+text,o); temptext:=GenerateLogString(tabstr+text,o);
p:=addr(Text[1]); p:=addr(temptext[1]);
a:=length(Text); a:=length(temptext);
while a<>0 do while a<>0 do
begin begin
b:=0; b:=0;
WriteConsoleW(CommandLine,p,a,b,nil); {$IFDEF FPC}WriteConsoleA(CommandLine,p,a,b,nil);{$ELSE}WriteConsoleW(CommandLine,p,a,b,nil);{$ENDIF}
inc(p,b); inc(p,b);
dec(a,b); dec(a,b);
end; end;
@@ -327,6 +330,7 @@ end;
destructor TAGCommandLineLog.Destroy(); destructor TAGCommandLineLog.Destroy();
begin begin
inherited; inherited;
if CommandLine<>GetStdHandle(STD_OUTPUT_HANDLE) then
CloseHandle(CommandLine); CloseHandle(CommandLine);
end; end;
{$ENDIF} {$ENDIF}
@@ -339,7 +343,7 @@ stream:=Astream;
inherited Create; inherited Create;
end; end;
procedure TAGStreamLog.Write(Text:string;o:TObject=nil); procedure TAGStreamLog.Write(const Text:string;o:TObject=nil);
var var
s:string; s:string;
begin begin
@@ -355,7 +359,7 @@ CallBack:=ACallBack;
inherited Create; inherited Create;
end; end;
procedure TAGCallBackLog.Write(Text:string;o:TObject=nil); procedure TAGCallBackLog.Write(const Text:string;o:TObject=nil);
begin begin
CallBack(GenerateLogString(Text,o)); CallBack(GenerateLogString(Text,o));
end; end;
@@ -371,7 +375,7 @@ else
Logs:=TLogsList.Create; Logs:=TLogsList.Create;
end; end;
procedure TAGMultiLog.Write(Text:string;o:TObject=nil); procedure TAGMultiLog.Write(const Text:string;o:TObject=nil);
var var
i:TAGLog; i:TAGLog;
begin begin

View File

@@ -3,7 +3,9 @@ program fpcunitproject1;
{$mode objfpc}{$H+} {$mode objfpc}{$H+}
uses uses
Classes, consoletestrunner, TestCase1; Classes,
consoletestrunner,
TestCase1;
type type
@@ -11,7 +13,7 @@ type
TMyTestRunner = class(TTestRunner) TMyTestRunner = class(TTestRunner)
protected protected
// override the protected methods of TTestRunner to customize its behavior // override the protected methods of TTestRunner to customize its behavior
end; end;
var var

View File

@@ -9,15 +9,15 @@
<Filename Value="fpcunitproject1.lpr"/> <Filename Value="fpcunitproject1.lpr"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<EditorIndex Value="-1"/> <EditorIndex Value="-1"/>
<CursorPos Y="23"/> <UsageCount Value="195"/>
<UsageCount Value="194"/>
</Unit0> </Unit0>
<Unit1> <Unit1>
<Filename Value="testcase1.pas"/> <Filename Value="testcase1.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="TestCase1"/> <UnitName Value="TestCase1"/>
<CursorPos X="116" Y="32"/> <TopLine Value="22"/>
<UsageCount Value="194"/> <CursorPos X="5" Y="35"/>
<UsageCount Value="195"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit1> </Unit1>
<Unit2> <Unit2>
@@ -25,9 +25,8 @@
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<IsVisibleTab Value="True"/> <IsVisibleTab Value="True"/>
<EditorIndex Value="1"/> <EditorIndex Value="1"/>
<TopLine Value="362"/> <CursorPos X="69" Y="22"/>
<CursorPos X="34" Y="376"/> <UsageCount Value="195"/>
<UsageCount Value="194"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit2> </Unit2>
<Unit3> <Unit3>
@@ -38,22 +37,22 @@
<UsageCount Value="4"/> <UsageCount Value="4"/>
</Unit3> </Unit3>
</Units> </Units>
<JumpHistory Count="30" HistoryIndex="29"> <JumpHistory Count="29" HistoryIndex="28">
<Position1> <Position1>
<Filename Value="..\AG.Logs.pas"/> <Filename Value="testcase1.pas"/>
<Caret Line="34" Column="38" TopLine="10"/> <Caret Line="48" Column="58" TopLine="34"/>
</Position1> </Position1>
<Position2> <Position2>
<Filename Value="testcase1.pas"/> <Filename Value="testcase1.pas"/>
<Caret Line="29" TopLine="4"/> <Caret Line="17" Column="26" TopLine="5"/>
</Position2> </Position2>
<Position3> <Position3>
<Filename Value="testcase1.pas"/> <Filename Value="testcase1.pas"/>
<Caret Line="41" Column="51" TopLine="28"/> <Caret Line="50" Column="58" TopLine="35"/>
</Position3> </Position3>
<Position4> <Position4>
<Filename Value="testcase1.pas"/> <Filename Value="testcase1.pas"/>
<Caret Line="48" Column="53" TopLine="9"/> <Caret Line="48" Column="63" TopLine="24"/>
</Position4> </Position4>
<Position5> <Position5>
<Filename Value="testcase1.pas"/> <Filename Value="testcase1.pas"/>
@@ -61,104 +60,98 @@
</Position5> </Position5>
<Position6> <Position6>
<Filename Value="testcase1.pas"/> <Filename Value="testcase1.pas"/>
<Caret Line="48" Column="58" TopLine="34"/> <Caret Line="48" Column="59" TopLine="33"/>
</Position6> </Position6>
<Position7> <Position7>
<Filename Value="testcase1.pas"/> <Filename Value="testcase1.pas"/>
<Caret Line="17" Column="26" TopLine="5"/> <Caret Line="21" TopLine="6"/>
</Position7> </Position7>
<Position8> <Position8>
<Filename Value="testcase1.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="50" Column="58" TopLine="35"/> <Caret Line="25" Column="27" TopLine="13"/>
</Position8> </Position8>
<Position9> <Position9>
<Filename Value="testcase1.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="48" Column="63" TopLine="24"/> <Caret Line="32" Column="57" TopLine="11"/>
</Position9> </Position9>
<Position10> <Position10>
<Filename Value="testcase1.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="19" Column="11" TopLine="5"/> <Caret Line="328" Column="7" TopLine="305"/>
</Position10> </Position10>
<Position11> <Position11>
<Filename Value="testcase1.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="48" Column="59" TopLine="33"/> <Caret Line="317" Column="25" TopLine="315"/>
</Position11> </Position11>
<Position12> <Position12>
<Filename Value="testcase1.pas"/> <Filename Value="testcase1.pas"/>
<Caret Line="21" TopLine="6"/> <Caret Line="28" Column="50" TopLine="15"/>
</Position12> </Position12>
<Position13> <Position13>
<Filename Value="..\AG.Logs.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="25" Column="27" TopLine="13"/> <Caret Line="21" Column="7" TopLine="7"/>
</Position13> </Position13>
<Position14> <Position14>
<Filename Value="..\AG.Logs.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="32" Column="57" TopLine="11"/> <Caret Line="64" Column="35" TopLine="50"/>
</Position14> </Position14>
<Position15> <Position15>
<Filename Value="..\AG.Logs.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="328" Column="7" TopLine="305"/> <Caret Line="28" Column="30" TopLine="10"/>
</Position15> </Position15>
<Position16> <Position16>
<Filename Value="..\AG.Logs.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="317" Column="25" TopLine="315"/> <Caret Line="134" Column="47" TopLine="134"/>
</Position16> </Position16>
<Position17> <Position17>
<Filename Value="testcase1.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="28" Column="50" TopLine="15"/> <Caret Line="179" Column="32" TopLine="165"/>
</Position17> </Position17>
<Position18> <Position18>
<Filename Value="..\AG.Logs.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="21" Column="7" TopLine="7"/> <Caret Line="184" Column="37" TopLine="170"/>
</Position18> </Position18>
<Position19> <Position19>
<Filename Value="..\AG.Logs.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="64" Column="35" TopLine="50"/> <Caret Line="257" Column="33" TopLine="243"/>
</Position19> </Position19>
<Position20> <Position20>
<Filename Value="..\AG.Logs.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="28" Column="30" TopLine="10"/> <Caret Line="297" Column="33" TopLine="283"/>
</Position20> </Position20>
<Position21> <Position21>
<Filename Value="..\AG.Logs.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="134" Column="47" TopLine="134"/> <Caret Line="310" Column="40" TopLine="296"/>
</Position21> </Position21>
<Position22> <Position22>
<Filename Value="..\AG.Logs.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="179" Column="32" TopLine="165"/> <Caret Line="312" Column="6" TopLine="301"/>
</Position22> </Position22>
<Position23> <Position23>
<Filename Value="..\AG.Logs.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="184" Column="37" TopLine="170"/> <Caret Line="324" Column="21" TopLine="301"/>
</Position23> </Position23>
<Position24> <Position24>
<Filename Value="..\AG.Logs.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="257" Column="33" TopLine="243"/> <Caret Line="344" Column="35" TopLine="330"/>
</Position24> </Position24>
<Position25> <Position25>
<Filename Value="..\AG.Logs.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="297" Column="33" TopLine="283"/> <Caret Line="360" Column="37" TopLine="346"/>
</Position25> </Position25>
<Position26> <Position26>
<Filename Value="..\AG.Logs.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="310" Column="40" TopLine="296"/> <Caret Line="368" Column="34" TopLine="362"/>
</Position26> </Position26>
<Position27> <Position27>
<Filename Value="..\AG.Logs.pas"/> <Filename Value="testcase1.pas"/>
<Caret Line="312" Column="6" TopLine="301"/>
</Position27> </Position27>
<Position28> <Position28>
<Filename Value="..\AG.Logs.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="324" Column="21" TopLine="301"/>
</Position28> </Position28>
<Position29> <Position29>
<Filename Value="..\AG.Logs.pas"/> <Filename Value="..\AG.Logs.pas"/>
<Caret Line="344" Column="35" TopLine="330"/> <Caret Line="8" Column="47"/>
</Position29> </Position29>
<Position30>
<Filename Value="..\AG.Logs.pas"/>
<Caret Line="360" Column="37" TopLine="346"/>
</Position30>
</JumpHistory> </JumpHistory>
</ProjectSession> </ProjectSession>
<Debugging> <Debugging>

View File

@@ -5,50 +5,53 @@ unit TestCase1;
interface interface
uses uses
Classes, SysUtils, fpcunit, testutils, testregistry, AG.Logs{$IFDEF MSWINDOWS},Windows{$ENDIF}; Classes, SysUtils, fpcunit, testutils, testregistry,
AG.Logs{$IFDEF MSWINDOWS}, Windows{$ENDIF};
type type
TTestCase1 = class(TTestCase)
TTestCase1= class(TTestCase)
published published
procedure TestHookUp; procedure TestHookUp;
end; end;
implementation implementation
procedure Test(s:string); procedure Test(s: string);
begin begin
Write(s); Write(s);
end; end;
procedure TTestCase1.TestHookUp; procedure TTestCase1.TestHookUp;
var var
MultiLog:TAGLog; MultiLog: TAGLog;
Stream:TStream; Stream: TStream;
s:TBytes; s: TBytes;
begin begin
MultiLog:=TAGMultiLog.Create(nil); MultiLog := TAGMultiLog.Create(nil);
(MultiLog as TAGMultiLog).Logs.Add(TAGNullLog.Create()); (MultiLog as TAGMultiLog).Logs.Add(TAGNullLog.Create());
(MultiLog as TAGMultiLog).Logs.Add(TAGDiskLog.Create('test.log')); (MultiLog as TAGMultiLog).Logs.Add(TAGDiskLog.Create('test.log'));
(MultiLog as TAGMultiLog).Logs.Add(TAGRamLog.Create()); (MultiLog as TAGMultiLog).Logs.Add(TAGRamLog.Create());
{$IFDEF MSWINDOWS}(MultiLog as TAGMultiLog).Logs.Add(TAGCommandLineLog.Create(GetStdHandle(STD_OUTPUT_HANDLE))){$ENDIF}; {$IFDEF MSWINDOWS}
Stream:=nil; (MultiLog as TAGMultiLog).Logs.Add(TAGCommandLineLog.Create(GetStdHandle(STD_OUTPUT_HANDLE)));
try {$ENDIF}
Stream:=TFileStream.Create('test2.log',fmOpenRead+fmShareDenyNone); Stream := nil;
SetLength(s,Stream.Size); try
Stream.Read(s[0],Stream.Size); Stream := TFileStream.Create('test2.log', fmOpenRead + fmShareDenyNone);
except SetLength(s, Stream.Size);
SetLength(s,0); Stream.Read(s[0], Stream.Size);
end; except
FreeAndNil(Stream); SetLength(s, 0);
Stream:=TFileStream.Create('test2.log',fmCreate+fmOpenReadWrite+fmShareDenyWrite); end;
Stream.Write(s[0],Length(s)); FreeAndNil(Stream);
(MultiLog as TAGMultiLog).Logs.Add(TAGStreamLog.Create(Stream)); Stream := TFileStream.Create('test2.log', fmCreate + fmOpenReadWrite +
SetLength(s,0); fmShareDenyWrite);
(MultiLog as TAGMultiLog).Logs.Add(TAGCallBackLog.Create(@Test)); Stream.Write(s[0], Length(s));
MultiLog.Write('Str Test'); (MultiLog as TAGMultiLog).Logs.Add(TAGStreamLog.Create(Stream));
MultiLog.Write('Str+Object Test',self); SetLength(s, 0);
FreeAndNil(MultiLog); (MultiLog as TAGMultiLog).Logs.Add(TAGCallBackLog.Create(@Test));
MultiLog.Write('Str Test');
MultiLog.Write('Str+Object Test', self);
FreeAndNil(MultiLog);
end; end;
@@ -57,4 +60,3 @@ initialization
RegisterTest(TTestCase1); RegisterTest(TTestCase1);
end. end.

View File

@@ -3,11 +3,12 @@ program Project2;
{$IFNDEF TESTINSIGHT} {$IFNDEF TESTINSIGHT}
{$APPTYPE CONSOLE} {$APPTYPE CONSOLE}
{$ENDIF}{$STRONGLINKTYPES ON} {$ENDIF}{$STRONGLINKTYPES ON}
uses uses
SysUtils, SysUtils,
{$IFDEF TESTINSIGHT} {$IFDEF TESTINSIGHT}
TestInsight.DUnitX, TestInsight.DUnitX,
{$ENDIF } {$ENDIF }
DUnitX.Loggers.Console, DUnitX.Loggers.Console,
DUnitX.Loggers.Xml.NUnit, DUnitX.Loggers.Xml.NUnit,
DUnitX.TestFramework, DUnitX.TestFramework,
@@ -15,46 +16,50 @@ uses
AG.Logs in '..\AG.Logs.pas'; AG.Logs in '..\AG.Logs.pas';
var var
runner : ITestRunner; runner: ITestRunner;
results : IRunResults; results: IRunResults;
logger : ITestLogger; logger: ITestLogger;
nunitLogger : ITestLogger; nunitLogger: ITestLogger;
begin begin
{$IFDEF TESTINSIGHT} {$IFDEF TESTINSIGHT}
TestInsight.DUnitX.RunRegisteredTests; TestInsight.DUnitX.RunRegisteredTests;
exit; exit;
{$ENDIF} {$ENDIF}
try try
//Check command line options, will exit if invalid // Check command line options, will exit if invalid
TDUnitX.CheckCommandLine; TDUnitX.CheckCommandLine;
//Create the test runner // Create the test runner
runner := TDUnitX.CreateRunner; runner := TDUnitX.CreateRunner;
//Tell the runner to use RTTI to find Fixtures // Tell the runner to use RTTI to find Fixtures
runner.UseRTTI := True; runner.UseRTTI := True;
//tell the runner how we will log things // tell the runner how we will log things
//Log to the console window // Log to the console window
logger := TDUnitXConsoleLogger.Create(true); logger := TDUnitXConsoleLogger.Create(True);
runner.AddLogger(logger); runner.AddLogger(logger);
//Generate an NUnit compatible XML File // Generate an NUnit compatible XML File
nunitLogger := TDUnitXXMLNUnitFileLogger.Create(TDUnitX.Options.XMLOutputFile); nunitLogger := TDUnitXXMLNUnitFileLogger.Create
(TDUnitX.Options.XMLOutputFile);
runner.AddLogger(nunitLogger); runner.AddLogger(nunitLogger);
runner.FailsOnNoAsserts := False; //When true, Assertions must be made during tests; runner.FailsOnNoAsserts := False;
// When true, Assertions must be made during tests;
//Run tests // Run tests
results := runner.Execute; results := runner.Execute;
if not results.AllPassed then if not results.AllPassed then
System.ExitCode := EXIT_ERRORS; System.ExitCode := EXIT_ERRORS;
{$IFNDEF CI} {$IFNDEF CI}
//We don't want this happening when running under CI. // We don't want this happening when running under CI.
if TDUnitX.Options.ExitBehavior = TDUnitXExitBehavior.Pause then if TDUnitX.Options.ExitBehavior = TDUnitXExitBehavior.Pause then
begin begin
System.Write('Done.. press <Enter> key to quit.'); System.Write('Done.. press <Enter> key to quit.');
System.Readln; System.Readln;
end; end;
{$ENDIF} {$ENDIF}
except except
on E: Exception do on E: Exception do
System.Writeln(E.ClassName, ': ', E.Message); System.Writeln(E.ClassName, ': ', E.Message);
end; end;
end. end.

View File

@@ -81,6 +81,8 @@
<DCC_RemoteDebug>true</DCC_RemoteDebug> <DCC_RemoteDebug>true</DCC_RemoteDebug>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''"> <PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
<Manifest_File>None</Manifest_File>
<VerInfo_Locale>1033</VerInfo_Locale>
<DCC_RemoteDebug>false</DCC_RemoteDebug> <DCC_RemoteDebug>false</DCC_RemoteDebug>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''"> <PropertyGroup Condition="'$(Cfg_2)'!=''">
@@ -115,6 +117,10 @@
<Source> <Source>
<Source Name="MainSource">Project2.dpr</Source> <Source Name="MainSource">Project2.dpr</Source>
</Source> </Source>
<Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dcloffice2k220.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dclofficexp220.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
</Excluded_Packages>
</Delphi.Personality> </Delphi.Personality>
<Deployment Version="1"> <Deployment Version="1">
<DeployFile LocalName="Win32\Debug\Project2.exe" Configuration="Debug" Class="ProjectOutput"> <DeployFile LocalName="Win32\Debug\Project2.exe" Configuration="Debug" Class="ProjectOutput">
@@ -451,13 +457,13 @@
<Operation>1</Operation> <Operation>1</Operation>
</Platform> </Platform>
</DeployClass> </DeployClass>
<ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/> <ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/> <ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/> <ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/> <ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="OSX32" Name="$(PROJECTNAME)"/> <ProjectRoot Platform="OSX32" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="iOSSimulator" Name="$(PROJECTNAME).app"/> <ProjectRoot Platform="iOSSimulator" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/>
</Deployment> </Deployment>
<Platforms> <Platforms>
<Platform value="OSX32">True</Platform> <Platform value="OSX32">True</Platform>

View File

@@ -1,8 +1,10 @@
unit Unit2; unit Unit2;
interface interface
uses uses
DUnitX.TestFramework,AG.Logs,System.Classes,System.IOUtils,System.SysUtils,Winapi.Windows; DUnitX.TestFramework, AG.Logs, System.Classes, System.IOUtils,
System.SysUtils, Winapi.Windows;
type type
@@ -20,32 +22,34 @@ implementation
procedure TMyTestObject.Test1; procedure TMyTestObject.Test1;
var var
MultiLog:TAGLog; MultiLog: TAGLog;
Stream:TStream; Stream: TStream;
s:TBytes; s: TBytes;
begin begin
MultiLog:=TAGMultiLog.Create(nil); MultiLog := TAGMultiLog.Create(nil);
(MultiLog as TAGMultiLog).Logs.Add(TAGNullLog.Create()); (MultiLog as TAGMultiLog).Logs.Add(TAGNullLog.Create());
(MultiLog as TAGMultiLog).Logs.Add(TAGDiskLog.Create('test.log')); (MultiLog as TAGMultiLog).Logs.Add(TAGDiskLog.Create('test.log'));
(MultiLog as TAGMultiLog).Logs.Add(TAGRamLog.Create()); (MultiLog as TAGMultiLog).Logs.Add(TAGRamLog.Create());
{$IFNDEF MSWINDOWS}(MultiLog as TAGMultiLog).Logs.Add(TAGCommandLineLog.Create(GetStdHandle(STD_OUTPUT_HANDLE))){$ENDIF}; {$IFNDEF MSWINDOWS}(MultiLog as TAGMultiLog).Logs.Add(TAGCommandLineLog.Create(GetStdHandle(STD_OUTPUT_HANDLE))){$ENDIF};
try try
s:=TFile.ReadAllBytes('test2.log'); s := TFile.ReadAllBytes('test2.log');
except except
s:=TBytes.Create(); s := TBytes.Create();
end; end;
Stream:=TFileStream.Create('test2.log',fmCreate+fmOpenReadWrite+fmShareDenyWrite); Stream := TFileStream.Create('test2.log', fmCreate + fmOpenReadWrite +
Stream.WriteBuffer(s,length(s)); fmShareDenyWrite);
(MultiLog as TAGMultiLog).Logs.Add(TAGStreamLog.Create(Stream)); Stream.WriteBuffer(s, length(s));
(MultiLog as TAGMultiLog).Logs.Add(TAGCallBackLog.Create(procedure(s:string) (MultiLog as TAGMultiLog).Logs.Add(TAGStreamLog.Create(Stream));
begin (MultiLog as TAGMultiLog)
Self.WriteLn(s); .Logs.Add(TAGCallBackLog.Create(procedure(s: string)
end));{} begin Self.WriteLn(s); end)); { }
MultiLog.Write('Str Test'); MultiLog.Write('Str Test');
MultiLog.Write('Str+Object Test',self); MultiLog.Write('Str+Object Test', Self);
FreeAndNil(MultiLog); FreeAndNil(MultiLog);
end; end;
initialization initialization
TDUnitX.RegisterTestFixture(TMyTestObject);
TDUnitX.RegisterTestFixture(TMyTestObject);
end. end.