testreport.pp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. {$mode objfpc}
  2. {$h+}
  3. {
  4. $Id$
  5. This file is part of the Free Component Library (FCL)
  6. Copyright (c) 2004 by Dean Zobec, Michael Van Canneyt
  7. an example of a console test runner of FPCUnit tests.
  8. See the file COPYING.FPC, included in this distribution,
  9. for details about the copyright.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13. **********************************************************************}
  14. unit testreport;
  15. interface
  16. uses
  17. classes, SysUtils, fpcunit, testutils;
  18. type
  19. TXMLResultsWriter = class(TNoRefCountObject, ITestListener)
  20. public
  21. procedure WriteHeader;
  22. procedure WriteResult(aResult: TTestResult);
  23. {ITestListener}
  24. procedure AddFailure(ATest: TTest; AFailure: TTestFailure);
  25. procedure AddError(ATest: TTest; AError: TTestFailure);
  26. procedure StartTest(ATest: TTest);
  27. procedure EndTest(ATest: TTest);
  28. end;
  29. {
  30. TLatexResultsWriter = class(TNoRefCountObject, ITestListener)
  31. public
  32. procedure AddFailure(ATest: TTest; AFailure: TTestFailure);
  33. procedure AddError(ATest: TTest; AError: TTestFailure);
  34. procedure StartTest(ATest: TTest);
  35. procedure EndTest(ATest: TTest);
  36. end;}
  37. function TestSuiteAsXML(aSuite: TTestSuite): string;
  38. function TestSuiteAsLatex(aSuite:TTestSuite): string;
  39. function GetSuiteAsXML(aSuite: TTestSuite): string;
  40. function GetSuiteAsLatex(aSuite: TTestSuite): string;
  41. function TestResultAsXML(aTestResult: TTestResult): string;
  42. implementation
  43. procedure TXMLResultsWriter.WriteHeader;
  44. begin
  45. writeln('<testresults>');
  46. writeln('<testlisting>');
  47. end;
  48. procedure TXMLResultsWriter.WriteResult(aResult: TTestResult);
  49. begin
  50. writeln('</testlisting>');
  51. writeln(TestResultAsXML(aResult));
  52. writeln('</testresults>');
  53. end;
  54. {TXMLResultsWriter}
  55. procedure TXMLResultsWriter.AddFailure(ATest: TTest; AFailure: TTestFailure);
  56. begin
  57. writeln('<failure ExceptionClassName="', AFailure.ExceptionClassName, '">');
  58. writeln('<message>', AFailure.ExceptionMessage, '</message>');
  59. writeln('</failure>');
  60. end;
  61. procedure TXMLResultsWriter.AddError(ATest: TTest; AError: TTestFailure);
  62. begin
  63. writeln('<error ExceptionClassName="', AError.ExceptionClassName, '">');
  64. writeln('<message>', AError.ExceptionMessage, '</message>');
  65. writeln('<sourceunit>', AError.SourceUnitName, '</sourceunit>');
  66. writeln('<methodname>', AError.MethodName, '</methodname>');
  67. writeln('<linenumber>', AError.LineNumber, '</linenumber>');
  68. writeln('</error>');
  69. end;
  70. procedure TXMLResultsWriter.StartTest(ATest: TTest);
  71. begin
  72. writeln('<test name="' , ATest.TestSuiteName + '.' + ATest.TestName, '">');
  73. end;
  74. procedure TXMLResultsWriter.EndTest(ATest: TTest);
  75. begin
  76. writeln('</test>');
  77. end;
  78. function TestSuiteAsXML(aSuite:TTestSuite): string;
  79. var
  80. i: integer;
  81. begin
  82. Result := '<TestSuite name="' + ASuite.TestName + '">' + System.sLineBreak;
  83. for i := 0 to aSuite.Tests.Count - 1 do
  84. if TTest(aSuite.Tests.Items[i]) is TTestSuite then
  85. Result := Result + TestSuiteAsXML(TTestSuite(aSuite.Tests.Items[i]))
  86. else
  87. if TTest(aSuite.Tests.Items[i]) is TTestCase then
  88. Result := Result +'<test>' + TTestcase(aSuite.Tests.Items[i]).TestName + '</test>' + System.sLineBreak;
  89. Result := Result + '</TestSuite>' + System.sLineBreak;
  90. end;
  91. function TestSuiteAsLatex(aSuite:TTestSuite): string;
  92. var
  93. i,j: integer;
  94. s: TTestSuite;
  95. begin
  96. Result := '\flushleft' + System.sLineBreak;
  97. for i := 0 to aSuite.Tests.Count - 1 do
  98. begin
  99. s := TTestSuite(ASuite.Tests.Items[i]);
  100. Result := Result + s.TestSuiteName + System.sLineBreak;
  101. Result := Result + '\begin{itemize}'+ System.sLineBreak;
  102. for j := 0 to s.Tests.Count - 1 do
  103. if TTest(s.Tests.Items[j]) is TTestCase then
  104. Result := Result + '\item[-] ' + TTestcase(s.Tests.Items[j]).TestName + System.sLineBreak;
  105. Result := Result +'\end{itemize}' + System.sLineBreak;
  106. end;
  107. end;
  108. function GetSuiteAsXML(aSuite: TTestSuite): string;
  109. begin
  110. if aSuite <> nil then
  111. begin
  112. if aSuite.TestName = '' then
  113. aSuite.TestName := 'Test Suite';
  114. Result := TestSuiteAsXML(aSuite)
  115. end
  116. else
  117. Result := '';
  118. end;
  119. function GetSuiteAsLatex(aSuite: TTestSuite): string;
  120. begin
  121. if aSuite <> nil then
  122. begin
  123. Result := '\documentclass[a4paper,12pt]{article}' + System.sLineBreak;
  124. Result := Result + '\usepackage{array}' + System.sLineBreak;
  125. Result := Result + '\usepackage{mdwlist}' + System.sLineBreak + System.sLineBreak;
  126. Result := Result + '\begin{document}' + System.sLineBreak + System.sLineBreak;
  127. if aSuite.TestName = '' then
  128. aSuite.TestName := 'Test Suite';
  129. Result := Result + TestSuiteAsLatex(aSuite);
  130. Result := Result + '\end{document}';
  131. end
  132. else
  133. Result := '';
  134. end;
  135. function TestResultAsXML(aTestResult: TTestResult): string;
  136. var
  137. i: longint;
  138. f: TTestFailure;
  139. begin
  140. with aTestResult do
  141. begin
  142. Result := '<NumberOfRunnedTests>' + intToStr(RunTests) + '</NumberOfRunnedTests>' + System.sLineBreak;
  143. Result := Result + '<NumberOfErrors>' + intToStr(NumberOfErrors) + '</NumberOfErrors>' + System.sLineBreak;
  144. Result := Result + '<NumberOfFailures>' + intToStr(NumberOfFailures) + '</NumberOfFailures>';
  145. if NumberOfErrors <> 0 then
  146. begin
  147. Result := Result + System.sLineBreak;
  148. Result := Result + '<ListOfErrors>';
  149. for i := 0 to Errors.Count - 1 do
  150. begin
  151. Result := Result + System.sLineBreak;
  152. Result := Result + '<Error>' + System.sLineBreak;
  153. f := TTestFailure(Errors.Items[i]);
  154. Result := Result + ' <Message>' + f.AsString + '</Message>' + System.sLineBreak;
  155. Result := Result + ' <ExceptionClass>' + f.ExceptionClassName + '</ExceptionClass>' + System.sLineBreak;
  156. Result := Result + ' <ExceptionMessage>' + f.ExceptionMessage + '</ExceptionMessage>' + System.sLineBreak;
  157. Result := Result + ' <SourceUnitName>' + f.SourceUnitName + '</SourceUnitName>' + System.sLineBreak;
  158. Result := Result + ' <LineNumber>' + IntToStr(f.LineNumber) + '</LineNumber>' + System.sLineBreak;
  159. Result := Result + ' <MethodName>' + f.MethodName + '</MethodName>' + System.sLineBreak;
  160. Result := Result + '</Error>' + System.sLineBreak;
  161. end;
  162. Result := Result + '</ListOfErrors>';
  163. end;
  164. if NumberOfFailures <> 0 then
  165. begin
  166. Result := Result + System.sLineBreak;
  167. Result := Result + '<ListOfFailures>' + System.sLineBreak;
  168. for i := 0 to Failures.Count - 1 do
  169. begin
  170. Result := Result + '<Failure>' + System.sLineBreak;
  171. f := TTestFailure(Failures.Items[i]);
  172. Result := Result + ' <Message>' + f.AsString + '</Message>' + System.sLineBreak;
  173. Result := Result + ' <ExceptionClass>' + f.ExceptionClassName + '</ExceptionClass>' + System.sLineBreak;
  174. Result := Result + ' <ExceptionMessage>' + f.ExceptionMessage + '</ExceptionMessage>' + System.sLineBreak;
  175. Result := Result + '</Failure>' + System.sLineBreak;
  176. end;
  177. Result := Result + '</ListOfFailures>';
  178. end;
  179. end;
  180. end;
  181. end.