fpcunittests.pp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  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. unit tests of the FPCUnit framework.
  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 fpcunittests;
  15. interface
  16. uses
  17. SysUtils, Classes, fpcunit, testutils;
  18. type
  19. EMyException = class(Exception);
  20. TTestCaseTest = class(TTestCase)
  21. private
  22. FFlag: integer;
  23. protected
  24. procedure SetUp; override;
  25. procedure TearDown; override;
  26. published
  27. procedure TestSetUp;
  28. procedure TestAsString;
  29. end;
  30. TTestSuiteTest = class(TTestCase)
  31. private
  32. FSuite: TTestSuite;
  33. protected
  34. procedure SetUp; override;
  35. procedure TearDown; override;
  36. published
  37. procedure CheckCountTestCases;
  38. procedure TestExtractMethods;
  39. end;
  40. TAssertTest = class(TTestCase)
  41. private
  42. Fa,
  43. Fb: TObject;
  44. procedure FailEqualsInt;
  45. procedure FailEqualsInt64;
  46. procedure FailEqualsCurrency;
  47. procedure FailEqualsDouble;
  48. procedure FailEqualsBoolean;
  49. procedure FailEqualsChar;
  50. procedure FailEqualsTClass;
  51. procedure FailEqualsTObject;
  52. procedure FailAssertNull;
  53. procedure FailAssertNotNull;
  54. procedure RaiseMyException;
  55. procedure InterceptFailure(AMethod: TRunMethod; const ExpectedMessage: string);
  56. published
  57. procedure TestEqualsInt;
  58. procedure TestEqualsInt64;
  59. procedure TestEqualsCurrency;
  60. procedure TestEqualsDouble;
  61. procedure TestEqualsBoolean;
  62. procedure TestEqualsChar;
  63. procedure TestEqualsTClass;
  64. procedure TestEqualsTObject;
  65. procedure TestNull;
  66. procedure TestNotNull;
  67. procedure TestFailEqualsInt;
  68. procedure TestFailEqualsInt64;
  69. procedure TestFailEqualsCurrency;
  70. procedure TestFailEqualsDouble;
  71. procedure TestFailEqualsBoolean;
  72. procedure TestFailEqualsChar;
  73. procedure TestFailEqualsTClass;
  74. procedure TestFailEqualsTObject;
  75. procedure TestFailNull;
  76. procedure TestFailNotNull;
  77. procedure TestAssertException;
  78. procedure TestComparisonMsg;
  79. end;
  80. TMockListener = class(TNoRefCountObject, ITestListener)
  81. private
  82. FList: TStringList;
  83. FFailureList: TStringList;
  84. FErrorList: TStringList;
  85. FExpectedList: TStringList;
  86. public
  87. constructor Create; virtual;
  88. destructor Destroy; override;
  89. procedure AddFailure(ATest: TTest; AFailure: TTestFailure);
  90. procedure AddError(ATest: TTest; AError: TTestFailure);
  91. procedure StartTest(ATest: TTest);
  92. procedure EndTest(ATest: TTest);
  93. procedure AddExpectedLine(ALine: string);
  94. procedure Verify(ActualList: TStrings);
  95. end;
  96. TExampleTest = class(TTestCase)
  97. published
  98. procedure TestOne;
  99. procedure TestWithError;
  100. procedure TestWithFailure;
  101. end;
  102. TListenerTest = class(TTestCase)
  103. private
  104. FMockListener: TMockListener;
  105. FResult: TTestResult;
  106. protected
  107. procedure SetUp; override;
  108. procedure TearDown; override;
  109. published
  110. procedure TestStartAndEndTest;
  111. procedure TestAddError;
  112. procedure TestAddFailure;
  113. end;
  114. implementation
  115. procedure TTestCaseTest.SetUp;
  116. begin
  117. FFlag := 1
  118. end;
  119. procedure TTestCaseTest.TearDown;
  120. begin
  121. FFlag := 0;
  122. end;
  123. procedure TTestCaseTest.TestSetUp;
  124. begin
  125. AssertTrue( 'TTestCaseTest: wrong SetUp', FFlag = 1);
  126. end;
  127. procedure TTestCaseTest.TestAsString;
  128. begin
  129. AssertEquals( 'TTestCaseTest: wrong AsString output', 'TestAsString(TTestCaseTest)', AsString);
  130. end;
  131. procedure TTestSuiteTest.SetUp;
  132. begin
  133. FSuite := TTestSuite.Create(TTestSuiteTest);
  134. end;
  135. procedure TTestSuiteTest.TearDown;
  136. begin
  137. FSuite.Free;
  138. end;
  139. procedure TTestSuiteTest.CheckCountTestCases;
  140. begin
  141. AssertTrue(FSuite.CountTestCases = 2);
  142. end;
  143. procedure TTestSuiteTest.TestExtractMethods;
  144. var
  145. i: integer;
  146. s: string;
  147. begin
  148. s := '';
  149. for i := 0 to FSuite.CountTestCases - 1 do
  150. s := s + UpperCase(FSuite[i].TestName) + ' ';
  151. AssertEquals('Failure in extracting methods:', 'CHECKCOUNTTESTCASES TESTEXTRACTMETHODS ', s );
  152. end;
  153. procedure TAssertTest.TestEqualsInt;
  154. var
  155. i, j: integer;
  156. begin
  157. AssertEquals(33,33);
  158. i := 33;
  159. j := 33;
  160. AssertEquals(i, j);
  161. end;
  162. procedure TAssertTest.TestEqualsInt64;
  163. var
  164. i, j: int64;
  165. begin
  166. AssertEquals(1234567891234,1234567891234);
  167. i := 1234567891234;
  168. j := 1234567891234;
  169. AssertEquals(i, j);
  170. end;
  171. procedure TAssertTest.TestEqualsCurrency;
  172. var
  173. i, j: currency;
  174. begin
  175. AssertEquals(12345678912345.6789, 12345678912345.6789);
  176. i := 12345678912345.6789;
  177. j := 12345678912345.6789;
  178. AssertEquals(i, j);
  179. end;
  180. procedure TAssertTest.TestEqualsDouble;
  181. var
  182. i, j, delta: double;
  183. begin
  184. i := 0.123456;
  185. j := 0.123456;
  186. delta := 0.0000001;
  187. AssertEquals(i,j, delta);
  188. end;
  189. procedure TAssertTest.TestEqualsBoolean;
  190. var
  191. a, b: boolean;
  192. begin
  193. a := true;
  194. b := true;
  195. AssertEquals(a, b);
  196. end;
  197. procedure TAssertTest.TestEqualsChar;
  198. var
  199. a, b: char;
  200. begin
  201. a := 'a';
  202. b := 'a';
  203. AssertEquals(a, b);
  204. end;
  205. procedure TAssertTest.TestEqualsTClass;
  206. var
  207. a, b: TClass;
  208. begin
  209. a := TAssertTest;
  210. b := TAssertTest;
  211. AssertEquals(a, b);
  212. end;
  213. procedure TAssertTest.TestEqualsTObject;
  214. var
  215. a, b: TObject;
  216. begin
  217. a := TMockListener.Create;
  218. b := a;
  219. AssertSame(a, b);
  220. a.Free;
  221. end;
  222. procedure TAssertTest.TestNull;
  223. begin
  224. AssertNull(nil);
  225. end;
  226. procedure TAssertTest.TestNotNull;
  227. var
  228. obj: TTestCase;
  229. begin
  230. obj := TTestCase.Create;
  231. AssertNotNull(obj);
  232. obj.Free;
  233. end;
  234. procedure TAssertTest.InterceptFailure(AMethod: TRunMethod; const ExpectedMessage: string);
  235. var
  236. failureIntercepted: boolean;
  237. begin
  238. failureIntercepted := False;
  239. try
  240. AMethod;
  241. except
  242. on E: EAssertionFailedError do
  243. begin
  244. failureIntercepted := True;
  245. if (E.Message <> ExpectedMessage) then
  246. raise EAssertionFailedError.Create('Wrong failure message: expected <'+ ExpectedMessage + '>'
  247. + 'but was <' + E.Message +'>');
  248. end
  249. else
  250. raise;
  251. end;
  252. if not failureIntercepted then
  253. raise EAssertionFailedError.Create('Expected an EAssertionFailedError');
  254. end;
  255. procedure TAssertTest.FailEqualsInt;
  256. var
  257. i, j: integer;
  258. begin
  259. i := 33;
  260. j := 34;
  261. AssertEquals(i, j);
  262. end;
  263. procedure TAssertTest.FailEqualsInt64;
  264. var
  265. i, j: int64;
  266. begin
  267. i := 33;
  268. j := 34;
  269. AssertEquals(i,j);
  270. end;
  271. procedure TAssertTest.FailEqualsCurrency;
  272. var
  273. i, j: Currency;
  274. begin
  275. i := 12345678912.6789;
  276. j := 12345678912.6788;
  277. AssertEquals(i,j);
  278. end;
  279. procedure TAssertTest.FailEqualsDouble;
  280. var
  281. i, j, delta: double;
  282. begin
  283. i := 33.00;
  284. j := 34.00;
  285. delta := 0.0000001;
  286. AssertEquals(i, j, delta);
  287. end;
  288. procedure TAssertTest.FailEqualsBoolean;
  289. var
  290. a, b: boolean;
  291. begin
  292. a := true;
  293. b := false;
  294. AssertEquals(a, b);
  295. end;
  296. procedure TAssertTest.FailEqualsChar;
  297. var
  298. a, b: char;
  299. begin
  300. a := 'a';
  301. b := 'b';
  302. AssertEquals(a, b);
  303. end;
  304. procedure TAssertTest.FailEqualsTClass;
  305. var
  306. a, b: TClass;
  307. begin
  308. a := TAssertTest;
  309. b := TTestSuiteTest;
  310. AssertEquals(a, b);
  311. end;
  312. procedure TAssertTest.FailEqualsTObject;
  313. begin
  314. AssertSame(Fa,Fb);
  315. FA.Free;
  316. FB.Free;
  317. end;
  318. procedure TAssertTest.FailAssertNull;
  319. var
  320. obj: TTestCase;
  321. begin
  322. obj := TTestCase.Create;
  323. try
  324. AssertNull(obj);
  325. finally
  326. obj.Free;
  327. end;
  328. end;
  329. procedure TAssertTest.FailAssertNotNull;
  330. var
  331. obj: TObject;
  332. begin
  333. obj := nil;
  334. AssertNotNull(obj);
  335. end;
  336. procedure TAssertTest.TestFailEqualsInt;
  337. begin
  338. InterceptFailure(@FailEqualsInt, ' expected: <33> but was: <34>');
  339. end;
  340. procedure TAssertTest.TestFailEqualsInt64;
  341. begin
  342. InterceptFailure(@FailEqualsInt64, ' expected: <33> but was: <34>');
  343. end;
  344. procedure TAssertTest.TestFailEqualsCurrency;
  345. begin
  346. InterceptFailure(@FailEqualsCurrency, ' expected: <'+FloatToStr(12345678912.6789)+'> but was: <'+FloatToStr(12345678912.6788)+'>');
  347. end;
  348. procedure TAssertTest.TestFailEqualsDouble;
  349. begin
  350. InterceptFailure(@FailEqualsDouble, ' expected: <33> but was: <34>')
  351. end;
  352. procedure TAssertTest.TestFailEqualsBoolean;
  353. begin
  354. InterceptFailure(@FailEqualsBoolean, ' expected: <TRUE> but was: <FALSE>');
  355. end;
  356. procedure TAssertTest.TestFailEqualsChar;
  357. begin
  358. InterceptFailure(@FailEqualsChar, ' expected: <a> but was: <b>');
  359. end;
  360. procedure TAssertTest.TestFailEqualsTClass;
  361. begin
  362. InterceptFailure(@FailEqualsTClass, ' expected: <TAssertTest> but was: <TTestSuiteTest>');
  363. end;
  364. procedure TAssertTest.TestFailEqualsTObject;
  365. begin
  366. FA := TAssertTest.Create;
  367. FB := TAssertTest.Create;
  368. InterceptFailure(@FailEqualsTObject, ' expected: <'+ IntToStr(PtrInt(FA)) +
  369. '> but was: <' + IntToStr(PtrInt(FB))+ '>');
  370. FA.Free;
  371. FB.Free;
  372. end;
  373. procedure TAssertTest.TestFailNull;
  374. begin
  375. InterceptFailure(@FailAssertNull, '');
  376. end;
  377. procedure TAssertTest.TestFailNotNull;
  378. begin
  379. InterceptFailure(@FailAssertNotNull, '');
  380. end;
  381. procedure TAssertTest.RaiseMyException;
  382. begin
  383. raise EMyException.Create('EMyException raised');
  384. end;
  385. procedure TAssertTest.TestAssertException;
  386. begin
  387. AssertException(EMyException, @RaiseMyException);
  388. end;
  389. procedure TAssertTest.TestComparisonMsg;
  390. begin
  391. AssertEquals(' expected: <expectedstring> but was: <actualstring>',
  392. ComparisonMsg('expectedstring', 'actualstring'));
  393. end;
  394. constructor TMockListener.Create;
  395. begin
  396. FList := TStringList.Create;
  397. FFailureList := TStringList.Create;
  398. FErrorList := TStringList.Create;
  399. FExpectedList := TStringList.Create;
  400. end;
  401. destructor TMockListener.Destroy;
  402. begin
  403. FList.Free;
  404. FFailureList.Free;
  405. FErrorList.Free;
  406. FExpectedList.Free;
  407. end;
  408. procedure TMockListener.AddFailure(ATest: TTest; AFailure: TTestFailure);
  409. begin
  410. FFailureList.Add(ATest.TestName + ': ' + AFailure.ExceptionMessage);
  411. end;
  412. procedure TMockListener.AddError(ATest: TTest; AError: TTestFailure);
  413. begin
  414. FErrorList.Add(ATest.TestName + ': ' + AError.ExceptionMessage);
  415. end;
  416. procedure TMockListener.StartTest(ATest: TTest);
  417. begin
  418. FList.Add('Started: ' + ATest.TestName)
  419. end;
  420. procedure TMockListener.EndTest(ATest: TTest);
  421. begin
  422. FList.Add('Ended: ' + ATest.TestName)
  423. end;
  424. procedure TMockListener.AddExpectedLine(ALine: string);
  425. begin
  426. FExpectedList.Add(ALine)
  427. end;
  428. procedure TMockListener.Verify(ActualList: TStrings);
  429. begin
  430. TAssert.AssertEquals('Error in comparing text', FExpectedList.Text, ActualList.Text);
  431. end;
  432. procedure TExampleTest.TestOne;
  433. var
  434. i: integer;
  435. begin
  436. i := 1;
  437. AssertEquals(1, i);
  438. end;
  439. procedure TExampleTest.TestWithError;
  440. begin
  441. raise Exception.Create('Error Raised');
  442. end;
  443. procedure TExampleTest.TestWithFailure;
  444. begin
  445. Fail('Failure Raised');
  446. end;
  447. procedure TListenerTest.SetUp;
  448. begin
  449. FMockListener := TMockListener.Create;
  450. FResult := TTestResult.Create;
  451. FResult.AddListener(FMockListener);
  452. end;
  453. procedure TListenerTest.TearDown;
  454. begin
  455. FMockListener.Free;
  456. FResult.Free;
  457. end;
  458. procedure TListenerTest.TestStartAndEndTest;
  459. var
  460. t: TTestCase;
  461. begin
  462. t := TExampleTest.CreateWith('TestOne','TExampleTest');
  463. try
  464. t.Run(FResult);
  465. FMockListener.AddExpectedLine('Started: TestOne');
  466. FMockListener.AddExpectedLine('Ended: TestOne');
  467. FMockListener.Verify(FMockListener.FList);
  468. finally
  469. t.Free;
  470. end;
  471. end;
  472. procedure TListenerTest.TestAddError;
  473. var
  474. t: TTestCase;
  475. begin
  476. t := TExampleTest.CreateWith('TestWithError', 'TExampleTest');
  477. try
  478. t.Run(FResult);
  479. FMockListener.AddExpectedLine('TestWithError: Error Raised');
  480. FMockListener.Verify(FMockListener.FErrorList);
  481. finally
  482. t.Free;
  483. end;
  484. end;
  485. procedure TListenerTest.TestAddFailure;
  486. var
  487. t: TTestCase;
  488. begin
  489. t := TExampleTest.CreateWith('TestWithFailure', 'TExampleTest');
  490. try
  491. t.Run(FResult);
  492. FMockListener.AddExpectedLine('TestWithFailure: Failure Raised');
  493. FMockListener.Verify(FMockListener.FFailureList);
  494. finally
  495. t.Free;
  496. end;
  497. end;
  498. end.