SynEdit: Ifdef Markup: tests

git-svn-id: trunk@41152 -
This commit is contained in:
martin 2013-05-12 13:23:09 +00:00
parent 34c01dba58
commit f685df6785

View File

@ -18,6 +18,7 @@ type
TPeerExpect = record
PeerType: TSynMarkupIfdefNodeTypeTest;
PeerY, PeerX: Integer;
NoAutoFree: Boolean;
end;
PPeerExpect = ^TPeerExpect;
@ -86,6 +87,7 @@ begin
Result^.PeerType := PeerType;
Result^.PeerY := PeerY;
Result^.PeerX := PeerX;
Result^.NoAutoFree := False;
end;
function EpIf(PeerY, PeerX: Integer): PPeerExpect;
@ -129,7 +131,9 @@ begin
Result.ClosePeer := Peer2^;
Result.ExpState := ExpState;
Result.TestExpState := True;
if not Peer1^.NoAutoFree then
Dispose(Peer1);
if not Peer2^.NoAutoFree then
Dispose(Peer2);
end;
@ -303,6 +307,11 @@ function TTestMarkupIfDef.TestTextNoIfDef: TStringArray;
Result[Length(Result)-1] := s;
end;
begin
AddLine('//' );
AddLine('//' );
AddLine('//' );
AddLine('//' );
AddLine('//' );
AddLine('//' );
AddLine('//' );
@ -963,6 +972,8 @@ end;
procedure TTestMarkupIfDef.TestIfDefTreePeerConnect;
var
n: String;
i, i2, i3, i4: Integer;
epMaybeIf: PPeerExpect;
begin
FTestTree := nil;
@ -1143,21 +1154,6 @@ begin
n := 'Peers, TestText2: Bad nodes';
ReCreateEditForTreeTest(TestText2);
FTestTree.ValidateRange(1, 18, FOpenings);
// ONe and only one of the 2 ends should have a peer
CheckNodes(n, 2, [ ExpN( 1,11, idnIfdef, EpSkip, EpEnd(4, 1)) ]);
CheckNodes(n, 4, [ ExpN( 1, 9, idnEndIf, EpIf(2, 1)) ]);
CheckNodes(n, 6, [ ExpN( 1, 9, idnEndIf, EpNil) ]); // must not have a peer
// One and only one else may be connected to if and one (but maybe the other) to endif
CheckNodes(n,10, [ ExpN( 1,11, idnIfdef) ]); // EpElse(12, 1) // or 14
CheckNodes(n,12, [ ExpN( 1, 8, idnElse) ]);
CheckNodes(n,14, [ ExpN( 1, 8, idnElse) ]);
CheckNodes(n,16, [ ExpN( 1, 9, idnEndIf, EpElse(14, 1)) ]);
n := 'scan plain text, after closed node: step 1: node';
ReCreateEditForTreeTest(TestText3);
@ -1351,6 +1347,24 @@ begin
CheckNodes(n,35, [ ExpN( 3,11, idnEndIf, EpElse(33, 3)) ]);
CheckNodes(n,37, [ ExpN( 1, 9, idnEndIf, EpElse(30, 1)) ]);
{%endregion peers + edit}
{%region UNMATCHED PEERS}
// NO EDIT
n := 'Peers, TestText2: Bad nodes';
ReCreateEditForTreeTest(TestText2);
FTestTree.ValidateRange(1, 18, FOpenings);
// ONe and only one of the 2 ends should have a peer
CheckNodes(n, 2, [ ExpN( 1,11, idnIfdef, EpSkip, EpEnd(4, 1)) ]);
CheckNodes(n, 4, [ ExpN( 1, 9, idnEndIf, EpIf(2, 1)) ]);
CheckNodes(n, 6, [ ExpN( 1, 9, idnEndIf, EpNil) ]); // must not have a peer
// One and only one else may be connected to if and one (but maybe the other) to endif
CheckNodes(n,10, [ ExpN( 1,11, idnIfdef) ]); // EpElse(12, 1) // or 14
CheckNodes(n,12, [ ExpN( 1, 8, idnElse) ]);
CheckNodes(n,14, [ ExpN( 1, 8, idnElse) ]);
CheckNodes(n,16, [ ExpN( 1, 9, idnEndIf, EpElse(14, 1)) ]);
{%region Insert If/end to create invalid peering, that must be resolved }
@ -1466,6 +1480,136 @@ begin
{%endregion Insert If/end to create invalid peering, that must be resolved }
{%region ELSE WITHOUT IFDEF and DOUBLE ELSE }
// TODO: Else and ifdef on same line
for i := 0 to 2 do begin
for i2 := 0 to 7 do
for i3 := 0 to 2 do // ifdef
for i4 := 0 to 1 do // endif TODO
begin
case i of
0: begin
PushBaseName('Scan empty, then add else at line 3 (after scan-start-marker)');
ReCreateEditForTreeTest(TestTextNoIfDef);
FTestTree.ValidateRange(1, 9, FOpenings);
end;
1: begin
PushBaseName('Scan empty (form 3), then add else at line 3 (AT scan-start-marker)');
ReCreateEditForTreeTest(TestTextNoIfDef);
FTestTree.ValidateRange(3, 9, FOpenings);
end;
2:begin
PushBaseName('Add else (before first scan) at line 3');
ReCreateEditForTreeTest(TestTextNoIfDef);
end;
end;
SynEdit.TextBetweenPoints[point(1, 3),point(1, 3)] := ' {$ELSE} //';
FTestTree.ValidateRange(1, 9, FOpenings);
CheckNodes(n, 3, [ ExpN(21,28, idnElse, EpNil, EpNil ) ]);
SynEdit.TextBetweenPoints[point(1, 3),point(28, 3)] := '';
FTestTree.ValidateRange(1, 9, FOpenings);
CheckNodes(n+'undone', 3, [ ]);
SynEdit.TextBetweenPoints[point(1, 3),point(1, 3)] := ' {$ELSE} //';
FTestTree.ValidateRange(1, 9, FOpenings);
CheckNodes(n+'redone', 3, [ ExpN(21,28, idnElse, EpNil, EpNil ) ]);
n := '['+IntToStr(i2)+']';
// Maybe ifdef
epMaybeIf := EpNil;
if i3 >= 1 then begin
n := n + 'Insert leading IFDEF';
SynEdit.TextBetweenPoints[point(1, 1),point(1, 1)] := '{$IFDEF a}';
if i4 = 2 then begin
n := n + '(scanned)';
FTestTree.ValidateRange(1, 9, FOpenings);
CheckNodes(n+'ifdef', 1, [ ExpN( 1,11, idnIfdef, EpNil, EpElse(3,21) ) ]);
CheckNodes(n+'ifdef', 3, [ ExpN(21,28, idnElse, EpIf(1,1), EpNil ) ]);
end;
epMaybeIf := EpIf(1,1);
end;
epMaybeIf^.NoAutoFree := True;
if (i2 and 1) = 0 then begin
// 2nd before first
SynEdit.TextBetweenPoints[point(1, 2),point(1, 2)] := ' {$ELSE}';
FTestTree.ValidateRange(1, 9, FOpenings);
if i3 >= 1 then
CheckNodes(n+'2nd else before 1st', 1, [ ExpN( 1,11, idnIfdef, EpNil, EpElse(2,2) ) ]);
CheckNodes(n+'2nd else before 1st', 2, [ ExpN( 2, 9, idnElse, epMaybeIf, EpNil ) ]);
CheckNodes(n+'2nd else before 1st', 3, [ ExpN(21,28, idnElse, EpNil, EpNil ) ]);
SynEdit.TextBetweenPoints[point(1, 2),point(9, 2)] := '';
FTestTree.ValidateRange(1, 9, FOpenings);
if i3 >= 1 then
CheckNodes(n+'undone 2nd before 1st', 1, [ ExpN( 1,11, idnIfdef, EpNil, EpElse(3,21) ) ]);
CheckNodes(n+'undone 2nd before 1st', 2, [ ]);
CheckNodes(n+'undone 2nd before 1st', 3, [ ExpN(21,28, idnElse, epMaybeIf, EpNil ) ]);
end;
if (i2 and 2) = 0 then begin
// 2nd after first
SynEdit.TextBetweenPoints[point(1, 4),point(1, 4)] := ' {$ELSE}';
FTestTree.ValidateRange(1, 9, FOpenings);
if i3 >= 1 then
CheckNodes(n+'2nd after 1st', 1, [ ExpN( 1,11, idnIfdef, EpNil, EpElse(3,21) ) ]);
CheckNodes(n+'2nd else after 1st', 3, [ ExpN(21,28, idnElse, epMaybeIf, EpNil ) ]);
CheckNodes(n+'2nd else after 1st', 4, [ ExpN( 2, 9, idnElse, EpNil, EpNil ) ]);
SynEdit.TextBetweenPoints[point(1, 4),point(9, 4)] := '';
FTestTree.ValidateRange(1, 9, FOpenings);
if i3 >= 1 then
CheckNodes(n+'undone 2nd after 1st', 1, [ ExpN( 1,11, idnIfdef, EpNil, EpElse(3,21) ) ]);
CheckNodes(n+'undone 2nd after 1st', 3, [ ExpN(21,28, idnElse, epMaybeIf, EpNil ) ]);
CheckNodes(n+'undone 2nd after 1st', 4, [ ]);
end;
if (i2 and 3) = 0 then begin
// 2nd before first (same line)
SynEdit.TextBetweenPoints[point(11, 3),point(18, 3)] := '{$ELSE}';
FTestTree.ValidateRange(1, 9, FOpenings);
if i3 >= 1 then
CheckNodes(n+'2nd before 1st (same line)', 1, [ ExpN( 1,11, idnIfdef, EpNil, EpElse(3,11) ) ]);
CheckNodes(n+'2nd else before 1st (same line)', 3, [
ExpN(11,18, idnElse, epMaybeIf, EpNil ),
ExpN(21,28, idnElse, EpNil, EpNil )
]);
SynEdit.TextBetweenPoints[point(11, 3),point(18, 3)] := ' ';
FTestTree.ValidateRange(1, 9, FOpenings);
if i3 >= 1 then
CheckNodes(n+'undone 2nd before 1st (same line)', 1, [ ExpN( 1,11, idnIfdef, EpNil, EpElse(3,21) ) ]);
CheckNodes(n+'undone 2nd before 1st (same line)', 3, [ ExpN(21,28, idnElse, epMaybeIf, EpNil ) ]);
end;
// 2nd after first (same line)
SynEdit.TextBetweenPoints[point(31, 3),point(38, 3)] := '{$ELSE}';
FTestTree.ValidateRange(1, 9, FOpenings);
if i3 >= 1 then
CheckNodes(n+'2nd after 1st (same line)', 1, [ ExpN( 1,11, idnIfdef, EpNil, EpElse(3,21) ) ]);
CheckNodes(n+'2nd else after 1st (same line)', 3, [
ExpN(21,28, idnElse, epMaybeIf, EpNil ),
ExpN(31,38, idnElse, EpNil, EpNil )
]);
SynEdit.TextBetweenPoints[point(31, 3),point(38, 3)] := ' ';
FTestTree.ValidateRange(1, 9, FOpenings);
if i3 >= 1 then
CheckNodes(n+'undone 2nd after 1st (same line)', 1, [ ExpN( 1,11, idnIfdef, EpNil, EpElse(3,21) ) ]);
CheckNodes(n+'undone 2nd after 1st (same line)', 3, [ ExpN(21,28, idnElse, epMaybeIf, EpNil ) ]);
Dispose(epMaybeIf);
end;
PopBaseName;
end;
{%endregion ELSE WITHOUT IFDEF and DOUBLE ELSE }
{%region }
n := 'P';
ReCreateEditForTreeTest(TestText2);
@ -1475,10 +1619,10 @@ begin
{%endregion }
{%endregion UNMATCHED PEERS}
{%endregion peers}
FTestTree.DiscardOpeningList(FOpenings);