Turbopower_ipro: Mark tests as "passed"/"failed", store these test results.

This commit is contained in:
wp_xyz 2022-05-29 13:36:29 +02:00
parent 92ed8ecb60
commit 3478834cba
6 changed files with 290 additions and 44 deletions

View File

@ -753,7 +753,7 @@ const
Arab_title =
'Arabian text';
Arab_descr =
'Text should begin at right. The left-most character should be the period (.).';
'Text should begin at right.';
Arab_html =
'<html lang="ar" dir="rtl">' + LE +
'<head>' + LE +

View File

@ -46,7 +46,7 @@
<Unit>
<Filename Value="iprotest_unit.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="Form1"/>
<ComponentName Value="TestForm"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit>

View File

@ -18,7 +18,7 @@ begin
RequireDerivedFormResource:=True;
Application.Scaled:=True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TTestForm, TestForm);
Application.Run;
end.

View File

@ -1,12 +1,13 @@
object Form1: TForm1
object TestForm: TTestForm
Left = 327
Height = 620
Top = 127
Width = 866
ActiveControl = btnRender
Caption = 'Form1'
Caption = 'TestForm'
ClientHeight = 620
ClientWidth = 866
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
LCLVersion = '2.3.0.0'
object Panel1: TPanel
@ -50,16 +51,18 @@ object Form1: TForm1
MaxLength = 0
TabOrder = 1
end
object TreeView1: TTreeView
object TestTree: TTreeView
Left = 0
Height = 577
Top = 0
Width = 218
Align = alClient
Images = ImageList1
ReadOnly = True
TabOrder = 0
OnDeletion = TreeView1Deletion
OnSelectionChanged = TreeView1SelectionChanged
OnDeletion = TestTreeDeletion
OnGetSelectedIndex = TestTreeGetSelectedIndex
OnSelectionChanged = TestTreeSelectionChanged
Options = [tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw]
end
end
@ -698,6 +701,42 @@ object Form1: TForm1
OnClick = btnLoadFromFileClick
TabOrder = 0
end
object btnPassed: TBitBtn
AnchorSideTop.Control = btnLoadFromFile
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = btnFailed
Left = 689
Height = 26
Top = -1
Width = 82
Anchors = [akTop, akRight]
AutoSize = True
BorderSpacing.Right = 6
Caption = 'Passed'
HotImageIndex = 1
Images = ImageList1
ImageIndex = 1
OnClick = btnTestResultClick
TabOrder = 3
end
object btnFailed: TBitBtn
AnchorSideTop.Control = btnLoadFromFile
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = Panel3
AnchorSideRight.Side = asrBottom
Left = 777
Height = 26
Top = -1
Width = 77
Anchors = [akTop, akRight]
AutoSize = True
Caption = 'Failed'
HotImageIndex = 0
Images = ImageList1
ImageIndex = 0
OnClick = btnTestResultClick
TabOrder = 4
end
end
object SynHTMLSyn1: TSynHTMLSyn
DefaultFilter = 'HTML Document (*.htm,*.html)|*.htm;*.html'
@ -705,4 +744,56 @@ object Form1: TForm1
Left = 469
Top = 78
end
object ImageList1: TImageList
Left = 96
Top = 128
Bitmap = {
4C7A020000001000000010000000330100000000000078DAFBFFFF3FC3FF4182
5919B6E580301EF94C10C626C7C4B0358387E1FC4B5E860BAF816A72B1C86723
E47764E3D22FC2F0EC3FBA1930BD08394CFD20CCCCB02D15A1EE22D80C6686ED
69E86284C200A8FE15483D0FC38557200C619F7F852F6C30FD7AE105481F36FF
D0523F25EEC71656D8C2145FFC931B7F94A61F42E99318F9514C18335433C832
3030309255BEB473190ACFD4B8CD37416A19A96670B5F31B8BCF33B86D7EBCF0
BFEE9ED81F5CBDA2B349B1576CAEDE2DF3E305FF41FA251618DE0699876E3E57
AFC86C747721DB0BC22036BA5E98F97A7BE37E81FDD6C0C044ACBD603B807E01
F9C9FC04C46FBC1324177375F29B10B2171E27403783F4209B21B9D0F831317A
D1CC58A8B32BEA27C80C30C6E366826690A817DD2F2233D5EF90AA17D90C503A
1D0AF90900E0D3FE8A
}
BitmapAdv = {
4C69020000004C7A020000001800000018000000E50100000000000078DAFBFF
FF3FC3FF514C126666581D04C2C4AB5FE30BC2C4A865605813C0C2B0E3052BC3
8E57CC0CEB82A8A99E8161831748AD30C3E3FF204C480FCC6C54F51B7C89315F
84E1195E3B90CD4653EB83DF0F6BBD5918B6BF44D5B7EB2533C3A660C26AD604
131707B8EDA0D46CE43404F43F8A39203E363152D21ABE301661780AC5C8E14D
9ED9E87688303C81DA01C24FA8623661F3D751C5EDF8C3873C3B6819BFF8D220
31F9835CB349C983A4950FAB49281F882B7F8849DFD8CB3742E50F7279BB9AC4
F299B87826A5BE2047FD281EC5C30DB3B67117B0B5F3AC63086560A6BAD91D5C
D982D3555E2BAE76FECAD6CEBD95A18181857A6673E60BCD507B6D76BCE0BFF9
89C2FF0A203B3A793752C31FA030019AFD06663608EBEC8CFA0B0CA7EB403F08
50234CCC8EE723CCDE1DFD8FBD83EF26432B83384E7DED5C590C6DACE6E4B89B
BD83F71AD0DD22F8C212E426AE5E9167B8EC400F6FB0D9BBA2FEB177F15DC76F
36C2BFC68732FE83ED6861B5A0469830B43108B3B470BE353A940ED707B6A347
E429CC1FE48609DC8E160633A0794F40E6A2D801F4074B0B7B3F396182E90F56
73909BD1ED905E6CF19D5C7763D8D1C460C8D923FC0439AC903131E14DAE1DD4
301B971DD4341B3DCED5B704921C97A4C4394B1BE7195A983D8A698F013C0DA6
1E4C7A020000002000000020000000F70100000000000078DAED58CD4AC34010
9E1ADA80204DC5BB525FC14450509FC68B55A9078F226DF105A4BE8268A91EB4
17CFB5F806FE3C80E0AD092D785BB3D1404C37E9FE6B610F1F6D21D36FE69BF9
66972084001918100070B585C11F7FED61F07217E0C60F11F0E420121F3EBF89
63CBF08CCAF08A0A70EB03747674C40374DD387609DE23E0EFB475C47593E3BB
2E1D7F77988CA7CD81C49D88F569F8BFFFA7B341CE215BCBA4E6BF635E30F790
A57FAC39C8E666C94115376D4FF3FBCDBF3B267398D4C181B7082AB9A7F54285
E6D37470C2FEA7B99D6826E4D74D9A851CFE40157FD69CD3EE07151EC899BF40
EEECE7F98F6F578B689E9C739E5D2D8B5BE4BC90C52D3B07D2F94FBBD7B2F6A4
E8F9CFB2534939889CFF3C3B55343E757FF405EF9FDC3B59E4FE2C23DEC0C0C0
60A6DF619C42094EA08E3FFF82DB6A95EE8B67F39F56CBEEE9CC0176A168354B
77CEF9CA68EDB18616DBAB63AB613FC03ED83AB9DDC1015A7FAA236F70A82587
48F3A6DDABB4AB23EF873B86DBAF21DC8BF099235D75C7505DBF4C6E56CFC473
4ED21CFFAE5C54C7B4F3CFEA19A9DC8C9E91AA39A36764CF1AF604D61C7B6442
C3505BECA958C33C8F919E973ABFC7B0A0CA633475CD35AC0F9975B3CEF3F2E5
36129D73915EA4A16AAFD1E4304B3B7516CF52E25EECEF69E54E7B333A179A7A
EF52FFE12E6960A0025FC697C5E2
}
end
end

