plaintestreport.pp 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. {$mode objfpc}
  2. {$h+}
  3. {
  4. This file is part of the Free Component Library (FCL)
  5. Copyright (c) 2006 by Dean Zobec
  6. an example of plain text report for FPCUnit tests.
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************}
  13. unit plaintestreport;
  14. interface
  15. uses
  16. classes, SysUtils, fpcunit, fpcunitreport;
  17. type
  18. TPlainResultsWriter = class(TCustomResultsWriter)
  19. private
  20. FDoc: TStringList;
  21. FSuiteHeaderIdx: TFPList;
  22. FTempFailure: TTestFailure;
  23. protected
  24. procedure WriteTestHeader(ATest: TTest; ALevel: integer; ACount: integer); override;
  25. procedure WriteTestFooter(ATest: TTest; ALevel: integer; ATiming: TDateTime); override;
  26. procedure WriteSuiteHeader(ATestSuite: TTestSuite; ALevel: integer); override;
  27. procedure WriteSuiteFooter(ATestSuite: TTestSuite; ALevel: integer;
  28. ATiming: TDateTime; ANumRuns: integer; ANumErrors: integer;
  29. ANumFailures: integer; ANumIgnores: integer); override;
  30. public
  31. constructor Create(aOwner: TComponent); override;
  32. destructor Destroy; override;
  33. procedure WriteHeader; override;
  34. procedure WriteResult(aResult: TTestResult); override;
  35. procedure AddFailure(ATest: TTest; AFailure: TTestFailure); override;
  36. procedure AddError(ATest: TTest; AError: TTestFailure); override;
  37. end;
  38. function TestSuiteAsPlain(aSuite:TTestSuite): string;
  39. function GetSuiteAsPlain(aSuite: TTestSuite): string;
  40. function TestResultAsPlain(aTestResult: TTestResult): string;
  41. implementation
  42. {TPlainResultsWriter}
  43. constructor TPlainResultsWriter.Create(aOwner: TComponent);
  44. begin
  45. inherited Create(aOwner);
  46. FDoc := TStringList.Create;
  47. FSuiteHeaderIdx := TFPList.Create;
  48. FTempFailure := nil;
  49. end;
  50. destructor TPlainResultsWriter.Destroy;
  51. begin
  52. FDoc.Free;
  53. FSuiteHeaderIdx.Free;
  54. inherited Destroy;
  55. end;
  56. procedure TPlainResultsWriter.WriteHeader;
  57. begin
  58. end;
  59. procedure TPlainResultsWriter.WriteResult(aResult: TTestResult);
  60. var
  61. f: text;
  62. begin
  63. system.Assign(f, FileName);
  64. rewrite(f);
  65. FDoc.Add('');
  66. FDoc.Add(TestResultAsPlain(aResult));
  67. writeln(f, FDoc.Text);
  68. close(f);
  69. end;
  70. procedure TPlainResultsWriter.AddFailure(ATest: TTest; AFailure: TTestFailure);
  71. begin
  72. inherited AddFailure(ATest, AFailure);
  73. FTempFailure := AFailure;
  74. end;
  75. procedure TPlainResultsWriter.AddError(ATest: TTest; AError: TTestFailure);
  76. begin
  77. inherited AddError(ATest, AError);
  78. FTempFailure := AError;
  79. end;
  80. procedure TPlainResultsWriter.WriteTestHeader(ATest: TTest; ALevel: integer; ACount: integer);
  81. begin
  82. inherited;
  83. end;
  84. procedure TPlainResultsWriter.WriteTestFooter(ATest: TTest; ALevel: integer; ATiming: TDateTime);
  85. begin
  86. inherited;
  87. FDoc.Add(' ' + StringOfChar(' ',ALevel*2) + FormatDateTime('ss.zzz', ATiming) + ' '
  88. + ATest.TestName);
  89. if Assigned(FTempFailure) then
  90. begin
  91. //check if it's an error
  92. if not FTempFailure.IsFailure then
  93. begin
  94. FDoc[FDoc.Count -1] := FDoc[FDoc.Count -1] + ' Error: ' + FTempFailure.ExceptionClassName;
  95. FDoc.Add(StringOfChar(' ',ALevel*2) + ' Exception: ' + FTempFailure.ExceptionMessage);
  96. FDoc.Add(StringOfChar(' ',ALevel*2) + ' Source unit: ' + FTempFailure.SourceUnitName);
  97. FDoc.Add(StringOfChar(' ',ALevel*2) + ' Method name: ' + FTempFailure.FailedMethodName);
  98. FDoc.Add(StringOfChar(' ',ALevel*2) + ' Line number: '
  99. + IntToStr(FTempFailure.LineNumber));
  100. end
  101. else
  102. if FTempFailure.IsIgnoredTest then
  103. begin
  104. FDoc[FDoc.Count -1] := FDoc[FDoc.Count -1] + ' Ignored test: '
  105. + FTempFailure.ExceptionMessage;
  106. end
  107. else
  108. //is a failure
  109. FDoc[FDoc.Count -1] := FDoc[FDoc.Count -1] + ' Failed: '
  110. + FTempFailure.ExceptionMessage;
  111. end;
  112. FTempFailure := nil;
  113. end;
  114. procedure TPlainResultsWriter.WriteSuiteFooter(ATestSuite: TTestSuite; ALevel: integer;
  115. ATiming: TDateTime; ANumRuns: integer; ANumErrors: integer; ANumFailures: integer;
  116. ANumIgnores: integer);
  117. var
  118. idx: integer;
  119. begin
  120. inherited;
  121. idx := Integer(FSuiteHeaderIdx[FSuiteHeaderIdx.Count -1]);
  122. FDoc[idx] := FDoc[idx] + ' Time:'+ FormatDateTime('ss.zzz', ATiming)+
  123. ' N:'+ IntToStr(ANumRuns)+ ' E:'+ IntToStr(ANumErrors)+ ' F:'+ IntToStr(ANumFailures)+
  124. ' I:'+ IntToStr(ANumIgnores);
  125. FSuiteHeaderIdx.Delete(FSuiteHeaderIdx.Count -1);
  126. end;
  127. procedure TPlainResultsWriter.WriteSuiteHeader(ATestSuite: TTestSuite; ALevel: integer);
  128. begin
  129. inherited;
  130. FDoc.Add(StringOfChar(' ',ALevel*2) + ATestSuite.TestName);
  131. FSuiteHeaderIdx.Add(Pointer(FDoc.Count - 1));
  132. end;
  133. function TestSuiteAsPlain(aSuite:TTestSuite): string;
  134. var
  135. i: integer;
  136. begin
  137. Result := '';
  138. for i := 0 to aSuite.Tests.Count - 1 do
  139. if TTest(aSuite.Tests.Items[i]) is TTestSuite then
  140. Result := Result + TestSuiteAsPlain(TTestSuite(aSuite.Tests.Items[i]))
  141. else
  142. if TTest(aSuite.Tests.Items[i]) is TTestCase then
  143. Result := Result + ' ' + ASuite.TestName+'.' + TTestcase(aSuite.Tests.Items[i]).TestName + System.sLineBreak;
  144. end;
  145. function GetSuiteAsPlain(aSuite: TTestSuite): string;
  146. begin
  147. Result := '';
  148. if aSuite <> nil then
  149. Result := 'TestSuites: ' + System.sLineBreak + TestSuiteAsPlain(aSuite);
  150. end;
  151. function TestResultAsPlain(aTestResult: TTestResult): string;
  152. var
  153. i: longint;
  154. f: TTestFailure;
  155. begin
  156. with aTestResult do
  157. begin
  158. Result := 'Number of run tests: ' + intToStr(RunTests) + System.sLineBreak;
  159. Result := Result + 'Number of errors: ' + intToStr(NumberOfErrors) + System.sLineBreak;
  160. Result := Result + 'Number of failures: ' + intToStr(NumberOfFailures);
  161. if NumberOfErrors <> 0 then
  162. begin
  163. Result := Result + System.sLineBreak;
  164. Result := Result + System.sLineBreak;
  165. Result := Result + 'List of errors:';
  166. for i := 0 to Errors.Count - 1 do
  167. begin
  168. Result := Result + System.sLineBreak;
  169. Result := Result + ' Error: ' + System.sLineBreak;
  170. f := TTestFailure(Errors.Items[i]);
  171. Result := Result + ' Message: ' + f.AsString + System.sLineBreak;
  172. Result := Result + ' Exception class: ' + f.ExceptionClassName + System.sLineBreak;
  173. Result := Result + ' Exception message: ' + f.ExceptionMessage + System.sLineBreak;
  174. Result := Result + ' Source unitname: ' + f.SourceUnitName + System.sLineBreak;
  175. Result := Result + ' Line number: ' + IntToStr(f.LineNumber) + System.sLineBreak;
  176. Result := Result + ' Failed methodname: ' + f.FailedMethodName + System.sLineBreak;
  177. end;
  178. end;
  179. if NumberOfFailures <> 0 then
  180. begin
  181. Result := Result + System.sLineBreak;
  182. Result := Result + System.sLineBreak;
  183. Result := Result + 'List of failures:' + System.sLineBreak;
  184. for i := 0 to Failures.Count - 1 do
  185. begin
  186. Result := Result + ' Failure: ' + System.sLineBreak;
  187. f := TTestFailure(Failures.Items[i]);
  188. Result := Result + ' Message: ' + f.AsString + System.sLineBreak;
  189. Result := Result + ' Exception class: ' + f.ExceptionClassName + System.sLineBreak;
  190. Result := Result + ' Exception message: ' + f.ExceptionMessage + System.sLineBreak;
  191. end;
  192. end;
  193. if NumberOfIgnoredTests <> 0 then
  194. begin
  195. Result := Result + System.sLineBreak;
  196. Result := Result + System.sLineBreak;
  197. Result := Result + 'List of ignored tests:' + System.sLineBreak;
  198. for i := 0 to IgnoredTests.Count - 1 do
  199. begin
  200. Result := Result + ' Ignored test: ' + System.sLineBreak;
  201. f := TTestFailure(IgnoredTests.Items[i]);
  202. Result := Result + ' Message: ' + f.AsString + System.sLineBreak;
  203. Result := Result + ' Exception class: ' + f.ExceptionClassName + System.sLineBreak;
  204. Result := Result + ' Exception message: ' + f.ExceptionMessage + System.sLineBreak;
  205. end;
  206. end;
  207. end;
  208. Result := Result + System.sLineBreak;
  209. end;
  210. end.