UnitTestFramework.pas
上传用户:yjb1804
上传日期:2021-01-30
资源大小:3105k
文件大小:49k
源码类别:

Email服务器

开发平台:

Delphi

  1. { Problem: TestRunAndTearDownFails has a leak of some sort. AV occurs outside
  2.   of entire framework at the end of the test. }
  3. { $Id: UnitTestFramework.pas,v 1.44 2006/07/19 02:52:55 judc Exp $ }
  4. {: DUnit: An XTreme testing framework for Delphi programs.
  5.    @author  The DUnit Group.
  6.    @version $Revision: 1.44 $
  7. }
  8. (*
  9.  * The contents of this file are subject to the Mozilla Public
  10.  * License Version 1.1 (the "License"); you may not use this file
  11.  * except in compliance with the License. You may obtain a copy of
  12.  * the License at http://www.mozilla.org/MPL/
  13.  *
  14.  * Software distributed under the License is distributed on an "AS
  15.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  16.  * implied. See the License for the specific language governing
  17.  * rights and limitations under the License.
  18.  *
  19.  * The Original Code is DUnit.
  20.  *
  21.  * The Initial Developers of the Original Code are Kent Beck, Erich Gamma,
  22.  * and Juancarlo A馿z.
  23.  * Portions created The Initial Developers are Copyright (C) 1999-2000.
  24.  * Portions created by The DUnit Group are Copyright (C) 2000-2004.
  25.  * All rights reserved.
  26.  *
  27.  * Contributor(s):
  28.  * Kent Beck <kentbeck@csi.com>
  29.  * Erich Gamma <Erich_Gamma@oti.com>
  30.  * Juanco A馿z <juanco@users.sourceforge.net>
  31.  * Chris Morris <chrismo@users.sourceforge.net>
  32.  * Jeff Moore <JeffMoore@users.sourceforge.net>
  33.  * Kenneth Semeijn <kennethsem@users.sourceforge.net>
  34.  * Kris Golko <neuromancer@users.sourceforge.net>
  35.  * The DUnit group at SourceForge <http://dunit.sourceforge.net>
  36.  *
  37.  *)
  38. {$UNDEF DETECTMEMLEAKS}
  39. {$IFDEF VER180}
  40.   {$IFNDEF CLR}
  41.     {$DEFINE DETECTMEMLEAKS}
  42.   {$ENDIF}
  43. {$ELSE}
  44.   {$IFDEF FASTMM}
  45.     {$DEFINE DETECTMEMLEAKS}
  46.   {$ENDIF}
  47. {$ENDIF}
  48. unit UnitTestFramework;
  49. interface
  50. uses
  51.   {$IFNDEF LINUX}
  52.   Windows,
  53.   {$ENDIF}
  54.   SysUtils,
  55.   TestFramework;
  56. type
  57.   TMonitoredTestCase = class(TTestCase)
  58.   public
  59.     destructor Destroy; override;
  60.     procedure _AddRef;
  61.     procedure _Release;
  62.   end;
  63.   TVerifierTestCase = class(TTestCase)
  64.   protected
  65.     procedure Verify(AResult: TTestResult;
  66.       runCount, failCount, errCount: Integer);
  67.     procedure VerifyError(ATest: ITest; errCount: Integer = 1);
  68.     procedure VerifyFailure(ATest: ITest); virtual;
  69.     procedure VerifySuccess(ATest: ITest); virtual;
  70.     procedure VerifyLackOfSuccess(ATest: ITest);
  71.   end;
  72.   TVerifierTotalTestCase = class(TVerifierTestCase)
  73.   protected
  74.     procedure VerifySuccess(ATest: ITest); override;
  75.     procedure VerifyFailure(ATest: ITest); override;
  76.   end;
  77.   { ported from JUnit tests, then refactored a bit }
  78.   TTestTest = class(TVerifierTestCase)
  79.   private
  80.     fTestCount: integer;
  81.   protected
  82.     procedure SetUp; override;
  83.     procedure TearDown; override;
  84.   published
  85. {$IFDEF CLR}[Test]{$ENDIF}
  86.     procedure TestCheck;
  87. {$IFDEF CLR}[Test]{$ENDIF}
  88.     procedure TestCheckEqualsBinHexMessage;
  89. {$IFNDEF CLR} // don't expect Check(Not)EqualsMem to work under CLR -> pointers unsafe
  90.     procedure TestCheckEqualsMem;
  91.     procedure TestFirstByteDiff;
  92. {$ENDIF}
  93. {$IFDEF CLR}[Test]{$ENDIF}
  94.     procedure TestError;
  95. {$IFDEF CLR}[Test]{$ENDIF}
  96.     procedure TestFailure;
  97. {$IFDEF CLR}[Test]{$ENDIF}
  98.     procedure TestRegisterTest;
  99. {$IFDEF CLR}[Test]{$ENDIF}
  100.     procedure TestRunAndTearDownFails;
  101. {$IFDEF CLR}[Test]{$ENDIF}
  102.     procedure TestSetupException;
  103. {$IFDEF CLR}[Test]{$ENDIF}
  104.     procedure TestSuccess;
  105. {$IFDEF CLR}[Test]{$ENDIF}
  106.     procedure TestTearDownAfterError;
  107. {$IFDEF CLR}[Test]{$ENDIF}
  108.     procedure TestTearDownFails;
  109. {$IFDEF CLR}[Test]{$ENDIF}
  110.     procedure TestTearDownSetupFails;
  111. {$IFDEF CLR}[Test]{$ENDIF}
  112.     procedure TestWasNotSuccessful;
  113. {$IFDEF CLR}[Test]{$ENDIF}
  114.     procedure TestWasSuccessful;
  115. {$IFDEF CLR}[Test]{$ENDIF}
  116.     procedure TestWasStopped;
  117.     procedure TestEmptyTestFailure;
  118. {$IFDEF CLR}[Test]{$ENDIF}
  119.     procedure TestBoolToStr;
  120. {$IFDEF CLR}[Test]{$ENDIF}
  121.     procedure TestElapsedTestTime;
  122. {$IFDEF CLR}[Test]{$ENDIF}
  123.     procedure TestFailOnDisAllowedUnCalledCheck;
  124. {$IFDEF CLR}[Test]{$ENDIF}
  125.     procedure TestPassOnAllowedUnCalledCheck;
  126. {$IFDEF CLR}[Test]{$ENDIF}
  127.     procedure TestAlloweLeakListIterator;
  128.   end;
  129.   TTestMemLeakTestSuite = class(TVerifierTotalTestCase)
  130.   private
  131.     fTestCount: integer;
  132.   protected
  133.     procedure SetUp; override;
  134.     procedure TearDown; override;
  135.   published
  136. {$IFDEF CLR}[Test]{$ENDIF}
  137.     procedure TestClassCanDetectFailure;
  138. {$IFDEF CLR}[Test]{$ENDIF}
  139.     procedure TestCaseDoesNotLeak;
  140. {$IFDEF CLR}[Test]{$ENDIF}
  141.     procedure TestCaseLeaksTObject;
  142. {$IFDEF CLR}[Test]{$ENDIF}
  143.     procedure TestCaseLeaksTObjectReportDisabled;
  144. {$IFDEF CLR}[Test]{$ENDIF}
  145.     procedure TestCaseLeaksTObjectLeakOfSizeAllowed;
  146. {$IFDEF CLR}[Test]{$ENDIF}
  147.     procedure TestCaseLeaksTObjectLeakOfListSizeAllowed;
  148. {$IFDEF CLR}[Test]{$ENDIF}
  149.     procedure TestCaseLeaksAllowedTObjectLeakOfEmptyList;
  150. {$IFDEF CLR}[Test]{$ENDIF}
  151.     procedure TestCaseFailsOnOverSizeAllowedLeakArrayList;
  152. {$IFDEF CLR}[Test]{$ENDIF}
  153.     procedure TestCaseNoLeaksAtSetupTearDownLevel;
  154. {$IFDEF CLR}[Test]{$ENDIF}
  155.     procedure TestCaseLeaksAtSetupTearDownLevel;
  156. {$IFDEF CLR}[Test]{$ENDIF}
  157.     procedure TestCaseIgnoresLeaksAtSetupTearDownLevel;
  158. {$IFDEF CLR}[Test]{$ENDIF}
  159.     procedure TestCaseDoesNotIgnoreLeaksInTestProc;
  160.   end;
  161.   TTestTestSuite = class(TVerifierTestCase)
  162.   published
  163. {$IFDEF CLR}[Test]{$ENDIF}
  164.     procedure TestSuiteSetupTearDown;
  165.   end;
  166.   TTestBasicTestCase4Leaks = class(TTestCase)
  167.   published
  168. {$IFDEF CLR}[Test]{$ENDIF}
  169.     procedure TestCheckIfTAbstractTestLeaks;
  170. {$IFDEF CLR}[Test]{$ENDIF}
  171.     procedure TestCheckIfTTestResultLeaks;
  172. {$IFDEF CLR}[Test]{$ENDIF}
  173.     procedure TestCheckIfTStatusListnerLeaks;
  174. {$IFDEF CLR}[Test]{$ENDIF}
  175.     procedure TestCheckIfTTestFalureLeaks;
  176. {$IFDEF CLR}[Test]{$ENDIF}
  177.     procedure TestCheckIfTTestCaseLeaks;
  178. {$IFDEF CLR}[Test]{$ENDIF}
  179.     procedure TestCheckIfRunTTestCaseLeaks;
  180. {$IFDEF CLR}[Test]{$ENDIF}
  181.     procedure TestCheckIfEnumeratorLeaks;
  182. {$IFDEF CLR}[Test]{$ENDIF}
  183.     procedure TestCheckIfITestSuiteLeaks;
  184.   end;
  185.   { JUnit has no tests for this class }
  186.   TTestTestResult = class(TTestCase)
  187.   protected
  188.     procedure SetUp; override;
  189.   published
  190. {$IFDEF CLR}[Test]{$ENDIF}
  191.     procedure TestRun;
  192. {$IFDEF CLR}[Test]{$ENDIF}
  193.     procedure TestElapsedTime;
  194.   end;
  195.   TTestMethodEnumerator = class(TTestCase)
  196.   private
  197.     FMethodEnumerator: TMethodEnumerator;
  198.   published
  199. {$IFDEF CLR}[Test]{$ENDIF}
  200.     procedure TestMethodEnumerator;
  201.   end;
  202.   TTestExceptionChecks = class(TVerifierTestCase)
  203.   protected
  204.     procedure TestIndividualException(AName :string; FailCnt, ErrCnt :Integer);
  205.   published
  206. {$IFDEF CLR}[Test]{$ENDIF}
  207.     procedure TestExpectedException;
  208. {$IFDEF CLR}[Test]{$ENDIF}
  209.     procedure TestChecksAfterException;
  210. {$IFDEF CLR}[Test]{$ENDIF}
  211.     procedure TestDifferentFromExpected;
  212. {$IFDEF CLR}[Test]{$ENDIF}
  213.     procedure TestInheritsFromExpected;
  214. {$IFDEF CLR}[Test]{$ENDIF}
  215.     procedure TestCheckException;
  216. {$IFDEF CLR}[Test]{$ENDIF}
  217.     procedure TestCheckWrongException;
  218. {$IFDEF CLR}[Test]{$ENDIF}
  219.     procedure TestNoExceptionRaised;
  220. {$IFDEF CLR}[Test]{$ENDIF}
  221.     procedure TestCheckAndNoExceptionRaised;
  222. {$IFDEF CLR}[Test]{$ENDIF}
  223.     procedure TestNotRaised;
  224.   end;
  225.   TTestStatus = class(TVerifierTestCase)
  226.   published
  227.     procedure testStatus;
  228.   end;
  229.   TStringyObject = class(TObject)
  230.   public
  231.     AString: string;
  232.   end;
  233.   {: Create our own exception class so users can choose
  234.     to ignore it in the debugger }
  235.   EUnitTestException = class(EAbort)
  236.   end;
  237. implementation
  238. {$ifdef DETECTMEMLEAKS}
  239. uses
  240.   FastMMMonitorTest;
  241. {$endif}
  242. const
  243.   ARBITRARY_STOPEXCEPT_MSG = 'An arbitrary StopExpectingException message';
  244.   EXPECTED_STOPEXCEPT_MSG = 'Expected exception "EUnitTestException" '
  245.                             + 'but there was none. '
  246.                             + ARBITRARY_STOPEXCEPT_MSG;
  247. var
  248. // Used by code to test memory leak detection.
  249.   AnObject: TObject = nil;
  250. type
  251. // prototype for CheckEqualsBin/Hex
  252.   TCheckEqualsBinHex = procedure(expected,actual:longword; msg:string = '';
  253.                                     digits:integer=0) of object;
  254.   TRunExceptionCase = class(TMonitoredTestCase)
  255.   published
  256. {$IFDEF CLR}[Test]{$ENDIF}
  257.     procedure Test;
  258.   end;
  259.   TRunExceptionTornDown = class(TRunExceptionCase)
  260.   protected
  261.     procedure TearDown; override;
  262.   public
  263.     TornDown: boolean;
  264.   end;
  265.   TRunAndTearDownException = class(TRunExceptionTornDown)
  266.   protected
  267.     procedure TearDown; override;
  268.   end;
  269.   TRunFalseAssertCase = class(TMonitoredTestCase)
  270.   published
  271. {$IFDEF CLR}[Test]{$ENDIF}
  272.     procedure Test;
  273.   end;
  274.   TSetupException = class(TMonitoredTestCase)
  275.   public
  276.     procedure SetUp; override;
  277.   published
  278. {$IFDEF CLR}[Test]{$ENDIF}
  279.     procedure Test;
  280.   end;
  281.   TSetupExceptionTornDown = class(TRunExceptionTornDown)
  282.   public
  283.     procedure SetUp; override;
  284.   end;
  285.   TSuccessCase = class(TMonitoredTestCase)
  286.   published
  287. {$IFDEF CLR}[Test]{$ENDIF}
  288.     procedure Test;
  289.   end;
  290.   TFailsCase = class(TMonitoredTestCase)
  291.   published
  292. {$IFDEF CLR}[Test]{$ENDIF}
  293.     procedure Test;
  294.   end;
  295.   TTearDownException = class(TSuccessCase)
  296.   protected
  297.     procedure TearDown; override;
  298.   end;
  299.   TTestMethodEnumClass = class(TMonitoredTestCase)
  300.   published
  301. {$IFDEF CLR}[Test]{$ENDIF}
  302.     procedure Method0;
  303. {$IFDEF CLR}[Test]{$ENDIF}
  304.     procedure Method1;
  305. {$IFDEF CLR}[Test]{$ENDIF}
  306.     procedure Method2;
  307.   end;
  308.   TStopTest = class(TMonitoredTestCase)
  309.   private
  310.     procedure DoNothing;
  311.   published
  312. {$IFDEF CLR}[Test]{$ENDIF}
  313.     procedure testOne;
  314. {$IFDEF CLR}[Test]{$ENDIF}
  315.     procedure testTwo;
  316. {$IFDEF CLR}[Test]{$ENDIF}
  317.     procedure doStop;
  318. {$IFDEF CLR}[Test]{$ENDIF}
  319.     procedure notExecutedOne;
  320. {$IFDEF CLR}[Test]{$ENDIF}
  321.     procedure notExecutedTwo;
  322.   end;
  323.   TExpectedTest = class(TMonitoredTestCase)
  324.   protected
  325.     function  RaiseException :Integer;
  326. {$IFDEF CLR}
  327.   public
  328. {$ENDIF}
  329.     procedure RaiseExceptionProc;
  330.     procedure DoNothing;
  331.   published
  332. {$IFDEF CLR}[Test]{$ENDIF}
  333.     procedure testRaised;
  334. {$IFDEF CLR}[Test]{$ENDIF}
  335.     procedure TestNotRaised;
  336. {$IFDEF CLR}[Test]{$ENDIF}
  337.     procedure testEnd;
  338. {$IFDEF CLR}[Test]{$ENDIF}
  339.     procedure testStart;
  340. {$IFDEF CLR}[Test]{$ENDIF}
  341.     procedure TestChecksAfterException;
  342. {$IFDEF CLR}[Test]{$ENDIF}
  343.     procedure TestDifferentFromExpected;
  344. {$IFDEF CLR}[Test]{$ENDIF}
  345.     procedure TestInheritsFromExpected;
  346. {$IFDEF CLR}[Test]{$ENDIF}
  347.     procedure TestCheckException;
  348. {$IFDEF CLR}[Test]{$ENDIF}
  349.     procedure TestCheckWrongException;
  350. {$IFDEF CLR}[Test]{$ENDIF}
  351.     procedure TestNoExceptionRaised;
  352. {$IFDEF CLR}[Test]{$ENDIF}
  353.     procedure TestCheckAndNoExceptionRaised;
  354.   end;
  355.   TEmptyTest = class(TMonitoredTestCase)
  356.   published
  357. {$IFDEF CLR}[Test]{$ENDIF}
  358.     procedure Test;
  359. {$IFDEF CLR}[Test]{$ENDIF}
  360.     procedure NoChecksTest;
  361.   end;
  362.   TLeakyTest = class(TMonitoredTestCase)
  363.   public
  364.     procedure SetUp; override;
  365.   published
  366. {$IFDEF CLR}[Test]{$ENDIF}
  367.     procedure TestDoesNotLeak;
  368. {$IFDEF CLR}[Test]{$ENDIF}
  369.     procedure TestContainsTObjectLeak;
  370. {$IFDEF CLR}[Test]{$ENDIF}
  371.     procedure TestContainsAllowedTObjectLeak;
  372. {$IFDEF CLR}[Test]{$ENDIF}
  373.     procedure TestContainsAllowedTObjectLeakByList;
  374. {$IFDEF CLR}[Test]{$ENDIF}
  375.     procedure TestContainsAllowedTObjectLeakByEmptyList;
  376. {$IFDEF CLR}[Test]{$ENDIF}
  377.     procedure TestContainsAllowedLeakArrayLongList;
  378.   end;
  379.   TLeakySetupTearDown = class(TMonitoredTestCase)
  380.   public
  381.     FreeInTearDown: boolean;
  382.     procedure SetUp; override;
  383.     procedure TearDown; override;
  384.   published
  385. {$IFDEF CLR}[Test]{$ENDIF}
  386.     procedure TestCaseDoesNotLeak;
  387. {$IFDEF CLR}[Test]{$ENDIF}
  388.     procedure TestSetupTearDownLeakDetect;
  389.   end;
  390.   TTestWithStatusMsgs = class(TMonitoredTestCase)
  391.   published
  392. {$IFDEF CLR}[Test]{$ENDIF}
  393.     procedure Test;
  394.   end;
  395.   TFixtureSuite = class(TTestSuite)
  396.   public
  397.     SetUpCalled: boolean;
  398.     TearDownCalled: boolean;
  399.     procedure SetUp; override;
  400.     procedure TearDown; override;
  401.   end;
  402.   TMockedTimeCase = class(TTestCase)
  403.   public
  404.     function ElapsedTestTime: Cardinal; override;
  405.   published
  406. {$IFDEF CLR}[Test]{$ENDIF}
  407.     procedure SuccessOne;
  408. {$IFDEF CLR}[Test]{$ENDIF}
  409.     procedure SuccessTwo;
  410.   end;
  411.   TMockedTimeSuite = class(TTestSuite)
  412.   public
  413.     function ElapsedTestTime: Cardinal; override;
  414.   end;
  415. { TMonitoredTestCase }
  416. destructor TMonitoredTestCase.Destroy;
  417. begin
  418.   inherited Destroy;
  419. end;
  420. procedure TMonitoredTestCase._AddRef;
  421. begin
  422. {$IFNDEF CLR}
  423.   inherited _AddRef;
  424. {$ENDIF}
  425. end;
  426. procedure TMonitoredTestCase._Release;
  427. begin
  428. {$IFNDEF CLR}
  429.   inherited _Release;
  430. {$ENDIF}
  431. end;
  432. { TRunExceptionTornDown }
  433. procedure TRunExceptionTornDown.TearDown;
  434. begin
  435.   TornDown := true;
  436. end;
  437. { TRunAndTearDownException }
  438. procedure TRunAndTearDownException.TearDown;
  439. begin
  440.   inherited;
  441.   raise EUnitTestException.Create('');
  442. end;
  443. { TVerifierTestCase }
  444. procedure TVerifierTestCase.Verify(AResult: TTestResult;
  445.   runCount, failCount, errCount: Integer);
  446. begin
  447.   assert(AResult <> nil);
  448.   CheckEquals(runCount,  AResult.runCount,      'wrong RunCount');
  449.   CheckEquals(failCount, AResult.failureCount,  'wrong FailureCount');
  450.   CheckEquals(errCount,  AResult.errorCount,    'wrong ErrorCount');
  451. end;
  452. procedure TVerifierTestCase.VerifyError(ATest: ITest; errCount: Integer);
  453. var
  454.   AResult: TTestResult;
  455. begin
  456.   assert((ATest <> nil) and (errCount >= 1));
  457.   AResult := ATest.run;
  458.   try
  459.     Verify(AResult, 1, 0, errCount);
  460.   finally
  461.     AResult.Free
  462.   end
  463. end;
  464. procedure TVerifierTestCase.VerifyFailure(ATest: ITest);
  465. var
  466.   AResult: TTestResult;
  467. begin
  468.   assert(ATest <> nil);
  469.   // don't let ref counting free the test too early
  470.   AResult := ATest.run;
  471.   try
  472.     Verify(AResult, 1, 1, 0);
  473.   finally
  474.     AResult.Free;
  475.   end
  476. end;
  477. procedure TVerifierTestCase.VerifyLackOfSuccess(ATest: ITest);
  478. var
  479.   AResult: TTestResult;
  480. begin
  481.   assert(ATest <> nil);
  482.   AResult := ATest.run;
  483.   try
  484.     check(AResult.runCount = 1, 'wrong RunCount');
  485.     check((AResult.failureCount + AResult.errorCount) > 0, 'wrong Failures+Errors');
  486.     check(not AResult.wasSuccessful, 'should not have suceeded');
  487.   finally
  488.     AResult.Free;
  489.   end
  490. end;
  491. procedure TVerifierTestCase.VerifySuccess(ATest: ITest);
  492. var
  493.   AResult: TTestResult;
  494. begin
  495.   assert(ATest <> nil);
  496.   AResult := ATest.run;
  497.   try
  498.     Verify(AResult, 1, 0, 0);
  499.     check(AResult.wasSuccessful, 'should have suceeded');
  500.   finally
  501.     AResult.Free;
  502.   end
  503. end;
  504. procedure TVerifierTotalTestCase.VerifySuccess(ATest: ITest);
  505. var
  506.   AResult: TTestResult;
  507. begin
  508.   assert(ATest <> nil);
  509.   AResult := TTestResult.Create;
  510.   AResult.FailsIfNoChecksExecuted := ATest.FailsOnNoChecksExecuted;
  511.   AResult.FailsIfMemoryLeaked := ATest.FailsOnMemoryLeak;
  512.   AResult.IgnoresMemoryLeakInSetUpTearDown :=
  513.     ATest.IgnoreSetUpTearDownLeaks;
  514.   ATest.RunWithFixture(AResult);
  515.   try
  516.     Verify(AResult, 1, 0, 0);
  517.     check(AResult.wasSuccessful, 'should have suceeded');
  518.   finally
  519.     AResult.Free;
  520.   end
  521. end;
  522. procedure TVerifierTotalTestCase.VerifyFailure(ATest: ITest);
  523. var
  524.   AResult: TTestResult;
  525. begin
  526.   assert(ATest <> nil);
  527.   AResult := TTestResult.Create;
  528.   AResult.FailsIfNoChecksExecuted := ATest.FailsOnNoChecksExecuted;
  529.   AResult.FailsIfMemoryLeaked := ATest.FailsOnMemoryLeak;
  530.   ATest.RunWithFixture(AResult);
  531.   try
  532.     Verify(AResult, 1, 1, 0);
  533.   finally
  534.     AResult.Free;
  535.   end
  536. end;
  537. procedure TTestTest.TestBoolToStr;
  538. begin
  539.   CheckEqualsString('True',  BoolToStr(True),  'BoolToStr(True)');
  540.   CheckEqualsString('False', BoolToStr(False), 'BoolToStr(False)');
  541. end;
  542. procedure TTestTest.TestCheck;
  543. var
  544.   s1, s2, s3 :WideString;
  545. begin
  546.   Check(true, 'Check');
  547.   CheckEquals(1, 1,                   'CheckEquals    Integer');
  548.   CheckNotEquals(1, 2,                'CheckNotEquals Integer');
  549.   CheckEquals(1.0, 1.1, 0.15,         'CheckEquals    Double');
  550.   CheckNotEquals(1.0, 1.16, 0.15,     'CheckNotEquals Double');
  551.   CheckEqualsString('abc', 'abc',     'CheckEquals    String');
  552.   CheckNotEqualsString('abc', 'abcd', 'CheckNotEquals String');
  553.   CheckEquals(true, true,             'CheckEquals    Boolean');
  554.   CheckNotEquals(true, false,         'CheckNotEquals Boolean');
  555.   CheckEqualsBin(1, 1,                'CheckEqualsBin  Longword');
  556.   CheckNotEqualsBin(1, 2,             'CheckNotEqualsBin  Longword');
  557.   CheckEqualsHex(1, 1,                'CheckEqualsHex  Longword');
  558.   CheckNotEqualsHex(1, 2,             'CheckNotEqualsHex  Longword');
  559.   CheckNull(TObject(nil),        'CheckNull');
  560.   CheckNotNull(TObject(self),    'CheckNotNull object');
  561.   CheckSame(TObject(self), self, 'CheckSame    object');
  562.   // need the TTestCase(self) cast to work around Delphi typing quirks
  563.   CheckNull(TTEstCase(nil) as ITest,        'CheckNull');
  564.   CheckNotNull(TTestCase(self) as ITest,    'CheckNotNull interface');
  565.   CheckSame(TTestCase(self) as ITest, TTestCase(self) as ITest, 'CheckSame    interface');
  566.   CheckIs(self, TObject, 'self not a TObject');
  567.   s1 := 'aaa'#1024;
  568.   s2 := 'aaa';
  569.   s3 := 'bbb';
  570.   {$IFNDEF CLR}
  571.   CheckEqualsWideString(s1, s1, 'CheckEquals WideString');
  572.   CheckNotEqualsWideString(s1, s2, 'CheckNotEquals WideString');
  573.   CheckNotEqualsWideString(s2, s3, 'CheckNotEquals WideString');
  574.   {$ENDIF}
  575.   CheckTrue(true, 'CheckTrue');
  576.   CheckFalse(false, 'CheckFalse');
  577. end;
  578. procedure TTestTest.TestCheckEqualsBinHexMessage;
  579.   function ExpWas(msg, sExp, sAct: string):string;
  580.   begin
  581.     Result:=Format(sExpButWasFmt, [msg, sExp, sAct]);
  582.   end;
  583.   function BothAre(msg, sAct: string):string;
  584.   begin
  585.     Result:=Format(sExpAndActualFmt, [msg, sAct]);
  586.   end;
  587.   procedure CheckFailureMessage(ACheck:TCheckEqualsBinHex; iExp,iAct,dig:longword;
  588.                                 msg,ExpectedFailMsg:string);
  589.   begin
  590.     try
  591.       ACheck(iExp,iAct,msg,dig);
  592.       Assert(False,'Expected Failure: '+msg);
  593.     except
  594.       on E:ETestFailure do
  595.       begin
  596.         CheckEqualsString(ExpectedFailMsg,E.Message);
  597.       end;
  598.     end;
  599.   end;
  600. begin
  601.   // Check the binary string output:
  602.   CheckFailureMessage(CheckEqualsBin,0,1,1,'',ExpWas('','0','1')); // empty msg
  603.   CheckFailureMessage(CheckEqualsBin,0,15,4,'A1',ExpWas('A1, ','0000','1111'));
  604.   CheckFailureMessage(CheckEqualsBin,0,$55AA55AA,32,'B1',
  605.     ExpWas('B1, ','00000000000000000000000000000000',
  606.                   '01010101101010100101010110101010'));
  607.   CheckFailureMessage(CheckNotEqualsBin,3,3,2,'C1',BothAre('C1, ','11'));
  608.   // Check the Hex string output:
  609.   CheckFailureMessage(CheckEqualsHex,0,15,1,'A2',ExpWas('A2, ','0',IntToHex(15, 1)));
  610.   CheckFailureMessage(CheckEqualsHex,0,$55AA55AA,8,'B2',ExpWas('B2, ','00000000',IntToHex($55AA55AA, 8)));
  611.   CheckFailureMessage(CheckNotEqualsHex,999,999,4,'C2',BothAre('C2, ',IntToHex($03E7, 4)));
  612. end;
  613. {$IFNDEF CLR} // [KGS] don't expect CheckEquals(Mem) to work under CLR - pointers are unsafe
  614. procedure TTestTest.TestCheckEqualsMem; // Added KGS 06/06/2005
  615. // Tests TAbstractTest.CheckEqualsMem / CheckNotEqualsMem
  616. type TCheckEqualsMem = procedure(expected,actual:pointer; size:longword; msg:string) of object;
  617. var
  618.   a,b: byte;
  619.   x,y,z:Int64;
  620.   b1,b2: array[0..1023] of byte;
  621.   i: integer;
  622.   procedure CheckEqualsMemFailure(ACheck:TCheckEqualsMem; pExp,pAct:pointer;
  623.                                   size:longword; msg:string);
  624.   begin
  625.     try
  626.       ACheck(pExp,pAct,size,msg);
  627.       Assert(False,'Expected Failure: '+msg);
  628.     except
  629.       on E:ETestFailure do
  630.       begin
  631.         // we expected this!
  632.       end;
  633.     end;
  634.   end;
  635. begin
  636.   // 1. Test on a single byte:
  637.   a:=1;
  638.   b:=0;
  639.   CheckNotEqualsMem(@a,@b,1,'Missed Diff a<>b');
  640.   b:=a;
  641.   CheckEqualsMem(@a,@b,1,'False Diff a<>b');
  642.   // 2. Test 8-byte (Int64) fields:
  643.   x:=$123456789ABCDEF0;
  644.   y:=$123456789ABCDEF0;
  645.   z:=$023456789ABCDEF0; // differs in MSByte = last byte, offset 7
  646.   CheckEqualsMem(@x,@y,8,'False Diff x<>y');
  647.   CheckEqualsMem(@x,@z,7,'x<>z first 7');
  648.   CheckNotEqualsMem(@x,@z,8,'Failed to find x<>z');
  649.   // 3. Test on a 1KB byte-field:
  650.   for i:=0 to 1023 do b1[i]:=i and $FF; // test pattern
  651.   Move(b1[0],b2[0],1024); // copy b1 to b2 so should be identical
  652.   CheckEqualsMem(@b1[0],@b2[0],1024,'Diff b1<>b2');
  653.   // Induce an error:
  654.   Inc(b2[777]); // should create a discrepancy at offset 777
  655.   CheckEqualsMem(@b1[0],@b2[0],777,'First 777 still OK');
  656.   CheckNotEqualsMem(@b1[0],@b2[0],1023,'Induced error b1<>b2 not found');
  657.   // 4. Negative tests: These calls should fail! If they don't, it's an error.
  658.   CheckEqualsMemFailure(CheckNotEqualsMem,@a,@b,1,'Unexpected diff a<>b');
  659.   CheckEqualsMemFailure(CheckNotEqualsMem,@x,@y,8,'Unexpected diff x<>y');
  660.   CheckEqualsMemFailure(CheckNotEqualsMem,@x,@y,8,'Unexpected diff x<>y');
  661.   CheckEqualsMemFailure(CheckNotEqualsMem,@x,@z,7,'Unexpected diff x<>z, 7');
  662.   CheckEqualsMemFailure(CheckEqualsMem,@x,@z,8,'Expected diff x<>z, 8');
  663.   CheckEqualsMemFailure(CheckEqualsMem,@b1[0],@b2[0],1023,'Error b1<>b2 not found');
  664. end;
  665. procedure TTestTest.TestFirstByteDiff;
  666. // Tests TestFrameWork.FirstByteDiff function
  667. // (utility for Check(Not)EqualsMem failure reporting):
  668. var
  669.   a,b,val1,val2: byte;
  670.   x,z:Int64;
  671.   b1,b2: array[0..1023] of byte;
  672.   i: integer;
  673. begin
  674.   // 1. Test on a single byte:
  675.   a:=1;
  676.   b:=0;
  677.   CheckEquals(0,FirstByteDiff(@a,@b,1,val1,val2),'FirstDiff(a,b,1)');
  678.   CheckEquals(a,Val1,'a<>Val1');
  679.   CheckEquals(b,Val2,'b<>Val2');
  680.   // Try size=0: should yield -1
  681.   CheckEquals(-1,FirstByteDiff(@a,@b,0,val1,val2),'FirstDiff(size=0)');
  682.   b:=a; // Now return should be -1 because a=b
  683.   CheckEquals(-1,FirstByteDiff(@a,@b,1,val1,val2),'FirstDiff(a=b,1)');
  684.   // 2. Test 8-byte (Int64) fields:
  685.   x:=$123456789ABCDEF0;
  686.   z:=$023456789ABCDEF0; // differs in MSByte = last byte, offset 7
  687.   CheckEquals(7,FirstByteDiff(@x,@z,8,val1,val2),'FirstDiff(x,z,8)');
  688.   CheckEquals($12,val1,'x-val1');
  689.   CheckEquals($02,val2,'z-val2');
  690.   // 3. Test 1024-byte (1KB) field:
  691.   for i:=0 to 1023 do b1[i]:=i and $FF; // test pattern
  692.   Move(b1[0],b2[0],1024); // copy b1 to b2 so should be identical
  693.   // Induce an error:
  694.   Inc(b2[777]); // should create a discrepancy at offset 777
  695.   CheckEquals(777,FirstByteDiff(@b1[0],@b2[0],1024,val1,val2),'FirstDiff(b1,b2,1024)');
  696.   CheckEquals($09,val1,'b1-val1');
  697.   CheckEquals($0A,val2,'b2-val2');
  698. end;
  699. {$ENDIF} // for conditional No CLR
  700. procedure TTestTest.TestElapsedTestTime;
  701. const
  702.   DELAY = 50;
  703. var
  704.   t, min, max: Cardinal;
  705. begin
  706.   Sleep(DELAY);
  707.   min := (DELAY * 5)  div 10;
  708.   max := (DELAY * 15) div 10 + 1;
  709.   t := ElapsedTestTime;
  710.   check((t <= max), Format('Expected elapsed time to be less than or equal to %d but was %d', [max, t]));
  711.   check((t >= min), Format('Expected elapsed time to be greater than or equal to %d but was %d', [min, t]));
  712. end;
  713. procedure TTestTest.TestEmptyTestFailure;
  714. var
  715.   EmptyTest: TEmptyTest;
  716. begin
  717.   EmptyTest := TEmptyTest.Create('Test');
  718.   VerifyFailure(EmptyTest);
  719. end;
  720. procedure TTestTest.TestFailOnDisAllowedUnCalledCheck;
  721. var
  722.   EmptyTest: TEmptyTest;
  723. begin
  724.   EmptyTest := TEmptyTest.Create('NoChecksTest');
  725.   EmptyTest.FailsOnNoChecksExecuted := True;
  726.   VerifyFailure(EmptyTest);
  727. end;
  728. procedure TTestTest.TestPassOnAllowedUnCalledCheck;
  729. var
  730.   EmptyTest: TEmptyTest;
  731. begin
  732.   EmptyTest := TEmptyTest.Create('NoChecksTest');
  733.   EmptyTest.FailsOnNoChecksExecuted := False;
  734.   VerifySuccess(EmptyTest);
  735. end;
  736. procedure TTestTest.TestAlloweLeakListIterator;
  737. var  // Test based on current allowed array length of 4
  738.   ListIteratorValue: TListIterator;
  739.   Value: integer;
  740. begin
  741.   AllowedMemoryLeakSize := 44;
  742.   // Note. Using more values than necessary to show it's handled gracefully
  743.   SetAllowedLeakArray([3, 97, -10]);
  744.   Value := AllowedMemoryLeakSize;
  745.   Check(Value = 44, 'Should return 44 but returned ' +
  746.     IntToStr(Value));
  747.   ListIteratorValue := AllowedLeaksIterator;
  748.   Value := ListIteratorValue;
  749.   Check(Value = 44, 'ListIterator should return 44 but returned ' +
  750.     IntToStr(Value));
  751.   Value := ListIteratorValue;
  752.   Check(Value =  3, 'ListIterator should return 3 but returned ' +
  753.     IntToStr(Value));
  754.   Value := ListIteratorValue;
  755.   Check(Value = 97, 'ListIterator should return 97 but returned ' +
  756.     IntToStr(Value));
  757.   Value := ListIteratorValue;
  758.   Check(Value = -10, 'ListIterator should return -10 but returned ' +
  759.     IntToStr(Value));
  760.   Value := ListIteratorValue;
  761.   Check(Value =  0, 'ListIterator should return 0 but returned ' +
  762.     IntToStr(Value));
  763. end;
  764. procedure TTestTest.TestError;
  765. var
  766.   ErrorTestCase: TRunExceptionCase;
  767. begin
  768.   ErrorTestCase := TRunExceptionCase.Create('Test');
  769.   VerifyError(ErrorTestCase);
  770. end;
  771. procedure TTestTest.TestFailure;
  772. var
  773.   FailureTestCase: TRunFalseAssertCase;
  774. begin
  775.   FailureTestCase := TRunFalseAssertCase.Create('Test');
  776.   VerifyFailure(FailureTestCase);
  777. end;
  778. {$IFDEF VER130}
  779. // It is Delphi 5 so define the Supports function as it was not introduced until Delphi 6
  780. function Supports(const AClass: IUnknown; const IID: TGUID): Boolean;
  781. var
  782.   Intf: IUnknown;
  783. begin
  784.   Result := (AClass.QueryInterface(IID, Intf) = S_OK) and Assigned(Intf);
  785. end;
  786. {$ENDIF}
  787. procedure TTestTest.SetUp;
  788. var
  789.   SuiteOfTests : ITest;
  790. begin
  791.   inherited;
  792.   SuiteOfTests := nil;
  793.   SuiteOfTests := TestFramework.RegisteredTests;
  794.   Assert(SuiteOfTests <> nil);
  795.   Assert(Supports(SuiteOfTests, ITest));
  796.   fTestCount := SuiteOfTests.Tests.Count;
  797. end;
  798. procedure TTestTest.TearDown;
  799. var
  800.   SuiteOfTests : ITest;
  801. begin
  802.   inherited;
  803.   SuiteOfTests := TestFramework.RegisteredTests;
  804.   while ((SuiteOfTests <> nil) and (SuiteOfTests.Tests.Count > fTestCount)) do
  805.   begin
  806.     SuiteOfTests.Tests.Items[SuiteOfTests.Tests.Count-1] := nil;
  807.     SuiteOfTests.Tests.Delete(SuiteOfTests.Tests.Count-1);
  808.   end;
  809.   SuiteOfTests := nil;
  810. end;
  811. procedure TTestTest.TestRegisterTest;
  812. var
  813.   TestsRegistered: integer;
  814. begin
  815.   AllowedMemoryLeakSize := 56;
  816.   { test needs more work - the below passes, but it's not checking everything }
  817.   TestsRegistered := RegisteredTests.Tests.Count;
  818.   RegisterTest('', TSuccessCase.Suite);
  819.   Check((RegisteredTests.Tests[TestsRegistered] as ITest).name = 'TSuccessCase');
  820.   TestsRegistered := RegisteredTests.Tests.Count;
  821.   RegisterTest('Suite', TSuccessCase.Suite);
  822.   Check((RegisteredTests.Tests[TestsRegistered] as ITest).name = 'Suite');
  823.   RegisterTest('Suite.ChildA', TSuccessCase.Suite);
  824.   RegisterTest('Suite.ChildB', TSuccessCase.Suite);
  825. end;
  826. procedure TTestTest.TestRunAndTearDownFails;
  827. var
  828.   ATornDown: TRunAndTearDownException;
  829. begin
  830.   ATornDown := TRunAndTearDownException.Create('Test');
  831.   ATornDown._AddRef;
  832.   try
  833.     VerifyError(ATornDown, 2);
  834.     check(ATornDown.TornDown, 'not torn down');
  835.   finally
  836.     ATornDown._Release;
  837.   end
  838. end;
  839. procedure TTestTest.TestSetupException;
  840. var
  841.   ASetupException: TSetupException;
  842. begin
  843.   ASetupException := TSetupException.Create('Test');
  844.   VerifyError(ASetupException);
  845. end;
  846. procedure TTestTest.TestSuccess;
  847. var
  848.   ASuccessCase: TSuccessCase;
  849. begin
  850.   ASuccessCase := TSuccessCase.Create('Test');
  851.   VerifySuccess(ASuccessCase);
  852. end;
  853. procedure TTestTest.TestTearDownAfterError;
  854. var
  855.   ARunExceptionTornDown: TRunExceptionTornDown;
  856. begin
  857.   ARunExceptionTornDown := TRunExceptionTornDown.Create('Test');
  858.   ARunExceptionTornDown._AddRef;
  859.   try
  860.     VerifyError(ARunExceptionTornDown);
  861.     check(ARunExceptionTornDown.TornDown, 'not torn down');
  862.   finally
  863.     ARunExceptionTornDown._Release;
  864.   end;
  865. end;
  866. procedure TTestTest.TestTearDownFails;
  867. var
  868.   ATearDownException: TTearDownException;
  869. begin
  870.   ATearDownException := TTearDownException.Create('Test');
  871.   VerifyError(ATearDownException);
  872. end;
  873. procedure TTestTest.TestTearDownSetupFails;
  874. var
  875.   ASetupExceptionTornDown: TSetupExceptionTornDown;
  876. begin
  877.   ASetupExceptionTornDown := TSetupExceptionTornDown.Create('Test');
  878.   ASetupExceptionTornDown._AddRef;
  879.   try
  880.     VerifyError(ASetupExceptionTornDown);
  881.     check(ASetupExceptionTornDown.TornDown);
  882.   finally
  883.     ASetupExceptionTornDown._Release
  884.   end;
  885. end;
  886. procedure TTestTest.TestWasNotSuccessful;
  887. var
  888.   ARunExceptionCase: TRunExceptionCase;
  889. begin
  890.   ARunExceptionCase := TRunExceptionCase.Create('Test');
  891.   VerifyLackOfSuccess(ARunExceptionCase);
  892. end;
  893. procedure TTestTest.TestWasStopped;
  894. var
  895.   AStopCase :ITest;
  896.   AResult   :TTestResult;
  897. begin
  898.   AStopCase := TStopTest.Suite;
  899.   AResult := AStopCase.run;
  900.   try
  901.     Verify(AResult, 3, 1, 0);
  902.     check(AResult.WasStopped);
  903.   finally
  904.     AResult.Free
  905.   end
  906. end;
  907. procedure TTestTest.TestWasSuccessful;
  908. var
  909.   ASuccessCase: TSuccessCase;
  910. begin
  911.   ASuccessCase := TSuccessCase.Create('Test');
  912.   VerifySuccess(ASuccessCase);
  913. end;
  914. { TRunExceptionCase }
  915. procedure TRunExceptionCase.Test;
  916. begin
  917.   raise EUnitTestException.Create('');
  918. end;
  919. { TRunFalseAssertCase }
  920. procedure TRunFalseAssertCase.Test;
  921. begin
  922.   check(false);
  923. end;
  924. { TSetupException }
  925. procedure TSetupException.SetUp;
  926. begin
  927.   raise EUnitTestException.Create('');
  928. end;
  929. procedure TSetupException.Test;
  930. begin
  931.   check(true);
  932. end;
  933. { TSuccessCase }
  934. procedure TSuccessCase.Test;
  935. begin
  936.   check(true);
  937. end;
  938. procedure TFailsCase.Test;
  939. begin
  940.   Check(False);
  941. end;
  942. { TTearDownException }
  943. procedure TTearDownException.TearDown;
  944. begin
  945.   raise EUnitTestException.Create('');
  946. end;
  947. { TSetupExceptionTornDown }
  948. procedure TSetupExceptionTornDown.SetUp;
  949. begin
  950.   raise EUnitTestException.Create('');
  951. end;
  952. { TTestTestResult }
  953. procedure TTestTestResult.SetUp;
  954. begin
  955.   FailsOnNoChecksExecuted := False;
  956. end;
  957. procedure TTestTestResult.TestElapsedTime;
  958. var
  959.   MockTimeSuite: ITest;
  960.   ATestResult: TTestResult;
  961. begin
  962.   MockTimeSuite := TMockedTimeSuite.Create(TMockedTimeCase);
  963.   ATestResult := nil;
  964.   try
  965.     ATestResult := MockTimeSuite.run;
  966.     CheckEquals(3, ATestResult.TotalTime, 'TestResult.TotalTime');
  967.   finally
  968.     ATestResult.Free;
  969.   end;
  970. end;
  971. procedure TTestTestResult.TestRun;
  972. var
  973.   ASuccessCase: ITest;
  974.   ATestResult: TTestResult;
  975. begin
  976.   ASuccessCase := TSuccessCase.Create('Test');
  977.   ATestResult := nil;
  978.   try
  979.     { TTestCase.run calls TTestResult.run. This test checks to ensure an
  980.       AV bug in TTestResult.run is fixed.}
  981.     ATestResult := ASuccessCase.run;
  982.   finally
  983.     ATestResult.Free;
  984.   end;
  985. end;
  986. { TTestMethodEnumerator }
  987. procedure TTestMethodEnumerator.TestMethodEnumerator;
  988. const
  989.   TotalMethods: integer = 3;
  990. var
  991.   i: integer;
  992. begin
  993.   FMethodEnumerator := TMethodEnumerator.Create(TTestMethodEnumClass);
  994.   try
  995.     check(FMethodEnumerator.MethodCount = TotalMethods);
  996.     for i := 0 to TotalMethods - 1 do
  997.       check(FMethodEnumerator.NameOfMethod[i] = 'Method' + IntToStr(i));
  998.   finally
  999.     FMethodEnumerator.Free;
  1000.   end;
  1001. end;
  1002. { TTestMethodEnumClass }
  1003. procedure TTestMethodEnumClass.Method0;
  1004. begin
  1005.   // do nothing, just used for TTestMethodEnumerator.TestMethodEnumerator
  1006. end;
  1007. procedure TTestMethodEnumClass.Method1;
  1008. begin
  1009.   // do nothing, just used for TTestMethodEnumerator.TestMethodEnumerator
  1010. end;
  1011. procedure TTestMethodEnumClass.Method2;
  1012. begin
  1013.   // do nothing, just used for TTestMethodEnumerator.TestMethodEnumerator
  1014. end;
  1015. { TStopTest }
  1016. procedure TStopTest.DoNothing;
  1017. begin
  1018.  // Stub so empty tests will not fail
  1019. end;
  1020. procedure TStopTest.doStop;
  1021. begin
  1022.   stopTests;
  1023. end;
  1024. procedure TStopTest.notExecutedOne;
  1025. begin
  1026.   DoNothing;
  1027. end;
  1028. procedure TStopTest.notExecutedTwo;
  1029. begin
  1030.   DoNothing;
  1031. end;
  1032. procedure TStopTest.testOne;
  1033. begin
  1034.   DoNothing;
  1035. end;
  1036. procedure TStopTest.testTwo;
  1037. begin
  1038.   DoNothing;
  1039. end;
  1040. { TExpectedTest }
  1041. procedure TExpectedTest.TestNotRaised;
  1042. begin
  1043.   StartExpectingException(EUnitTestException);
  1044.   StopExpectingException(ARBITRARY_STOPEXCEPT_MSG);
  1045. end;
  1046. procedure TExpectedTest.testRaised;
  1047. begin
  1048.   StartExpectingException(EUnitTestException);
  1049.   raise EUnitTestException.Create('testStartExpectingException');
  1050. end;
  1051. procedure TExpectedTest.testStart;
  1052. begin
  1053.   StopExpectingException;
  1054. end;
  1055. procedure TExpectedTest.testEnd;
  1056. begin
  1057.   StartExpectingException(EUnitTestException);
  1058. end;
  1059. { TEmptyTest }
  1060. {$IFOPT O-}
  1061. {$DEFINE UNOPTIMIZED}
  1062. {$OPTIMIZATION ON}
  1063. {$ENDIF}
  1064. procedure TEmptyTest.Test;
  1065. begin
  1066. // Test left intentionally empty
  1067. end;
  1068. {$IFDEF UNOPTIMIZED}
  1069. {$OPTIMIZATION OFF}
  1070. {$ENDIF}
  1071. {$IFOPT O+}
  1072. {$DEFINE OPTIMIZED}
  1073. {$OPTIMIZATION OFF}
  1074. {$ENDIF}
  1075. procedure TEmptyTest.NoChecksTest;
  1076. begin
  1077. // Test contains no executed calls to Check(...);
  1078. end;
  1079. {$IFDEF OPTIMIZED}
  1080. {$OPTIMIZATION ON}
  1081. {$ENDIF}
  1082. function TExpectedTest.RaiseException: Integer;
  1083. begin
  1084.   raise EUnitTestException.Create('testing exception');
  1085.   Result := 0;
  1086. end;
  1087. procedure TExpectedTest.RaiseExceptionProc;
  1088. begin
  1089.   RaiseException;
  1090. end;
  1091. procedure TExpectedTest.TestChecksAfterException;
  1092. begin
  1093.   StartExpectingException(EUnitTestException);
  1094.   CheckEquals(0, RaiseException, 'No error should have been reported');
  1095.   CheckEquals(0, RaiseException, 'This code is never reached! No error.');
  1096.   CheckEquals(0, 1, 'This code should never be reached!');
  1097. end;
  1098. procedure TExpectedTest.TestDifferentFromExpected;
  1099. begin
  1100.   StartExpectingException(ERangeError);
  1101.   CheckEquals(0, RaiseException, 'No error should have been reported');
  1102. end;
  1103. procedure TExpectedTest.TestInheritsFromExpected;
  1104. begin
  1105.   StartExpectingException(Exception);
  1106.   CheckEquals(0, RaiseException, 'No error should have been reported');
  1107. end;
  1108. procedure TExpectedTest.TestCheckException;
  1109. begin
  1110. {$IFDEF CLR}
  1111.   CheckException('RaiseExceptionProc', EUnitTestException);
  1112. {$ELSE}
  1113.   CheckException(RaiseExceptionProc, EUnitTestException);
  1114. {$ENDIF}
  1115. end;
  1116. procedure TExpectedTest.TestCheckWrongException;
  1117. begin
  1118. {$IFDEF CLR}
  1119.   CheckException('RaiseExceptionProc', ERangeError);
  1120. {$ELSE}
  1121.   CheckException(RaiseExceptionProc, ERangeError);
  1122. {$ENDIF}
  1123. end;
  1124. procedure TExpectedTest.TestNoExceptionRaised;
  1125. begin
  1126.   StartExpectingException(Exception);
  1127. end;
  1128. procedure TExpectedTest.DoNothing;
  1129. begin
  1130.   // nothing
  1131. end;
  1132. procedure TExpectedTest.testCheckAndNoExceptionRaised;
  1133. begin
  1134. {$IFDEF CLR}
  1135.   CheckException('DoNothing', Exception);
  1136. {$ELSE}
  1137.   CheckException(DoNothing, Exception);
  1138. {$ENDIF}
  1139. end;
  1140. { TTestExceptionChecks }
  1141. procedure TTestExceptionChecks.TestExpectedException;
  1142. var
  1143.   AExpectedCase :ITest;
  1144.   AResult   :TTestResult;
  1145. begin
  1146.   AExpectedCase := TExpectedTest.Suite;
  1147.   AResult := AExpectedCase.run;
  1148.   try
  1149.     Verify(AResult, AExpectedCase.CountEnabledTestCases, 6, 0);
  1150.   finally
  1151.     AResult.Free
  1152.   end
  1153. end;
  1154. procedure TTestExceptionChecks.TestIndividualException(AName: string; FailCnt, ErrCnt: Integer);
  1155. var
  1156.   AExpectedCase: ITest;
  1157.   AResult: TTestResult;
  1158. begin
  1159.   AExpectedCase := TExpectedTest.Create(AName);
  1160.   AResult := AExpectedCase.run;
  1161.   try
  1162.     Verify(AResult, 1, FailCnt, ErrCnt);
  1163.   finally
  1164.     AResult.Free
  1165.   end;
  1166. end;
  1167. procedure TTestExceptionChecks.TestCheckException;
  1168. begin
  1169.   TestIndividualException('TestCheckException', 0, 0);
  1170. end;
  1171. procedure TTestExceptionChecks.TestChecksAfterException;
  1172. begin
  1173.   TestIndividualException('TestChecksAfterException', 0, 0);
  1174. end;
  1175. procedure TTestExceptionChecks.TestCheckWrongException;
  1176. begin
  1177.   TestIndividualException('TestCheckWrongException', 1, 0);
  1178. end;
  1179. procedure TTestExceptionChecks.TestDifferentFromExpected;
  1180. begin
  1181.   TestIndividualException('TestDifferentFromExpected', 1, 0);
  1182. end;
  1183. procedure TTestExceptionChecks.TestInheritsFromExpected;
  1184. begin
  1185.   TestIndividualException('TestInheritsFromExpected', 0, 0);
  1186. end;
  1187. procedure TTestExceptionChecks.TestNoExceptionRaised;
  1188. begin
  1189.   TestIndividualException('TestNoExceptionRaised', 1, 0);
  1190. end;
  1191. procedure TTestExceptionChecks.TestCheckAndNoExceptionRaised;
  1192. begin
  1193.   TestIndividualException('TestCheckAndNoExceptionRaised', 1, 0);
  1194. end;
  1195. procedure TTestExceptionChecks.TestNotRaised;
  1196. var
  1197.   AExpectedCase :ITest;
  1198.   AResult   :TTestResult;
  1199. begin
  1200.   AExpectedCase := TExpectedTest.Create('TestNotRaised');
  1201.   AResult := AExpectedCase.run;
  1202.   try
  1203.     Verify(AResult, 1, 1, 0);
  1204.     CheckEqualsString( EXPECTED_STOPEXCEPT_MSG,
  1205.                  AResult.Failures[0].ThrownExceptionMessage,
  1206.                  'wrong message thrown from StopExpectingException');
  1207.   finally
  1208.     AResult.Free
  1209.   end;
  1210. end;
  1211. { TTestWthStatusMsgs }
  1212. procedure TTestWithStatusMsgs.Test;
  1213. begin
  1214.   Status('Line 1');
  1215.   Status('Line 2');
  1216.   Status('Line 3');
  1217. end;
  1218. { TTestStatus }
  1219. procedure TTestStatus.testStatus;
  1220. var
  1221.   AStatusCase: TTestWithStatusMsgs;
  1222. const
  1223. {$IFDEF WIN32}
  1224.   constLineDelim = #13#10;
  1225. {$ENDIF}
  1226. {$IFDEF CLR}
  1227.   constLineDelim = #13#10;
  1228. {$ENDIF}
  1229. {$IFDEF LINUX}
  1230.   constLineDelim = #10;
  1231. {$ENDIF}
  1232.   constStatusTestStr =
  1233.       'Line 1' + constLineDelim
  1234.       + 'Line 2' + constLineDelim
  1235.       + 'Line 3' + constLineDelim;
  1236. begin
  1237.   AStatusCase := TTestWithStatusMsgs.Create('Test');
  1238.   try
  1239.     AStatusCase._AddRef;
  1240.     VerifySuccess(AStatusCase);
  1241.     CheckEqualsString(AStatusCase.getStatus, constStatusTestStr,
  1242.       'Status not correctly validated in test');
  1243.   finally
  1244.     AStatusCase._Release;
  1245.   end;
  1246. end;
  1247. { TFixtureSuite }
  1248. procedure TFixtureSuite.SetUp;
  1249. begin
  1250.   inherited;
  1251.   SetUpCalled := true;
  1252. end;
  1253. procedure TFixtureSuite.TearDown;
  1254. begin
  1255.   TearDownCalled := true;
  1256.   inherited;
  1257. end;
  1258. { TTestTestSuite }
  1259. procedure TTestTestSuite.TestSuiteSetupTearDown;
  1260. var
  1261.   AFixtureSuite: TFixtureSuite;
  1262. begin
  1263.   AFixtureSuite := TFixtureSuite.Create('Fixture Suite');
  1264. {$IFNDEF CLR}
  1265.   AFixtureSuite._AddRef;
  1266. {$ENDIF}
  1267.   try
  1268.     AFixtureSuite.AddTests(TSuccessCase);
  1269.     VerifySuccess(AFixtureSuite);
  1270.     CheckEquals(true, AFixtureSuite.SetUpCalled, 'Suite SetUp called');
  1271.     CheckEquals(true, AFixtureSuite.TearDownCalled, 'Suite TearDown called');
  1272.   finally
  1273. {$IFNDEF CLR}
  1274.     AFixtureSuite._Release;
  1275. {$ENDIF}
  1276.   end;
  1277. end;
  1278. { TMockedTimeCase }
  1279. function TMockedTimeCase.ElapsedTestTime: Cardinal;
  1280. begin
  1281.   Result := 1;
  1282. end;
  1283. procedure TMockedTimeCase.SuccessOne;
  1284. begin
  1285.   Check(true);
  1286. end;
  1287. procedure TMockedTimeCase.SuccessTwo;
  1288. begin
  1289.   Check(true);
  1290. end;
  1291. { TMockedTimeSuite }
  1292. function TMockedTimeSuite.ElapsedTestTime: Cardinal;
  1293. begin
  1294.   Result := 3;
  1295. end;
  1296. procedure TTestMemLeakTestSuite.SetUp;
  1297. var
  1298.   SuiteOfTests : ITest;
  1299. begin
  1300.   inherited;
  1301.   SuiteOfTests := nil;
  1302.   SuiteOfTests := TestFramework.RegisteredTests;
  1303.   Assert(SuiteOfTests <> nil);
  1304.   Assert(Supports(SuiteOfTests, ITest));
  1305.   fTestCount := SuiteOfTests.Tests.Count;
  1306.   FreeAndNil(AnObject);
  1307. end;
  1308. procedure TTestMemLeakTestSuite.TearDown;
  1309. var
  1310.   SuiteOfTests : ITest;
  1311. begin
  1312.   inherited;
  1313.   SuiteOfTests := nil;
  1314.   SuiteOfTests := TestFramework.RegisteredTests;
  1315.   while ((SuiteOfTests <> nil) and (SuiteOfTests.Tests.Count > fTestCount)) do
  1316.   begin
  1317.     SuiteOfTests.Tests.Items[SuiteOfTests.Tests.Count-1] := nil;
  1318.     SuiteOfTests.Tests.Delete(SuiteOfTests.Tests.Count-1);
  1319.   end;
  1320.   FreeAndNil(AnObject);
  1321. end;
  1322. procedure TTestMemLeakTestSuite.TestClassCanDetectFailure;
  1323. var
  1324.   TestWillFail: TFailsCase;
  1325. begin
  1326. {$IFDEF CLR}
  1327.   Check(True);
  1328. {$ELSE}
  1329.   {$IFDEF VER180}
  1330.     Check(not IsMemoryManagerSet, 'Unknown Memory Manager loaded');
  1331.   {$ELSE}
  1332.   Check(IsMemoryManagerSet, 'Memory Manager not loaded');
  1333.   {$ENDIF}
  1334. {$ENDIF}
  1335.   TestWillFail := TFailsCase.Create('Test');
  1336.   TestWillFail.FailsOnMemoryLeak := True;
  1337.   VerifyFailure(TestWillFail);
  1338. end;
  1339. procedure TTestMemLeakTestSuite.TestCaseDoesNotLeak;
  1340. var
  1341.   LeakyTest: TLeakyTest;
  1342. begin
  1343.   LeakyTest := TLeakyTest.Create('TestDoesNotLeak');
  1344.   LeakyTest.FailsOnMemoryLeak := True;
  1345.   VerifySuccess(LeakyTest);
  1346.   FreeAndNil(AnObject);
  1347. end;
  1348. procedure TTestMemLeakTestSuite.TestCaseLeaksTObject;
  1349. var
  1350.   LeakyTest: TLeakyTest;
  1351. begin
  1352.   LeakyTest := TLeakyTest.Create('TestContainsTObjectLeak');
  1353.   LeakyTest.FailsOnMemoryLeak := True;
  1354.   VerifyFailure(LeakyTest);
  1355.   FreeAndNil(AnObject);
  1356. end;
  1357. procedure TTestMemLeakTestSuite.TestCaseLeaksTObjectReportDisabled;
  1358. var
  1359.   LeakyTest: TLeakyTest;
  1360. begin
  1361.   LeakyTest := TLeakyTest.Create('TestContainsTObjectLeak');
  1362.   LeakyTest.FailsOnMemoryLeak := False;
  1363.   VerifySuccess(LeakyTest);
  1364.   FreeAndNil(AnObject);
  1365. end;
  1366. procedure TTestMemLeakTestSuite.TestCaseLeaksTObjectLeakOfSizeAllowed;
  1367. var
  1368.   LeakyTest: TLeakyTest;
  1369. begin
  1370.   LeakyTest := TLeakyTest.Create('TestContainsAllowedTObjectLeak');
  1371.   LeakyTest.FailsOnMemoryLeak := True;
  1372.   VerifySuccess(LeakyTest);
  1373.   FreeAndNil(AnObject);
  1374. end;
  1375. procedure TTestMemLeakTestSuite.TestCaseLeaksTObjectLeakOfListSizeAllowed;
  1376. var
  1377.   LeakyTest: TLeakyTest;
  1378. begin
  1379.   LeakyTest := TLeakyTest.Create('TestContainsAllowedTObjectLeakByList');
  1380.   LeakyTest.FailsOnMemoryLeak := True;
  1381.   VerifySuccess(LeakyTest);
  1382.   FreeAndNil(AnObject);
  1383. end;
  1384. procedure TTestMemLeakTestSuite.TestCaseLeaksAllowedTObjectLeakOfEmptyList;
  1385. var
  1386.   LeakyTest: TLeakyTest;
  1387. begin
  1388.   LeakyTest := TLeakyTest.Create('TestContainsAllowedTObjectLeakByEmptyList');
  1389.   LeakyTest.FailsOnMemoryLeak := True;
  1390.   VerifySuccess(LeakyTest);
  1391.   FreeAndNil(AnObject);
  1392. end;
  1393. procedure TTestMemLeakTestSuite.TestCaseFailsOnOverSizeAllowedLeakArrayList;
  1394. var
  1395.   LeakyTest: TLeakyTest;
  1396. begin
  1397.   LeakyTest := TLeakyTest.Create('TestContainsAllowedLeakArrayLongList');
  1398.   LeakyTest.FailsOnMemoryLeak := True;
  1399.   VerifyLackOfSuccess(LeakyTest);
  1400.   FreeAndNil(AnObject);
  1401. end;
  1402. procedure TTestMemLeakTestSuite.TestCaseNoLeaksAtSetupTearDownLevel;
  1403. var
  1404.   LeakyTest: TLeakySetupTearDown;
  1405. begin
  1406.   LeakyTest := TLeakySetupTearDown.Create('TestSetupTearDownLeakDetect');
  1407.   LeakyTest.FailsOnMemoryLeak := True;
  1408.   VerifyFailure(LeakyTest);
  1409.   FreeAndNil(AnObject);
  1410. end;
  1411. procedure TTestMemLeakTestSuite.TestCaseLeaksAtSetupTearDownLevel;
  1412. var
  1413.   LeakyTest: TLeakySetupTearDown;
  1414. begin
  1415.   LeakyTest := TLeakySetupTearDown.Create('TestSetupTearDownLeakDetect');
  1416.   LeakyTest.FailsOnMemoryLeak := True;
  1417.   VerifyFailure(LeakyTest);
  1418.   FreeAndNil(AnObject);
  1419. end;
  1420. procedure TTestMemLeakTestSuite.TestCaseIgnoresLeaksAtSetupTearDownLevel;
  1421. var
  1422.   LeakyTest: TLeakySetupTearDown;
  1423. begin
  1424.   LeakyTest := TLeakySetupTearDown.Create('TestSetupTearDownLeakDetect');
  1425.   LeakyTest.FailsOnMemoryLeak := True;
  1426.   LeakyTest.IgnoreSetUpTearDownLeaks:= True;
  1427.   VerifySuccess(LeakyTest);
  1428.   FreeAndNil(AnObject);
  1429. end;
  1430. procedure TTestMemLeakTestSuite.TestCaseDoesNotIgnoreLeaksInTestProc;
  1431. var
  1432.   LeakyTest: TLeakyTest;
  1433. begin
  1434.   LeakyTest := TLeakyTest.Create('TestContainsTObjectLeak');
  1435.   LeakyTest.FailsOnMemoryLeak := True;
  1436.   LeakyTest.IgnoreSetUpTearDownLeaks:= True;
  1437.   VerifyFailure(LeakyTest);
  1438.   FreeAndNil(AnObject);
  1439. end;
  1440. procedure TLeakyTest.Setup;
  1441. begin
  1442.   FailsOnNoChecksExecuted := False;
  1443. end;
  1444. procedure TLeakyTest.TestDoesNotLeak;
  1445. begin
  1446.   Check(True, 'Test does not leak and never fails');
  1447. end;
  1448. procedure TLeakyTest.TestContainsTObjectLeak;
  1449. begin
  1450.   AnObject := TObject.Create;
  1451. end;
  1452. procedure TLeakyTest.TestContainsAllowedTObjectLeak;
  1453. begin
  1454.   AnObject := TObject.Create;
  1455.   AllowedMemoryLeakSize := 16;
  1456. end;
  1457. procedure TLeakyTest.TestContainsAllowedTObjectLeakByList;
  1458. begin
  1459.   AnObject := TObject.Create;
  1460.   SetAllowedLeakArray([1, 7, 16]);
  1461. end;
  1462. procedure TLeakyTest.TestContainsAllowedTObjectLeakByEmptyList;
  1463. begin
  1464.   AnObject := TObject.Create;
  1465.   AllowedMemoryLeakSize := 16;
  1466.   SetAllowedLeakArray([]);
  1467. end;
  1468. procedure TLeakyTest.TestContainsAllowedLeakArrayLongList;
  1469. begin
  1470.   AnObject := TObject.Create;
  1471.   SetAllowedLeakArray([1, 7, 16, 55]);  // causes deliberate failure
  1472. end;
  1473. procedure TLeakySetupTearDown.SetUp;
  1474. begin
  1475.   AnObject := TObject.Create;
  1476. end;
  1477. procedure TLeakySetupTearDown.TearDown;
  1478. begin
  1479.   if FreeInTearDown then
  1480.     FreeAndNil(AnObject);
  1481. end;
  1482. procedure TLeakySetupTearDown.TestCaseDoesNotLeak;
  1483. begin
  1484.   FreeInTearDown := True;
  1485.   Check(Assigned(AnObject), 'Object should be Assigned');
  1486. end;
  1487. procedure TLeakySetupTearDown.TestSetupTearDownLeakDetect;
  1488. begin
  1489.   // Dont allow TearDown to free object created in SetUp.
  1490.   // Cause mem leak at teardown phase.
  1491.   FreeInTearDown := false;
  1492.   Check(Assigned(AnObject), 'Object should be Assigned');
  1493. end;
  1494. { TTestBasicTestCase4Leaks }
  1495. type
  1496.   TTiny1 = class(TTestCase)
  1497.   private
  1498.     FTestRan: boolean;
  1499.   public
  1500.     constructor Create(MethodName: string); override;
  1501.     destructor Destroy; override;
  1502.   published
  1503.     procedure NonEmptyProc;
  1504.   end;
  1505.   TTiny2 = class(TTestCase)
  1506.   private
  1507.     FTestRan: boolean;
  1508.   public
  1509.     constructor Create(MethodName: string); override;
  1510.     destructor Destroy; override;
  1511.   published
  1512.     procedure NonEmptyProc;
  1513.   end;
  1514. constructor TTiny1.Create(MethodName: string);
  1515. begin
  1516.   inherited Create(MethodName);
  1517. end;
  1518. destructor TTiny1.Destroy;
  1519. begin
  1520.   inherited;
  1521. end;
  1522. procedure TTiny1.NonEmptyProc;
  1523. begin
  1524.   FTestRan := True;
  1525. end;
  1526. constructor TTiny2.Create(MethodName: string);
  1527. begin
  1528.   inherited Create(MethodName);
  1529. end;
  1530. destructor TTiny2.Destroy;
  1531. begin
  1532.   inherited;
  1533. end;
  1534. procedure TTiny2.NonEmptyProc;
  1535. begin
  1536.   FTestRan := True;
  1537. end;
  1538. procedure TTestBasicTestCase4Leaks.TestCheckIfTAbstractTestLeaks;
  1539. var
  1540.   TrialTest: TAbstractTest;
  1541.   MLM: IMemLeakMonitor;
  1542.   LeakSize: integer;
  1543. begin
  1544.   MLM := MemLeakMonitor;
  1545.   TrialTest := TAbstractTest.Create('ABCDEFG12345');
  1546.   FreeAndNil(TrialTest);
  1547.   Check(not MLM.MemLeakDetected(LeakSize),
  1548.     'Named TAbstractTest leaks ' + IntToStr(LeakSize) + ' Bytes');
  1549.   MLM := nil;
  1550. end;
  1551. procedure TTestBasicTestCase4Leaks.TestCheckIfTTestCaseLeaks;
  1552. var
  1553.   TrialTestCase: TTiny1;
  1554.   MLM: IMemLeakMonitor;
  1555.   LeakSize: integer;
  1556. begin
  1557.   MLM := MemLeakMonitor;
  1558.   TrialTestCase := TTiny1.Create('NonEmptyProc');
  1559.   FreeAndNil(TrialTestCase);
  1560.   Check(not MLM.MemLeakDetected(LeakSize), 'TTiny1 leaks '
  1561.     + IntToStr(LeakSize) + ' Bytes');
  1562.   MLM := nil;
  1563. end;
  1564. procedure TTestBasicTestCase4Leaks.TestCheckIfTTestResultLeaks;
  1565. var
  1566.   TrialTestResult: TTestResult;
  1567.   MLM: IMemLeakMonitor;
  1568.   LeakSize: integer;
  1569. begin
  1570.   MLM := MemLeakMonitor;
  1571.   TrialTestResult := TTestResult.Create;
  1572.   FreeAndNil(TrialTestResult);
  1573.   Check(not MLM.MemLeakDetected(LeakSize), 'TTestResult leaks '
  1574.     + IntToStr(LeakSize) + ' Bytes');
  1575.   MLM := nil;
  1576. end;
  1577. procedure TTestBasicTestCase4Leaks.TestCheckIfTStatusListnerLeaks;
  1578. var
  1579.   TrialStatusListner: IStatusListener;
  1580.   TrialTestResult: TTestResult;
  1581.   MLM: IMemLeakMonitor;
  1582.   LeakSize: integer;
  1583. begin
  1584.   TrialTestResult := nil;
  1585.   try
  1586.     TrialTestResult := TTestResult.Create;
  1587.     MLM := MemLeakMonitor;
  1588.     TrialStatusListner := TStatusToResultAdapter.Create(TrialTestResult);
  1589.     Check(Assigned(TrialStatusListner), 'Failed to create TStatusToResultAdapter');
  1590.     TrialStatusListner := nil;
  1591.     Check(not MLM.MemLeakDetected(LeakSize), 'IStatusListener leaks '
  1592.       + IntToStr(LeakSize) + ' Bytes');
  1593.     MLM := nil;
  1594.   finally
  1595.     FreeAndNil(TrialTestResult);
  1596.   end;
  1597. end;
  1598. procedure TTestBasicTestCase4Leaks.TestCheckIfTTestFalureLeaks;
  1599. var
  1600.   TrialTestFailure: TTestFailure;
  1601.   MLM: IMemLeakMonitor;
  1602.   LeakSize: integer;
  1603.   TrialTestCase: TTiny1;
  1604. begin
  1605.   MLM := MemLeakMonitor;
  1606.   TrialTestCase := TTiny1.Create('NonEmptyProc');
  1607.   TrialTestFailure := TTestFailure.Create(TrialTestCase, nil, 'A String');
  1608.   FreeAndNil(TrialTestFailure); // Note. Seems to free TrialTestCase early.
  1609.   Check(not MLM.MemLeakDetected(LeakSize), 'TTestFailure leaks '
  1610.     + IntToStr(LeakSize) + ' Bytes');
  1611.   MLM := nil;
  1612. end;
  1613. procedure TTestBasicTestCase4Leaks.TestCheckIfRunTTestCaseLeaks;
  1614. var
  1615.   TrialTestCase: TTiny1;
  1616.   TrialTestResult: TTestResult;
  1617.   MLM: IMemLeakMonitor;
  1618.   LeakSize: integer;
  1619. begin
  1620.   MLM := MemLeakMonitor;
  1621.   TrialTestCase := TTiny1.Create('NonEmptyProc');
  1622.   TrialTestResult := TTestResult.Create;
  1623.   TrialTestResult.RunSuite(TrialTestCase);
  1624.   FreeAndNil(TrialTestResult);
  1625.   Check(not MLM.MemLeakDetected(LeakSize), 'TTiny1 leaks '
  1626.     + IntToStr(LeakSize) + ' Bytes');
  1627.   MLM := nil;
  1628. end;
  1629. procedure TTestBasicTestCase4Leaks.TestCheckIfEnumeratorLeaks;
  1630. var
  1631.   MLM: IMemLeakMonitor;
  1632.   LeakSize: integer;
  1633.   TrialEnumerator: TMethodEnumerator;
  1634. begin
  1635.   MLM := MemLeakMonitor;
  1636.   TrialEnumerator := TMethodEnumerator.Create(TTiny1);
  1637.   FreeAndNil(TrialEnumerator);
  1638.   Check(not MLM.MemLeakDetected(LeakSize), 'TrialEnumerator leaks '
  1639.     + IntToStr(LeakSize) + ' Bytes');
  1640.   MLM := nil;
  1641. end;
  1642. procedure TTestBasicTestCase4Leaks.TestCheckIfITestSuiteLeaks;
  1643. var
  1644.   MLM: IMemLeakMonitor;
  1645.   LeakSize: integer;
  1646.   TrialTestSuite: ITestSuite;
  1647. // Suite creation put inside local procedure to provide an end statement to
  1648. // hit before the memory difference is computed.
  1649. // This is believed to be due to the suite ref creation in TestFramework
  1650. // <function TestSuite(name: string; const Tests: array of ITest): ITestSuite;>
  1651. // Free up of interfaced refs needs a end statement to complete mem release.
  1652.   procedure LRunTest;
  1653.   begin
  1654.     TrialTestSuite := TestSuite('MyTestSuite', [TTiny1.Suite, TTiny2.Suite]);
  1655.     TrialTestSuite := nil;
  1656.   end;
  1657. begin
  1658.   MLM := MemLeakMonitor;
  1659.   LRunTest;
  1660.   Check(not MLM.MemLeakDetected(LeakSize), 'TrialTestSuite leaks '
  1661.     + IntToStr(LeakSize) + ' Bytes');
  1662.   MLM := nil;
  1663. end;
  1664. initialization
  1665.   RegisterTests('Framework Suites',[TTestTest.Suite,
  1666.                                     TTestTestResult.Suite,
  1667.                                     TTestStatus.Suite,
  1668.                                     TTestMethodEnumerator.Suite,
  1669.                                     TTestExceptionChecks.Suite,
  1670. {$IFDEF DETECTMEMLEAKS}
  1671.                                     TBasicMemMonitor.Suite,
  1672.                                     TMemMonitorGetErrorMessage.Suite,
  1673.                                     TMemMonitorGetErrorMessageNew.Suite,
  1674.                                     TTestMemLeakTestSuite.Suite,
  1675.                                     TTestBasicTestCase4Leaks.Suite,
  1676. {$ENDIF}
  1677.                                     TTestTestSuite.Suite]);
  1678. end.