View File

@ -6,17 +6,20 @@ interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
EditBtn, ComCtrls, SynEdit, SynHighlighterHTML, IpHtml;
EditBtn, ComCtrls, Buttons, SynEdit, SynHighlighterHTML, IpHtml;
type
{ TForm1 }
{ TTestForm }
TForm1 = class(TForm)
TTestForm = class(TForm)
btnPassed: TBitBtn;
btnFailed: TBitBtn;
btnRender: TButton;
btnShowInBrowser: TButton;
btnLoadFromFile: TButton;
FileNameEdit1: TFileNameEdit;
ImageList1: TImageList;
IpHtmlPanel1: TIpHtmlPanel;
Label1: TLabel;
Memo1: TMemo;
@ -29,15 +32,20 @@ type
Splitter3: TSplitter;
SynEdit1: TSynEdit;
SynHTMLSyn1: TSynHTMLSyn;
TreeView1: TTreeView;
TestTree: TTreeView;
procedure btnTestResultClick(Sender: TObject);
procedure btnRenderClick(Sender: TObject);
procedure btnShowInBrowserClick(Sender: TObject);
procedure btnLoadFromFileClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCreate(Sender: TObject);
procedure TreeView1Deletion(Sender: TObject; Node: TTreeNode);
procedure TreeView1SelectionChanged(Sender: TObject);
procedure TestTreeDeletion(Sender: TObject; Node: TTreeNode);
procedure TestTreeGetSelectedIndex(Sender: TObject; Node: TTreeNode);
procedure TestTreeSelectionChanged(Sender: TObject);
private
procedure PopulateTests;
procedure LoadResults;
procedure SaveResults;
public
procedure AddTest(ANode: TTreeNode; ATitle, ADescription, AHtml: String);
@ -45,52 +53,83 @@ type
end;
var
Form1: TForm1;
TestForm: TTestForm;
implementation
{$R *.lfm}
uses
LCLIntf, ipro_tests;
LCLIntf, md5, ipro_tests;
const // Values for node imageindex showing test results
RESULT_UNDEFINED = -1;
RESULT_FAILED = 0;
RESULT_PASSED = 1;
RESULTS_FILE = 'test-results.txt';
type
TTestCase = class
Description: String;
HTML: String;
MD5: TMDDigest;
end;
{ TForm1 }
{ TTestForm }
procedure TForm1.AddTest(ANode: TTreeNode; ATitle, ADescription, AHtml: String);
procedure TTestForm.AddTest(ANode: TTreeNode; ATitle, ADescription, AHtml: String);
var
testcase: TTestCase;
begin
testcase := TTestCase.Create;
testcase.Description := ADescription;
testcase.HTML := AHtml;
TreeView1.Items.AddChildObject(ANode, ATitle, testcase);
testcase.MD5 := MDString(AHtml, MD_VERSION_5);
TestTree.Items.AddChildObject(ANode, ATitle, testcase);
end;
procedure TForm1.FormCreate(Sender: TObject);
procedure TTestForm.FormCreate(Sender: TObject);
begin
SynEdit1.Font.Quality := fqCleartype;
PopulateTests;
end;
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
procedure TTestForm.TestTreeDeletion(Sender: TObject; Node: TTreeNode);
begin
if (TObject(Node.Data) is TTestCase) then
TTestCase(Node.Data).Free;
end;
procedure TForm1.btnRenderClick(Sender: TObject);
procedure TTestForm.TestTreeGetSelectedIndex(Sender: TObject; Node: TTreeNode);
begin
Node.SelectedIndex := Node.ImageIndex;
end;
procedure TTestForm.btnRenderClick(Sender: TObject);
begin
IpHtmlPanel1.SetHtmlFromStr(SynEdit1.Lines.Text);
end;
procedure TForm1.btnShowInBrowserClick(Sender: TObject);
procedure TTestForm.btnTestResultClick(Sender: TObject);
var
testcase: TTestCase;
begin
if TestTree.Selected <> nil then
begin
testcase := TTestCase(TestTree.Selected.Data);
if testcase <> nil then
begin
if Sender = btnPassed then
TestTree.Selected.ImageIndex := RESULT_PASSED
else if Sender = btnFailed then
TestTree.Selected.ImageIndex := RESULT_FAILED;
end;
end;
end;
procedure TTestForm.btnShowInBrowserClick(Sender: TObject);
const
TEST_FILE = 'test.html';
begin
@ -98,7 +137,7 @@ begin
OpenURL(TEST_FILE);
end;
procedure TForm1.btnLoadFromFileClick(Sender: TObject);
procedure TTestForm.btnLoadFromFileClick(Sender: TObject);
begin
with TOpenDialog.Create(nil) do
try
@ -117,13 +156,19 @@ begin
end;
end;
procedure TForm1.TreeView1SelectionChanged(Sender: TObject);
procedure TTestForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if CanClose then
SaveResults;
end;
procedure TTestForm.TestTreeSelectionChanged(Sender: TObject);
var
testcase: TTestCase;
begin
if TreeView1.Selected = nil then
if TestTree.Selected = nil then
exit;
testCase := TTestCase(TreeView1.Selected.Data);
testCase := TTestCase(TestTree.Selected.Data);
if testCase <> nil then
begin
Memo1.Lines.Text := testCase.Description;
@ -137,39 +182,39 @@ begin
end;
end;
procedure TForm1.PopulateTests;
procedure TTestForm.PopulateTests;
var
node, node1: TTreeNode;
begin
TreeView1.Items.BeginUpdate;
TestTree.Items.BeginUpdate;
try
TreeView1.Items.Clear;
TestTree.Items.Clear;
node := TreeView1.Items.AddChild(nil, 'Text background');
node := TestTree.Items.AddChild(nil, 'Text background');
AddTest(node, TextWithBackgroundInBODY_title, TextWithBackgroundInBODY_descr, TextWithBackgroundInBODY_html);
AddTest(node, TextWithBackgroundInBODY_CSS_title, TextWithBackgroundInBODY_CSS_descr, TextWithBackgroundInBODY_CSS_html);
AddTest(node, TextInColoredTableCell_title, TextInColoredTableCell_descr, TextInColoredTableCell_html);
node.Expanded := true;
node := TreeView1.Items.AddChild(nil, 'Tables');
node1 := TreeView1.Items.AddChild(node, 'Text alignment');
node := TestTree.Items.AddChild(nil, 'Tables');
node1 := TestTree.Items.AddChild(node, 'Text alignment');
AddTest(node1, AlignInCell_title, AlignInCell_descr, AlignInCell_html);
AddTest(node1, AlignInCellBold_title, AlignInCellBold_descr, AlignInCellBold_html);
AddTest(node1, AlignInCell_CSS_title, AlignInCell_CSS_descr, AlignInCell_CSS_html);
AddTest(node1, AlignInCellBold_CSS_title, AlignInCellBold_CSS_descr, AlignInCellBold_CSS_html);
node1.Expanded := true;
node1 := TreeView1.Items.AddChild(node, 'Background colors');
node1 := TestTree.Items.AddChild(node, 'Background colors');
AddTest(node1, TableCellBkColor_title, TableCellBkColor_descr, TableCellBkColor_html);
AddTest(node1, TableCellBkColor_style_title, TableCellBkColor_style_descr, TableCellBkColor_style_html);
AddTest(node1, TableRowBkColor_title, TableRowBkColor_descr, TableRowBkColor_html);
AddTest(node1, TableRowBkColor_style_title, TableRowBkColor_style_descr, TableRowBkColor_style_html);
AddTest(node1, TableColBkColor_style_title, TableColBkColor_style_descr, TableColBkColor_style_html);
node1.Expanded := true;
node1 := TreeView1.Items.AddChild(node, 'Merged cells');
node1 := TestTree.Items.AddChild(node, 'Merged cells');
AddTest(node1, TableColSpan_title, TableColSpan_descr, TableColSpan_html);
AddTest(node1, TableRowSpan_title, TableRowSpan_descr, TableRowSpan_html);
node1.Expanded := true;
node1 := TreeView1.Items.AddChild(node, 'Column widths');
node1 := TestTree.Items.AddChild(node, 'Column widths');
AddTest(node1, ColWidth_auto_title, ColWidth_auto_descr, ColWidth_auto_html);
AddTest(node1, ColWidth_fixed_title, ColWidth_fixed_descr, ColWidth_fixed_html);
AddTest(node1, ColWidth_100perc_title, ColWidth_100perc_descr, ColWidth_100perc_html);
@ -179,7 +224,7 @@ begin
node1.Expanded := true;
node.Expanded := true;
node := TreeView1.Items.AddChild(nil, 'Lists');
node := TestTree.Items.AddChild(nil, 'Lists');
AddTest(node, OL_title, OL_descr, OL_html);
AddTest(node, UL_title, UL_descr, UL_html);
AddTest(node, UL_style_title, UL_style_descr, UL_style_html);
@ -187,12 +232,12 @@ begin
AddTest(node, OUL_3lev_title, OUL_3lev_descr, OUL_3lev_html);
node.Expanded := true;
node := TreeView1.Items.AddChild(nil, 'CSS');
node := TestTree.Items.AddChild(nil, 'CSS');
AddTest(node, HTMLCommentInCSS_title, HTMLCommentInCSS_descr, HTMLCommentInCSS_html);
node.Expanded := true;
node := TreeView1.Items.AddChild(nil, 'Special tags');
node1 := TreeView1.Items.AddChild(node, '<BR>');
node := TestTree.Items.AddChild(nil, 'Special tags');
node1 := TestTree.Items.AddChild(node, '<BR>');
AddTest(node1, BRinBODY_title, BRinBODY_descr, BRinBODY_html);
AddTest(node1, TwoBRinBODY_title, TwoBRinBODY_descr, TwoBRinBODY_html);
AddTest(node1, BRinP_title, BRinP_descr, BRinP_html);
@ -202,24 +247,96 @@ begin
AddTest(node1, BRbetweenTwoP_title, BRbetweenTwoP_descr, BRbetweenTwoP_html);
AddTest(node1, BRbetweenTwoTables_title, BRbetweenTwoTables_descr, BRbetweenTwoTables_html);
node1.Expanded := true;
node1 := TreeView1.Items.AddChild(node, '<PRE>');
node1 := TestTree.Items.AddChild(node, '<PRE>');
AddTest(node1, PRE_title, PRE_descr, PRE_html);
node1.Expanded := true;
node.Expanded := true;
node := TreeView1.Items.AddChild(nil, 'Special cases in file structure');
node := TestTree.Items.AddChild(nil, 'Special cases in file structure');
AddTest(node, NoHtmlTag_title, NoHtmlTag_descr, NoHtmlTag_html);
AddTest(node, NoBodyTag_title, NoBodyTag_descr, NoBodyTag_html);
node.Expanded := true;
node := TreeView1.Items.AddChild(nil, 'Localization, right-to-left');
node := TestTree.Items.AddChild(nil, 'Localization, right-to-left');
AddTest(node, Arab_title, Arab_descr, Arab_html);
node.Expanded := true;
LoadResults;
finally
TreeView1.Items.EndUpdate;
TestTree.Items.EndUpdate;
end;
end;
procedure TTestForm.LoadResults;
var
L: TStringList;
procedure LoadResult(ANode: TTreeNode);
var
testcase: TTestCase;
idx: Integer;
begin
if ANode = nil then
exit;
testcase := TTestCase(ANode.Data);
if testcase <> nil then
begin
if L.Find(MD5Print(testcase.MD5), idx) then
ANode.ImageIndex := PtrInt(L.Objects[idx]);
end else
LoadResult(ANode.GetFirstChild);
LoadResult(ANode.GetNextSibling);
end;
var
i, p, res: Integer;
imgidx: PtrInt;
fn: String;
begin
fn := Application.Location + RESULTS_FILE;
if not FileExists(fn) then
exit;
L := TStringList.Create;
try
L.LoadFromFile(fn);
for i := 0 to L.Count-1 do begin
p := pos('|', L[i]);
val(copy(L[i], p+1), imgidx, res);
L.Objects[i] := TObject(imgidx);
L.Strings[i] := Copy(L[i], 1, p-1);
end;
L.Sorted := true;
LoadResult(TestTree.Items.GetFirstNode);
finally
L.Free;
end;
end;
procedure TTestForm.SaveResults;
var
F: TextFile;
procedure SaveTest(ANode: TTreeNode);
var
testcase: TTestCase;
begin
if ANode = nil then
exit;
testcase := TTestCase(ANode.Data);
if testcase <> nil then
WriteLn(F, MDPrint(testcase.MD5) + '|' + IntToStr(ANode.ImageIndex))
else
SaveTest(ANode.GetFirstChild);
SaveTest(ANode.GetNextSibling);
end;
begin
AssignFile(F, Application.Location + RESULTS_FILE);
Rewrite(F);
SaveTest(TestTree.Items.GetFirstNode);
CloseFile(F);
end;
end.

