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

Email服务器

开发平台:

Delphi

  1. { #(@)$Id: UnitTestGUITesting.pas,v 1.50 2006/07/19 02:52:55 judc Exp $ }
  2. {: DUnit: An XTreme testing framework for Delphi programs.
  3.    @author  The DUnit Group.
  4.    @version $Revision: 1.50 $ uberto 08/03/2001
  5. }
  6. (*
  7.  * The contents of this file are subject to the Mozilla Public
  8.  * License Version 1.1 (the "License"); you may not use this file
  9.  * except in compliance with the License. You may obtain a copy of
  10.  * the License at http://www.mozilla.org/MPL/
  11.  *
  12.  * Software distributed under the License is distributed on an "AS
  13.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  14.  * implied. See the License for the specific language governing
  15.  * rights and limitations under the License.
  16.  *
  17.  * The Original Code is DUnit.
  18.  *
  19.  * The Initial Developers of the Original Code are Serge Beaumont
  20.  * and Juancarlo A馿z.
  21.  * Portions created The Initial Developers are Copyright (C) 1999-2000.
  22.  * Portions created by The DUnit Group are Copyright (C) 2000-2003.
  23.  * All rights reserved.
  24.  *
  25.  * Contributor(s):
  26.  * Serge Beaumont <beaumose@iquip.nl>
  27.  * Juanco A馿z <juanco@users.sourceforge.net>
  28.  * Uberto Barbini <uberto@usa.net>
  29.  * Kris Golko <neuromancer@users.sourceforge.net>
  30.  * Kenneth Semeijn <kennethsem@users.sourceforge.net>
  31.  * Jon Bertrand <jonbsfnet@users.sourceforge.net>
  32.  * The DUnit group at SourceForge <http://dunit.sourceforge.net>
  33.  *
  34.  *)
  35. {$IFDEF LINUX}
  36. {$DEFINE DUNIT_CLX}
  37. {$ENDIF}
  38. unit UnitTestGUITesting;
  39. interface
  40. uses
  41.   GUITesting,
  42. {$IFDEF DUNIT_CLX}
  43.   Qt, QGraphics, QForms, QMenus, QStdCtrls, QControls,
  44.   QGUITestRunner,
  45. {$ELSE}
  46.   Windows, Messages, Graphics, Forms, Menus, StdCtrls, Controls,
  47.   GUITestRunner,
  48. {$ENDIF}
  49.   SysUtils,
  50.   Classes {Variants,};
  51. const
  52.   rcs_id: string = '#(@)$Id: UnitTestGUITesting.pas,v 1.50 2006/07/19 02:52:55 judc Exp $';
  53. type
  54.   TDunitDialogCracker = class(TGUITestRunner);
  55.   { This form is used to test some of the methods in TGUITestCase }
  56.   TTestForm = class(TForm)
  57.     xButton: TButton;
  58.     xEdit: TEdit;
  59.     xMemo: TMemo;
  60.     MainMenu1: TMainMenu;
  61.     est11: TMenuItem;
  62.     xAltBackspace: TMenuItem;
  63.     xCtrlA: TMenuItem;
  64.     F21: TMenuItem;
  65.     xButton2: TButton;
  66.     xButton3: TButton;
  67.     procedure xButtonClick(Sender: TObject);
  68.     procedure xEditKeyUp(Sender: TObject; var Key: Word;
  69.       Shift: TShiftState);
  70.     procedure FormCreate(Sender: TObject);
  71.     procedure xEditKeyDown(Sender: TObject; var Key: Word;
  72.       Shift: TShiftState);
  73.     procedure FormKeyDown(Sender: TObject; var Key: Word;
  74.       Shift: TShiftState);
  75.     procedure FormKeyPress(Sender: TObject; var Key: Char);
  76.     procedure FormKeyUp(Sender: TObject; var Key: Word;
  77.       Shift: TShiftState);
  78.     procedure xAltBackspaceClick(Sender: TObject);
  79.     procedure xCtrlAClick(Sender: TObject);
  80.     procedure F8Click(Sender: TObject);
  81.   public
  82.     ButtonClickCount, EditKeyDownCount, EditKeyUpCount,
  83.     FormKeyDownCount, FormKeyUpCount : integer;
  84.     AltBackspaceCount, ControlACount, Function8Count : integer;
  85.     FormKeys : string;
  86.     procedure ResetForm;
  87.   end;
  88.   T_TGUITestCase = class(TGUITestCase)
  89.   protected
  90.     mForm : TTestForm;
  91.     procedure SetUp; override;
  92.   public
  93.     procedure TearDown; override;
  94.   published
  95.     procedure Test_Form_Releases;
  96.     procedure Test_IsFocused;
  97.     procedure Test_Sleep;
  98.     procedure Test_EnterKeyInto;
  99.     procedure Test_EnterKey;
  100.     procedure Test_EnterTextInto;
  101.     procedure Test_Tab;
  102.   end;
  103.   TGUITestRunnerTests = class(TGUITestCase)
  104.   private
  105.     FRunner :TGUITestRunner;
  106.   public
  107.     { Test BOOLEVAL OFF Directive }
  108.     mRefCountA, mRefCountB : integer;
  109.     function TestA(const ReturnValue : boolean) : boolean;
  110.     function TestB(const ReturnValue : boolean) : boolean;
  111.     procedure TestAnd(const A, B : boolean);
  112.     procedure TestOr(const A, B : boolean);
  113.     procedure SetUp; override;
  114.     procedure TearDown; override;
  115.     {$IFDEF LINUX}
  116.     procedure TestStatus;
  117.     {$ENDIF}
  118.   published
  119.     procedure Test_BooleanEvalOff;
  120.     procedure TestTabOrder;
  121.     procedure TestViewResult;
  122.     procedure TestElapsedTime;
  123.     procedure RunEmptySuite;
  124.     procedure RunSuccessSuite;
  125.     procedure RunFailureSuite;
  126.     {$IFDEF WIN32}
  127.     procedure TestStatus;
  128.     {$ENDIF}
  129.     procedure TestRunSelectedTestWithDecorator;
  130.     procedure TestRunSelectedTestWithSetupDecorator;
  131.     {$IFNDEF DUNIT_CLX}
  132.     procedure TestGoToPrevNextSelectedNode;
  133.     {$ENDIF}
  134.   end;
  135. implementation
  136. uses
  137.   TestFramework,
  138.   TestExtensions;
  139. {$R *.dfm}
  140. type
  141.   TSuccessTestCase = class(TTestCase)
  142.   published
  143.     procedure OneSuccess;
  144.     procedure SecondSuccess;
  145.   end;
  146.   TFailuresTestCase = class(TTestCase)
  147.   private
  148.     procedure DoNothing;
  149.   published
  150.     procedure OneSuccess;
  151.     procedure OneFailure;
  152.     procedure SecondFailure;
  153.     procedure OneError;
  154.   end;
  155.   TTimeTestCase = class(TTestCase)
  156.   published
  157.     procedure TestTime;
  158.   end;
  159.   TStatusTestCase = class(TTestCase)
  160.   published
  161.     procedure OneSuccessWithStatus;
  162.     procedure SecondSuccessWithStatus;
  163.   public
  164.     procedure SetUp; override;
  165.   end;
  166.   TSetupTestCase = class(TTestSetup)
  167.   protected
  168.     FSetupCount : integer;
  169.     FTearDownCount : integer;
  170.     procedure SetUp; override;
  171.     procedure TearDown; override;
  172.   public
  173.     procedure AfterConstruction; override;
  174.   end;
  175. { TTestForm }
  176. procedure TTestForm.ResetForm;
  177. begin
  178.   ButtonClickCount := 0;
  179.   EditKeyDownCount := 0;
  180.   EditKeyUpCount := 0;
  181.   FormKeyDownCount := 0;
  182.   FormKeyUpCount := 0;
  183.   AltBackspaceCount := 0;
  184.   ControlACount := 0;
  185.   Function8Count := 0;
  186.   xEdit.Text := '';
  187.   FormKeys := '';
  188. end;
  189. procedure TTestForm.FormCreate(Sender: TObject);
  190. begin
  191.   ResetForm;
  192. end;
  193. procedure TTestForm.xButtonClick(Sender: TObject);
  194. begin
  195.   inc(ButtonClickCount);
  196. end;
  197. procedure TTestForm.xEditKeyDown(Sender: TObject; var Key: Word;
  198.   Shift: TShiftState);
  199. begin
  200.   inc(EditKeyDownCount);
  201. end;
  202. procedure TTestForm.xEditKeyUp(Sender: TObject; var Key: Word;
  203.   Shift: TShiftState);
  204. begin
  205.   inc(EditKeyUpCount);
  206. end;
  207. procedure TTestForm.FormKeyDown(Sender: TObject; var Key: Word;
  208.   Shift: TShiftState);
  209. begin
  210.   inc(FormKeyDownCount);
  211.   Assert(FormKeyDownCount > EditKeyDownCount);
  212. end;
  213. procedure TTestForm.FormKeyPress(Sender: TObject; var Key: Char);
  214. begin
  215.   FormKeys := FormKeys + Key;
  216. end;
  217. procedure TTestForm.FormKeyUp(Sender: TObject; var Key: Word;
  218.   Shift: TShiftState);
  219. begin
  220.   inc(FormKeyUpCount);
  221.   Assert(FormKeyUpCount > EditKeyUpCount);
  222. end;
  223. procedure TTestForm.xAltBackspaceClick(Sender: TObject);
  224. begin
  225.   inc(AltBackSpaceCount);
  226. end;
  227. procedure TTestForm.xCtrlAClick(Sender: TObject);
  228. begin
  229.   inc(ControlACount);
  230. end;
  231. procedure TTestForm.F8Click(Sender: TObject);
  232. begin
  233.   inc(Function8Count);
  234. end;
  235. { T_TGUITestCase }
  236. procedure T_TGUITestCase.SetUp;
  237. begin
  238.   inherited;
  239.   mForm := TTestForm.Create(nil);
  240.   ActionDelay := 10;
  241.   mForm.Show;
  242.   Application.ProcessMessages;
  243. end;
  244. procedure T_TGUITestCase.TearDown;
  245. begin
  246.   mForm.Release;
  247.   Application.ProcessMessages;
  248.   inherited;
  249. end;
  250. procedure T_TGUITestCase.Test_IsFocused;
  251. begin
  252.   fFailsOnNoChecksExecuted := False;
  253.   SetFocus(mForm.xButton);
  254.   Assert(not IsFocused(mForm.xButton2));
  255.   Assert(IsFocused(mForm.xButton));
  256. end;
  257. procedure T_TGUITestCase.Test_Sleep;
  258. var before, after, diff : TDateTime;
  259. begin
  260.   fFailsOnNoChecksExecuted := False;
  261.   AllowedMemoryLeakSize := 24;
  262.   before := Now;
  263.   Sleep(250);
  264.   after := Now;
  265.   Assert(after > before);
  266.   diff := after - before;
  267.   Assert(diff > 2.0e-6);
  268.   { Sleep is done in EnterKeyInto }
  269.   ActionDelay := 125;
  270.   before := Now;
  271.   EnterKeyInto(mForm, ord('A'), []);
  272.   after := Now;
  273.   Assert(after > before);
  274.   diff := after - before;
  275.   Assert(diff > 2.0e-6);
  276. end;
  277. procedure T_TGUITestCase.Test_EnterKeyInto;
  278. const VK_A = ord('A');
  279. begin
  280.   fFailsOnNoChecksExecuted := False;
  281.   SetFocus(mForm.xButton);
  282.   { Make sure:
  283.      focus shifts to the correct control
  284.      form key preview works
  285.      control gets the proper key(s)
  286.      works for TEdit, TButton, TMemo
  287.   }
  288.   { Keys pressed: A }
  289.   EnterKeyInto(mForm.xEdit, VK_A, []);
  290.   Assert(mForm.xEdit.Text = 'a');
  291.   Assert(mForm.EditKeyDownCount = 1);
  292.   Assert(mForm.EditKeyUpCount = 1);
  293.   Assert(mForm.FormKeyDownCount = 1);
  294.   Assert(mForm.FormKeyUpCount = 1);
  295.   Assert(mForm.FormKeys = 'a');
  296.   { Keys pressed:  Shift, A }
  297.   mForm.ResetForm;
  298.   EnterKeyInto(mForm.xEdit, VK_A, [ssShift]);
  299.   Assert(mForm.xEdit.Text = 'A');
  300.   Assert(mForm.EditKeyDownCount = 1);
  301.   Assert(mForm.EditKeyUpCount = 1);
  302.   Assert(mForm.FormKeyDownCount = 1);
  303.   Assert(mForm.FormKeyUpCount = 1);
  304.   Assert(mForm.FormKeys = 'A');
  305.   { Keys pressed:  Shift, A }
  306.   mForm.ResetForm;
  307.   EnterKeyInto(mForm.xMemo, VK_A, [ssShift]);
  308.   Assert(mForm.xMemo.Text = 'A');
  309.   Assert(mForm.FormKeyDownCount = 1);
  310.   Assert(mForm.FormKeyUpCount = 1);
  311.   Assert(mForm.FormKeys = 'A');
  312.   { Keys pressed:  Shift, A }
  313.   mForm.ResetForm;
  314.   EnterKeyInto(mForm.xButton, VK_A, [ssShift]);
  315.   Assert(mForm.FormKeyDownCount = 1);
  316.   Assert(mForm.FormKeyUpCount = 1);
  317.   Assert(mForm.FormKeys = 'A');
  318.   { Keys pressed : F8 }
  319.   mForm.ResetForm;
  320.   EnterKeyInto(mForm, VK_F8, []);
  321.   Assert(mForm.Function8Count = 1);
  322.   Assert(mForm.FormKeyDownCount = 0);  { Keydown gets munched ?}
  323.   Assert(mForm.FormKeyUpCount = 1);
  324.   { Keys pressed : Alt, Backspace }
  325.   mForm.ResetForm;
  326.   EnterKeyInto(mForm, VK_BACK, [ssAlt]);
  327.   Assert(mForm.AltBackspaceCount = 1);
  328.   { Keys pressed : Ctrl, A }
  329.   mForm.ResetForm;
  330.   EnterKeyInto(mForm, VK_A, [ssCtrl]);
  331.   Assert(mForm.ControlACount = 1);
  332. end;
  333. procedure T_TGUITestCase.Test_EnterKey;
  334. begin
  335.   fFailsOnNoChecksExecuted := False;
  336.   EnterKey(VK_F8);
  337. {$IFNDEF DUNIT_CLX}
  338.   Assert(mForm.Function8Count = 1);
  339. {$ENDIF}
  340.   SetFocus(mForm.xMemo);
  341.   EnterKey('M');
  342.   Assert(mForm.xMemo.Text = 'm');
  343.   SetFocus(mForm);
  344.   EnterKey(VK_F8);
  345. {$IFNDEF DUNIT_CLX}
  346.   Assert(mForm.Function8Count = 2);
  347. {$ENDIF}
  348. end;
  349. procedure T_TGUITestCase.Test_EnterTextInto;
  350. const c_text = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ `1234567890-=~!@#$%^&*()_+[]{}|;'':",./<>?';
  351. begin
  352.   fFailsOnNoChecksExecuted := False;
  353.   EnterTextInto(mForm.xMemo, c_text);
  354.   Assert(mForm.xMemo.Text = c_text);
  355.   EnterTextInto(mForm.xEdit, c_text);
  356.   Assert(mForm.xEdit.Text = c_text);
  357. end;
  358. procedure T_TGUITestCase.Test_Tab;
  359. begin
  360.   fFailsOnNoChecksExecuted := False;
  361.   Tab(2);
  362.   Assert(GetFocused = mForm.xButton3);
  363.   Tab(-1);
  364.   Assert(GetFocused = mForm.xButton2);
  365.   Tab(-1);
  366.   Assert(GetFocused = mForm.xButton);
  367. end;
  368. procedure T_TGUITestCase.Test_Form_Releases;
  369. begin
  370.   AllowedMemoryLeakSize := 24;
  371.   Application.ProcessMessages;
  372.   Check(MForm.Enabled, 'Form should be enabled and release without leaking');
  373. end;
  374. { TGUITestRunnerTests }
  375. procedure TGUITestRunnerTests.SetUp;
  376. begin
  377.   inherited;
  378.   FRunner := TGUITestRunner.Create(nil);
  379.   FRunner.Color   := clWhite;
  380.   FRunner.Caption := 'This Form is being tested';
  381.   FRunner.Left    :=  FRunner.Left + 200;
  382.   FRunner.Top     := FRunner.Top + 100;
  383.   FRunner.Width   := 300;
  384.   FRunner.Height  := 480;
  385.   FRunner.AutoSaveAction.Checked := False;
  386.   FRunner.HideTestNodesOnOpenAction.Checked := False;
  387.   GUI := FRunner;
  388. end;
  389. procedure TGUITestRunnerTests.TearDown;
  390. begin
  391.   GUI := nil;
  392.   FRunner.Free;
  393.   inherited;
  394. end;
  395. procedure TGUITestRunnerTests.TestTabOrder;
  396. begin
  397.   fFailsOnNoChecksExecuted := False;
  398.   AllowedMemoryLeakSize := 24;
  399.   // need to set a test suite, or buttons will be disabled
  400.   FRunner.Suite := TFailuresTestCase.Suite;
  401.   FRunner.AutoSaveAction.Checked := False;
  402.   FRunner.BreakOnFailuresAction.Checked := False;
  403.   Show;
  404.   (*!! Actions are now in Toolbar
  405.   CheckFocused(FRunner.RunButton);
  406.   Tab;
  407.   CheckFocused(FRunner.CloseButton);
  408.   Tab;
  409.   *)
  410. {$IFDEF DUNIT_CLX}
  411.   FRunner.SetFocusedControl(FRunner);
  412.   FRunner.TestTree.SetFocus;
  413. {$ENDIF}
  414.   CheckFocused(FRunner.TestTree);
  415.   Tab;
  416.   CheckFocused(FRunner.ResultsView);
  417.   Tab;
  418.   CheckFocused(FRunner.FailureListView);
  419.   Tab;
  420. {$IFNDEF DUNIT_CLX}
  421.   CheckFocused(FRunner.ErrorMessageRTF);
  422.   Tab;
  423. {$ENDIF}
  424.   (*
  425.   CheckFocused(FRunner.RunButton);
  426.   Tab;
  427.   CheckTabTo('RunButton');
  428.   *)
  429. end;
  430. procedure TGUITestRunnerTests.RunEmptySuite;
  431. begin
  432.   // no suite
  433.   Show;
  434. {$IFDEF DUNIT_CLX}
  435.   FRunner.SetFocusedControl(FRunner);
  436.   FRunner.TestTree.SetFocus;
  437. {$ENDIF}
  438.   CheckEquals(0,          FRunner.ProgressBar.Position,               'progress bar');
  439.   CheckEqualsString('',   FRunner.LbProgress.Caption,                 'progress label');
  440.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[0],   'tests');
  441.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[1],   'run count');
  442.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[2],   'failure count');
  443.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[3],   'error count');
  444.   CheckEquals(0,          FRunner.FailureListView.Items.Count,        'failure list');
  445.   EnterKey(vk_F9);
  446.   // nothing happens
  447.   CheckEquals(0,          FRunner.ProgressBar.Position,               'progress bar');
  448.   CheckEqualsString('',   FRunner.LbProgress.Caption,                 'progress label');
  449.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[0],   'tests');
  450.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[1],   'run count');
  451.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[2],   'failure count');
  452.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[3],   'error count');
  453.   CheckEquals(0,          FRunner.FailureListView.Items.Count,        'failure list');
  454.   EnterKey('X', [ssAlt]);
  455.   Check(not FRunner.Visible, 'form closed?');
  456. end;
  457. procedure TGUITestRunnerTests.RunSuccessSuite;
  458. begin
  459.   FRunner.Suite := TSuccessTestCase.Suite;
  460.   FRunner.AutoSaveAction.Checked := False;
  461.   FRunner.BreakOnFailuresAction.Checked := False;
  462.   Show;
  463. {$IFDEF DUNIT_CLX}
  464.   FRunner.SetFocusedControl(FRunner);
  465.   FRunner.TestTree.SetFocus;
  466. {$ENDIF}
  467.   CheckEquals(0,          FRunner.ProgressBar.Position,               'progress bar');
  468.   CheckEqualsString('',   FRunner.LbProgress.Caption,                 'progress label');
  469.   CheckEqualsString('2',  FRunner.ResultsView.Items[0].SubItems[0],   'tests');
  470.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[1],   'run count');
  471.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[2],   'failure count');
  472.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[3],   'error count');
  473.   CheckEquals(0,          FRunner.FailureListView.Items.Count,        'failure list');
  474.   EnterKey('R', [ssAlt]);
  475.   CheckEquals(2,          FRunner.ProgressBar.Position,               'progress bar');
  476.   CheckEqualsString('100%', FRunner.LbProgress.Caption,               'progress label');
  477.   CheckEqualsString('2',  FRunner.ResultsView.Items[0].SubItems[0],   'tests');
  478.   CheckEqualsString('2',  FRunner.ResultsView.Items[0].SubItems[1],   'run count');
  479.   CheckEqualsString('0',  FRunner.ResultsView.Items[0].SubItems[2],   'failure count');
  480.   CheckEqualsString('0',  FRunner.ResultsView.Items[0].SubItems[3],   'error count');
  481.   CheckEquals(0,          FRunner.FailureListView.Items.Count,        'failure list');
  482.   EnterKey('X', [ssAlt]);
  483.   Check(not FRunner.Visible, 'form closed?');
  484. end;
  485. procedure TGUITestRunnerTests.RunFailureSuite;
  486. begin
  487.   FRunner.Suite := TFailuresTestCase.Suite;
  488.   FRunner.AutoSaveAction.Checked := False;
  489.   FRunner.BreakOnFailuresAction.Checked := False;
  490.   FRunner.FailIfNoChecksExecutedAction.Checked := False;
  491.   Show;
  492. {$IFDEF DUNIT_CLX}
  493.   FRunner.SetFocusedControl(FRunner);
  494.   FRunner.TestTree.SetFocus;
  495. {$ENDIF}
  496.   CheckEquals(0,          FRunner.ProgressBar.Position,               'progress bar');
  497.   CheckEqualsString('',   FRunner.LbProgress.Caption,                 'progress label');
  498.   CheckEqualsString('4',  FRunner.ResultsView.Items[0].SubItems[0],   'tests');
  499.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[1],   'run count');
  500.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[2],   'failure count');
  501.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[3],   'error count');
  502.   CheckEquals(0,          FRunner.FailureListView.Items.Count,        'failure list');
  503.   EnterKey('R', [ssAlt]);
  504.   CheckEquals(4,          FRunner.ProgressBar.Position,               'progress bar');
  505.   CheckEqualsString('25%', FRunner.LbProgress.Caption,                'progress label');
  506.   CheckEqualsString('4',  FRunner.ResultsView.Items[0].SubItems[0],   'tests');
  507.   CheckEqualsString('4',  FRunner.ResultsView.Items[0].SubItems[1],   'run count');
  508.   CheckEqualsString('2',  FRunner.ResultsView.Items[0].SubItems[2],   'failure count');
  509.   CheckEqualsString('1',  FRunner.ResultsView.Items[0].SubItems[3],   'error count');
  510.   CheckEquals(3,          FRunner.FailureListView.Items.Count,        'failure list');
  511.   EnterKey('X', [ssAlt]);
  512.   Check(not FRunner.Visible, 'form closed?');
  513. end;
  514. procedure TGUITestRunnerTests.TestViewResult;
  515. begin
  516.   FRunner.Suite := TFailuresTestCase.Suite;
  517.   FRunner.AutoSaveAction.Checked := False;
  518.   FRunner.BreakOnFailuresAction.Checked := False;
  519.   Show;
  520. {$IFDEF DUNIT_CLX}
  521.   FRunner.SetFocusedControl(FRunner);
  522. {$ENDIF}
  523.   FRunner.TestTree.SetFocus;
  524.   FRunner.TestTree.Items[0].Item[0].Selected := true;
  525.   FRunner.TestTree.Items[0].Item[0].Selected := true;
  526. {$IFNDEF DUNIT_CLX}
  527.   EnterKey('D',[ssAlt]); //to uncheck node
  528. {$ENDIF}
  529.   CheckEquals(0,          FRunner.ProgressBar.Position,               'progress bar');
  530.   CheckEqualsString('',   FRunner.LbProgress.Caption,                 'progress label');
  531.   CheckEqualsString('4',  FRunner.ResultsView.Items[0].SubItems[0],   'tests');
  532.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[1],   'run count');
  533.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[2],   'failure count');
  534.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[3],   'error count');
  535.   CheckEquals(0,          FRunner.FailureListView.Items.Count,        'failure list');
  536. end;
  537. procedure TGUITestRunnerTests.TestElapsedTime;
  538. var
  539.   ElapTime, MinTime, MaxTime: string;
  540. begin
  541.   FRunner.Suite := TTimeTestCase.Suite;
  542.   FRunner.AutoSaveAction.Checked := False;
  543.   FRunner.BreakOnFailuresAction.Checked := False;
  544.   Show;
  545. {$IFDEF DUNIT_CLX}
  546.   FRunner.SetFocusedControl(FRunner);
  547.   FRunner.TestTree.SetFocus;
  548. {$ENDIF}
  549.   EnterKey(vk_F9);
  550.   ElapTime := FRunner.ResultsView.Items[0].SubItems[6];
  551.   MinTime := '0:00:00.070';
  552.   MaxTime := '0:00:00.300';
  553.   Check(ElapTime > MinTime, 'Test Time ('+ElapTime+') should be bigger than ' + MinTime);
  554.   Check(ElapTime < MaxTime, 'Test Time ('+ElapTime+') should be lesser than ' + MaxTime);
  555. end;
  556. procedure TGUITestRunnerTests.TestStatus;
  557. const
  558. {$IFDEF WIN32}
  559.   constLineDelim = #13#10;
  560. {$ENDIF}
  561. {$IFDEF LINUX}
  562.   constLineDelim = #10;
  563. {$ENDIF}
  564.   constStatusTestStr =
  565.       'SecondSuccessWithStatus:' + constLineDelim
  566.       + 'Line 1' + constLineDelim
  567.       + 'Line 2' + constLineDelim
  568.       + 'Line 3' + constLineDelim;
  569. begin
  570.   SetAllowedLeakArray([288, 312]);
  571.   FRunner.Suite := TStatusTestCase.Suite;
  572.   FRunner.AutoSaveAction.Checked := False;
  573.   FRunner.BreakOnFailuresAction.Checked := False;
  574.   Show;
  575. {$IFDEF DUNIT_CLX}
  576.   FRunner.SetFocusedControl(FRunner);
  577.   FRunner.TestTree.SetFocus;
  578. {$ENDIF}
  579.   CheckEquals(0,          FRunner.ProgressBar.Position,               'progress bar');
  580.   CheckEqualsString('',   FRunner.LbProgress.Caption,                 'progress label');
  581.   CheckEqualsString('2',  FRunner.ResultsView.Items[0].SubItems[0],   'tests');
  582.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[1],   'run count');
  583.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[2],   'failure count');
  584.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[3],   'error count');
  585.   CheckEquals(0,          FRunner.FailureListView.Items.Count,        'failure list');
  586. {$IFNDEF DUNIT_CLX}
  587.   CheckEquals(0,          FRunner.ErrorMessageRTF.Lines.Count,        'Status in ErrorMessageRTF');
  588. {$ENDIF}
  589.   EnterKey('R', [ssAlt]);
  590.   CheckEquals(2,          FRunner.ProgressBar.Position,               'progress bar');
  591.   CheckEqualsString('100%', FRunner.LbProgress.Caption,               'progress label');
  592.   CheckEqualsString('2',  FRunner.ResultsView.Items[0].SubItems[0],   'tests');
  593.   CheckEqualsString('2',  FRunner.ResultsView.Items[0].SubItems[1],   'run count');
  594.   CheckEqualsString('0',  FRunner.ResultsView.Items[0].SubItems[2],   'failure count');
  595.   CheckEqualsString('0',  FRunner.ResultsView.Items[0].SubItems[3],   'error count');
  596.   CheckEquals(0,          FRunner.FailureListView.Items.Count,        'failure list');
  597. {$IFNDEF DUNIT_CLX}
  598.   CheckEqualsString(constStatusTestStr, FRunner.ErrorMessageRTF.Lines.Text,
  599.       'Statustext in ErrorMessageRTF');
  600.   CheckEquals(4,          FRunner.ErrorMessageRTF.Lines.Count,        'Status in ErrorMessageRTF');
  601. {$ENDIF}
  602.   EnterKey('X', [ssAlt]);
  603.   Check(not FRunner.Visible, 'form closed?');
  604. end;
  605. procedure TGUITestRunnerTests.TestRunSelectedTestWithDecorator;
  606. var
  607.   LTestSuite : ITest;
  608.   SuccessTest : ITest;
  609. begin
  610.   SuccessTest := TSuccessTestCase.Suite;
  611.   LTestSuite := TRepeatedTest.Create( SuccessTest , 2);
  612.   FRunner.Suite := LTestSuite;
  613.   FRunner.AutoSaveAction.Checked := False;
  614.   FRunner.BreakOnFailuresAction.Checked := False;
  615.   Show;
  616. {$IFDEF DUNIT_CLX}
  617.   FRunner.SetFocusedControl(FRunner);
  618.   FRunner.TestTree.SetFocus;
  619. {$ENDIF}
  620.   CheckEquals(0,          FRunner.ProgressBar.Position,               'progress bar');
  621.   CheckEqualsString('',   FRunner.LbProgress.Caption,                 'progress label');
  622.   CheckEqualsString('4',  FRunner.ResultsView.Items[0].SubItems[0],   'tests');
  623.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[1],   'run count');
  624.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[2],   'failure count');
  625.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[3],   'error count');
  626.   CheckEquals(0,          FRunner.FailureListView.Items.Count,        'failure list');
  627.   CheckEquals(1, FRunner.Suite.Tests.Count, 'Before Suite.Tests.Count');
  628.   CheckEquals(2, (FRunner.Suite.Tests[0] as ITest).Tests.Count, 'Before Suite.Tests[0].Tests.Count');
  629.   CheckEquals(4, FRunner.Suite.CountEnabledTestCases, 'Before CountEnabledTestCases');
  630.   CheckEquals(4, TDunitDialogCracker(FRunner).FTests.Count, 'Before testcount');
  631.   CheckSame(LTestSuite, FRunner.Suite, 'Before LTestSuite');
  632.   CheckSame(SuccessTest, FRunner.Suite.Tests[0], 'Before SuccesTest');
  633.   FRunner.TestTree.SetFocus;
  634.   CheckFocused(FRunner.TestTree);
  635.   EnterKeyInto(FRunner.TestTree, VK_END);
  636.   EnterKey(VK_F8);
  637.   CheckEquals(1,          FRunner.ProgressBar.Position,               'After first progress bar');
  638.   CheckEqualsString('100%', FRunner.LbProgress.Caption,               'After first progress label');
  639.   CheckEqualsString('4',  FRunner.ResultsView.Items[0].SubItems[0],   'After first tests');
  640.   CheckEqualsString('2',  FRunner.ResultsView.Items[0].SubItems[1],   'After first run count');
  641.   CheckEqualsString('0',  FRunner.ResultsView.Items[0].SubItems[2],   'After first failure count');
  642.   CheckEqualsString('0',  FRunner.ResultsView.Items[0].SubItems[3],   'After first error count');
  643.   CheckEquals(0,          FRunner.FailureListView.Items.Count,        'After first failure list');
  644.   CheckEquals(1, FRunner.Suite.Tests.Count, 'After first Suite.Tests.Count');
  645.   CheckEquals(2, (FRunner.Suite.Tests[0] as ITest).Tests.Count, 'After first Suite.Tests[0].Tests.Count');
  646.   CheckSame(LTestSuite, FRunner.Suite, 'After first LTestSuite');
  647.   CheckSame(SuccessTest, FRunner.Suite.Tests[0], 'After first SuccesTest');
  648.   CheckEquals(4, FRunner.Suite.CountEnabledTestCases, 'After first CountEnabledTestCases');
  649.   CheckEquals(4, TDunitDialogCracker(FRunner).FTests.Count, 'After first testcount');
  650.   CheckFocused(FRunner.TestTree);
  651.   // Second time could generate an pointer error
  652.   EnterKeyInto(FRunner.TestTree, VK_F8);
  653.   CheckEquals(1,          FRunner.ProgressBar.Position,               'After second progress bar');
  654.   CheckEqualsString('100%', FRunner.LbProgress.Caption,               'After second progress label');
  655.   CheckEqualsString('4',  FRunner.ResultsView.Items[0].SubItems[0],   'After second tests');
  656.   CheckEqualsString('2',  FRunner.ResultsView.Items[0].SubItems[1],   'After second run count');
  657.   CheckEqualsString('0',  FRunner.ResultsView.Items[0].SubItems[2],   'After second failure count');
  658.   CheckEqualsString('0',  FRunner.ResultsView.Items[0].SubItems[3],   'After second error count');
  659.   CheckEquals(0,          FRunner.FailureListView.Items.Count,        'After second failure list');
  660.   CheckEquals(4, FRunner.Suite.CountEnabledTestCases, 'After second CountEnabledTestCases');
  661.   CheckEquals(4, TDunitDialogCracker(FRunner).FTests.Count, 'testcount');
  662.   // Normal test after single test. Should run all enabled tests.
  663.   EnterKeyInto(FRunner.TestTree, VK_F9);
  664.   CheckEquals(4,          FRunner.ProgressBar.Position,               'Normal after progress bar');
  665.   CheckEqualsString('100%', FRunner.LbProgress.Caption,               'Normal after progress label');
  666.   CheckEqualsString('4',  FRunner.ResultsView.Items[0].SubItems[0],   'Normal after tests');
  667.   CheckEqualsString('4',  FRunner.ResultsView.Items[0].SubItems[1],   'Normal after run count');
  668.   CheckEqualsString('0',  FRunner.ResultsView.Items[0].SubItems[2],   'Normal after failure count');
  669.   CheckEqualsString('0',  FRunner.ResultsView.Items[0].SubItems[3],   'Normal after error count');
  670.   CheckEquals(0,          FRunner.FailureListView.Items.Count,        'Normal after failure list');
  671.   CheckEquals(4, FRunner.Suite.CountEnabledTestCases, 'Normal after CountEnabledTestCases');
  672.   CheckEquals(4, TDunitDialogCracker(FRunner).FTests.Count, 'Normal after testcount');
  673.   EnterKey('X', [ssAlt]);
  674.   Check(not FRunner.Visible, 'form closed?');
  675. end;
  676. procedure TGUITestRunnerTests.TestRunSelectedTestWithSetupDecorator;
  677. var LTestSuite  : TSetupTestCase;
  678.     ITestSuite  : ITest;
  679.     SuccessTest : ITest;
  680. begin
  681.   SuccessTest := TSuccessTestCase.Suite;
  682.   LTestSuite := TSetupTestCase.Create( SuccessTest);
  683.   ITestSuite := LTestSuite;
  684.   FRunner.Suite := ITestSuite;
  685.   FRunner.AutoSaveAction.Checked := False;
  686.   FRunner.BreakOnFailuresAction.Checked := False;
  687.   Show;
  688. {$IFDEF DUNIT_CLX}
  689.   FRunner.SetFocusedControl(FRunner);
  690.   FRunner.TestTree.SetFocus;
  691. {$ENDIF}
  692.   CheckEquals(0,          FRunner.ProgressBar.Position,               'progress bar');
  693.   CheckEqualsString('',   FRunner.LbProgress.Caption,                 'progress label');
  694.   CheckEqualsString('2',  FRunner.ResultsView.Items[0].SubItems[0],   'tests');
  695.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[1],   'run count');
  696.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[2],   'failure count');
  697.   CheckEqualsString('',   FRunner.ResultsView.Items[0].SubItems[3],   'error count');
  698.   CheckEquals(0,          FRunner.FailureListView.Items.Count,        'failure list');
  699.   CheckEquals(1, FRunner.Suite.Tests.Count, 'Before Suite.Tests.Count');
  700.   CheckEquals(2, (FRunner.Suite.Tests[0] as ITest).Tests.Count, 'Before Suite.Tests[0].Tests.Count');
  701.   CheckEquals(2, FRunner.Suite.CountEnabledTestCases, 'Before CountEnabledTestCases');
  702.   CheckEquals(4, TDunitDialogCracker(FRunner).FTests.Count, 'Before testcount');
  703.   CheckEquals(0, LTestSuite.FSetupCount, 'Before SetupCount');
  704.   CheckEquals(0, LTestSuite.FTearDownCount, 'Before TearDownCount');
  705.   FRunner.TestTree.SetFocus;
  706.   CheckFocused(FRunner.TestTree);
  707.   EnterKeyInto(FRunner.TestTree, VK_END);
  708.   EnterKey(VK_F8);
  709.   CheckEquals(1,          FRunner.ProgressBar.Position,               'After first progress bar');
  710.   CheckEqualsString('100%', FRunner.LbProgress.Caption,               'After first progress label');
  711.   CheckEqualsString('2',  FRunner.ResultsView.Items[0].SubItems[0],   'After first tests');
  712.   CheckEqualsString('1',  FRunner.ResultsView.Items[0].SubItems[1],   'After first run count');
  713.   CheckEqualsString('0',  FRunner.ResultsView.Items[0].SubItems[2],   'After first failure count');
  714.   CheckEqualsString('0',  FRunner.ResultsView.Items[0].SubItems[3],   'After first error count');
  715.   CheckEquals(0,          FRunner.FailureListView.Items.Count,        'After first failure list');
  716.   CheckEquals(1, FRunner.Suite.Tests.Count, 'After first Suite.Tests.Count');
  717.   CheckEquals(2, (FRunner.Suite.Tests[0] as ITest).Tests.Count, 'After first Suite.Tests[0].Tests.Count');
  718.   CheckEquals(2, FRunner.Suite.CountEnabledTestCases, 'After first CountEnabledTestCases');
  719.   CheckEquals(4, TDunitDialogCracker(FRunner).FTests.Count, 'After first testcount');
  720.   CheckEquals(1, LTestSuite.FSetupCount, 'After first SetupCount');
  721.   CheckEquals(1, LTestSuite.FTearDownCount, 'After first TearDownCount');
  722.   CheckFocused(FRunner.TestTree);
  723.   // Second time could generate a pointer error
  724.   EnterKeyInto(FRunner.TestTree, VK_F8);
  725.   CheckEquals(1,          FRunner.ProgressBar.Position,               'After second progress bar');
  726.   CheckEqualsString('100%', FRunner.LbProgress.Caption,               'After second progress label');
  727.   CheckEqualsString('2',  FRunner.ResultsView.Items[0].SubItems[0],   'After second tests');
  728.   CheckEqualsString('1',  FRunner.ResultsView.Items[0].SubItems[1],   'After second run count');
  729.   CheckEqualsString('0',  FRunner.ResultsView.Items[0].SubItems[2],   'After second failure count');
  730.   CheckEqualsString('0',  FRunner.ResultsView.Items[0].SubItems[3],   'After second error count');
  731.   CheckEquals(0,          FRunner.FailureListView.Items.Count,        'After second failure list');
  732.   CheckEquals(2, FRunner.Suite.CountEnabledTestCases, 'After second CountEnabledTestCases');
  733.   CheckEquals(4, TDunitDialogCracker(FRunner).FTests.Count, 'testcount');
  734.   CheckEquals(2, LTestSuite.FSetupCount, 'After second SetupCount');
  735.   CheckEquals(2, LTestSuite.FTearDownCount, 'After second TearDownCount');
  736.   // Normal test after single test. Should run all enabled tests.
  737.   EnterKeyInto(FRunner.TestTree, VK_F9);
  738.   CheckEquals(2,          FRunner.ProgressBar.Position,               'Normal after progress bar');
  739.   CheckEqualsString('100%', FRunner.LbProgress.Caption,               'Normal after progress label');
  740.   CheckEqualsString('2',  FRunner.ResultsView.Items[0].SubItems[0],   'Normal after tests');
  741.   CheckEqualsString('2',  FRunner.ResultsView.Items[0].SubItems[1],   'Normal after run count');
  742.   CheckEqualsString('0',  FRunner.ResultsView.Items[0].SubItems[2],   'Normal after failure count');
  743.   CheckEqualsString('0',  FRunner.ResultsView.Items[0].SubItems[3],   'Normal after error count');
  744.   CheckEquals(0,          FRunner.FailureListView.Items.Count,        'Normal after failure list');
  745.   CheckEquals(2, FRunner.Suite.CountEnabledTestCases, 'Normal after CountEnabledTestCases');
  746.   CheckEquals(4, TDunitDialogCracker(FRunner).FTests.Count, 'Normal after testcount');
  747.   CheckEquals(3, LTestSuite.FSetupCount, 'Normal after SetupCount');
  748.   CheckEquals(3, LTestSuite.FTearDownCount, 'Normal after TearDownCount');
  749.   EnterKey('X', [ssAlt]);
  750.   Check(not FRunner.Visible, 'form closed?');
  751.   if ITestSuite <> nil then
  752.     ITestSuite := nil;
  753. end;
  754. {$IFNDEF DUNIT_CLX}
  755. procedure TGUITestRunnerTests.TestGoToPrevNextSelectedNode;
  756. begin
  757.   FRunner.Suite := TSuccessTestCase.Suite;
  758.   Show;
  759.   FRunner.TestTree.SetFocus;
  760.   Check(FRunner.TestTree.Selected = FRunner.TestTree.Items[0], 'ensure starting at root node');
  761.   FRunner.GoToNextSelectedTestAction.Execute;
  762.   Check(FRunner.TestTree.Selected = FRunner.TestTree.Items[1], 'testing from non-test to next test node');
  763.   FRunner.GoToNextSelectedTestAction.Execute;
  764.   Check(FRunner.TestTree.Selected = FRunner.TestTree.Items[2], 'testing test node to next test node');
  765.   FRunner.GoToNextSelectedTestAction.Execute;
  766.   Check(FRunner.TestTree.Selected = FRunner.TestTree.Items[2], 'testing the end of the line, next should stay put');
  767.   FRunner.GoToPrevSelectedTestAction.Execute;
  768.   Check(FRunner.TestTree.Selected = FRunner.TestTree.Items[1], 'testing test to prev test');
  769.   FRunner.GoToPrevSelectedTestAction.Execute;
  770.   Check(FRunner.TestTree.Selected = FRunner.TestTree.Items[1], 'beg of the line, prev should stay put');
  771. end;
  772. {$ENDIF}
  773. procedure TGUITestRunnerTests.Test_BooleanEvalOff;
  774. begin
  775.   { this test makes sure boolean evals short circuit }
  776.   fFailsOnNoChecksExecuted := False;
  777.   //Added because the test leaks memory.
  778.   AllowedMemoryLeakSize := 288;
  779.   {$BOOLEVAL OFF}
  780.   TestOr(true, false);
  781.   Assert(mRefCountA = 1);
  782.   Assert(mRefCountB = 0);
  783.   TestOr(true, true);
  784.   Assert(mRefCountA = 1);
  785.   Assert(mRefCountB = 0);
  786.   TestOr(false, true);
  787.   Assert(mRefCountA = 1);
  788.   Assert(mRefCountB = 1);
  789.   TestOr(false, false);
  790.   Assert(mRefCountA = 1);
  791.   Assert(mRefCountB = 1);
  792.   TestAnd(false, false);
  793.   Assert(mRefCountA = 1);
  794.   Assert(mRefCountB = 0);
  795.   TestAnd(true, false);
  796.   Assert(mRefCountA = 1);
  797.   Assert(mRefCountB = 1);
  798.   TestAnd(true, true);
  799.   Assert(mRefCountA = 1);
  800.   Assert(mRefCountB = 1);
  801.   TestAnd(false, true);
  802.   Assert(mRefCountA = 1);
  803.   Assert(mRefCountB = 0);
  804. end;
  805. function TGUITestRunnerTests.TestA(const ReturnValue: boolean): boolean;
  806. begin
  807.   inc(mRefCountA);
  808.   Result := ReturnValue;
  809. end;
  810. procedure TGUITestRunnerTests.TestAnd(const A, B: boolean);
  811. begin
  812.   mRefCountA := 0;
  813.   mRefCountB := 0;
  814.   if TestA(a) and TestB(b) then
  815.   begin
  816.   end;
  817. end;
  818. function TGUITestRunnerTests.TestB(const ReturnValue: boolean): boolean;
  819. begin
  820.   inc(mRefCountB);
  821.   Result := ReturnValue;
  822. end;
  823. procedure TGUITestRunnerTests.TestOr(const A, B: boolean);
  824. begin
  825.   mRefCountA := 0;
  826.   mRefCountB := 0;
  827.   if TestA(a) or TestB(b) then
  828.   begin
  829.   end;
  830. end;
  831. { TSuccessTestCase }
  832. procedure TSuccessTestCase.OneSuccess;
  833. begin
  834.   check(true);
  835. end;
  836. procedure TSuccessTestCase.SecondSuccess;
  837. begin
  838.   check(true);
  839. end;
  840. { TFailuresTestCase }
  841. procedure TFailuresTestCase.OneSuccess;
  842. begin
  843.   DoNothing;
  844. end;
  845. procedure TFailuresTestCase.OneError;
  846. begin
  847.   raise EAbort.Create('One Error');
  848. end;
  849. procedure TFailuresTestCase.OneFailure;
  850. begin
  851.   fail('One failure');
  852. end;
  853. procedure TFailuresTestCase.SecondFailure;
  854. begin
  855.   fail('Second failure');
  856. end;
  857. procedure TFailuresTestCase.DoNothing;
  858. begin
  859. // Do Nothing
  860. end;
  861. { TTimeTestCase }
  862. procedure TTimeTestCase.TestTime;
  863. const
  864.   DELAY = 100;
  865. begin
  866.   Sleep(DELAY);
  867.   Check( True );
  868. end;
  869. { TStatusTestCase }
  870. procedure TStatusTestCase.OneSuccessWithStatus;
  871. begin
  872.   Status('Line 1');
  873.   Status('Line 2');
  874.   Status('Line 3');
  875. end;
  876. procedure TStatusTestCase.SecondSuccessWithStatus;
  877. begin
  878.   Status('Line 1');
  879.   Sleep(200);
  880.   Status('Line 2');
  881.   Sleep(200);
  882.   Status('Line 3');
  883.   Sleep(200);
  884. end;
  885. procedure TStatusTestCase.SetUp;
  886. begin
  887.   inherited;
  888.   FailsOnNoChecksExecuted := False;
  889.   FailsOnMemoryLeak := False;
  890. end;
  891. { TSetupTestCase }
  892. procedure TSetupTestCase.AfterConstruction;
  893. begin
  894.   inherited;
  895.   FSetupCount := 0;
  896.   FTearDownCount := 0;
  897. end;
  898. procedure TSetupTestCase.SetUp;
  899. begin
  900.   inherited;
  901.   inc(FSetupCount)
  902. end;
  903. procedure TSetupTestCase.TearDown;
  904. begin
  905.   inherited;
  906.   inc(FTearDownCount)
  907. end;
  908. initialization
  909.   RegisterTests('', [T_TGUITestCase.Suite]);
  910.   RegisterTests('GUI Tests', [TGUITestRunnerTests.Suite]);
  911. end.