mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-18 23:59:10 +02:00
fpcunit gui testrunner: added checkboxes to create adhoc test suites from Dean Zobec
git-svn-id: trunk@9957 -
This commit is contained in:
parent
7ef1a310ed
commit
1439364b64
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -52,7 +52,19 @@ type
|
|||||||
actCut: TAction;
|
actCut: TAction;
|
||||||
ActCloseForm: TAction;
|
ActCloseForm: TAction;
|
||||||
actCopyErrorMsg: TAction;
|
actCopyErrorMsg: TAction;
|
||||||
|
ActCheckCurrentSuite: TAction;
|
||||||
|
ActCheckAll: TAction;
|
||||||
|
ActRunHighlightedTest: TAction;
|
||||||
|
ActUncheckAll: TAction;
|
||||||
|
ActUncheckCurrentSuite: TAction;
|
||||||
|
btnRunHighlighted: TBitBtn;
|
||||||
|
ilNodeStates: TImageList;
|
||||||
Memo1: TMemo;
|
Memo1: TMemo;
|
||||||
|
MenuItem4: TMenuItem;
|
||||||
|
MenuItem5: TMenuItem;
|
||||||
|
MenuItem6: TMenuItem;
|
||||||
|
MenuItem7: TMenuItem;
|
||||||
|
MenuItem8: TMenuItem;
|
||||||
miRunTest: TMenuItem;
|
miRunTest: TMenuItem;
|
||||||
miShowfailureMsg: TMenuItem;
|
miShowfailureMsg: TMenuItem;
|
||||||
pbBar: TPaintBox;
|
pbBar: TPaintBox;
|
||||||
@ -65,8 +77,6 @@ type
|
|||||||
BtnClose: TBitBtn;
|
BtnClose: TBitBtn;
|
||||||
ImageList1: TImageList;
|
ImageList1: TImageList;
|
||||||
ImageList2: TImageList;
|
ImageList2: TImageList;
|
||||||
Label1: TLabel;
|
|
||||||
lblSelectedTest: TLabel;
|
|
||||||
MenuItem1: TMenuItem;
|
MenuItem1: TMenuItem;
|
||||||
MenuItem2: TMenuItem;
|
MenuItem2: TMenuItem;
|
||||||
MenuItem3: TMenuItem;
|
MenuItem3: TMenuItem;
|
||||||
@ -83,12 +93,19 @@ type
|
|||||||
tsTestTree: TTabSheet;
|
tsTestTree: TTabSheet;
|
||||||
tsResultsXML: TTabSheet;
|
tsResultsXML: TTabSheet;
|
||||||
XMLSynEdit: TSynEdit;
|
XMLSynEdit: TSynEdit;
|
||||||
|
procedure ActCheckAllExecute(Sender: TObject);
|
||||||
|
procedure ActCheckCurrentSuiteExecute(Sender: TObject);
|
||||||
procedure ActCloseFormExecute(Sender: TObject);
|
procedure ActCloseFormExecute(Sender: TObject);
|
||||||
procedure RunActionUpdate(Sender: TObject);
|
procedure ActRunHighlightedTestExecute(Sender: TObject);
|
||||||
|
procedure ActUncheckAllExecute(Sender: TObject);
|
||||||
|
procedure ActRunHighLightedTestUpdate(Sender: TObject);
|
||||||
|
procedure ActUncheckCurrentSuiteExecute(Sender: TObject);
|
||||||
procedure RunExecute(Sender: TObject);
|
procedure RunExecute(Sender: TObject);
|
||||||
procedure GUITestRunnerCreate(Sender: TObject);
|
procedure GUITestRunnerCreate(Sender: TObject);
|
||||||
procedure GUITestRunnerShow(Sender: TObject);
|
procedure GUITestRunnerShow(Sender: TObject);
|
||||||
procedure MenuItem3Click(Sender: TObject);
|
procedure MenuItem3Click(Sender: TObject);
|
||||||
|
procedure TestTreeMouseDown(Sender: TOBject; Button: TMouseButton;
|
||||||
|
Shift: TShiftState; X, Y: Integer);
|
||||||
procedure TestTreeSelectionChanged(Sender: TObject);
|
procedure TestTreeSelectionChanged(Sender: TObject);
|
||||||
procedure actCopyErrorMsgExecute(Sender: TObject);
|
procedure actCopyErrorMsgExecute(Sender: TObject);
|
||||||
procedure actCopyErrorMsgUpdate(Sender: TObject);
|
procedure actCopyErrorMsgUpdate(Sender: TObject);
|
||||||
@ -99,6 +116,7 @@ type
|
|||||||
failureCounter: Integer;
|
failureCounter: Integer;
|
||||||
errorCounter: Integer;
|
errorCounter: Integer;
|
||||||
testsCounter: Integer;
|
testsCounter: Integer;
|
||||||
|
skipsCounter: Integer;
|
||||||
barColor: TColor;
|
barColor: TColor;
|
||||||
testSuite: TTest;
|
testSuite: TTest;
|
||||||
procedure BuildTree(rootNode: TTreeNode; aSuite: TTestSuite);
|
procedure BuildTree(rootNode: TTreeNode; aSuite: TTestSuite);
|
||||||
@ -114,6 +132,7 @@ type
|
|||||||
procedure AddError(ATest: TTest; AError: TTestFailure);
|
procedure AddError(ATest: TTest; AError: TTestFailure);
|
||||||
procedure StartTest(ATest: TTest);
|
procedure StartTest(ATest: TTest);
|
||||||
procedure EndTest(ATest: TTest);
|
procedure EndTest(ATest: TTest);
|
||||||
|
procedure RunTest(ATest: TTest);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
@ -128,6 +147,10 @@ uses
|
|||||||
;
|
;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
|
type
|
||||||
|
|
||||||
|
TTreeNodeState=(tsUnChecked, tsChecked);
|
||||||
|
|
||||||
{ TGUITestRunner }
|
{ TGUITestRunner }
|
||||||
|
|
||||||
procedure TGUITestRunner.actCopyExecute(Sender: TObject);
|
procedure TGUITestRunner.actCopyExecute(Sender: TObject);
|
||||||
@ -153,67 +176,10 @@ end;
|
|||||||
|
|
||||||
|
|
||||||
procedure TGUITestRunner.RunExecute(Sender: TObject);
|
procedure TGUITestRunner.RunExecute(Sender: TObject);
|
||||||
var
|
|
||||||
testResult:TTestResult;
|
|
||||||
FStopCrono: TDateTime;
|
|
||||||
FStartCrono: TDateTime;
|
|
||||||
{$IFNDEF UseOldXML}
|
|
||||||
w: TXMLResultsWriter;
|
|
||||||
m: TMemoryStream;
|
|
||||||
{$ENDIF}
|
|
||||||
begin
|
begin
|
||||||
barcolor := clGreen;
|
testSuite := GetTestRegistry;
|
||||||
ResetNodeColors;
|
TestTree.Selected := TestTree.Items[0];
|
||||||
|
RunTest(testSuite);
|
||||||
if (TestTree.Selected <> nil) and (TestTree.Selected.Data <> nil) then
|
|
||||||
begin
|
|
||||||
testSuite := TTest(TestTree.Selected.Data);
|
|
||||||
TestTree.Selected.Expand(false);
|
|
||||||
end
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
testSuite := GetTestRegistry;
|
|
||||||
TestTree.Selected := TestTree.Items[0];
|
|
||||||
end;
|
|
||||||
failureCounter := 0;
|
|
||||||
errorCounter := 0;
|
|
||||||
testsCounter := 0;
|
|
||||||
testResult := TTestResult.Create;
|
|
||||||
try
|
|
||||||
testResult.AddListener(self);
|
|
||||||
{$IFNDEF UseOldXML}
|
|
||||||
w := TXMLResultsWriter.Create;
|
|
||||||
TestResult.AddListener(w);
|
|
||||||
{$ENDIF}
|
|
||||||
MemoLog('Running ' + TestTree.Selected.Text);
|
|
||||||
FStartCrono := Now;
|
|
||||||
testSuite.Run(testResult);
|
|
||||||
FStopCrono := Now;
|
|
||||||
// In the next fpc (post 2.0.4) we can pull the time from the TestResult
|
|
||||||
MemoLog('Number of executed tests: ' + IntToStr(testResult.RunTests)
|
|
||||||
+ ' Time elapsed: '
|
|
||||||
+ FormatDateTime('hh:nn:ss.zzz', FStopCrono - FStartCrono));
|
|
||||||
|
|
||||||
{$IFNDEF UseOldXML}
|
|
||||||
w.WriteResult(testResult);
|
|
||||||
m := TMemoryStream.Create;
|
|
||||||
WriteXMLFile(w.Document, m);
|
|
||||||
m.Position := 0;
|
|
||||||
XMLSynEdit.Lines.LoadFromStream(m);
|
|
||||||
{$ELSE}
|
|
||||||
XMLSynEdit.lines.text := '<TestResults>' + system.sLineBreak +
|
|
||||||
TestResultAsXML(testResult) + system.sLineBreak + '</TestResults>';
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
pbBar.Invalidate;
|
|
||||||
pbBar1.Invalidate;
|
|
||||||
finally
|
|
||||||
{$IFNDEF UseOldXML}
|
|
||||||
m.free;
|
|
||||||
w.Free;
|
|
||||||
{$ENDIF}
|
|
||||||
testResult.Free;
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -222,11 +188,61 @@ begin
|
|||||||
Close;
|
Close;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TGUITestRunner.ActCheckAllExecute(Sender: TObject);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
begin
|
||||||
|
for i := 0 to TestTree.Items.Count -1 do
|
||||||
|
TestTree.Items[i].StateIndex := ord(tsChecked);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TGUITestRunner.RunActionUpdate(Sender: TObject);
|
procedure TGUITestRunner.ActCheckCurrentSuiteExecute(Sender: TObject);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
begin
|
||||||
|
if (TestTree.Selected <> nil) and (TestTree.Selected.Data <> nil) then
|
||||||
|
begin
|
||||||
|
TestTree.Selected.StateIndex := ord(tsChecked);
|
||||||
|
for i := 0 to TestTree.Selected.Count - 1 do
|
||||||
|
TestTree.Selected.Items[i].StateIndex := ord(tsChecked);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TGUITestRunner.ActRunHighlightedTestExecute(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if (TestTree.Selected <> nil) and (TestTree.Selected.Data <> nil) then
|
||||||
|
begin
|
||||||
|
testSuite := TTest(TestTree.Selected.Data);
|
||||||
|
TestTree.Selected.Expand(false);
|
||||||
|
end;
|
||||||
|
RunTest(testSuite);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TGUITestRunner.ActUncheckAllExecute(Sender: TObject);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
begin
|
||||||
|
for i := 0 to TestTree.Items.Count -1 do
|
||||||
|
TestTree.Items[i].StateIndex := ord(tsUnChecked);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TGUITestRunner.ActRunHighlightedTestUpdate(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
(Sender as TAction).Enabled := ((TestTree.Selected <> nil)
|
(Sender as TAction).Enabled := ((TestTree.Selected <> nil)
|
||||||
and (TestTree.Selected.Data <> nil)) or (not TestTree.Focused);
|
and (TestTree.Selected.Data <> nil));
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TGUITestRunner.ActUncheckCurrentSuiteExecute(Sender: TObject);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
begin
|
||||||
|
if (TestTree.Selected <> nil) and (TestTree.Selected.Data <> nil) then
|
||||||
|
begin
|
||||||
|
TestTree.Selected.StateIndex := ord(tsUnchecked);
|
||||||
|
for i := 0 to TestTree.Selected.Count - 1 do
|
||||||
|
TestTree.Selected.Items[i].StateIndex := ord(tsUnChecked);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -242,14 +258,55 @@ begin
|
|||||||
Clipboard.AsText := Memo1.Lines.Text;
|
Clipboard.AsText := Memo1.Lines.Text;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TGUITestRunner.TestTreeMouseDown(Sender: TOBject;
|
||||||
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
||||||
|
|
||||||
|
procedure ChangeCheck(aNode: TTreeNode; aCheck: TTreeNodeState);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
n: TTreeNode;
|
||||||
|
begin
|
||||||
|
if Assigned(aNode) then
|
||||||
|
begin
|
||||||
|
aNode.StateIndex := ord(aCheck);
|
||||||
|
if (TTest(aNode.Data) is TTestSuite) then
|
||||||
|
for i := 0 to aNode.Count - 1 do
|
||||||
|
begin
|
||||||
|
n := aNode.Items[i];
|
||||||
|
ChangeCheck(n, aCheck);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
ht: THitTests;
|
||||||
|
lNode: TTreeNode;
|
||||||
|
begin
|
||||||
|
ht := (Sender as TTreeview).GetHitTestInfoAt(X, Y);
|
||||||
|
if htOnStateIcon in ht then
|
||||||
|
begin
|
||||||
|
lNode := (Sender as TTreeview).GetNodeAt(X, Y);
|
||||||
|
case lNode.StateIndex of
|
||||||
|
0: ChangeCheck(lNode, tsChecked);
|
||||||
|
1: ChangeCheck(lNode, tsUnChecked);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TGUITestRunner.TestTreeSelectionChanged(Sender: TObject);
|
procedure TGUITestRunner.TestTreeSelectionChanged(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
if ((Sender as TTreeView).Selected <> nil) and
|
if ((Sender as TTreeView).Selected <> nil) and
|
||||||
Assigned((Sender as TTreeview).Selected.Data) then
|
Assigned((Sender as TTreeview).Selected.Data) then
|
||||||
lblSelectedTest.Caption := (Sender as TTreeview).Selected.Text
|
begin
|
||||||
|
btnRunHighlighted.Visible := true;
|
||||||
|
btnRunHighlighted.Caption := 'Run ' + (Sender as TTreeview).Selected.Text;
|
||||||
|
end
|
||||||
else
|
else
|
||||||
lblSelectedTest.Caption := '';
|
begin
|
||||||
|
btnRunHighlighted.Visible := false;
|
||||||
|
btnRunHighlighted.Caption := '';
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -285,8 +342,8 @@ begin
|
|||||||
Canvas.Brush.Color := barColor;
|
Canvas.Brush.Color := barColor;
|
||||||
if TestsCounter <> 0 then
|
if TestsCounter <> 0 then
|
||||||
begin
|
begin
|
||||||
Canvas.Rectangle(0, 0, round(TestsCounter / alltests * Width), Height);
|
Canvas.Rectangle(0, 0, round(TestsCounter / (alltests - skipsCounter) * Width), Height);
|
||||||
msg := 'Runs: ' + IntToStr(TestsCounter) + '/' + IntToStr(alltests);
|
msg := 'Runs: ' + IntToStr(TestsCounter) + '/' + IntToStr(alltests - skipsCounter);
|
||||||
msg := msg + ' Errors: ' + IntToStr(ErrorCounter);
|
msg := msg + ' Errors: ' + IntToStr(ErrorCounter);
|
||||||
msg := msg + ' Failures: ' + IntToStr(FailureCounter);
|
msg := msg + ' Failures: ' + IntToStr(FailureCounter);
|
||||||
Canvas.Textout(10, 10, msg)
|
Canvas.Textout(10, 10, msg)
|
||||||
@ -302,6 +359,7 @@ var
|
|||||||
node: TTreeNode;
|
node: TTreeNode;
|
||||||
i: integer;
|
i: integer;
|
||||||
begin
|
begin
|
||||||
|
rootNode.StateIndex := Ord(tsChecked);
|
||||||
for i := 0 to ASuite.Tests.Count - 1 do
|
for i := 0 to ASuite.Tests.Count - 1 do
|
||||||
begin
|
begin
|
||||||
node := TestTree.Items.AddChildObject(rootNode, ASuite.Test[i].TestName, ASuite.Test[i]);
|
node := TestTree.Items.AddChildObject(rootNode, ASuite.Test[i].TestName, ASuite.Test[i]);
|
||||||
@ -312,6 +370,7 @@ begin
|
|||||||
BuildTree(Node, TTestSuite(TTestDecorator(ASuite.Test[i]).Test));
|
BuildTree(Node, TTestSuite(TTestDecorator(ASuite.Test[i]).Test));
|
||||||
node.ImageIndex := 12;
|
node.ImageIndex := 12;
|
||||||
node.SelectedIndex := 12;
|
node.SelectedIndex := 12;
|
||||||
|
node.StateIndex := ord(tsChecked);
|
||||||
end;
|
end;
|
||||||
rootNode.Expand(False);
|
rootNode.Expand(False);
|
||||||
ResetNodeColors;
|
ResetNodeColors;
|
||||||
@ -522,6 +581,72 @@ begin
|
|||||||
TestTree.EndUpdate;
|
TestTree.EndUpdate;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TGUITestRunner.RunTest(ATest: TTest);
|
||||||
|
procedure SkipUncheckedTests(aResult: TTestResult; aNode: TTreeNode);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
begin
|
||||||
|
if (aNode.StateIndex = ord(tsUnChecked)) and (TTest(aNode.Data) is TTestCase) then
|
||||||
|
aResult.AddToSkipList(TTest(aNode.Data) as TTestCase);
|
||||||
|
for i := 0 to aNode.Count - 1 do
|
||||||
|
SkipUncheckedTests(aResult, aNode.Items[i]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
testResult:TTestResult;
|
||||||
|
FStopCrono: TDateTime;
|
||||||
|
FStartCrono: TDateTime;
|
||||||
|
{$IFNDEF UseOldXML}
|
||||||
|
w: TXMLResultsWriter;
|
||||||
|
m: TMemoryStream;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
begin
|
||||||
|
barcolor := clGreen;
|
||||||
|
ResetNodeColors;
|
||||||
|
failureCounter := 0;
|
||||||
|
errorCounter := 0;
|
||||||
|
testsCounter := 0;
|
||||||
|
skipsCounter := 0;
|
||||||
|
testResult := TTestResult.Create;
|
||||||
|
try
|
||||||
|
SkipUncheckedTests(testResult, TestTree.Selected);
|
||||||
|
skipsCounter := testResult.NumberOfSkippedTests;
|
||||||
|
testResult.AddListener(self);
|
||||||
|
{$IFNDEF UseOldXML}
|
||||||
|
w := TXMLResultsWriter.Create;
|
||||||
|
testResult.AddListener(w);
|
||||||
|
{$ENDIF}
|
||||||
|
MemoLog('Running ' + TestTree.Selected.Text);
|
||||||
|
FStartCrono := Now;
|
||||||
|
aTest.Run(testResult);
|
||||||
|
FStopCrono := Now;
|
||||||
|
// In the next fpc (post 2.0.4) we can pull the time from the TestResult
|
||||||
|
MemoLog('Number of executed tests: ' + IntToStr(testResult.RunTests)
|
||||||
|
+ ' Time elapsed: '
|
||||||
|
+ FormatDateTime('hh:nn:ss.zzz', FStopCrono - FStartCrono));
|
||||||
|
{$IFNDEF UseOldXML}
|
||||||
|
w.WriteResult(testResult);
|
||||||
|
m := TMemoryStream.Create;
|
||||||
|
WriteXMLFile(w.Document, m);
|
||||||
|
m.Position := 0;
|
||||||
|
XMLSynEdit.Lines.LoadFromStream(m);
|
||||||
|
{$ELSE}
|
||||||
|
XMLSynEdit.lines.text := '<TestResults>' + system.sLineBreak +
|
||||||
|
TestResultAsXML(testResult) + system.sLineBreak + '</TestResults>';
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
pbBar.Invalidate;
|
||||||
|
pbBar1.Invalidate;
|
||||||
|
finally
|
||||||
|
{$IFNDEF UseOldXML}
|
||||||
|
m.free;
|
||||||
|
w.Free;
|
||||||
|
{$ENDIF}
|
||||||
|
testResult.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
{$I guitestrunner.lrs}
|
{$I guitestrunner.lrs}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user