|
@@ -22,16 +22,21 @@ uses
|
|
classes, SysUtils, fpcunit, fpcunitreport;
|
|
classes, SysUtils, fpcunit, fpcunitreport;
|
|
|
|
|
|
type
|
|
type
|
|
|
|
+ TTestResultOption = (ttoSkipAddress,ttoSkipExceptionMessage,ttoErrorsOnly);
|
|
|
|
+ TTestResultOptions = set of TTestResultOption;
|
|
|
|
|
|
{ TPlainResultsWriter }
|
|
{ TPlainResultsWriter }
|
|
|
|
|
|
TPlainResultsWriter = class(TCustomResultsWriter)
|
|
TPlainResultsWriter = class(TCustomResultsWriter)
|
|
private
|
|
private
|
|
|
|
+ FTestResultOptions : TTestResultOptions;
|
|
FDoc: TStringList;
|
|
FDoc: TStringList;
|
|
FSuiteHeaderIdx: TFPList;
|
|
FSuiteHeaderIdx: TFPList;
|
|
FTempFailure: TTestFailure;
|
|
FTempFailure: TTestFailure;
|
|
function TimeFormat(ATiming: TDateTime): String;
|
|
function TimeFormat(ATiming: TDateTime): String;
|
|
protected
|
|
protected
|
|
|
|
+ procedure SetSkipAddressInfo(AValue: Boolean); override;
|
|
|
|
+ procedure SetSparse(AValue: Boolean); override;
|
|
procedure WriteTestHeader(ATest: TTest; ALevel: integer; ACount: integer); override;
|
|
procedure WriteTestHeader(ATest: TTest; ALevel: integer; ACount: integer); override;
|
|
procedure WriteTestFooter(ATest: TTest; ALevel: integer; ATiming: TDateTime); override;
|
|
procedure WriteTestFooter(ATest: TTest; ALevel: integer; ATiming: TDateTime); override;
|
|
procedure WriteSuiteHeader(ATestSuite: TTestSuite; ALevel: integer); override;
|
|
procedure WriteSuiteHeader(ATestSuite: TTestSuite; ALevel: integer); override;
|
|
@@ -47,9 +52,10 @@ type
|
|
procedure AddError(ATest: TTest; AError: TTestFailure); override;
|
|
procedure AddError(ATest: TTest; AError: TTestFailure); override;
|
|
end;
|
|
end;
|
|
|
|
|
|
-function TestSuiteAsPlain(aSuite:TTestSuite): string;
|
|
|
|
-function GetSuiteAsPlain(aSuite: TTestSuite): string;
|
|
|
|
-function TestResultAsPlain(aTestResult: TTestResult): string;
|
|
|
|
|
|
+
|
|
|
|
+function TestSuiteAsPlain(aSuite:TTestSuite; Options : TTestResultOptions = []): string;
|
|
|
|
+function GetSuiteAsPlain(aSuite: TTestSuite; Options : TTestResultOptions = []): string;
|
|
|
|
+function TestResultAsPlain(aTestResult: TTestResult; Options : TTestResultOptions = []): string;
|
|
|
|
|
|
implementation
|
|
implementation
|
|
|
|
|
|
@@ -83,7 +89,7 @@ begin
|
|
system.Assign(f, FileName);
|
|
system.Assign(f, FileName);
|
|
rewrite(f);
|
|
rewrite(f);
|
|
FDoc.Add('');
|
|
FDoc.Add('');
|
|
- FDoc.Add(TestResultAsPlain(aResult));
|
|
|
|
|
|
+ FDoc.Add(TestResultAsPlain(aResult,FTestResultOptions));
|
|
writeln(f, FDoc.Text);
|
|
writeln(f, FDoc.Text);
|
|
close(f);
|
|
close(f);
|
|
end;
|
|
end;
|
|
@@ -116,6 +122,7 @@ begin
|
|
if Not SkipTiming then
|
|
if Not SkipTiming then
|
|
S:=S + FormatDateTime(TimeFormat(ATiming), ATiming) + ' ';
|
|
S:=S + FormatDateTime(TimeFormat(ATiming), ATiming) + ' ';
|
|
S:=S + ATest.TestName;
|
|
S:=S + ATest.TestName;
|
|
|
|
+ if Assigned(FTempFailure) or (not Sparse) then
|
|
FDoc.Add(S);
|
|
FDoc.Add(S);
|
|
if Assigned(FTempFailure) then
|
|
if Assigned(FTempFailure) then
|
|
begin
|
|
begin
|
|
@@ -145,7 +152,7 @@ begin
|
|
FTempFailure := nil;
|
|
FTempFailure := nil;
|
|
end;
|
|
end;
|
|
|
|
|
|
-Function TPlainResultsWriter.TimeFormat(ATiming : TDateTime) : String;
|
|
|
|
|
|
+function TPlainResultsWriter.TimeFormat(ATiming: TDateTime): String;
|
|
|
|
|
|
Var
|
|
Var
|
|
M : Int64;
|
|
M : Int64;
|
|
@@ -159,6 +166,24 @@ begin
|
|
Result:='mm:'+Result;
|
|
Result:='mm:'+Result;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+procedure TPlainResultsWriter.SetSkipAddressInfo(AValue: Boolean);
|
|
|
|
+begin
|
|
|
|
+ inherited SetSkipAddressInfo(AValue);
|
|
|
|
+ if AValue then
|
|
|
|
+ Include(FTestResultOptions,ttoSkipAddress)
|
|
|
|
+ else
|
|
|
|
+ Exclude(FTestResultOptions,ttoSkipAddress);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TPlainResultsWriter.SetSparse(AValue: Boolean);
|
|
|
|
+begin
|
|
|
|
+ inherited SetSparse(AValue);
|
|
|
|
+ if AValue then
|
|
|
|
+ FTestResultOptions:=FTestResultOptions+[ttoSkipExceptionMessage,ttoErrorsOnly]
|
|
|
|
+ else
|
|
|
|
+ FTestResultOptions:=FTestResultOptions-[ttoSkipExceptionMessage,ttoErrorsOnly];
|
|
|
|
+end;
|
|
|
|
+
|
|
procedure TPlainResultsWriter.WriteSuiteFooter(ATestSuite: TTestSuite; ALevel: integer;
|
|
procedure TPlainResultsWriter.WriteSuiteFooter(ATestSuite: TTestSuite; ALevel: integer;
|
|
ATiming: TDateTime; ANumRuns: integer; ANumErrors: integer; ANumFailures: integer;
|
|
ATiming: TDateTime; ANumRuns: integer; ANumErrors: integer; ANumFailures: integer;
|
|
ANumIgnores: integer);
|
|
ANumIgnores: integer);
|
|
@@ -183,28 +208,39 @@ begin
|
|
FSuiteHeaderIdx.Add(Pointer(FDoc.Count - 1));
|
|
FSuiteHeaderIdx.Add(Pointer(FDoc.Count - 1));
|
|
end;
|
|
end;
|
|
|
|
|
|
-function TestSuiteAsPlain(aSuite:TTestSuite): string;
|
|
|
|
|
|
+function TestSuiteAsPlain(aSuite:TTestSuite; Options : TTestResultOptions = []): string;
|
|
var
|
|
var
|
|
i: integer;
|
|
i: integer;
|
|
begin
|
|
begin
|
|
Result := '';
|
|
Result := '';
|
|
for i := 0 to aSuite.Tests.Count - 1 do
|
|
for i := 0 to aSuite.Tests.Count - 1 do
|
|
if TTest(aSuite.Tests.Items[i]) is TTestSuite then
|
|
if TTest(aSuite.Tests.Items[i]) is TTestSuite then
|
|
- Result := Result + TestSuiteAsPlain(TTestSuite(aSuite.Tests.Items[i]))
|
|
|
|
|
|
+ Result := Result + TestSuiteAsPlain(TTestSuite(aSuite.Tests.Items[i]),Options)
|
|
else
|
|
else
|
|
if TTest(aSuite.Tests.Items[i]) is TTestCase then
|
|
if TTest(aSuite.Tests.Items[i]) is TTestCase then
|
|
Result := Result + ' ' + ASuite.TestName+'.' + TTestcase(aSuite.Tests.Items[i]).TestName + System.sLineBreak;
|
|
Result := Result + ' ' + ASuite.TestName+'.' + TTestcase(aSuite.Tests.Items[i]).TestName + System.sLineBreak;
|
|
end;
|
|
end;
|
|
|
|
|
|
-function GetSuiteAsPlain(aSuite: TTestSuite): string;
|
|
|
|
|
|
+function GetSuiteAsPlain(aSuite: TTestSuite; Options : TTestResultOptions = []): string;
|
|
begin
|
|
begin
|
|
Result := '';
|
|
Result := '';
|
|
-
|
|
|
|
if aSuite <> nil then
|
|
if aSuite <> nil then
|
|
- Result := 'TestSuites: ' + System.sLineBreak + TestSuiteAsPlain(aSuite);
|
|
|
|
|
|
+ Result := 'TestSuites: ' + System.sLineBreak + TestSuiteAsPlain(aSuite,Options);
|
|
end;
|
|
end;
|
|
|
|
|
|
-function TestResultAsPlain(aTestResult: TTestResult): string;
|
|
|
|
|
|
+function TestResultAsPlain(aTestResult: TTestResult; Options : TTestResultOptions = []): string;
|
|
|
|
+
|
|
|
|
+ Procedure WriteFailure(F : TTestFailure; SkipAddress : Boolean = False );
|
|
|
|
+
|
|
|
|
+ begin
|
|
|
|
+ Result := Result + ' Message: ' + f.AsString + System.sLineBreak;
|
|
|
|
+ Result := Result + ' Exception class: ' + f.ExceptionClassName + System.sLineBreak;
|
|
|
|
+ if not (ttoSkipExceptionMessage in options) then
|
|
|
|
+ Result := Result + ' Exception message: ' + f.ExceptionMessage + System.sLineBreak;
|
|
|
|
+ if not (SkipAddress or (ttoSkipAddress in options) )then
|
|
|
|
+ Result := Result + ' at ' + f.LocationInfo + System.sLineBreak;
|
|
|
|
+ end;
|
|
|
|
+
|
|
var
|
|
var
|
|
i: longint;
|
|
i: longint;
|
|
f: TTestFailure;
|
|
f: TTestFailure;
|
|
@@ -223,11 +259,7 @@ begin
|
|
begin
|
|
begin
|
|
Result := Result + System.sLineBreak;
|
|
Result := Result + System.sLineBreak;
|
|
Result := Result + ' Error: ' + System.sLineBreak;
|
|
Result := Result + ' Error: ' + System.sLineBreak;
|
|
- f := TTestFailure(Errors.Items[i]);
|
|
|
|
- Result := Result + ' Message: ' + f.AsString + System.sLineBreak;
|
|
|
|
- Result := Result + ' Exception class: ' + f.ExceptionClassName + System.sLineBreak;
|
|
|
|
- Result := Result + ' Exception message: ' + f.ExceptionMessage + System.sLineBreak;
|
|
|
|
- Result := Result + ' at ' + f.LocationInfo + System.sLineBreak;
|
|
|
|
|
|
+ WriteFailure(TTestFailure(Errors.Items[i]));
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
if NumberOfFailures <> 0 then
|
|
if NumberOfFailures <> 0 then
|
|
@@ -238,11 +270,7 @@ begin
|
|
for i := 0 to Failures.Count - 1 do
|
|
for i := 0 to Failures.Count - 1 do
|
|
begin
|
|
begin
|
|
Result := Result + ' Failure: ' + System.sLineBreak;
|
|
Result := Result + ' Failure: ' + System.sLineBreak;
|
|
- f := TTestFailure(Failures.Items[i]);
|
|
|
|
- Result := Result + ' Message: ' + f.AsString + System.sLineBreak;
|
|
|
|
- Result := Result + ' Exception class: ' + f.ExceptionClassName + System.sLineBreak;
|
|
|
|
- Result := Result + ' Exception message: ' + f.ExceptionMessage + System.sLineBreak;
|
|
|
|
- Result := Result + ' at ' + f.LocationInfo + System.sLineBreak;
|
|
|
|
|
|
+ WriteFailure(TTestFailure(Failures.Items[i]));
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
if NumberOfIgnoredTests <> 0 then
|
|
if NumberOfIgnoredTests <> 0 then
|
|
@@ -253,10 +281,7 @@ begin
|
|
for i := 0 to IgnoredTests.Count - 1 do
|
|
for i := 0 to IgnoredTests.Count - 1 do
|
|
begin
|
|
begin
|
|
Result := Result + ' Ignored test: ' + System.sLineBreak;
|
|
Result := Result + ' Ignored test: ' + System.sLineBreak;
|
|
- f := TTestFailure(IgnoredTests.Items[i]);
|
|
|
|
- Result := Result + ' Message: ' + f.AsString + System.sLineBreak;
|
|
|
|
- Result := Result + ' Exception class: ' + f.ExceptionClassName + System.sLineBreak;
|
|
|
|
- Result := Result + ' Exception message: ' + f.ExceptionMessage + System.sLineBreak;
|
|
|
|
|
|
+ WriteFailure(TTestFailure(IgnoredTests.Items[i]),True);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|