View File

@ -0,0 +1,38 @@
caed306af1cf468e5910cb1f3b46cd51|1
c745e8b8e7bf5afeb32f6e40066b8f20|1
42e1e7505296bfabf74d8ce0d276b265|1
1a73bf758f9ffb962746faaf13b8f166|1
faf187bf6662c4dc9010c89e52fd9c05|1
b04ecc7eb166dd8432afebddaaa6ca7c|1
faffbd13f323d19002d5319afddecf30|0
c34635385386c1ff8e77236b31e4c684|1
ab7d8098373c01ae729e8a9e3e0ed3a0|1
76f9fb06074c7bc161b07fea5a278a16|1
96d8065611dda197d0be1ed47adbb524|1
f410a0a721b9a5d3e43e4134d05d55e1|0
3a3f27a1eb496d7fa2852241883489c7|1
3893ea2a37335b97594c2e034727ef6e|1
db425850a781ed8fc7fa450adf36367f|1
d5068632b7f322c1076e0e78442ae6a3|1
c9798563026960f2332ed2fe9bc74b61|1
0f50b75c007ba031862243f4cb9cd99b|1
eadb0b01c9e5cb899dd67a83e9edfe1f|0
b84b1fcd170be4b397c019e7fe21f166|0
d042fcbe050041d0b45543b2a51d4bd1|1
6dbc1942cb7e1e1c9a7c5a65b4604100|1
d597ff5b6b490f55e97b54056cce90f4|0
ec3b47cf554b90366517e2917bca4517|1
c9de5a135d783c12056966dc69a7eac2|1
decd85b27d5247d7927b200e16867580|0
ab150875b0491c2aa421bfbf0afc0dbe|1
9237189012709fd252b072deec129e09|1
f9018cc29cc35a14d816dc4200afbe0b|1
ad5744714d6c9021894e67fdf52b1689|1
7e72847dc980aca45c260f6612e8ef5f|1
c5ea29ee080832664180790c6e277154|1
2696b28d0a93547dc3286dec1bf2869b|1
dca07f136c5214df3052f67cc853e62a|1
93dd425a961945639cf1c85592e26843|0
09b8149415d34207aa8e95634d64469a|1
cc5bf5c55da8bb627046b09b0fcfb1ce|1
dfba0057569856f72bec2b26854d474b|1