const str optimization
This commit is contained in:
96
AG.Logs.pas
96
AG.Logs.pas
@@ -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}
|
||||||
|
{$IF defined(MSWINDOWS) and not defined(FPC)},
|
||||||
{$IFDEF FPC}SyncObjs{$ELSE}System.SyncObjs{$ENDIF}
|
{$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
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ program fpcunitproject1;
|
|||||||
{$mode objfpc}{$H+}
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, consoletestrunner, TestCase1;
|
Classes,
|
||||||
|
consoletestrunner,
|
||||||
|
TestCase1;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user