1*16467b97STreehugger Robot unit Antlr.Runtime.Tree.Tests;
2*16467b97STreehugger Robot {
3*16467b97STreehugger Robot
4*16467b97STreehugger Robot Delphi DUnit Test Case
5*16467b97STreehugger Robot ----------------------
6*16467b97STreehugger Robot This unit contains a skeleton test case class generated by the Test Case Wizard.
7*16467b97STreehugger Robot Modify the generated code to correctly setup and call the methods from the unit
8*16467b97STreehugger Robot being tested.
9*16467b97STreehugger Robot
10*16467b97STreehugger Robot }
11*16467b97STreehugger Robot
12*16467b97STreehugger Robot interface
13*16467b97STreehugger Robot
14*16467b97STreehugger Robot uses
15*16467b97STreehugger Robot TestFramework,
16*16467b97STreehugger Robot Antlr.Runtime.Collections,
17*16467b97STreehugger Robot Antlr.Runtime.Tree,
18*16467b97STreehugger Robot Classes,
19*16467b97STreehugger Robot SysUtils,
20*16467b97STreehugger Robot Antlr.Runtime,
21*16467b97STreehugger Robot Antlr.Runtime.Tools;
22*16467b97STreehugger Robot
23*16467b97STreehugger Robot type
24*16467b97STreehugger Robot // Test methods for class ICommonTree
25*16467b97STreehugger Robot TestICommonTree = class(TTestCase)
26*16467b97STreehugger Robot public
27*16467b97STreehugger Robot procedure SetUp; override;
28*16467b97STreehugger Robot procedure TearDown; override;
29*16467b97STreehugger Robot published
30*16467b97STreehugger Robot procedure TestSingleNode;
31*16467b97STreehugger Robot procedure Test4Nodes;
32*16467b97STreehugger Robot procedure TestList;
33*16467b97STreehugger Robot procedure TestList2;
34*16467b97STreehugger Robot procedure TestAddListToExistChildren;
35*16467b97STreehugger Robot procedure TestDupTree;
36*16467b97STreehugger Robot procedure TestBecomeRoot;
37*16467b97STreehugger Robot procedure TestBecomeRoot2;
38*16467b97STreehugger Robot procedure TestBecomeRoot3;
39*16467b97STreehugger Robot procedure TestBecomeRoot5;
40*16467b97STreehugger Robot procedure TestBecomeRoot6;
41*16467b97STreehugger Robot procedure TestReplaceWithNoChildren;
42*16467b97STreehugger Robot procedure TestReplaceWithOneChildren;
43*16467b97STreehugger Robot procedure TestReplaceInMiddle;
44*16467b97STreehugger Robot procedure TestReplaceAtLeft;
45*16467b97STreehugger Robot procedure TestReplaceAtRight;
46*16467b97STreehugger Robot procedure TestReplaceOneWithTwoAtLeft;
47*16467b97STreehugger Robot procedure TestReplaceOneWithTwoAtRight;
48*16467b97STreehugger Robot procedure TestReplaceOneWithTwoInMiddle;
49*16467b97STreehugger Robot procedure TestReplaceTwoWithOneAtLeft;
50*16467b97STreehugger Robot procedure TestReplaceTwoWithOneAtRight;
51*16467b97STreehugger Robot procedure TestReplaceAllWithOne;
52*16467b97STreehugger Robot procedure TestReplaceAllWithTwo;
53*16467b97STreehugger Robot end;
54*16467b97STreehugger Robot
55*16467b97STreehugger Robot // Test methods for class ICommonTreeNodeStream
56*16467b97STreehugger Robot TestICommonTreeNodeStream = class(TTestCase)
57*16467b97STreehugger Robot private
CreateCommonTreeNodeStream(const T: IANTLRInterface)58*16467b97STreehugger Robot function CreateCommonTreeNodeStream(const T: IANTLRInterface): ITreeNodeStream;
GetStringOfEntireStreamContentsWithNodeTypesOnly(59*16467b97STreehugger Robot function GetStringOfEntireStreamContentsWithNodeTypesOnly(
60*16467b97STreehugger Robot const Nodes: ITreeNodeStream): String;
CreateUnBufferedTreeNodeStream(const T: IANTLRInterface)61*16467b97STreehugger Robot function CreateUnBufferedTreeNodeStream(const T: IANTLRInterface): ITreeNodeStream;
62*16467b97STreehugger Robot public
63*16467b97STreehugger Robot procedure SetUp; override;
64*16467b97STreehugger Robot procedure TearDown; override;
65*16467b97STreehugger Robot published
66*16467b97STreehugger Robot procedure TestSingleNode;
67*16467b97STreehugger Robot procedure Test4Nodes;
68*16467b97STreehugger Robot procedure TestList;
69*16467b97STreehugger Robot procedure TestFlatList;
70*16467b97STreehugger Robot procedure TestListWithOneNode;
71*16467b97STreehugger Robot procedure TestAoverB;
72*16467b97STreehugger Robot procedure TestLT;
73*16467b97STreehugger Robot procedure TestMarkRewindEntire;
74*16467b97STreehugger Robot procedure TestMarkRewindInMiddle;
75*16467b97STreehugger Robot procedure TestMarkRewindNested;
76*16467b97STreehugger Robot procedure TestSeek;
77*16467b97STreehugger Robot procedure TestSeekFromStart;
78*16467b97STreehugger Robot procedure TestPushPop;
79*16467b97STreehugger Robot procedure TestNestedPushPop;
80*16467b97STreehugger Robot procedure TestPushPopFromEOF;
81*16467b97STreehugger Robot procedure TestStackStretch;
82*16467b97STreehugger Robot procedure TestBufferOverflow;
83*16467b97STreehugger Robot procedure TestBufferWrap;
84*16467b97STreehugger Robot end;
85*16467b97STreehugger Robot
86*16467b97STreehugger Robot // Test methods for class IRewriteRuleXxxxStream
87*16467b97STreehugger Robot TestIRewriteRuleXxxxStream = class(TTestCase)
88*16467b97STreehugger Robot strict private
CreateTreeAdaptor()89*16467b97STreehugger Robot function CreateTreeAdaptor: ITreeAdaptor;
CreateTree(const Token: IToken)90*16467b97STreehugger Robot function CreateTree(const Token: IToken): ITree;
CreateToken(const TokenType: Integer; const Text: String)91*16467b97STreehugger Robot function CreateToken(const TokenType: Integer; const Text: String): IToken;
CreateTokenList(const Count: Integer)92*16467b97STreehugger Robot function CreateTokenList(const Count: Integer): IList<IToken>;
93*16467b97STreehugger Robot public
94*16467b97STreehugger Robot procedure SetUp; override;
95*16467b97STreehugger Robot procedure TearDown; override;
96*16467b97STreehugger Robot published
97*16467b97STreehugger Robot procedure TestRewriteRuleTokenStreamConstructors;
98*16467b97STreehugger Robot procedure TestRewriteRuleSubtreeStreamConstructors;
99*16467b97STreehugger Robot procedure TestRewriteRuleNodeStreamConstructors;
100*16467b97STreehugger Robot
101*16467b97STreehugger Robot procedure TestRRTokenStreamBehaviourWhileEmpty1;
102*16467b97STreehugger Robot procedure TestRRSubtreeStreamBehaviourWhileEmpty1;
103*16467b97STreehugger Robot procedure TestRRNodeStreamBehaviourWhileEmpty1;
104*16467b97STreehugger Robot
105*16467b97STreehugger Robot procedure TestRRTokenStreamBehaviourWhileEmpty2;
106*16467b97STreehugger Robot procedure TestRRSubtreeStreamBehaviourWhileEmpty2;
107*16467b97STreehugger Robot procedure TestRRNodeStreamBehaviourWhileEmpty2;
108*16467b97STreehugger Robot
109*16467b97STreehugger Robot procedure TestRRTokenStreamBehaviourWhileEmpty3;
110*16467b97STreehugger Robot
111*16467b97STreehugger Robot procedure TestRRTokenStreamBehaviourWithElements;
112*16467b97STreehugger Robot procedure TestRRSubtreeStreamBehaviourWithElements;
113*16467b97STreehugger Robot procedure TestRRNodeStreamBehaviourWithElements;
114*16467b97STreehugger Robot end;
115*16467b97STreehugger Robot
116*16467b97STreehugger Robot // Test methods for class ITreeWizard
117*16467b97STreehugger Robot TestITreeWizard = class(TTestCase)
118*16467b97STreehugger Robot strict private
119*16467b97STreehugger Robot FTokens: TStringArray;
120*16467b97STreehugger Robot strict private
121*16467b97STreehugger Robot type
122*16467b97STreehugger Robot TRecordAllElementsVisitor = class sealed(TTreeWizard.TVisitor)
123*16467b97STreehugger Robot strict private
124*16467b97STreehugger Robot FList: IList<IANTLRInterface>;
125*16467b97STreehugger Robot strict protected
126*16467b97STreehugger Robot procedure Visit(const T: IANTLRInterface); override;
127*16467b97STreehugger Robot public
128*16467b97STreehugger Robot constructor Create(const AList: IList<IANTLRInterface>);
129*16467b97STreehugger Robot end;
130*16467b97STreehugger Robot
131*16467b97STreehugger Robot TTest1ContextVisitor = class sealed(TANTLRObject, IContextVisitor)
132*16467b97STreehugger Robot strict private
133*16467b97STreehugger Robot FAdaptor: ITreeAdaptor;
134*16467b97STreehugger Robot FList: IList<IANTLRInterface>;
135*16467b97STreehugger Robot protected
136*16467b97STreehugger Robot { IContextVisitor }
137*16467b97STreehugger Robot procedure Visit(const T, Parent: IANTLRInterface; const ChildIndex: Integer;
138*16467b97STreehugger Robot const Labels: IDictionary<String, IANTLRInterface>);
139*16467b97STreehugger Robot public
140*16467b97STreehugger Robot constructor Create(const AAdaptor: ITreeAdaptor;
141*16467b97STreehugger Robot const AList: IList<IANTLRInterface>);
142*16467b97STreehugger Robot end;
143*16467b97STreehugger Robot
144*16467b97STreehugger Robot TTest2ContextVisitor = class sealed(TANTLRObject, IContextVisitor)
145*16467b97STreehugger Robot strict private
146*16467b97STreehugger Robot FAdaptor: ITreeAdaptor;
147*16467b97STreehugger Robot FList: IList<IANTLRInterface>;
148*16467b97STreehugger Robot protected
149*16467b97STreehugger Robot { IContextVisitor }
150*16467b97STreehugger Robot procedure Visit(const T, Parent: IANTLRInterface; const ChildIndex: Integer;
151*16467b97STreehugger Robot const Labels: IDictionary<String, IANTLRInterface>);
152*16467b97STreehugger Robot public
153*16467b97STreehugger Robot constructor Create(const AAdaptor: ITreeAdaptor;
154*16467b97STreehugger Robot const AList: IList<IANTLRInterface>);
155*16467b97STreehugger Robot end;
156*16467b97STreehugger Robot public
157*16467b97STreehugger Robot constructor Create(MethodName: String); override;
158*16467b97STreehugger Robot procedure SetUp; override;
159*16467b97STreehugger Robot procedure TearDown; override;
160*16467b97STreehugger Robot published
161*16467b97STreehugger Robot procedure TestSingleNode;
162*16467b97STreehugger Robot procedure TestSingleNodeWithArg;
163*16467b97STreehugger Robot procedure TestSingleNodeTree;
164*16467b97STreehugger Robot procedure TestSingleLevelTree;
165*16467b97STreehugger Robot procedure TestListTree;
166*16467b97STreehugger Robot procedure TestInvalidListTree;
167*16467b97STreehugger Robot procedure TestDoubleLevelTree;
168*16467b97STreehugger Robot procedure TestSingleNodeIndex;
169*16467b97STreehugger Robot procedure TestNoRepeatsIndex;
170*16467b97STreehugger Robot procedure TestRepeatsIndex;
171*16467b97STreehugger Robot procedure TestNoRepeatsVisit;
172*16467b97STreehugger Robot procedure TestNoRepeatsVisit2;
173*16467b97STreehugger Robot procedure TestRepeatsVisit;
174*16467b97STreehugger Robot procedure TestRepeatsVisit2;
175*16467b97STreehugger Robot procedure TestRepeatsVisitWithContext;
176*16467b97STreehugger Robot procedure TestRepeatsVisitWithNullParentAndContext;
177*16467b97STreehugger Robot procedure TestVisitPattern;
178*16467b97STreehugger Robot procedure TestVisitPatternMultiple;
179*16467b97STreehugger Robot procedure TestVisitPatternMultipleWithLabels;
180*16467b97STreehugger Robot procedure TestParse;
181*16467b97STreehugger Robot procedure TestParseSingleNode;
182*16467b97STreehugger Robot procedure TestParseFlatTree;
183*16467b97STreehugger Robot procedure TestWildcard;
184*16467b97STreehugger Robot procedure TestParseWithText;
185*16467b97STreehugger Robot procedure TestParseWithTextFails;
186*16467b97STreehugger Robot procedure TestParseLabels;
187*16467b97STreehugger Robot procedure TestParseWithWildcardLabels;
188*16467b97STreehugger Robot procedure TestParseLabelsAndTestText;
189*16467b97STreehugger Robot procedure TestParseLabelsInNestedTree;
190*16467b97STreehugger Robot procedure TestEquals;
191*16467b97STreehugger Robot procedure TestEqualsWithText;
192*16467b97STreehugger Robot procedure TestEqualsWithMismatchedText;
193*16467b97STreehugger Robot procedure TestFindPattern;
194*16467b97STreehugger Robot end;
195*16467b97STreehugger Robot
196*16467b97STreehugger Robot implementation
197*16467b97STreehugger Robot
198*16467b97STreehugger Robot procedure TestICommonTree.SetUp;
199*16467b97STreehugger Robot begin
200*16467b97STreehugger Robot end;
201*16467b97STreehugger Robot
202*16467b97STreehugger Robot procedure TestICommonTree.TearDown;
203*16467b97STreehugger Robot begin
204*16467b97STreehugger Robot end;
205*16467b97STreehugger Robot
206*16467b97STreehugger Robot procedure TestICommonTree.Test4Nodes;
207*16467b97STreehugger Robot var
208*16467b97STreehugger Robot R0: ICommonTree;
209*16467b97STreehugger Robot begin
210*16467b97STreehugger Robot // ^(101 ^(102 103) 104)
211*16467b97STreehugger Robot R0 := TCommonTree.Create(TCommonToken.Create(101));
212*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
213*16467b97STreehugger Robot R0.GetChild(0).AddChild(TCommonTree.Create(TCommonToken.Create(103)));
214*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
215*16467b97STreehugger Robot CheckNull(R0.Parent);
216*16467b97STreehugger Robot CheckEquals(R0.ChildIndex,-1);
217*16467b97STreehugger Robot end;
218*16467b97STreehugger Robot
219*16467b97STreehugger Robot procedure TestICommonTree.TestAddListToExistChildren;
220*16467b97STreehugger Robot var
221*16467b97STreehugger Robot Root, R0, C0, C1, C2: ICommonTree;
222*16467b97STreehugger Robot begin
223*16467b97STreehugger Robot // Add child ^(nil 101 102 103) to root ^(5 6)
224*16467b97STreehugger Robot // should add 101 102 103 to end of 5's child list
225*16467b97STreehugger Robot Root := TCommonTree.Create(TCommonToken.Create(5));
226*16467b97STreehugger Robot Root.AddChild(TCommonTree.Create(TCommonToken.Create(6)));
227*16467b97STreehugger Robot
228*16467b97STreehugger Robot // child tree
229*16467b97STreehugger Robot R0 := TCommonTree.Create(IToken(nil));
230*16467b97STreehugger Robot C0 := TCommonTree.Create(TCommonToken.Create(101));
231*16467b97STreehugger Robot C1 := TCommonTree.Create(TCommonToken.Create(102));
232*16467b97STreehugger Robot C2 := TCommonTree.Create(TCommonToken.Create(103));
233*16467b97STreehugger Robot R0.AddChild(C0);
234*16467b97STreehugger Robot R0.AddChild(C1);
235*16467b97STreehugger Robot R0.AddChild(C2);
236*16467b97STreehugger Robot
237*16467b97STreehugger Robot Root.AddChild(R0);
238*16467b97STreehugger Robot
239*16467b97STreehugger Robot CheckNull(Root.Parent);
240*16467b97STreehugger Robot CheckEquals(Root.ChildIndex, -1);
241*16467b97STreehugger Robot
242*16467b97STreehugger Robot // check children of root all point at root
243*16467b97STreehugger Robot Check(C0.Parent = Root);
244*16467b97STreehugger Robot Check(C0.ChildIndex = 1);
245*16467b97STreehugger Robot Check(C1.Parent = Root);
246*16467b97STreehugger Robot Check(C1.ChildIndex = 2);
247*16467b97STreehugger Robot Check(C2.Parent = Root);
248*16467b97STreehugger Robot Check(C2.ChildIndex = 3);
249*16467b97STreehugger Robot end;
250*16467b97STreehugger Robot
251*16467b97STreehugger Robot procedure TestICommonTree.TestBecomeRoot;
252*16467b97STreehugger Robot var
253*16467b97STreehugger Robot OldRoot, NewRoot: ICommonTree;
254*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
255*16467b97STreehugger Robot begin
256*16467b97STreehugger Robot // 5 becomes new root of ^(nil 101 102 103)
257*16467b97STreehugger Robot NewRoot := TCommonTree.Create(TCommonToken.Create(5));
258*16467b97STreehugger Robot OldRoot := TCommonTree.Create(IToken(nil));
259*16467b97STreehugger Robot OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(101)));
260*16467b97STreehugger Robot OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
261*16467b97STreehugger Robot OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
262*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
263*16467b97STreehugger Robot Adaptor.BecomeRoot(NewRoot, OldRoot);
264*16467b97STreehugger Robot NewRoot.SanityCheckParentAndChildIndexes;
265*16467b97STreehugger Robot end;
266*16467b97STreehugger Robot
267*16467b97STreehugger Robot procedure TestICommonTree.TestBecomeRoot2;
268*16467b97STreehugger Robot var
269*16467b97STreehugger Robot OldRoot, NewRoot: ICommonTree;
270*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
271*16467b97STreehugger Robot begin
272*16467b97STreehugger Robot // 5 becomes new root of ^(101 102 103)
273*16467b97STreehugger Robot NewRoot := TCommonTree.Create(TCommonToken.Create(5));
274*16467b97STreehugger Robot OldRoot := TCommonTree.Create(TCommonToken.Create(101));
275*16467b97STreehugger Robot OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
276*16467b97STreehugger Robot OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
277*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
278*16467b97STreehugger Robot Adaptor.BecomeRoot(NewRoot, OldRoot);
279*16467b97STreehugger Robot NewRoot.SanityCheckParentAndChildIndexes;
280*16467b97STreehugger Robot end;
281*16467b97STreehugger Robot
282*16467b97STreehugger Robot procedure TestICommonTree.TestBecomeRoot3;
283*16467b97STreehugger Robot var
284*16467b97STreehugger Robot OldRoot, NewRoot: ICommonTree;
285*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
286*16467b97STreehugger Robot begin
287*16467b97STreehugger Robot // ^(nil 5) becomes new root of ^(nil 101 102 103)
288*16467b97STreehugger Robot NewRoot := TCommonTree.Create(IToken(nil));
289*16467b97STreehugger Robot NewRoot.AddChild(TCommonTree.Create(TCommonToken.Create(5)));
290*16467b97STreehugger Robot OldRoot := TCommonTree.Create(IToken(nil));
291*16467b97STreehugger Robot OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(101)));
292*16467b97STreehugger Robot OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
293*16467b97STreehugger Robot OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
294*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
295*16467b97STreehugger Robot Adaptor.BecomeRoot(NewRoot, OldRoot);
296*16467b97STreehugger Robot NewRoot.SanityCheckParentAndChildIndexes;
297*16467b97STreehugger Robot end;
298*16467b97STreehugger Robot
299*16467b97STreehugger Robot procedure TestICommonTree.TestBecomeRoot5;
300*16467b97STreehugger Robot var
301*16467b97STreehugger Robot OldRoot, NewRoot: ICommonTree;
302*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
303*16467b97STreehugger Robot begin
304*16467b97STreehugger Robot // ^(nil 5) becomes new root of ^(101 102 103)
305*16467b97STreehugger Robot NewRoot := TCommonTree.Create(IToken(nil));
306*16467b97STreehugger Robot NewRoot.AddChild(TCommonTree.Create(TCommonToken.Create(5)));
307*16467b97STreehugger Robot OldRoot := TCommonTree.Create(TCommonToken.Create(101));
308*16467b97STreehugger Robot OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
309*16467b97STreehugger Robot OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
310*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
311*16467b97STreehugger Robot Adaptor.BecomeRoot(NewRoot, OldRoot);
312*16467b97STreehugger Robot NewRoot.SanityCheckParentAndChildIndexes;
313*16467b97STreehugger Robot end;
314*16467b97STreehugger Robot
315*16467b97STreehugger Robot procedure TestICommonTree.TestBecomeRoot6;
316*16467b97STreehugger Robot var
317*16467b97STreehugger Robot Root0, Root1: ICommonTree;
318*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
319*16467b97STreehugger Robot begin
320*16467b97STreehugger Robot // emulates construction of ^(5 6)
321*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
322*16467b97STreehugger Robot Root0 := Adaptor.GetNilNode as ICommonTree;
323*16467b97STreehugger Robot Root1 := Adaptor.GetNilNode as ICommonTree;
324*16467b97STreehugger Robot Root1 := Adaptor.BecomeRoot(TCommonTree.Create(TCommonToken.Create(5)), Root1) as ICommonTree;
325*16467b97STreehugger Robot Adaptor.AddChild(Root1, TCommonTree.Create(TCommonToken.Create(6)));
326*16467b97STreehugger Robot Adaptor.AddChild(Root0, Root1);
327*16467b97STreehugger Robot Root0.SanityCheckParentAndChildIndexes;
328*16467b97STreehugger Robot end;
329*16467b97STreehugger Robot
330*16467b97STreehugger Robot procedure TestICommonTree.TestDupTree;
331*16467b97STreehugger Robot var
332*16467b97STreehugger Robot R0, R1, Dup: ICommonTree;
333*16467b97STreehugger Robot R2: ITree;
334*16467b97STreehugger Robot Adaptor: ICommonTreeAdaptor;
335*16467b97STreehugger Robot begin
336*16467b97STreehugger Robot // ^(101 ^(102 103 ^(106 107) ) 104 105)
337*16467b97STreehugger Robot R0 := TCommonTree.Create(TCommonToken.Create(101));
338*16467b97STreehugger Robot R1 := TCommonTree.Create(TCommonToken.Create(102));
339*16467b97STreehugger Robot R0.AddChild(R1);
340*16467b97STreehugger Robot R1.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
341*16467b97STreehugger Robot R2 := TCommonTree.Create(TCommonToken.Create(106));
342*16467b97STreehugger Robot R2.AddChild(TCommonTree.Create(TCommonToken.Create(107)));
343*16467b97STreehugger Robot R1.AddChild(R2);
344*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
345*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(105)));
346*16467b97STreehugger Robot
347*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
348*16467b97STreehugger Robot Dup := Adaptor.DupTree(R0) as ICommonTree;
349*16467b97STreehugger Robot
350*16467b97STreehugger Robot CheckNull(Dup.Parent);
351*16467b97STreehugger Robot CheckEquals(Dup.ChildIndex, -1);
352*16467b97STreehugger Robot Dup.SanityCheckParentAndChildIndexes;
353*16467b97STreehugger Robot end;
354*16467b97STreehugger Robot
355*16467b97STreehugger Robot procedure TestICommonTree.TestList;
356*16467b97STreehugger Robot var
357*16467b97STreehugger Robot R0, C0, C1, C2: ICommonTree;
358*16467b97STreehugger Robot begin
359*16467b97STreehugger Robot // ^(nil 101 102 103)
360*16467b97STreehugger Robot R0 := TCommonTree.Create(IToken(nil));
361*16467b97STreehugger Robot C0 := TCommonTree.Create(TCommonToken.Create(101));
362*16467b97STreehugger Robot C1 := TCommonTree.Create(TCommonToken.Create(102));
363*16467b97STreehugger Robot C2 := TCommonTree.Create(TCommonToken.Create(103));
364*16467b97STreehugger Robot R0.AddChild(C0);
365*16467b97STreehugger Robot R0.AddChild(C1);
366*16467b97STreehugger Robot R0.AddChild(C2);
367*16467b97STreehugger Robot
368*16467b97STreehugger Robot CheckNull(R0.Parent);
369*16467b97STreehugger Robot CheckEquals(R0.ChildIndex, -1);
370*16467b97STreehugger Robot Check(C0.Parent = R0);
371*16467b97STreehugger Robot CheckEquals(C0.ChildIndex, 0);
372*16467b97STreehugger Robot Check(C1.Parent = R0);
373*16467b97STreehugger Robot CheckEquals(C1.ChildIndex, 1);
374*16467b97STreehugger Robot Check(C2.Parent = R0);
375*16467b97STreehugger Robot CheckEquals(C2.ChildIndex, 2);
376*16467b97STreehugger Robot end;
377*16467b97STreehugger Robot
378*16467b97STreehugger Robot procedure TestICommonTree.TestList2;
379*16467b97STreehugger Robot var
380*16467b97STreehugger Robot Root, R0, C0, C1, C2: ICommonTree;
381*16467b97STreehugger Robot begin
382*16467b97STreehugger Robot // Add child ^(nil 101 102 103) to root 5
383*16467b97STreehugger Robot // should pull 101 102 103 directly to become 5's child list
384*16467b97STreehugger Robot Root := TCommonTree.Create(TClassicToken.Create(5));
385*16467b97STreehugger Robot
386*16467b97STreehugger Robot // child tree
387*16467b97STreehugger Robot R0 := TCommonTree.Create(IToken(nil));
388*16467b97STreehugger Robot C0 := TCommonTree.Create(TCommonToken.Create(101));
389*16467b97STreehugger Robot C1 := TCommonTree.Create(TCommonToken.Create(102));
390*16467b97STreehugger Robot C2 := TCommonTree.Create(TCommonToken.Create(103));
391*16467b97STreehugger Robot R0.AddChild(C0);
392*16467b97STreehugger Robot R0.AddChild(C1);
393*16467b97STreehugger Robot R0.AddChild(C2);
394*16467b97STreehugger Robot
395*16467b97STreehugger Robot Root.AddChild(R0);
396*16467b97STreehugger Robot
397*16467b97STreehugger Robot CheckNull(Root.Parent);
398*16467b97STreehugger Robot CheckEquals(Root.ChildIndex, -1);
399*16467b97STreehugger Robot
400*16467b97STreehugger Robot // check children of root all point at root
401*16467b97STreehugger Robot Check(C0.Parent = Root);
402*16467b97STreehugger Robot Check(C0.ChildIndex = 0);
403*16467b97STreehugger Robot Check(C1.Parent = Root);
404*16467b97STreehugger Robot Check(C1.ChildIndex = 1);
405*16467b97STreehugger Robot Check(C2.Parent = Root);
406*16467b97STreehugger Robot Check(C2.ChildIndex = 2);
407*16467b97STreehugger Robot end;
408*16467b97STreehugger Robot
409*16467b97STreehugger Robot procedure TestICommonTree.TestReplaceAllWithOne;
410*16467b97STreehugger Robot var
411*16467b97STreehugger Robot T, NewChild: ICommonTree;
412*16467b97STreehugger Robot begin
413*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
414*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b')));
415*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c')));
416*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd')));
417*16467b97STreehugger Robot NewChild := TCommonTree.Create(TCommonToken.Create(99, 'x'));
418*16467b97STreehugger Robot T.ReplaceChildren(0, 2, NewChild);
419*16467b97STreehugger Robot CheckEquals(T.ToStringTree, '(a x)');
420*16467b97STreehugger Robot T.SanityCheckParentAndChildIndexes;
421*16467b97STreehugger Robot end;
422*16467b97STreehugger Robot
423*16467b97STreehugger Robot procedure TestICommonTree.TestReplaceAllWithTwo;
424*16467b97STreehugger Robot var
425*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
426*16467b97STreehugger Robot T, NewChildren: ICommonTree;
427*16467b97STreehugger Robot begin
428*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
429*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
430*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b')));
431*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c')));
432*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd')));
433*16467b97STreehugger Robot NewChildren := Adaptor.GetNilNode as ICommonTree;
434*16467b97STreehugger Robot NewChildren.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'x')));
435*16467b97STreehugger Robot NewChildren.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'y')));
436*16467b97STreehugger Robot T.ReplaceChildren(0, 2, NewChildren);
437*16467b97STreehugger Robot CheckEquals(T.ToStringTree, '(a x y)');
438*16467b97STreehugger Robot T.SanityCheckParentAndChildIndexes;
439*16467b97STreehugger Robot end;
440*16467b97STreehugger Robot
441*16467b97STreehugger Robot procedure TestICommonTree.TestReplaceAtLeft;
442*16467b97STreehugger Robot var
443*16467b97STreehugger Robot T, NewChild: ICommonTree;
444*16467b97STreehugger Robot begin
445*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
446*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b'))); // index 0
447*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c')));
448*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd')));
449*16467b97STreehugger Robot NewChild := TCommonTree.Create(TCommonToken.Create(99, 'x'));
450*16467b97STreehugger Robot T.ReplaceChildren(0, 0, NewChild);
451*16467b97STreehugger Robot CheckEquals(T.ToStringTree, '(a x c d)');
452*16467b97STreehugger Robot T.SanityCheckParentAndChildIndexes;
453*16467b97STreehugger Robot end;
454*16467b97STreehugger Robot
455*16467b97STreehugger Robot procedure TestICommonTree.TestReplaceAtRight;
456*16467b97STreehugger Robot var
457*16467b97STreehugger Robot T, NewChild: ICommonTree;
458*16467b97STreehugger Robot begin
459*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
460*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b')));
461*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c')));
462*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd'))); // index 2
463*16467b97STreehugger Robot NewChild := TCommonTree.Create(TCommonToken.Create(99, 'x'));
464*16467b97STreehugger Robot T.ReplaceChildren(2, 2, NewChild);
465*16467b97STreehugger Robot CheckEquals(T.ToStringTree, '(a b c x)');
466*16467b97STreehugger Robot T.SanityCheckParentAndChildIndexes;
467*16467b97STreehugger Robot end;
468*16467b97STreehugger Robot
469*16467b97STreehugger Robot procedure TestICommonTree.TestReplaceInMiddle;
470*16467b97STreehugger Robot var
471*16467b97STreehugger Robot T, NewChild: ICommonTree;
472*16467b97STreehugger Robot begin
473*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
474*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b')));
475*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c'))); // index 1
476*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd')));
477*16467b97STreehugger Robot NewChild := TCommonTree.Create(TCommonToken.Create(99, 'x'));
478*16467b97STreehugger Robot T.ReplaceChildren(1, 1, NewChild);
479*16467b97STreehugger Robot CheckEquals(T.ToStringTree, '(a b x d)');
480*16467b97STreehugger Robot T.SanityCheckParentAndChildIndexes;
481*16467b97STreehugger Robot end;
482*16467b97STreehugger Robot
483*16467b97STreehugger Robot procedure TestICommonTree.TestReplaceOneWithTwoAtLeft;
484*16467b97STreehugger Robot var
485*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
486*16467b97STreehugger Robot T, NewChildren: ICommonTree;
487*16467b97STreehugger Robot begin
488*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
489*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
490*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b')));
491*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c')));
492*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd')));
493*16467b97STreehugger Robot NewChildren := Adaptor.GetNilNode as ICommonTree;
494*16467b97STreehugger Robot NewChildren.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'x')));
495*16467b97STreehugger Robot NewChildren.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'y')));
496*16467b97STreehugger Robot T.ReplaceChildren(0, 0, NewChildren);
497*16467b97STreehugger Robot CheckEquals(T.ToStringTree, '(a x y c d)');
498*16467b97STreehugger Robot T.SanityCheckParentAndChildIndexes;
499*16467b97STreehugger Robot end;
500*16467b97STreehugger Robot
501*16467b97STreehugger Robot procedure TestICommonTree.TestReplaceOneWithTwoAtRight;
502*16467b97STreehugger Robot var
503*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
504*16467b97STreehugger Robot T, NewChildren: ICommonTree;
505*16467b97STreehugger Robot begin
506*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
507*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
508*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b')));
509*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c')));
510*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd')));
511*16467b97STreehugger Robot NewChildren := Adaptor.GetNilNode as ICommonTree;
512*16467b97STreehugger Robot NewChildren.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'x')));
513*16467b97STreehugger Robot NewChildren.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'y')));
514*16467b97STreehugger Robot T.ReplaceChildren(2, 2, NewChildren);
515*16467b97STreehugger Robot CheckEquals(T.ToStringTree, '(a b c x y)');
516*16467b97STreehugger Robot T.SanityCheckParentAndChildIndexes;
517*16467b97STreehugger Robot end;
518*16467b97STreehugger Robot
519*16467b97STreehugger Robot procedure TestICommonTree.TestReplaceOneWithTwoInMiddle;
520*16467b97STreehugger Robot var
521*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
522*16467b97STreehugger Robot T, NewChildren: ICommonTree;
523*16467b97STreehugger Robot begin
524*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
525*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
526*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b')));
527*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c')));
528*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd')));
529*16467b97STreehugger Robot NewChildren := Adaptor.GetNilNode as ICommonTree;
530*16467b97STreehugger Robot NewChildren.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'x')));
531*16467b97STreehugger Robot NewChildren.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'y')));
532*16467b97STreehugger Robot T.ReplaceChildren(1, 1, NewChildren);
533*16467b97STreehugger Robot CheckEquals(T.ToStringTree, '(a b x y d)');
534*16467b97STreehugger Robot T.SanityCheckParentAndChildIndexes;
535*16467b97STreehugger Robot end;
536*16467b97STreehugger Robot
537*16467b97STreehugger Robot procedure TestICommonTree.TestReplaceTwoWithOneAtLeft;
538*16467b97STreehugger Robot var
539*16467b97STreehugger Robot T, NewChild: ICommonTree;
540*16467b97STreehugger Robot begin
541*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
542*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b')));
543*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c')));
544*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd')));
545*16467b97STreehugger Robot NewChild := TCommonTree.Create(TCommonToken.Create(99, 'x'));
546*16467b97STreehugger Robot T.ReplaceChildren(0, 1, NewChild);
547*16467b97STreehugger Robot CheckEquals(T.ToStringTree, '(a x d)');
548*16467b97STreehugger Robot T.SanityCheckParentAndChildIndexes;
549*16467b97STreehugger Robot end;
550*16467b97STreehugger Robot
551*16467b97STreehugger Robot procedure TestICommonTree.TestReplaceTwoWithOneAtRight;
552*16467b97STreehugger Robot var
553*16467b97STreehugger Robot T, NewChild: ICommonTree;
554*16467b97STreehugger Robot begin
555*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
556*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b')));
557*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c')));
558*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd')));
559*16467b97STreehugger Robot NewChild := TCommonTree.Create(TCommonToken.Create(99, 'x'));
560*16467b97STreehugger Robot T.ReplaceChildren(1, 2, NewChild);
561*16467b97STreehugger Robot CheckEquals(T.ToStringTree, '(a b x)');
562*16467b97STreehugger Robot T.SanityCheckParentAndChildIndexes;
563*16467b97STreehugger Robot end;
564*16467b97STreehugger Robot
565*16467b97STreehugger Robot procedure TestICommonTree.TestReplaceWithNoChildren;
566*16467b97STreehugger Robot var
567*16467b97STreehugger Robot T, NewChild: ICommonTree;
568*16467b97STreehugger Robot Error: Boolean;
569*16467b97STreehugger Robot begin
570*16467b97STreehugger Robot Exit; // already checked. Avoid exception
571*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(101));
572*16467b97STreehugger Robot NewChild := TCommonTree.Create(TCommonToken.Create(5));
573*16467b97STreehugger Robot Error := False;
574*16467b97STreehugger Robot try
575*16467b97STreehugger Robot T.ReplaceChildren(0, 0, NewChild);
576*16467b97STreehugger Robot except
577*16467b97STreehugger Robot Error := True;
578*16467b97STreehugger Robot end;
579*16467b97STreehugger Robot CheckTrue(Error);
580*16467b97STreehugger Robot end;
581*16467b97STreehugger Robot
582*16467b97STreehugger Robot procedure TestICommonTree.TestReplaceWithOneChildren;
583*16467b97STreehugger Robot var
584*16467b97STreehugger Robot T, C0, NewChild: ICommonTree;
585*16467b97STreehugger Robot begin
586*16467b97STreehugger Robot // assume token type 99 and use text
587*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
588*16467b97STreehugger Robot C0 := TCommonTree.Create(TCommonToken.Create(99, 'b'));
589*16467b97STreehugger Robot T.AddChild(C0);
590*16467b97STreehugger Robot NewChild := TCommonTree.Create(TCommonToken.Create(99, 'c'));
591*16467b97STreehugger Robot T.ReplaceChildren(0, 0, NewChild);
592*16467b97STreehugger Robot CheckEquals(T.ToStringTree,'(a c)');
593*16467b97STreehugger Robot T.SanityCheckParentAndChildIndexes;
594*16467b97STreehugger Robot end;
595*16467b97STreehugger Robot
596*16467b97STreehugger Robot procedure TestICommonTree.TestSingleNode;
597*16467b97STreehugger Robot var
598*16467b97STreehugger Robot T: ICommonTree;
599*16467b97STreehugger Robot begin
600*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(101));
601*16467b97STreehugger Robot CheckNull(T.Parent);
602*16467b97STreehugger Robot CheckEquals(T.ChildIndex, -1);
603*16467b97STreehugger Robot end;
604*16467b97STreehugger Robot
CreateCommonTreeNodeStreamnull605*16467b97STreehugger Robot function TestICommonTreeNodeStream.CreateCommonTreeNodeStream(
606*16467b97STreehugger Robot const T: IANTLRInterface): ITreeNodeStream;
607*16467b97STreehugger Robot begin
608*16467b97STreehugger Robot Result := TCommonTreeNodeStream.Create(T);
609*16467b97STreehugger Robot end;
610*16467b97STreehugger Robot
TestICommonTreeNodeStream.CreateUnBufferedTreeNodeStream(611*16467b97STreehugger Robot function TestICommonTreeNodeStream.CreateUnBufferedTreeNodeStream(
612*16467b97STreehugger Robot const T: IANTLRInterface): ITreeNodeStream;
613*16467b97STreehugger Robot begin
614*16467b97STreehugger Robot Result := TUnBufferedTreeNodeStream.Create(T);
615*16467b97STreehugger Robot end;
616*16467b97STreehugger Robot
TestICommonTreeNodeStream.GetStringOfEntireStreamContentsWithNodeTypesOnly(617*16467b97STreehugger Robot function TestICommonTreeNodeStream.GetStringOfEntireStreamContentsWithNodeTypesOnly(
618*16467b97STreehugger Robot const Nodes: ITreeNodeStream): String;
619*16467b97STreehugger Robot var
620*16467b97STreehugger Robot Buf: TStringBuilder;
621*16467b97STreehugger Robot I, TokenType: Integer;
622*16467b97STreehugger Robot T: IANTLRInterface;
623*16467b97STreehugger Robot begin
624*16467b97STreehugger Robot Buf := TStringBuilder.Create;
625*16467b97STreehugger Robot try
626*16467b97STreehugger Robot for I := 0 to Nodes.Size - 1 do
627*16467b97STreehugger Robot begin
628*16467b97STreehugger Robot T := Nodes.LT(I + 1);
629*16467b97STreehugger Robot TokenType := Nodes.TreeAdaptor.GetNodeType(T);
630*16467b97STreehugger Robot if (TokenType <> TToken.DOWN) and (TokenType <> TToken.UP) then
631*16467b97STreehugger Robot begin
632*16467b97STreehugger Robot Buf.Append(' ');
633*16467b97STreehugger Robot Buf.Append(TokenType)
634*16467b97STreehugger Robot end;
635*16467b97STreehugger Robot end;
636*16467b97STreehugger Robot Result := Buf.ToString;
637*16467b97STreehugger Robot finally
638*16467b97STreehugger Robot Buf.Free;
639*16467b97STreehugger Robot end;
640*16467b97STreehugger Robot end;
641*16467b97STreehugger Robot
642*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.SetUp;
643*16467b97STreehugger Robot begin
644*16467b97STreehugger Robot end;
645*16467b97STreehugger Robot
646*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.TearDown;
647*16467b97STreehugger Robot begin
648*16467b97STreehugger Robot end;
649*16467b97STreehugger Robot
650*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.Test4Nodes;
651*16467b97STreehugger Robot var
652*16467b97STreehugger Robot T: ITree;
653*16467b97STreehugger Robot Stream: ITreeNodeStream;
654*16467b97STreehugger Robot begin
655*16467b97STreehugger Robot /// Test a tree with four nodes - ^(101 ^(102 103) 104)
656*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(101));
657*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
658*16467b97STreehugger Robot T.GetChild(0).AddChild(TCommonTree.Create(TCommonToken.Create(103)));
659*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
660*16467b97STreehugger Robot
661*16467b97STreehugger Robot Stream := CreateCommonTreeNodeStream(T);
662*16467b97STreehugger Robot CheckEquals(GetStringOfEntireStreamContentsWithNodeTypesOnly(Stream),' 101 102 103 104');
663*16467b97STreehugger Robot CheckEquals(Stream.ToString, ' 101 2 102 2 103 3 104 3');
664*16467b97STreehugger Robot end;
665*16467b97STreehugger Robot
666*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.TestAoverB;
667*16467b97STreehugger Robot var
668*16467b97STreehugger Robot T: ITree;
669*16467b97STreehugger Robot Stream: ITreeNodeStream;
670*16467b97STreehugger Robot begin
671*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(101));
672*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
673*16467b97STreehugger Robot
674*16467b97STreehugger Robot Stream := CreateCommonTreeNodeStream(T);
675*16467b97STreehugger Robot CheckEquals(GetStringOfEntireStreamContentsWithNodeTypesOnly(Stream),' 101 102');
676*16467b97STreehugger Robot CheckEquals(Stream.ToString, ' 101 2 102 3');
677*16467b97STreehugger Robot end;
678*16467b97STreehugger Robot
679*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.TestBufferOverflow;
680*16467b97STreehugger Robot var
681*16467b97STreehugger Robot Buf, Buf2: TStringBuilder;
682*16467b97STreehugger Robot Stream: ITreeNodeStream;
683*16467b97STreehugger Robot T: ITree;
684*16467b97STreehugger Robot I: Integer;
685*16467b97STreehugger Robot begin
686*16467b97STreehugger Robot Buf := TStringBuilder.Create;
687*16467b97STreehugger Robot Buf2 := TStringBuilder.Create;
688*16467b97STreehugger Robot try
689*16467b97STreehugger Robot // make ^(101 102 ... n)
690*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(101));
691*16467b97STreehugger Robot Buf.Append(' 101');
692*16467b97STreehugger Robot Buf2.Append(' 101');
693*16467b97STreehugger Robot Buf2.Append(' ');
694*16467b97STreehugger Robot Buf2.Append(TToken.DOWN);
695*16467b97STreehugger Robot
696*16467b97STreehugger Robot for I := 0 to TUnBufferedTreeNodeStream.INITIAL_LOOKAHEAD_BUFFER_SIZE + 10 do
697*16467b97STreehugger Robot begin
698*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(102 + I)));
699*16467b97STreehugger Robot Buf.Append(' ');
700*16467b97STreehugger Robot Buf.Append(102 + I);
701*16467b97STreehugger Robot Buf2.Append(' ');
702*16467b97STreehugger Robot Buf2.Append(102 + I);
703*16467b97STreehugger Robot end;
704*16467b97STreehugger Robot Buf2.Append(' ');
705*16467b97STreehugger Robot Buf2.Append(TToken.UP);
706*16467b97STreehugger Robot
707*16467b97STreehugger Robot Stream := CreateUnBufferedTreeNodeStream(T);
708*16467b97STreehugger Robot CheckEquals(GetStringOfEntireStreamContentsWithNodeTypesOnly(Stream), Buf.ToString);
709*16467b97STreehugger Robot CheckEquals(Stream.ToString, Buf2.ToString);
710*16467b97STreehugger Robot finally
711*16467b97STreehugger Robot Buf2.Free;
712*16467b97STreehugger Robot Buf.Free;
713*16467b97STreehugger Robot end;
714*16467b97STreehugger Robot end;
715*16467b97STreehugger Robot
716*16467b97STreehugger Robot /// <summary>
717*16467b97STreehugger Robot /// Test what happens when tail hits the end of the buffer, but there
718*16467b97STreehugger Robot /// is more room left.
719*16467b97STreehugger Robot /// </summary>
720*16467b97STreehugger Robot /// <remarks>
721*16467b97STreehugger Robot /// Specifically that would mean that head is not at 0 but has
722*16467b97STreehugger Robot /// advanced somewhere to the middle of the lookahead buffer.
723*16467b97STreehugger Robot ///
724*16467b97STreehugger Robot /// Use Consume() to advance N nodes into lookahead. Then use LT()
725*16467b97STreehugger Robot /// to load at least INITIAL_LOOKAHEAD_BUFFER_SIZE-N nodes so the
726*16467b97STreehugger Robot /// buffer has to wrap.
727*16467b97STreehugger Robot /// </remarks>
728*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.TestBufferWrap;
729*16467b97STreehugger Robot const
730*16467b97STreehugger Robot N = 10;
731*16467b97STreehugger Robot WrapBy = 4; // wrap around by 4 nodes
732*16467b97STreehugger Robot var
733*16467b97STreehugger Robot T: ITree;
734*16467b97STreehugger Robot I, Remaining: Integer;
735*16467b97STreehugger Robot Stream: ITreeNodeStream;
736*16467b97STreehugger Robot Node: ITree;
737*16467b97STreehugger Robot begin
738*16467b97STreehugger Robot // make tree with types: 1 2 ... INITIAL_LOOKAHEAD_BUFFER_SIZE+N
739*16467b97STreehugger Robot T := TCommonTree.Create(IToken(nil));
740*16467b97STreehugger Robot for I := 0 to TUnBufferedTreeNodeStream.INITIAL_LOOKAHEAD_BUFFER_SIZE + N - 1 do
741*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(I + 1)));
742*16467b97STreehugger Robot
743*16467b97STreehugger Robot // move head to index N
744*16467b97STreehugger Robot Stream := CreateUnBufferedTreeNodeStream(T);
745*16467b97STreehugger Robot for I := 1 to N do
746*16467b97STreehugger Robot begin
747*16467b97STreehugger Robot // consume N
748*16467b97STreehugger Robot Node := Stream.LT(1) as ITree;
749*16467b97STreehugger Robot CheckEquals(Node.TokenType, I);
750*16467b97STreehugger Robot Stream.Consume;
751*16467b97STreehugger Robot end;
752*16467b97STreehugger Robot
753*16467b97STreehugger Robot // now use LT to lookahead past end of buffer
754*16467b97STreehugger Robot Remaining := TUnBufferedTreeNodeStream.INITIAL_LOOKAHEAD_BUFFER_SIZE - N;
755*16467b97STreehugger Robot CheckTrue(WrapBy < N);
756*16467b97STreehugger Robot for I := 1 to Remaining + WrapBy do
757*16467b97STreehugger Robot begin
758*16467b97STreehugger Robot // wrap past end of buffer
759*16467b97STreehugger Robot Node := Stream.LT(I) as ITree; // look ahead to ith token
760*16467b97STreehugger Robot CheckEquals(Node.TokenType, N + I);
761*16467b97STreehugger Robot end;
762*16467b97STreehugger Robot end;
763*16467b97STreehugger Robot
764*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.TestFlatList;
765*16467b97STreehugger Robot var
766*16467b97STreehugger Robot Root: ITree;
767*16467b97STreehugger Robot Stream: ITreeNodeStream;
768*16467b97STreehugger Robot begin
769*16467b97STreehugger Robot Root := TCommonTree.Create(IToken(nil));
770*16467b97STreehugger Robot Root.AddChild(TCommonTree.Create(TCommonToken.Create(101)));
771*16467b97STreehugger Robot Root.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
772*16467b97STreehugger Robot Root.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
773*16467b97STreehugger Robot
774*16467b97STreehugger Robot Stream := CreateCommonTreeNodeStream(Root);
775*16467b97STreehugger Robot CheckEquals(GetStringOfEntireStreamContentsWithNodeTypesOnly(Stream),' 101 102 103');
776*16467b97STreehugger Robot CheckEquals(Stream.ToString, ' 101 102 103');
777*16467b97STreehugger Robot end;
778*16467b97STreehugger Robot
779*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.TestList;
780*16467b97STreehugger Robot var
781*16467b97STreehugger Robot Root, T, U: ITree;
782*16467b97STreehugger Robot Stream: ITreeNodeStream;
783*16467b97STreehugger Robot begin
784*16467b97STreehugger Robot Root := TCommonTree.Create(IToken(nil));
785*16467b97STreehugger Robot
786*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(101));
787*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
788*16467b97STreehugger Robot T.GetChild(0).AddChild(TCommonTree.Create(TCommonToken.Create(103)));
789*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
790*16467b97STreehugger Robot
791*16467b97STreehugger Robot U := TCommonTree.Create(TCommonToken.Create(105));
792*16467b97STreehugger Robot
793*16467b97STreehugger Robot Root.AddChild(T);
794*16467b97STreehugger Robot Root.AddChild(U);
795*16467b97STreehugger Robot
796*16467b97STreehugger Robot Stream := CreateCommonTreeNodeStream(Root);
797*16467b97STreehugger Robot CheckEquals(GetStringOfEntireStreamContentsWithNodeTypesOnly(Stream),' 101 102 103 104 105');
798*16467b97STreehugger Robot CheckEquals(Stream.ToString, ' 101 2 102 2 103 3 104 3 105');
799*16467b97STreehugger Robot end;
800*16467b97STreehugger Robot
801*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.TestListWithOneNode;
802*16467b97STreehugger Robot var
803*16467b97STreehugger Robot Root: ITree;
804*16467b97STreehugger Robot Stream: ITreeNodeStream;
805*16467b97STreehugger Robot begin
806*16467b97STreehugger Robot Root := TCommonTree.Create(IToken(nil));
807*16467b97STreehugger Robot Root.AddChild(TCommonTree.Create(TCommonToken.Create(101)));
808*16467b97STreehugger Robot
809*16467b97STreehugger Robot Stream := CreateCommonTreeNodeStream(Root);
810*16467b97STreehugger Robot CheckEquals(GetStringOfEntireStreamContentsWithNodeTypesOnly(Stream),' 101');
811*16467b97STreehugger Robot CheckEquals(Stream.ToString, ' 101');
812*16467b97STreehugger Robot end;
813*16467b97STreehugger Robot
814*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.TestLT;
815*16467b97STreehugger Robot var
816*16467b97STreehugger Robot T: ITree;
817*16467b97STreehugger Robot Stream: ITreeNodeStream;
818*16467b97STreehugger Robot begin
819*16467b97STreehugger Robot // ^(101 ^(102 103) 104)
820*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(101));
821*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
822*16467b97STreehugger Robot T.GetChild(0).AddChild(TCommonTree.Create(TCommonToken.Create(103)));
823*16467b97STreehugger Robot T.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
824*16467b97STreehugger Robot
825*16467b97STreehugger Robot Stream := CreateCommonTreeNodeStream(T);
826*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,101);
827*16467b97STreehugger Robot CheckEquals((Stream.LT(2) as ITree).TokenType,TToken.DOWN);
828*16467b97STreehugger Robot CheckEquals((Stream.LT(3) as ITree).TokenType,102);
829*16467b97STreehugger Robot CheckEquals((Stream.LT(4) as ITree).TokenType,TToken.DOWN);
830*16467b97STreehugger Robot CheckEquals((Stream.LT(5) as ITree).TokenType,103);
831*16467b97STreehugger Robot CheckEquals((Stream.LT(6) as ITree).TokenType,TToken.UP);
832*16467b97STreehugger Robot CheckEquals((Stream.LT(7) as ITree).TokenType,104);
833*16467b97STreehugger Robot CheckEquals((Stream.LT(8) as ITree).TokenType,TToken.UP);
834*16467b97STreehugger Robot CheckEquals((Stream.LT(9) as ITree).TokenType,TToken.EOF);
835*16467b97STreehugger Robot // check way ahead
836*16467b97STreehugger Robot CheckEquals((Stream.LT(100) as ITree).TokenType,TToken.EOF);
837*16467b97STreehugger Robot end;
838*16467b97STreehugger Robot
839*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.TestMarkRewindEntire;
840*16467b97STreehugger Robot var
841*16467b97STreehugger Robot R0, R1, R2: ITree;
842*16467b97STreehugger Robot Stream: ICommonTreeNodeStream;
843*16467b97STreehugger Robot M, K: Integer;
844*16467b97STreehugger Robot begin
845*16467b97STreehugger Robot // ^(101 ^(102 103 ^(106 107) ) 104 105)
846*16467b97STreehugger Robot // stream has 7 real + 6 nav nodes
847*16467b97STreehugger Robot // Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
848*16467b97STreehugger Robot R0 := TCommonTree.Create(TCommonToken.Create(101));
849*16467b97STreehugger Robot R1 := TCommonTree.Create(TCommonToken.Create(102));
850*16467b97STreehugger Robot R0.AddChild(R1);
851*16467b97STreehugger Robot R1.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
852*16467b97STreehugger Robot R2 := TCommonTree.Create(TCommonToken.Create(106));
853*16467b97STreehugger Robot R2.AddChild(TCommonTree.Create(TCommonToken.Create(107)));
854*16467b97STreehugger Robot R1.AddChild(R2);
855*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
856*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(105)));
857*16467b97STreehugger Robot
858*16467b97STreehugger Robot Stream := TCommonTreeNodeStream.Create(R0);
859*16467b97STreehugger Robot M := Stream.Mark;
860*16467b97STreehugger Robot for K := 1 to 13 do
861*16467b97STreehugger Robot begin
862*16467b97STreehugger Robot // consume til end
863*16467b97STreehugger Robot Stream.LT(1);
864*16467b97STreehugger Robot Stream.Consume;
865*16467b97STreehugger Robot end;
866*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.EOF);
867*16467b97STreehugger Robot CheckEquals((Stream.LT(-1) as ITree).TokenType,TToken.UP);
868*16467b97STreehugger Robot Stream.Rewind(M);
869*16467b97STreehugger Robot
870*16467b97STreehugger Robot for K := 1 to 13 do
871*16467b97STreehugger Robot begin
872*16467b97STreehugger Robot // consume til end
873*16467b97STreehugger Robot Stream.LT(1);
874*16467b97STreehugger Robot Stream.Consume;
875*16467b97STreehugger Robot end;
876*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.EOF);
877*16467b97STreehugger Robot CheckEquals((Stream.LT(-1) as ITree).TokenType,TToken.UP);
878*16467b97STreehugger Robot end;
879*16467b97STreehugger Robot
880*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.TestMarkRewindInMiddle;
881*16467b97STreehugger Robot var
882*16467b97STreehugger Robot R0, R1, R2: ITree;
883*16467b97STreehugger Robot Stream: ICommonTreeNodeStream;
884*16467b97STreehugger Robot M, K: Integer;
885*16467b97STreehugger Robot begin
886*16467b97STreehugger Robot // ^(101 ^(102 103 ^(106 107) ) 104 105)
887*16467b97STreehugger Robot // stream has 7 real + 6 nav nodes
888*16467b97STreehugger Robot // Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
889*16467b97STreehugger Robot R0 := TCommonTree.Create(TCommonToken.Create(101));
890*16467b97STreehugger Robot R1 := TCommonTree.Create(TCommonToken.Create(102));
891*16467b97STreehugger Robot R0.AddChild(R1);
892*16467b97STreehugger Robot R1.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
893*16467b97STreehugger Robot R2 := TCommonTree.Create(TCommonToken.Create(106));
894*16467b97STreehugger Robot R2.AddChild(TCommonTree.Create(TCommonToken.Create(107)));
895*16467b97STreehugger Robot R1.AddChild(R2);
896*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
897*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(105)));
898*16467b97STreehugger Robot
899*16467b97STreehugger Robot Stream := TCommonTreeNodeStream.Create(R0);
900*16467b97STreehugger Robot for K := 1 to 7 do
901*16467b97STreehugger Robot begin
902*16467b97STreehugger Robot // consume til middle
903*16467b97STreehugger Robot Stream.Consume;
904*16467b97STreehugger Robot end;
905*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,107);
906*16467b97STreehugger Robot M := Stream.Mark;
907*16467b97STreehugger Robot Stream.Consume; // consume 107
908*16467b97STreehugger Robot Stream.Consume; // consume UP
909*16467b97STreehugger Robot Stream.Consume; // consume UP
910*16467b97STreehugger Robot Stream.Consume; // consume 104
911*16467b97STreehugger Robot Stream.Rewind(M);
912*16467b97STreehugger Robot
913*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,107);
914*16467b97STreehugger Robot Stream.Consume;
915*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.UP);
916*16467b97STreehugger Robot Stream.Consume;
917*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.UP);
918*16467b97STreehugger Robot Stream.Consume;
919*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,104);
920*16467b97STreehugger Robot Stream.Consume;
921*16467b97STreehugger Robot // now we're past rewind position
922*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,105);
923*16467b97STreehugger Robot Stream.Consume;
924*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.UP);
925*16467b97STreehugger Robot Stream.Consume;
926*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.EOF);
927*16467b97STreehugger Robot CheckEquals((Stream.LT(-1) as ITree).TokenType,TToken.UP);
928*16467b97STreehugger Robot end;
929*16467b97STreehugger Robot
930*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.TestMarkRewindNested;
931*16467b97STreehugger Robot var
932*16467b97STreehugger Robot R0, R1, R2: ITree;
933*16467b97STreehugger Robot Stream: ICommonTreeNodeStream;
934*16467b97STreehugger Robot M, M2: Integer;
935*16467b97STreehugger Robot begin
936*16467b97STreehugger Robot // ^(101 ^(102 103 ^(106 107) ) 104 105)
937*16467b97STreehugger Robot // stream has 7 real + 6 nav nodes
938*16467b97STreehugger Robot // Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
939*16467b97STreehugger Robot R0 := TCommonTree.Create(TCommonToken.Create(101));
940*16467b97STreehugger Robot R1 := TCommonTree.Create(TCommonToken.Create(102));
941*16467b97STreehugger Robot R0.AddChild(R1);
942*16467b97STreehugger Robot R1.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
943*16467b97STreehugger Robot R2 := TCommonTree.Create(TCommonToken.Create(106));
944*16467b97STreehugger Robot R2.AddChild(TCommonTree.Create(TCommonToken.Create(107)));
945*16467b97STreehugger Robot R1.AddChild(R2);
946*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
947*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(105)));
948*16467b97STreehugger Robot
949*16467b97STreehugger Robot Stream := TCommonTreeNodeStream.Create(R0);
950*16467b97STreehugger Robot M := Stream.Mark; // MARK at start
951*16467b97STreehugger Robot Stream.Consume; // consume 101
952*16467b97STreehugger Robot Stream.Consume; // consume DN
953*16467b97STreehugger Robot M2:= Stream.Mark; // MARK on 102
954*16467b97STreehugger Robot Stream.Consume; // consume 102
955*16467b97STreehugger Robot Stream.Consume; // consume DN
956*16467b97STreehugger Robot Stream.Consume; // consume 103
957*16467b97STreehugger Robot Stream.Consume; // consume 106
958*16467b97STreehugger Robot Stream.Rewind(M2);
959*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,102);
960*16467b97STreehugger Robot Stream.Consume;
961*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.DOWN);
962*16467b97STreehugger Robot Stream.Consume;
963*16467b97STreehugger Robot // stop at 103 and rewind to start
964*16467b97STreehugger Robot Stream.Rewind(M); // REWIND to 101
965*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,101);
966*16467b97STreehugger Robot Stream.Consume;
967*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.DOWN);
968*16467b97STreehugger Robot Stream.Consume;
969*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,102);
970*16467b97STreehugger Robot Stream.Consume;
971*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.DOWN);
972*16467b97STreehugger Robot end;
973*16467b97STreehugger Robot
974*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.TestNestedPushPop;
975*16467b97STreehugger Robot const
976*16467b97STreehugger Robot IndexOf102 = 2;
977*16467b97STreehugger Robot IndexOf104 = 6;
978*16467b97STreehugger Robot IndexOf107 = 12;
979*16467b97STreehugger Robot var
980*16467b97STreehugger Robot R0, R1, R2, R3: ITree;
981*16467b97STreehugger Robot Stream: ICommonTreeNodeStream;
982*16467b97STreehugger Robot K: Integer;
983*16467b97STreehugger Robot begin
984*16467b97STreehugger Robot // ^(101 ^(102 103) ^(104 105) ^(106 107) 108 109)
985*16467b97STreehugger Robot // stream has 9 real + 8 nav nodes
986*16467b97STreehugger Robot // Sequence of types: 101 DN 102 DN 103 UP 104 DN 105 UP 106 DN 107 UP 108 109 UP
987*16467b97STreehugger Robot R0 := TCommonTree.Create(TCommonToken.Create(101));
988*16467b97STreehugger Robot R1 := TCommonTree.Create(TCommonToken.Create(102));
989*16467b97STreehugger Robot R1.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
990*16467b97STreehugger Robot R0.AddChild(R1);
991*16467b97STreehugger Robot R2 := TCommonTree.Create(TCommonToken.Create(104));
992*16467b97STreehugger Robot R2.AddChild(TCommonTree.Create(TCommonToken.Create(105)));
993*16467b97STreehugger Robot R0.AddChild(R2);
994*16467b97STreehugger Robot R3 := TCommonTree.Create(TCommonToken.Create(106));
995*16467b97STreehugger Robot R3.AddChild(TCommonTree.Create(TCommonToken.Create(107)));
996*16467b97STreehugger Robot R0.AddChild(R3);
997*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(108)));
998*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(109)));
999*16467b97STreehugger Robot
1000*16467b97STreehugger Robot Stream := TCommonTreeNodeStream.Create(R0);
1001*16467b97STreehugger Robot CheckEquals(Stream.ToString, ' 101 2 102 2 103 3 104 2 105 3 106 2 107 3 108 109 3');
1002*16467b97STreehugger Robot
1003*16467b97STreehugger Robot // Assume we want to hit node 107 and then "call 102", which
1004*16467b97STreehugger Robot // calls 104, then return
1005*16467b97STreehugger Robot for K := 1 to IndexOf107 do
1006*16467b97STreehugger Robot // consume til 107 node
1007*16467b97STreehugger Robot Stream.Consume;
1008*16467b97STreehugger Robot
1009*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,107);
1010*16467b97STreehugger Robot // CALL 102
1011*16467b97STreehugger Robot Stream.Push(IndexOf102);
1012*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,102);
1013*16467b97STreehugger Robot Stream.Consume; // consume 102
1014*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.DOWN);
1015*16467b97STreehugger Robot Stream.Consume; // consume DN
1016*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,103);
1017*16467b97STreehugger Robot Stream.Consume; // consume 103
1018*16467b97STreehugger Robot
1019*16467b97STreehugger Robot // CALL 104
1020*16467b97STreehugger Robot Stream.Push(IndexOf104);
1021*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,104);
1022*16467b97STreehugger Robot Stream.Consume; // consume 104
1023*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.DOWN);
1024*16467b97STreehugger Robot Stream.Consume; // consume DN
1025*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,105);
1026*16467b97STreehugger Robot Stream.Consume; // consume 1045
1027*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.UP);
1028*16467b97STreehugger Robot
1029*16467b97STreehugger Robot // RETURN (to UP node in 102 subtree)
1030*16467b97STreehugger Robot Stream.Pop;
1031*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.UP);
1032*16467b97STreehugger Robot
1033*16467b97STreehugger Robot // RETURN (to empty stack)
1034*16467b97STreehugger Robot Stream.Pop;
1035*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,107);
1036*16467b97STreehugger Robot end;
1037*16467b97STreehugger Robot
1038*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.TestPushPop;
1039*16467b97STreehugger Robot const
1040*16467b97STreehugger Robot IndexOf102 = 2;
1041*16467b97STreehugger Robot IndexOf107 = 12;
1042*16467b97STreehugger Robot var
1043*16467b97STreehugger Robot R0, R1, R2, R3: ITree;
1044*16467b97STreehugger Robot Stream: ICommonTreeNodeStream;
1045*16467b97STreehugger Robot K: Integer;
1046*16467b97STreehugger Robot begin
1047*16467b97STreehugger Robot // ^(101 ^(102 103) ^(104 105) ^(106 107) 108 109)
1048*16467b97STreehugger Robot // stream has 9 real + 8 nav nodes
1049*16467b97STreehugger Robot // Sequence of types: 101 DN 102 DN 103 UP 104 DN 105 UP 106 DN 107 UP 108 109 UP
1050*16467b97STreehugger Robot R0 := TCommonTree.Create(TCommonToken.Create(101));
1051*16467b97STreehugger Robot R1 := TCommonTree.Create(TCommonToken.Create(102));
1052*16467b97STreehugger Robot R1.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
1053*16467b97STreehugger Robot R0.AddChild(R1);
1054*16467b97STreehugger Robot R2 := TCommonTree.Create(TCommonToken.Create(104));
1055*16467b97STreehugger Robot R2.AddChild(TCommonTree.Create(TCommonToken.Create(105)));
1056*16467b97STreehugger Robot R0.AddChild(R2);
1057*16467b97STreehugger Robot R3 := TCommonTree.Create(TCommonToken.Create(106));
1058*16467b97STreehugger Robot R3.AddChild(TCommonTree.Create(TCommonToken.Create(107)));
1059*16467b97STreehugger Robot R0.AddChild(R3);
1060*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(108)));
1061*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(109)));
1062*16467b97STreehugger Robot
1063*16467b97STreehugger Robot Stream := TCommonTreeNodeStream.Create(R0);
1064*16467b97STreehugger Robot CheckEquals(Stream.ToString, ' 101 2 102 2 103 3 104 2 105 3 106 2 107 3 108 109 3');
1065*16467b97STreehugger Robot
1066*16467b97STreehugger Robot // Assume we want to hit node 107 and then "call 102" then return
1067*16467b97STreehugger Robot for K := 1 to IndexOf107 do
1068*16467b97STreehugger Robot // consume til 107 node
1069*16467b97STreehugger Robot Stream.Consume;
1070*16467b97STreehugger Robot
1071*16467b97STreehugger Robot // CALL 102
1072*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,107);
1073*16467b97STreehugger Robot Stream.Push(IndexOf102);
1074*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,102);
1075*16467b97STreehugger Robot Stream.Consume; // consume 102
1076*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.DOWN);
1077*16467b97STreehugger Robot Stream.Consume; // consume DN
1078*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,103);
1079*16467b97STreehugger Robot Stream.Consume; // consume 103
1080*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.UP);
1081*16467b97STreehugger Robot // RETURN
1082*16467b97STreehugger Robot Stream.Pop;
1083*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,107);
1084*16467b97STreehugger Robot end;
1085*16467b97STreehugger Robot
1086*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.TestPushPopFromEOF;
1087*16467b97STreehugger Robot const
1088*16467b97STreehugger Robot IndexOf102 = 2;
1089*16467b97STreehugger Robot IndexOf104 = 6;
1090*16467b97STreehugger Robot var
1091*16467b97STreehugger Robot R0, R1, R2, R3: ITree;
1092*16467b97STreehugger Robot Stream: ICommonTreeNodeStream;
1093*16467b97STreehugger Robot begin
1094*16467b97STreehugger Robot // ^(101 ^(102 103) ^(104 105) ^(106 107) 108 109)
1095*16467b97STreehugger Robot // stream has 9 real + 8 nav nodes
1096*16467b97STreehugger Robot // Sequence of types: 101 DN 102 DN 103 UP 104 DN 105 UP 106 DN 107 UP 108 109 UP
1097*16467b97STreehugger Robot R0 := TCommonTree.Create(TCommonToken.Create(101));
1098*16467b97STreehugger Robot R1 := TCommonTree.Create(TCommonToken.Create(102));
1099*16467b97STreehugger Robot R1.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
1100*16467b97STreehugger Robot R0.AddChild(R1);
1101*16467b97STreehugger Robot R2 := TCommonTree.Create(TCommonToken.Create(104));
1102*16467b97STreehugger Robot R2.AddChild(TCommonTree.Create(TCommonToken.Create(105)));
1103*16467b97STreehugger Robot R0.AddChild(R2);
1104*16467b97STreehugger Robot R3 := TCommonTree.Create(TCommonToken.Create(106));
1105*16467b97STreehugger Robot R3.AddChild(TCommonTree.Create(TCommonToken.Create(107)));
1106*16467b97STreehugger Robot R0.AddChild(R3);
1107*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(108)));
1108*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(109)));
1109*16467b97STreehugger Robot
1110*16467b97STreehugger Robot Stream := TCommonTreeNodeStream.Create(R0);
1111*16467b97STreehugger Robot CheckEquals(Stream.ToString, ' 101 2 102 2 103 3 104 2 105 3 106 2 107 3 108 109 3');
1112*16467b97STreehugger Robot
1113*16467b97STreehugger Robot while (Stream.LA(1) <> TToken.EOF) do
1114*16467b97STreehugger Robot Stream.Consume;
1115*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.EOF);
1116*16467b97STreehugger Robot
1117*16467b97STreehugger Robot // CALL 102
1118*16467b97STreehugger Robot Stream.Push(IndexOf102);
1119*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,102);
1120*16467b97STreehugger Robot Stream.Consume; // consume 102
1121*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.DOWN);
1122*16467b97STreehugger Robot Stream.Consume; // consume DN
1123*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,103);
1124*16467b97STreehugger Robot Stream.Consume; // consume 103
1125*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.UP);
1126*16467b97STreehugger Robot // RETURN (to empty stack)
1127*16467b97STreehugger Robot Stream.Pop;
1128*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.EOF);
1129*16467b97STreehugger Robot
1130*16467b97STreehugger Robot // CALL 104
1131*16467b97STreehugger Robot Stream.Push(IndexOf104);
1132*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,104);
1133*16467b97STreehugger Robot Stream.Consume; // consume 104
1134*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.DOWN);
1135*16467b97STreehugger Robot Stream.Consume; // consume DN
1136*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,105);
1137*16467b97STreehugger Robot Stream.Consume; // consume 105
1138*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.UP);
1139*16467b97STreehugger Robot // RETURN (to empty stack)
1140*16467b97STreehugger Robot Stream.Pop;
1141*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.EOF);
1142*16467b97STreehugger Robot end;
1143*16467b97STreehugger Robot
1144*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.TestSeek;
1145*16467b97STreehugger Robot var
1146*16467b97STreehugger Robot R0, R1, R2: ITree;
1147*16467b97STreehugger Robot Stream: ICommonTreeNodeStream;
1148*16467b97STreehugger Robot begin
1149*16467b97STreehugger Robot // ^(101 ^(102 103 ^(106 107) ) 104 105)
1150*16467b97STreehugger Robot // stream has 7 real + 6 nav nodes
1151*16467b97STreehugger Robot // Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
1152*16467b97STreehugger Robot R0 := TCommonTree.Create(TCommonToken.Create(101));
1153*16467b97STreehugger Robot R1 := TCommonTree.Create(TCommonToken.Create(102));
1154*16467b97STreehugger Robot R0.AddChild(R1);
1155*16467b97STreehugger Robot R1.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
1156*16467b97STreehugger Robot R2 := TCommonTree.Create(TCommonToken.Create(106));
1157*16467b97STreehugger Robot R2.AddChild(TCommonTree.Create(TCommonToken.Create(107)));
1158*16467b97STreehugger Robot R1.AddChild(R2);
1159*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
1160*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(105)));
1161*16467b97STreehugger Robot
1162*16467b97STreehugger Robot Stream := TCommonTreeNodeStream.Create(R0);
1163*16467b97STreehugger Robot Stream.Consume; // consume 101
1164*16467b97STreehugger Robot Stream.Consume; // consume DN
1165*16467b97STreehugger Robot Stream.Consume; // consume 102
1166*16467b97STreehugger Robot Stream.Seek(7); // seek to 107
1167*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,107);
1168*16467b97STreehugger Robot Stream.Consume; // consume 107
1169*16467b97STreehugger Robot Stream.Consume; // consume UP
1170*16467b97STreehugger Robot Stream.Consume; // consume UP
1171*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,104);
1172*16467b97STreehugger Robot end;
1173*16467b97STreehugger Robot
1174*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.TestSeekFromStart;
1175*16467b97STreehugger Robot var
1176*16467b97STreehugger Robot R0, R1, R2: ITree;
1177*16467b97STreehugger Robot Stream: ICommonTreeNodeStream;
1178*16467b97STreehugger Robot begin
1179*16467b97STreehugger Robot // ^(101 ^(102 103 ^(106 107) ) 104 105)
1180*16467b97STreehugger Robot // stream has 7 real + 6 nav nodes
1181*16467b97STreehugger Robot // Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
1182*16467b97STreehugger Robot R0 := TCommonTree.Create(TCommonToken.Create(101));
1183*16467b97STreehugger Robot R1 := TCommonTree.Create(TCommonToken.Create(102));
1184*16467b97STreehugger Robot R0.AddChild(R1);
1185*16467b97STreehugger Robot R1.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
1186*16467b97STreehugger Robot R2 := TCommonTree.Create(TCommonToken.Create(106));
1187*16467b97STreehugger Robot R2.AddChild(TCommonTree.Create(TCommonToken.Create(107)));
1188*16467b97STreehugger Robot R1.AddChild(R2);
1189*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
1190*16467b97STreehugger Robot R0.AddChild(TCommonTree.Create(TCommonToken.Create(105)));
1191*16467b97STreehugger Robot
1192*16467b97STreehugger Robot Stream := TCommonTreeNodeStream.Create(R0);
1193*16467b97STreehugger Robot Stream.Seek(7); // seek to 107
1194*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,107);
1195*16467b97STreehugger Robot Stream.Consume; // consume 107
1196*16467b97STreehugger Robot Stream.Consume; // consume UP
1197*16467b97STreehugger Robot Stream.Consume; // consume UP
1198*16467b97STreehugger Robot CheckEquals((Stream.LT(1) as ITree).TokenType,104);
1199*16467b97STreehugger Robot end;
1200*16467b97STreehugger Robot
1201*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.TestSingleNode;
1202*16467b97STreehugger Robot var
1203*16467b97STreehugger Robot T: ITree;
1204*16467b97STreehugger Robot Stream: ITreeNodeStream;
1205*16467b97STreehugger Robot begin
1206*16467b97STreehugger Robot T := TCommonTree.Create(TCommonToken.Create(101));
1207*16467b97STreehugger Robot Stream := CreateCommonTreeNodeStream(T);
1208*16467b97STreehugger Robot CheckEquals(GetStringOfEntireStreamContentsWithNodeTypesOnly(Stream),' 101');
1209*16467b97STreehugger Robot CheckEquals(Stream.ToString, ' 101');
1210*16467b97STreehugger Robot end;
1211*16467b97STreehugger Robot
1212*16467b97STreehugger Robot procedure TestICommonTreeNodeStream.TestStackStretch;
1213*16467b97STreehugger Robot var
1214*16467b97STreehugger Robot R0: ICommonTree;
1215*16467b97STreehugger Robot Stream: ICommonTreeNodeStream;
1216*16467b97STreehugger Robot I: Integer;
1217*16467b97STreehugger Robot begin
1218*16467b97STreehugger Robot // make more than INITIAL_CALL_STACK_SIZE pushes
1219*16467b97STreehugger Robot R0 := TCommonTree.Create(TCommonToken.Create(101));
1220*16467b97STreehugger Robot Stream := TCommonTreeNodeStream.Create(R0);
1221*16467b97STreehugger Robot
1222*16467b97STreehugger Robot // go 1 over initial size
1223*16467b97STreehugger Robot for I := 1 to TCommonTreeNodeStream.INITIAL_CALL_STACK_SIZE + 1 do
1224*16467b97STreehugger Robot Stream.Push(I);
1225*16467b97STreehugger Robot
1226*16467b97STreehugger Robot CheckEquals(Stream.Pop, 10);
1227*16467b97STreehugger Robot CheckEquals(Stream.Pop, 9);
1228*16467b97STreehugger Robot end;
1229*16467b97STreehugger Robot
CreateTokennull1230*16467b97STreehugger Robot function TestIRewriteRuleXxxxStream.CreateToken(const TokenType: Integer;
1231*16467b97STreehugger Robot const Text: String): IToken;
1232*16467b97STreehugger Robot begin
1233*16467b97STreehugger Robot Result := TCommonToken.Create(TokenType, Text);
1234*16467b97STreehugger Robot end;
1235*16467b97STreehugger Robot
CreateTokenListnull1236*16467b97STreehugger Robot function TestIRewriteRuleXxxxStream.CreateTokenList(
1237*16467b97STreehugger Robot const Count: Integer): IList<IToken>;
1238*16467b97STreehugger Robot var
1239*16467b97STreehugger Robot I: Integer;
1240*16467b97STreehugger Robot begin
1241*16467b97STreehugger Robot Result := TList<IToken>.Create;
1242*16467b97STreehugger Robot for I := 0 to Count - 1 do
1243*16467b97STreehugger Robot Result.Add(TCommonToken.Create(I + 1,'test token ' + IntToStr(I + 1)
1244*16467b97STreehugger Robot + ' without any real context'));
1245*16467b97STreehugger Robot end;
1246*16467b97STreehugger Robot
CreateTreenull1247*16467b97STreehugger Robot function TestIRewriteRuleXxxxStream.CreateTree(const Token: IToken): ITree;
1248*16467b97STreehugger Robot begin
1249*16467b97STreehugger Robot Result := TCommonTree.Create(Token);
1250*16467b97STreehugger Robot end;
1251*16467b97STreehugger Robot
TestIRewriteRuleXxxxStream.CreateTreeAdaptor()1252*16467b97STreehugger Robot function TestIRewriteRuleXxxxStream.CreateTreeAdaptor: ITreeAdaptor;
1253*16467b97STreehugger Robot begin
1254*16467b97STreehugger Robot Result := TCommonTreeAdaptor.Create;
1255*16467b97STreehugger Robot end;
1256*16467b97STreehugger Robot
1257*16467b97STreehugger Robot procedure TestIRewriteRuleXxxxStream.SetUp;
1258*16467b97STreehugger Robot begin
1259*16467b97STreehugger Robot end;
1260*16467b97STreehugger Robot
1261*16467b97STreehugger Robot procedure TestIRewriteRuleXxxxStream.TearDown;
1262*16467b97STreehugger Robot begin
1263*16467b97STreehugger Robot end;
1264*16467b97STreehugger Robot
1265*16467b97STreehugger Robot procedure TestIRewriteRuleXxxxStream.TestRewriteRuleNodeStreamConstructors;
1266*16467b97STreehugger Robot var
1267*16467b97STreehugger Robot NodeTest1, NodeTest2, NodeTest3: IRewriteRuleNodeStream;
1268*16467b97STreehugger Robot begin
1269*16467b97STreehugger Robot NodeTest1 := TRewriteRuleNodeStream.Create(CreateTreeAdaptor,
1270*16467b97STreehugger Robot 'RewriteRuleNodeStream test1');
1271*16467b97STreehugger Robot
1272*16467b97STreehugger Robot NodeTest2 := TRewriteRuleNodeStream.Create(CreateTreeAdaptor,
1273*16467b97STreehugger Robot 'RewriteRuleNodeStream test2',
1274*16467b97STreehugger Robot CreateToken(1,'test token without any real context'));
1275*16467b97STreehugger Robot
1276*16467b97STreehugger Robot NodeTest3 := TRewriteRuleNodeStream.Create(CreateTreeAdaptor,
1277*16467b97STreehugger Robot 'RewriteRuleNodeStream test3', CreateTokenList(4));
1278*16467b97STreehugger Robot end;
1279*16467b97STreehugger Robot
1280*16467b97STreehugger Robot procedure TestIRewriteRuleXxxxStream.TestRewriteRuleSubtreeStreamConstructors;
1281*16467b97STreehugger Robot var
1282*16467b97STreehugger Robot SubtreeTest1, SubtreeTest2, SubtreeTest3: IRewriteRuleSubtreeStream;
1283*16467b97STreehugger Robot begin
1284*16467b97STreehugger Robot SubtreeTest1 := TRewriteRuleSubtreeStream.Create(CreateTreeAdaptor,
1285*16467b97STreehugger Robot 'RewriteRuleSubtreeStream test1');
1286*16467b97STreehugger Robot
1287*16467b97STreehugger Robot SubtreeTest2 := TRewriteRuleSubtreeStream.Create(CreateTreeAdaptor,
1288*16467b97STreehugger Robot 'RewriteRuleSubtreeStream test2',
1289*16467b97STreehugger Robot CreateToken(1,'test token without any real context'));
1290*16467b97STreehugger Robot
1291*16467b97STreehugger Robot SubtreeTest3 := TRewriteRuleSubtreeStream.Create(CreateTreeAdaptor,
1292*16467b97STreehugger Robot 'RewriteRuleSubtreeStream test3', CreateTokenList(4));
1293*16467b97STreehugger Robot end;
1294*16467b97STreehugger Robot
1295*16467b97STreehugger Robot procedure TestIRewriteRuleXxxxStream.TestRewriteRuleTokenStreamConstructors;
1296*16467b97STreehugger Robot var
1297*16467b97STreehugger Robot TokenTest1, TokenTest2, TokenTest3: IRewriteRuleTokenStream;
1298*16467b97STreehugger Robot begin
1299*16467b97STreehugger Robot TokenTest1 := TRewriteRuleTokenStream.Create(CreateTreeAdaptor,
1300*16467b97STreehugger Robot 'RewriteRuleTokenStream test1');
1301*16467b97STreehugger Robot
1302*16467b97STreehugger Robot TokenTest2 := TRewriteRuleTokenStream.Create(CreateTreeAdaptor,
1303*16467b97STreehugger Robot 'RewriteRuleTokenStream test2',
1304*16467b97STreehugger Robot CreateToken(1, 'test token without any real context'));
1305*16467b97STreehugger Robot
1306*16467b97STreehugger Robot TokenTest3 := TRewriteRuleTokenStream.Create(CreateTreeAdaptor,
1307*16467b97STreehugger Robot 'RewriteRuleTokenStream test3', CreateTokenList(4));
1308*16467b97STreehugger Robot end;
1309*16467b97STreehugger Robot
1310*16467b97STreehugger Robot procedure TestIRewriteRuleXxxxStream.TestRRNodeStreamBehaviourWhileEmpty1;
1311*16467b97STreehugger Robot const
1312*16467b97STreehugger Robot Description = 'RewriteRuleNodeStream test';
1313*16467b97STreehugger Robot var
1314*16467b97STreehugger Robot NodeTest: IRewriteRuleNodeStream;
1315*16467b97STreehugger Robot begin
1316*16467b97STreehugger Robot ExpectedException := ERewriteEmptyStreamException;
1317*16467b97STreehugger Robot NodeTest := TRewriteRuleNodeStream.Create(CreateTreeAdaptor, Description);
1318*16467b97STreehugger Robot
1319*16467b97STreehugger Robot CheckFalse(NodeTest.HasNext);
1320*16467b97STreehugger Robot CheckEquals(Description, NodeTest.Description);
1321*16467b97STreehugger Robot CheckEquals(NodeTest.Size, 0);
1322*16467b97STreehugger Robot NodeTest.Reset;
1323*16467b97STreehugger Robot CheckEquals(NodeTest.Size, 0);
1324*16467b97STreehugger Robot NodeTest.NextNode;
1325*16467b97STreehugger Robot end;
1326*16467b97STreehugger Robot
1327*16467b97STreehugger Robot procedure TestIRewriteRuleXxxxStream.TestRRNodeStreamBehaviourWhileEmpty2;
1328*16467b97STreehugger Robot const
1329*16467b97STreehugger Robot Description = 'RewriteRuleNodeStream test';
1330*16467b97STreehugger Robot var
1331*16467b97STreehugger Robot NodeTest: IRewriteRuleNodeStream;
1332*16467b97STreehugger Robot begin
1333*16467b97STreehugger Robot ExpectedException := ERewriteEmptyStreamException;
1334*16467b97STreehugger Robot NodeTest := TRewriteRuleNodeStream.Create(CreateTreeAdaptor, Description);
1335*16467b97STreehugger Robot NodeTest.NextTree;
1336*16467b97STreehugger Robot end;
1337*16467b97STreehugger Robot
1338*16467b97STreehugger Robot procedure TestIRewriteRuleXxxxStream.TestRRNodeStreamBehaviourWithElements;
1339*16467b97STreehugger Robot var
1340*16467b97STreehugger Robot NodeTest: IRewriteRuleNodeStream;
1341*16467b97STreehugger Robot Token1, Token2: IToken;
1342*16467b97STreehugger Robot Tree1, Tree2: ITree;
1343*16467b97STreehugger Robot ReturnedTree: ICommonTree;
1344*16467b97STreehugger Robot begin
1345*16467b97STreehugger Robot ExpectedException := ERewriteCardinalityException;
1346*16467b97STreehugger Robot NodeTest := TRewriteRuleNodeStream.Create(CreateTreeAdaptor, 'RewriteRuleNodeStream test');
1347*16467b97STreehugger Robot Token1 := CreateToken(1, 'test token without any real context');
1348*16467b97STreehugger Robot Tree1 := CreateTree(Token1);
1349*16467b97STreehugger Robot
1350*16467b97STreehugger Robot // Test Add()
1351*16467b97STreehugger Robot NodeTest.Add(Tree1);
1352*16467b97STreehugger Robot CheckEquals(NodeTest.Size, 1);
1353*16467b97STreehugger Robot CheckTrue(NodeTest.HasNext);
1354*16467b97STreehugger Robot
1355*16467b97STreehugger Robot // Test NextNode()
1356*16467b97STreehugger Robot ReturnedTree := NodeTest.NextNode as ICommoNTree;
1357*16467b97STreehugger Robot CheckEquals(ReturnedTree.TokenType, Tree1.TokenType);
1358*16467b97STreehugger Robot CheckEquals(NodeTest.Size, 1);
1359*16467b97STreehugger Robot CheckFalse(NodeTest.HasNext);
1360*16467b97STreehugger Robot NodeTest.Reset;
1361*16467b97STreehugger Robot CheckEquals(NodeTest.Size, 1);
1362*16467b97STreehugger Robot CheckTrue(NodeTest.HasNext);
1363*16467b97STreehugger Robot
1364*16467b97STreehugger Robot // Test NextTree()
1365*16467b97STreehugger Robot ReturnedTree := NodeTest.NextTree as ICommonTree;
1366*16467b97STreehugger Robot Check(SameObj(Token1, ReturnedTree.Token));
1367*16467b97STreehugger Robot CheckEquals(NodeTest.Size, 1);
1368*16467b97STreehugger Robot CheckFalse(NodeTest.HasNext);
1369*16467b97STreehugger Robot NodeTest.Reset;
1370*16467b97STreehugger Robot CheckEquals(NodeTest.Size, 1);
1371*16467b97STreehugger Robot CheckTrue(NodeTest.HasNext);
1372*16467b97STreehugger Robot
1373*16467b97STreehugger Robot // Test, what happens with two elements
1374*16467b97STreehugger Robot Token2 := CreateToken(2, 'test token without any real context');
1375*16467b97STreehugger Robot Tree2 := CreateTree(Token2);
1376*16467b97STreehugger Robot NodeTest.Add(Tree2);
1377*16467b97STreehugger Robot CheckEquals(NodeTest.Size, 2);
1378*16467b97STreehugger Robot CheckTrue(NodeTest.HasNext);
1379*16467b97STreehugger Robot ReturnedTree := NodeTest.NextTree as ICommonTree;
1380*16467b97STreehugger Robot Check(SameObj(Token1, ReturnedTree.Token));
1381*16467b97STreehugger Robot CheckEquals(NodeTest.Size, 2);
1382*16467b97STreehugger Robot CheckTrue(NodeTest.HasNext);
1383*16467b97STreehugger Robot ReturnedTree := NodeTest.NextTree as ICommonTree;
1384*16467b97STreehugger Robot Check(SameObj(Token2, ReturnedTree.Token));
1385*16467b97STreehugger Robot CheckFalse(NodeTest.HasNext);
1386*16467b97STreehugger Robot
1387*16467b97STreehugger Robot // Test exception
1388*16467b97STreehugger Robot NodeTest.NextTree;
1389*16467b97STreehugger Robot end;
1390*16467b97STreehugger Robot
1391*16467b97STreehugger Robot procedure TestIRewriteRuleXxxxStream.TestRRSubtreeStreamBehaviourWhileEmpty1;
1392*16467b97STreehugger Robot const
1393*16467b97STreehugger Robot Description = 'RewriteRuleSubtreeStream test';
1394*16467b97STreehugger Robot var
1395*16467b97STreehugger Robot SubtreeTest: IRewriteRuleSubtreeStream;
1396*16467b97STreehugger Robot begin
1397*16467b97STreehugger Robot ExpectedException := ERewriteEmptyStreamException;
1398*16467b97STreehugger Robot SubtreeTest := TRewriteRuleSubtreeStream.Create(CreateTreeAdaptor, Description);
1399*16467b97STreehugger Robot
1400*16467b97STreehugger Robot CheckFalse(SubtreeTest.HasNext);
1401*16467b97STreehugger Robot CheckEquals(Description, SubtreeTest.Description);
1402*16467b97STreehugger Robot CheckEquals(SubtreeTest.Size, 0);
1403*16467b97STreehugger Robot SubtreeTest.Reset;
1404*16467b97STreehugger Robot CheckEquals(SubtreeTest.Size, 0);
1405*16467b97STreehugger Robot SubtreeTest.NextNode;
1406*16467b97STreehugger Robot end;
1407*16467b97STreehugger Robot
1408*16467b97STreehugger Robot procedure TestIRewriteRuleXxxxStream.TestRRSubtreeStreamBehaviourWhileEmpty2;
1409*16467b97STreehugger Robot const
1410*16467b97STreehugger Robot Description = 'RewriteRuleSubtreeStream test';
1411*16467b97STreehugger Robot var
1412*16467b97STreehugger Robot SubtreeTest: IRewriteRuleSubtreeStream;
1413*16467b97STreehugger Robot begin
1414*16467b97STreehugger Robot ExpectedException := ERewriteEmptyStreamException;
1415*16467b97STreehugger Robot SubtreeTest := TRewriteRuleSubtreeStream.Create(CreateTreeAdaptor, Description);
1416*16467b97STreehugger Robot SubtreeTest.NextTree;
1417*16467b97STreehugger Robot end;
1418*16467b97STreehugger Robot
1419*16467b97STreehugger Robot procedure TestIRewriteRuleXxxxStream.TestRRSubtreeStreamBehaviourWithElements;
1420*16467b97STreehugger Robot var
1421*16467b97STreehugger Robot SubtreeTest: IRewriteRuleSubtreeStream;
1422*16467b97STreehugger Robot Token1, Token2: IToken;
1423*16467b97STreehugger Robot Tree1, Tree2: ITree;
1424*16467b97STreehugger Robot ReturnedTree: ICommonTree;
1425*16467b97STreehugger Robot begin
1426*16467b97STreehugger Robot ExpectedException := ERewriteCardinalityException;
1427*16467b97STreehugger Robot SubtreeTest := TRewriteRuleSubtreeStream.Create(CreateTreeAdaptor, 'RewriteRuleSubtreeStream test');
1428*16467b97STreehugger Robot Token1 := CreateToken(1, 'test token without any real context');
1429*16467b97STreehugger Robot Tree1 := CreateTree(Token1);
1430*16467b97STreehugger Robot
1431*16467b97STreehugger Robot // Test Add()
1432*16467b97STreehugger Robot SubtreeTest.Add(Tree1);
1433*16467b97STreehugger Robot CheckEquals(SubtreeTest.Size, 1);
1434*16467b97STreehugger Robot CheckTrue(SubtreeTest.HasNext);
1435*16467b97STreehugger Robot
1436*16467b97STreehugger Robot // Test NextNode()
1437*16467b97STreehugger Robot Check(SameObj(SubtreeTest.NextNode, Tree1));
1438*16467b97STreehugger Robot CheckEquals(SubtreeTest.Size, 1);
1439*16467b97STreehugger Robot CheckFalse(SubtreeTest.HasNext);
1440*16467b97STreehugger Robot SubtreeTest.Reset;
1441*16467b97STreehugger Robot CheckEquals(SubtreeTest.Size, 1);
1442*16467b97STreehugger Robot CheckTrue(SubtreeTest.HasNext);
1443*16467b97STreehugger Robot
1444*16467b97STreehugger Robot // Test NextTree()
1445*16467b97STreehugger Robot ReturnedTree := SubtreeTest.NextTree as ICommonTree;
1446*16467b97STreehugger Robot Check(SameObj(Token1, ReturnedTree.Token));
1447*16467b97STreehugger Robot CheckEquals(SubtreeTest.Size, 1);
1448*16467b97STreehugger Robot CheckFalse(SubtreeTest.HasNext);
1449*16467b97STreehugger Robot SubtreeTest.Reset;
1450*16467b97STreehugger Robot CheckEquals(SubtreeTest.Size, 1);
1451*16467b97STreehugger Robot CheckTrue(SubtreeTest.HasNext);
1452*16467b97STreehugger Robot
1453*16467b97STreehugger Robot // Test, what happens with two elements
1454*16467b97STreehugger Robot Token2 := CreateToken(2, 'test token without any real context');
1455*16467b97STreehugger Robot Tree2 := CreateTree(Token2);
1456*16467b97STreehugger Robot SubtreeTest.Add(Tree2);
1457*16467b97STreehugger Robot CheckEquals(SubtreeTest.Size, 2);
1458*16467b97STreehugger Robot CheckTrue(SubtreeTest.HasNext);
1459*16467b97STreehugger Robot ReturnedTree := SubtreeTest.NextTree as ICommonTree;
1460*16467b97STreehugger Robot Check(SameObj(Token1, ReturnedTree.Token));
1461*16467b97STreehugger Robot CheckEquals(SubtreeTest.Size, 2);
1462*16467b97STreehugger Robot CheckTrue(SubtreeTest.HasNext);
1463*16467b97STreehugger Robot ReturnedTree := SubtreeTest.NextTree as ICommonTree;
1464*16467b97STreehugger Robot Check(SameObj(Token2, ReturnedTree.Token));
1465*16467b97STreehugger Robot CheckFalse(SubtreeTest.HasNext);
1466*16467b97STreehugger Robot
1467*16467b97STreehugger Robot // Test exception
1468*16467b97STreehugger Robot SubtreeTest.NextTree;
1469*16467b97STreehugger Robot end;
1470*16467b97STreehugger Robot
1471*16467b97STreehugger Robot procedure TestIRewriteRuleXxxxStream.TestRRTokenStreamBehaviourWhileEmpty1;
1472*16467b97STreehugger Robot const
1473*16467b97STreehugger Robot Description = 'RewriteRuleTokenStream test';
1474*16467b97STreehugger Robot var
1475*16467b97STreehugger Robot TokenTest: IRewriteRuleTokenStream;
1476*16467b97STreehugger Robot begin
1477*16467b97STreehugger Robot ExpectedException := ERewriteEmptyStreamException;
1478*16467b97STreehugger Robot TokenTest := TRewriteRuleTokenStream.Create(CreateTreeAdaptor, Description);
1479*16467b97STreehugger Robot
1480*16467b97STreehugger Robot CheckFalse(TokenTest.HasNext);
1481*16467b97STreehugger Robot CheckEquals(Description, TokenTest.Description);
1482*16467b97STreehugger Robot CheckEquals(TokenTest.Size, 0);
1483*16467b97STreehugger Robot TokenTest.Reset;
1484*16467b97STreehugger Robot CheckEquals(TokenTest.Size, 0);
1485*16467b97STreehugger Robot TokenTest.NextNode;
1486*16467b97STreehugger Robot end;
1487*16467b97STreehugger Robot
1488*16467b97STreehugger Robot procedure TestIRewriteRuleXxxxStream.TestRRTokenStreamBehaviourWhileEmpty2;
1489*16467b97STreehugger Robot const
1490*16467b97STreehugger Robot Description = 'RewriteRuleTokenStream test';
1491*16467b97STreehugger Robot var
1492*16467b97STreehugger Robot TokenTest: IRewriteRuleTokenStream;
1493*16467b97STreehugger Robot begin
1494*16467b97STreehugger Robot ExpectedException := ERewriteEmptyStreamException;
1495*16467b97STreehugger Robot TokenTest := TRewriteRuleTokenStream.Create(CreateTreeAdaptor, Description);
1496*16467b97STreehugger Robot TokenTest.NextTree;
1497*16467b97STreehugger Robot end;
1498*16467b97STreehugger Robot
1499*16467b97STreehugger Robot procedure TestIRewriteRuleXxxxStream.TestRRTokenStreamBehaviourWhileEmpty3;
1500*16467b97STreehugger Robot const
1501*16467b97STreehugger Robot Description = 'RewriteRuleTokenStream test';
1502*16467b97STreehugger Robot var
1503*16467b97STreehugger Robot TokenTest: IRewriteRuleTokenStream;
1504*16467b97STreehugger Robot begin
1505*16467b97STreehugger Robot ExpectedException := ERewriteEmptyStreamException;
1506*16467b97STreehugger Robot TokenTest := TRewriteRuleTokenStream.Create(CreateTreeAdaptor, Description);
1507*16467b97STreehugger Robot TokenTest.NextToken;
1508*16467b97STreehugger Robot end;
1509*16467b97STreehugger Robot
1510*16467b97STreehugger Robot procedure TestIRewriteRuleXxxxStream.TestRRTokenStreamBehaviourWithElements;
1511*16467b97STreehugger Robot var
1512*16467b97STreehugger Robot TokenTest: IRewriteRuleTokenStream;
1513*16467b97STreehugger Robot Token1, Token2, ReturnedToken: IToken;
1514*16467b97STreehugger Robot Tree: ICommonTree;
1515*16467b97STreehugger Robot begin
1516*16467b97STreehugger Robot ExpectedException := ERewriteCardinalityException;
1517*16467b97STreehugger Robot TokenTest := TRewriteRuleTokenStream.Create(CreateTreeAdaptor, 'RewriteRuleTokenStream test');
1518*16467b97STreehugger Robot Token1 := CreateToken(1, 'test token without any real context');
1519*16467b97STreehugger Robot
1520*16467b97STreehugger Robot // Test Add()
1521*16467b97STreehugger Robot TokenTest.Add(Token1);
1522*16467b97STreehugger Robot CheckEquals(TokenTest.Size, 1);
1523*16467b97STreehugger Robot CheckTrue(TokenTest.HasNext);
1524*16467b97STreehugger Robot
1525*16467b97STreehugger Robot // Test NextNode()
1526*16467b97STreehugger Robot Tree := TokenTest.NextNode as ICommonTree;
1527*16467b97STreehugger Robot Check(SameObj(Tree.Token, Token1));
1528*16467b97STreehugger Robot CheckEquals(TokenTest.Size, 1);
1529*16467b97STreehugger Robot CheckFalse(TokenTest.HasNext);
1530*16467b97STreehugger Robot TokenTest.Reset;
1531*16467b97STreehugger Robot CheckEquals(TokenTest.Size, 1);
1532*16467b97STreehugger Robot CheckTrue(TokenTest.HasNext);
1533*16467b97STreehugger Robot
1534*16467b97STreehugger Robot // Test NextToken()
1535*16467b97STreehugger Robot ReturnedToken := TokenTest.NextToken;
1536*16467b97STreehugger Robot Check(SameObj(Token1, ReturnedToken));
1537*16467b97STreehugger Robot CheckEquals(TokenTest.Size, 1);
1538*16467b97STreehugger Robot CheckFalse(TokenTest.HasNext);
1539*16467b97STreehugger Robot TokenTest.Reset;
1540*16467b97STreehugger Robot CheckEquals(TokenTest.Size, 1);
1541*16467b97STreehugger Robot CheckTrue(TokenTest.HasNext);
1542*16467b97STreehugger Robot
1543*16467b97STreehugger Robot // Test NextTree()
1544*16467b97STreehugger Robot ReturnedToken := TokenTest.NextTree as IToken;
1545*16467b97STreehugger Robot Check(SameObj(Token1, ReturnedToken));
1546*16467b97STreehugger Robot CheckEquals(TokenTest.Size, 1);
1547*16467b97STreehugger Robot CheckFalse(TokenTest.HasNext);
1548*16467b97STreehugger Robot TokenTest.Reset;
1549*16467b97STreehugger Robot CheckEquals(TokenTest.Size, 1);
1550*16467b97STreehugger Robot CheckTrue(TokenTest.HasNext);
1551*16467b97STreehugger Robot
1552*16467b97STreehugger Robot // Test, what happens with two elements
1553*16467b97STreehugger Robot Token2 := CreateToken(2, 'test token without any real context');
1554*16467b97STreehugger Robot TokenTest.Add(Token2);
1555*16467b97STreehugger Robot CheckEquals(TokenTest.Size, 2);
1556*16467b97STreehugger Robot CheckTrue(TokenTest.HasNext);
1557*16467b97STreehugger Robot ReturnedToken := TokenTest.NextToken;
1558*16467b97STreehugger Robot Check(SameObj(Token1, ReturnedToken));
1559*16467b97STreehugger Robot CheckEquals(TokenTest.Size, 2);
1560*16467b97STreehugger Robot CheckTrue(TokenTest.HasNext);
1561*16467b97STreehugger Robot ReturnedToken := TokenTest.NextToken;
1562*16467b97STreehugger Robot Check(SameObj(Token2, ReturnedToken));
1563*16467b97STreehugger Robot CheckFalse(TokenTest.HasNext);
1564*16467b97STreehugger Robot
1565*16467b97STreehugger Robot // Test exception
1566*16467b97STreehugger Robot TokenTest.NextToken;
1567*16467b97STreehugger Robot end;
1568*16467b97STreehugger Robot
1569*16467b97STreehugger Robot constructor TestITreeWizard.Create(MethodName: String);
1570*16467b97STreehugger Robot const
1571*16467b97STreehugger Robot TOKENS: array [0..11] of String = ('', '', '', '', '', 'A', 'B', 'C', 'D', 'E', 'ID', 'VAR');
1572*16467b97STreehugger Robot var
1573*16467b97STreehugger Robot I: Integer;
1574*16467b97STreehugger Robot begin
1575*16467b97STreehugger Robot inherited;
1576*16467b97STreehugger Robot SetLength(FTokens,Length(TOKENS));
1577*16467b97STreehugger Robot for I := 0 to Length(TOKENS) - 1 do
1578*16467b97STreehugger Robot FTokens[I] := TOKENS[I];
1579*16467b97STreehugger Robot end;
1580*16467b97STreehugger Robot
1581*16467b97STreehugger Robot procedure TestITreeWizard.SetUp;
1582*16467b97STreehugger Robot begin
1583*16467b97STreehugger Robot end;
1584*16467b97STreehugger Robot
1585*16467b97STreehugger Robot procedure TestITreeWizard.TearDown;
1586*16467b97STreehugger Robot begin
1587*16467b97STreehugger Robot end;
1588*16467b97STreehugger Robot
1589*16467b97STreehugger Robot procedure TestITreeWizard.TestDoubleLevelTree;
1590*16467b97STreehugger Robot var
1591*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1592*16467b97STreehugger Robot Wiz: ITreeWizard;
1593*16467b97STreehugger Robot T: ICommonTree;
1594*16467b97STreehugger Robot begin
1595*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1596*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1597*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A (B C) (B D) E)') as ICommonTree;
1598*16467b97STreehugger Robot CheckEquals(T.ToStringTree, '(A (B C) (B D) E)');
1599*16467b97STreehugger Robot end;
1600*16467b97STreehugger Robot
1601*16467b97STreehugger Robot procedure TestITreeWizard.TestEquals;
1602*16467b97STreehugger Robot var
1603*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1604*16467b97STreehugger Robot Wiz: ITreeWizard;
1605*16467b97STreehugger Robot T1, T2: ICommonTree;
1606*16467b97STreehugger Robot begin
1607*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1608*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1609*16467b97STreehugger Robot T1 := Wiz.CreateTreeOrNode('(A B C)') as ICommonTree;
1610*16467b97STreehugger Robot T2 := Wiz.CreateTreeOrNode('(A B C)') as ICommonTree;
1611*16467b97STreehugger Robot CheckTrue(Wiz.Equals(T1, T2, Adaptor));
1612*16467b97STreehugger Robot end;
1613*16467b97STreehugger Robot
1614*16467b97STreehugger Robot procedure TestITreeWizard.TestEqualsWithMismatchedText;
1615*16467b97STreehugger Robot var
1616*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1617*16467b97STreehugger Robot Wiz: ITreeWizard;
1618*16467b97STreehugger Robot T1, T2: ICommonTree;
1619*16467b97STreehugger Robot begin
1620*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1621*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1622*16467b97STreehugger Robot T1 := Wiz.CreateTreeOrNode('(A B[foo] C)') as ICommonTree;
1623*16467b97STreehugger Robot T2 := Wiz.CreateTreeOrNode('(A B C)') as ICommonTree;
1624*16467b97STreehugger Robot CheckFalse(Wiz.Equals(T1, T2, Adaptor));
1625*16467b97STreehugger Robot end;
1626*16467b97STreehugger Robot
1627*16467b97STreehugger Robot procedure TestITreeWizard.TestEqualsWithText;
1628*16467b97STreehugger Robot var
1629*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1630*16467b97STreehugger Robot Wiz: ITreeWizard;
1631*16467b97STreehugger Robot T1, T2: ICommonTree;
1632*16467b97STreehugger Robot begin
1633*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1634*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1635*16467b97STreehugger Robot T1 := Wiz.CreateTreeOrNode('(A B[foo] C)') as ICommonTree;
1636*16467b97STreehugger Robot T2 := Wiz.CreateTreeOrNode('(A B[foo] C)') as ICommonTree;
1637*16467b97STreehugger Robot CheckTrue(Wiz.Equals(T1, T2, Adaptor));
1638*16467b97STreehugger Robot end;
1639*16467b97STreehugger Robot
1640*16467b97STreehugger Robot procedure TestITreeWizard.TestFindPattern;
1641*16467b97STreehugger Robot var
1642*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1643*16467b97STreehugger Robot Wiz: ITreeWizard;
1644*16467b97STreehugger Robot T: ICommonTree;
1645*16467b97STreehugger Robot Subtrees, Elements: IList<IANTLRInterface>;
1646*16467b97STreehugger Robot begin
1647*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1648*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1649*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B C (A[foo] B[bar]) (D (A[big] B[dog])))') as ICommonTree;
1650*16467b97STreehugger Robot Subtrees := Wiz.Find(T, '(A B)');
1651*16467b97STreehugger Robot Elements := Subtrees;
1652*16467b97STreehugger Robot CheckEquals('[foo, big]', TCollectionUtils.ListToString(Elements));
1653*16467b97STreehugger Robot end;
1654*16467b97STreehugger Robot
1655*16467b97STreehugger Robot procedure TestITreeWizard.TestInvalidListTree;
1656*16467b97STreehugger Robot var
1657*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1658*16467b97STreehugger Robot Wiz: ITreeWizard;
1659*16467b97STreehugger Robot T: ICommonTree;
1660*16467b97STreehugger Robot begin
1661*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1662*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1663*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('A B C') as ICommonTree;
1664*16467b97STreehugger Robot CheckNull(T);
1665*16467b97STreehugger Robot end;
1666*16467b97STreehugger Robot
1667*16467b97STreehugger Robot procedure TestITreeWizard.TestListTree;
1668*16467b97STreehugger Robot var
1669*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1670*16467b97STreehugger Robot Wiz: ITreeWizard;
1671*16467b97STreehugger Robot T: ICommonTree;
1672*16467b97STreehugger Robot begin
1673*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1674*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1675*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(nil A B C)') as ICommonTree;
1676*16467b97STreehugger Robot CheckEquals(T.ToStringTree, 'A B C');
1677*16467b97STreehugger Robot end;
1678*16467b97STreehugger Robot
1679*16467b97STreehugger Robot procedure TestITreeWizard.TestNoRepeatsIndex;
1680*16467b97STreehugger Robot var
1681*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1682*16467b97STreehugger Robot Wiz: ITreeWizard;
1683*16467b97STreehugger Robot T: ICommonTree;
1684*16467b97STreehugger Robot M: IDictionary<Integer, IList<IANTLRInterface>>;
1685*16467b97STreehugger Robot begin
1686*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1687*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1688*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B C D)') as ICommonTree;
1689*16467b97STreehugger Robot M := Wiz.Index(T);
1690*16467b97STreehugger Robot CheckEquals('{5=[A], 8=[D], 7=[C], 6=[B]}' ,TCollectionUtils.DictionaryToString(M));
1691*16467b97STreehugger Robot end;
1692*16467b97STreehugger Robot
1693*16467b97STreehugger Robot procedure TestITreeWizard.TestNoRepeatsVisit;
1694*16467b97STreehugger Robot var
1695*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1696*16467b97STreehugger Robot Wiz: ITreeWizard;
1697*16467b97STreehugger Robot T: ICommonTree;
1698*16467b97STreehugger Robot Elements: IList<IANTLRInterface>;
1699*16467b97STreehugger Robot Visitor: IContextVisitor;
1700*16467b97STreehugger Robot begin
1701*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1702*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1703*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B C D)') as ICommonTree;
1704*16467b97STreehugger Robot Elements := TList<IANTLRInterface>.Create;
1705*16467b97STreehugger Robot Visitor := TRecordAllElementsVisitor.Create(Elements);
1706*16467b97STreehugger Robot Wiz.Visit(T, Wiz.GetTokenType('B'), Visitor);
1707*16467b97STreehugger Robot CheckEquals('[B]' ,TCollectionUtils.ListToString(Elements));
1708*16467b97STreehugger Robot end;
1709*16467b97STreehugger Robot
1710*16467b97STreehugger Robot procedure TestITreeWizard.TestNoRepeatsVisit2;
1711*16467b97STreehugger Robot var
1712*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1713*16467b97STreehugger Robot Wiz: ITreeWizard;
1714*16467b97STreehugger Robot T: ICommonTree;
1715*16467b97STreehugger Robot Elements: IList<IANTLRInterface>;
1716*16467b97STreehugger Robot Visitor: IContextVisitor;
1717*16467b97STreehugger Robot begin
1718*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1719*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1720*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B (A C B) B D D)') as ICommonTree;
1721*16467b97STreehugger Robot Elements := TList<IANTLRInterface>.Create;
1722*16467b97STreehugger Robot Visitor := TRecordAllElementsVisitor.Create(Elements);
1723*16467b97STreehugger Robot Wiz.Visit(T, Wiz.GetTokenType('C'), Visitor);
1724*16467b97STreehugger Robot CheckEquals('[C]' ,TCollectionUtils.ListToString(Elements));
1725*16467b97STreehugger Robot end;
1726*16467b97STreehugger Robot
1727*16467b97STreehugger Robot procedure TestITreeWizard.TestParse;
1728*16467b97STreehugger Robot var
1729*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1730*16467b97STreehugger Robot Wiz: ITreeWizard;
1731*16467b97STreehugger Robot T: ICommonTree;
1732*16467b97STreehugger Robot begin
1733*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1734*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1735*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B C)') as ICommonTree;
1736*16467b97STreehugger Robot CheckTrue(Wiz.Parse(T, '(A B C)'));
1737*16467b97STreehugger Robot end;
1738*16467b97STreehugger Robot
1739*16467b97STreehugger Robot procedure TestITreeWizard.TestParseFlatTree;
1740*16467b97STreehugger Robot var
1741*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1742*16467b97STreehugger Robot Wiz: ITreeWizard;
1743*16467b97STreehugger Robot T: ICommonTree;
1744*16467b97STreehugger Robot begin
1745*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1746*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1747*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(nil A B C)') as ICommonTree;
1748*16467b97STreehugger Robot CheckTrue(Wiz.Parse(T, '(nil A B C)'));
1749*16467b97STreehugger Robot end;
1750*16467b97STreehugger Robot
1751*16467b97STreehugger Robot procedure TestITreeWizard.TestParseLabels;
1752*16467b97STreehugger Robot var
1753*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1754*16467b97STreehugger Robot Wiz: ITreeWizard;
1755*16467b97STreehugger Robot T: ICommonTree;
1756*16467b97STreehugger Robot Labels: IDictionary<String, IANTLRInterface>;
1757*16467b97STreehugger Robot begin
1758*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1759*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1760*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B C)') as ICommonTree;
1761*16467b97STreehugger Robot Labels := TDictionary<String, IANTLRInterface>.Create;
1762*16467b97STreehugger Robot CheckTrue(Wiz.Parse(T, '(%a:A %b:B %c:C)', Labels));
1763*16467b97STreehugger Robot CheckEquals('A', Labels['a'].ToString);
1764*16467b97STreehugger Robot CheckEquals('B', Labels['b'].ToString);
1765*16467b97STreehugger Robot CheckEquals('C', Labels['c'].ToString);
1766*16467b97STreehugger Robot end;
1767*16467b97STreehugger Robot
1768*16467b97STreehugger Robot procedure TestITreeWizard.TestParseLabelsAndTestText;
1769*16467b97STreehugger Robot var
1770*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1771*16467b97STreehugger Robot Wiz: ITreeWizard;
1772*16467b97STreehugger Robot T: ICommonTree;
1773*16467b97STreehugger Robot Labels: IDictionary<String, IANTLRInterface>;
1774*16467b97STreehugger Robot begin
1775*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1776*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1777*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B[foo] C)') as ICommonTree;
1778*16467b97STreehugger Robot Labels := TDictionary<String, IANTLRInterface>.Create;
1779*16467b97STreehugger Robot CheckTrue(Wiz.Parse(T, '(%a:A %b:B[foo] %c:C)', Labels));
1780*16467b97STreehugger Robot CheckEquals('A', Labels['a'].ToString);
1781*16467b97STreehugger Robot CheckEquals('foo', Labels['b'].ToString);
1782*16467b97STreehugger Robot CheckEquals('C', Labels['c'].ToString);
1783*16467b97STreehugger Robot end;
1784*16467b97STreehugger Robot
1785*16467b97STreehugger Robot procedure TestITreeWizard.TestParseLabelsInNestedTree;
1786*16467b97STreehugger Robot var
1787*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1788*16467b97STreehugger Robot Wiz: ITreeWizard;
1789*16467b97STreehugger Robot T: ICommonTree;
1790*16467b97STreehugger Robot Labels: IDictionary<String, IANTLRInterface>;
1791*16467b97STreehugger Robot begin
1792*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1793*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1794*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A (B C) (D E))') as ICommonTree;
1795*16467b97STreehugger Robot Labels := TDictionary<String, IANTLRInterface>.Create;
1796*16467b97STreehugger Robot CheckTrue(Wiz.Parse(T, '(%a:A (%b:B %c:C) (%d:D %e:E) )', Labels));
1797*16467b97STreehugger Robot CheckEquals('A', Labels['a'].ToString);
1798*16467b97STreehugger Robot CheckEquals('B', Labels['b'].ToString);
1799*16467b97STreehugger Robot CheckEquals('C', Labels['c'].ToString);
1800*16467b97STreehugger Robot CheckEquals('D', Labels['d'].ToString);
1801*16467b97STreehugger Robot CheckEquals('E', Labels['e'].ToString);
1802*16467b97STreehugger Robot end;
1803*16467b97STreehugger Robot
1804*16467b97STreehugger Robot procedure TestITreeWizard.TestParseSingleNode;
1805*16467b97STreehugger Robot var
1806*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1807*16467b97STreehugger Robot Wiz: ITreeWizard;
1808*16467b97STreehugger Robot T: ICommonTree;
1809*16467b97STreehugger Robot begin
1810*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1811*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1812*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('A') as ICommonTree;
1813*16467b97STreehugger Robot CheckTrue(Wiz.Parse(T, 'A'));
1814*16467b97STreehugger Robot end;
1815*16467b97STreehugger Robot
1816*16467b97STreehugger Robot procedure TestITreeWizard.TestParseWithText;
1817*16467b97STreehugger Robot var
1818*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1819*16467b97STreehugger Robot Wiz: ITreeWizard;
1820*16467b97STreehugger Robot T: ICommonTree;
1821*16467b97STreehugger Robot begin
1822*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1823*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1824*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B[foo] C[bar])') as ICommonTree;
1825*16467b97STreehugger Robot // C pattern has no text arg so despite [bar] in t, no need
1826*16467b97STreehugger Robot // to match text--check structure only.
1827*16467b97STreehugger Robot CheckTrue(Wiz.Parse(T, '(A B[foo] C)'));
1828*16467b97STreehugger Robot end;
1829*16467b97STreehugger Robot
1830*16467b97STreehugger Robot procedure TestITreeWizard.TestParseWithTextFails;
1831*16467b97STreehugger Robot var
1832*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1833*16467b97STreehugger Robot Wiz: ITreeWizard;
1834*16467b97STreehugger Robot T: ICommonTree;
1835*16467b97STreehugger Robot begin
1836*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1837*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1838*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B C)') as ICommonTree;
1839*16467b97STreehugger Robot CheckFalse(Wiz.Parse(T, '(A[foo] B C)'));
1840*16467b97STreehugger Robot end;
1841*16467b97STreehugger Robot
1842*16467b97STreehugger Robot procedure TestITreeWizard.TestParseWithWildcardLabels;
1843*16467b97STreehugger Robot var
1844*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1845*16467b97STreehugger Robot Wiz: ITreeWizard;
1846*16467b97STreehugger Robot T: ICommonTree;
1847*16467b97STreehugger Robot Labels: IDictionary<String, IANTLRInterface>;
1848*16467b97STreehugger Robot begin
1849*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1850*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1851*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B C)') as ICommonTree;
1852*16467b97STreehugger Robot Labels := TDictionary<String, IANTLRInterface>.Create;
1853*16467b97STreehugger Robot CheckTrue(Wiz.Parse(T, '(A %b:. %c:.)', Labels));
1854*16467b97STreehugger Robot CheckEquals('B', Labels['b'].ToString);
1855*16467b97STreehugger Robot CheckEquals('C', Labels['c'].ToString);
1856*16467b97STreehugger Robot end;
1857*16467b97STreehugger Robot
1858*16467b97STreehugger Robot procedure TestITreeWizard.TestRepeatsIndex;
1859*16467b97STreehugger Robot var
1860*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1861*16467b97STreehugger Robot Wiz: ITreeWizard;
1862*16467b97STreehugger Robot T: ICommonTree;
1863*16467b97STreehugger Robot M: IDictionary<Integer, IList<IANTLRInterface>>;
1864*16467b97STreehugger Robot begin
1865*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1866*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1867*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B (A C B) B D D)') as ICommonTree;
1868*16467b97STreehugger Robot M := Wiz.Index(T);
1869*16467b97STreehugger Robot CheckEquals('{5=[A, A], 8=[D, D], 7=[C], 6=[B, B, B]}' ,TCollectionUtils.DictionaryToString(M));
1870*16467b97STreehugger Robot end;
1871*16467b97STreehugger Robot
1872*16467b97STreehugger Robot procedure TestITreeWizard.TestRepeatsVisit;
1873*16467b97STreehugger Robot var
1874*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1875*16467b97STreehugger Robot Wiz: ITreeWizard;
1876*16467b97STreehugger Robot T: ICommonTree;
1877*16467b97STreehugger Robot Elements: IList<IANTLRInterface>;
1878*16467b97STreehugger Robot Visitor: IContextVisitor;
1879*16467b97STreehugger Robot begin
1880*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1881*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1882*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B (A C B) B D D)') as ICommonTree;
1883*16467b97STreehugger Robot Elements := TList<IANTLRInterface>.Create;
1884*16467b97STreehugger Robot Visitor := TRecordAllElementsVisitor.Create(Elements);
1885*16467b97STreehugger Robot Wiz.Visit(T, Wiz.GetTokenType('B'), Visitor);
1886*16467b97STreehugger Robot CheckEquals('[B, B, B]' ,TCollectionUtils.ListToString(Elements));
1887*16467b97STreehugger Robot end;
1888*16467b97STreehugger Robot
1889*16467b97STreehugger Robot procedure TestITreeWizard.TestRepeatsVisit2;
1890*16467b97STreehugger Robot var
1891*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1892*16467b97STreehugger Robot Wiz: ITreeWizard;
1893*16467b97STreehugger Robot T: ICommonTree;
1894*16467b97STreehugger Robot Elements: IList<IANTLRInterface>;
1895*16467b97STreehugger Robot Visitor: IContextVisitor;
1896*16467b97STreehugger Robot begin
1897*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1898*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1899*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B (A C B) B D D)') as ICommonTree;
1900*16467b97STreehugger Robot Elements := TList<IANTLRInterface>.Create;
1901*16467b97STreehugger Robot Visitor := TRecordAllElementsVisitor.Create(Elements);
1902*16467b97STreehugger Robot Wiz.Visit(T, Wiz.GetTokenType('A'), Visitor);
1903*16467b97STreehugger Robot CheckEquals('[A, A]' ,TCollectionUtils.ListToString(Elements));
1904*16467b97STreehugger Robot end;
1905*16467b97STreehugger Robot
1906*16467b97STreehugger Robot procedure TestITreeWizard.TestRepeatsVisitWithContext;
1907*16467b97STreehugger Robot var
1908*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1909*16467b97STreehugger Robot Wiz: ITreeWizard;
1910*16467b97STreehugger Robot T: ICommonTree;
1911*16467b97STreehugger Robot Elements: IList<IANTLRInterface>;
1912*16467b97STreehugger Robot Visitor: IContextVisitor;
1913*16467b97STreehugger Robot begin
1914*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1915*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1916*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B (A C B) B D D)') as ICommonTree;
1917*16467b97STreehugger Robot Elements := TList<IANTLRInterface>.Create;
1918*16467b97STreehugger Robot Visitor := TTest1ContextVisitor.Create(Adaptor, Elements);
1919*16467b97STreehugger Robot Wiz.Visit(T, Wiz.GetTokenType('B'), Visitor);
1920*16467b97STreehugger Robot CheckEquals('[B@A[0], B@A[1], B@A[2]]', TCollectionUtils.ListToString(Elements));
1921*16467b97STreehugger Robot end;
1922*16467b97STreehugger Robot
1923*16467b97STreehugger Robot procedure TestITreeWizard.TestRepeatsVisitWithNullParentAndContext;
1924*16467b97STreehugger Robot var
1925*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1926*16467b97STreehugger Robot Wiz: ITreeWizard;
1927*16467b97STreehugger Robot T: ICommonTree;
1928*16467b97STreehugger Robot Elements: IList<IANTLRInterface>;
1929*16467b97STreehugger Robot Visitor: IContextVisitor;
1930*16467b97STreehugger Robot begin
1931*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1932*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1933*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B (A C B) B D D)') as ICommonTree;
1934*16467b97STreehugger Robot Elements := TList<IANTLRInterface>.Create;
1935*16467b97STreehugger Robot Visitor := TTest1ContextVisitor.Create(Adaptor, Elements);
1936*16467b97STreehugger Robot Wiz.Visit(T, Wiz.GetTokenType('A'), Visitor);
1937*16467b97STreehugger Robot CheckEquals('[A@nil[0], A@A[1]]', TCollectionUtils.ListToString(Elements));
1938*16467b97STreehugger Robot end;
1939*16467b97STreehugger Robot
1940*16467b97STreehugger Robot procedure TestITreeWizard.TestSingleLevelTree;
1941*16467b97STreehugger Robot var
1942*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1943*16467b97STreehugger Robot Wiz: ITreeWizard;
1944*16467b97STreehugger Robot T: ICommonTree;
1945*16467b97STreehugger Robot begin
1946*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1947*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1948*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B C D)') as ICommonTree;
1949*16467b97STreehugger Robot CheckEquals(T.ToStringTree, '(A B C D)');
1950*16467b97STreehugger Robot end;
1951*16467b97STreehugger Robot
1952*16467b97STreehugger Robot procedure TestITreeWizard.TestSingleNode;
1953*16467b97STreehugger Robot var
1954*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1955*16467b97STreehugger Robot Wiz: ITreeWizard;
1956*16467b97STreehugger Robot T: ICommonTree;
1957*16467b97STreehugger Robot begin
1958*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1959*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1960*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('ID') as ICommonTree;
1961*16467b97STreehugger Robot CheckEquals(T.ToStringTree, 'ID');
1962*16467b97STreehugger Robot end;
1963*16467b97STreehugger Robot
1964*16467b97STreehugger Robot procedure TestITreeWizard.TestSingleNodeIndex;
1965*16467b97STreehugger Robot var
1966*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1967*16467b97STreehugger Robot Wiz: ITreeWizard;
1968*16467b97STreehugger Robot T: ICommonTree;
1969*16467b97STreehugger Robot M: IDictionary<Integer, IList<IANTLRInterface>>;
1970*16467b97STreehugger Robot begin
1971*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1972*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1973*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('ID') as ICommonTree;
1974*16467b97STreehugger Robot M := Wiz.Index(T);
1975*16467b97STreehugger Robot CheckEquals('{10=[ID]}' ,TCollectionUtils.DictionaryToString(M));
1976*16467b97STreehugger Robot end;
1977*16467b97STreehugger Robot
1978*16467b97STreehugger Robot procedure TestITreeWizard.TestSingleNodeTree;
1979*16467b97STreehugger Robot var
1980*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1981*16467b97STreehugger Robot Wiz: ITreeWizard;
1982*16467b97STreehugger Robot T: ICommonTree;
1983*16467b97STreehugger Robot begin
1984*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1985*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1986*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A)') as ICommonTree;
1987*16467b97STreehugger Robot CheckEquals(T.ToStringTree, 'A');
1988*16467b97STreehugger Robot end;
1989*16467b97STreehugger Robot
1990*16467b97STreehugger Robot procedure TestITreeWizard.TestSingleNodeWithArg;
1991*16467b97STreehugger Robot var
1992*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
1993*16467b97STreehugger Robot Wiz: ITreeWizard;
1994*16467b97STreehugger Robot T: ICommonTree;
1995*16467b97STreehugger Robot begin
1996*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
1997*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
1998*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('ID[foo]') as ICommonTree;
1999*16467b97STreehugger Robot CheckEquals(T.ToStringTree, 'foo');
2000*16467b97STreehugger Robot end;
2001*16467b97STreehugger Robot
2002*16467b97STreehugger Robot procedure TestITreeWizard.TestVisitPattern;
2003*16467b97STreehugger Robot var
2004*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
2005*16467b97STreehugger Robot Wiz: ITreeWizard;
2006*16467b97STreehugger Robot T: ICommonTree;
2007*16467b97STreehugger Robot Elements: IList<IANTLRInterface>;
2008*16467b97STreehugger Robot Visitor: IContextVisitor;
2009*16467b97STreehugger Robot begin
2010*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
2011*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
2012*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B C (A B) D)') as ICommonTree;
2013*16467b97STreehugger Robot Elements := TList<IANTLRInterface>.Create;
2014*16467b97STreehugger Robot Visitor := TRecordAllElementsVisitor.Create(Elements);
2015*16467b97STreehugger Robot Wiz.Visit(T, '(A B)', Visitor);
2016*16467b97STreehugger Robot CheckEquals('[A]', TCollectionUtils.ListToString(Elements));
2017*16467b97STreehugger Robot end;
2018*16467b97STreehugger Robot
2019*16467b97STreehugger Robot procedure TestITreeWizard.TestVisitPatternMultiple;
2020*16467b97STreehugger Robot var
2021*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
2022*16467b97STreehugger Robot Wiz: ITreeWizard;
2023*16467b97STreehugger Robot T: ICommonTree;
2024*16467b97STreehugger Robot Elements: IList<IANTLRInterface>;
2025*16467b97STreehugger Robot Visitor: IContextVisitor;
2026*16467b97STreehugger Robot begin
2027*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
2028*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
2029*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B C (A B) (D (A B)))') as ICommonTree;
2030*16467b97STreehugger Robot Elements := TList<IANTLRInterface>.Create;
2031*16467b97STreehugger Robot Visitor := TTest1ContextVisitor.Create(Adaptor, Elements);
2032*16467b97STreehugger Robot Wiz.Visit(T, '(A B)', Visitor);
2033*16467b97STreehugger Robot CheckEquals('[A@A[2], A@D[0]]', TCollectionUtils.ListToString(Elements));
2034*16467b97STreehugger Robot end;
2035*16467b97STreehugger Robot
2036*16467b97STreehugger Robot procedure TestITreeWizard.TestVisitPatternMultipleWithLabels;
2037*16467b97STreehugger Robot var
2038*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
2039*16467b97STreehugger Robot Wiz: ITreeWizard;
2040*16467b97STreehugger Robot T: ICommonTree;
2041*16467b97STreehugger Robot Elements: IList<IANTLRInterface>;
2042*16467b97STreehugger Robot Visitor: IContextVisitor;
2043*16467b97STreehugger Robot begin
2044*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
2045*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
2046*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B C (A[foo] B[bar]) (D (A[big] B[dog])))') as ICommonTree;
2047*16467b97STreehugger Robot Elements := TList<IANTLRInterface>.Create;
2048*16467b97STreehugger Robot Visitor := TTest2ContextVisitor.Create(Adaptor, Elements);
2049*16467b97STreehugger Robot Wiz.Visit(T, '(%a:A %b:B)', Visitor);
2050*16467b97STreehugger Robot CheckEquals('[foo@A[2]foo&bar, big@D[0]big&dog]', TCollectionUtils.ListToString(Elements));
2051*16467b97STreehugger Robot end;
2052*16467b97STreehugger Robot
2053*16467b97STreehugger Robot procedure TestITreeWizard.TestWildcard;
2054*16467b97STreehugger Robot var
2055*16467b97STreehugger Robot Adaptor: ITreeAdaptor;
2056*16467b97STreehugger Robot Wiz: ITreeWizard;
2057*16467b97STreehugger Robot T: ICommonTree;
2058*16467b97STreehugger Robot begin
2059*16467b97STreehugger Robot Adaptor := TCommonTreeAdaptor.Create;
2060*16467b97STreehugger Robot Wiz := TTreeWizard.Create(Adaptor, FTokens);
2061*16467b97STreehugger Robot T := Wiz.CreateTreeOrNode('(A B C)') as ICommonTree;
2062*16467b97STreehugger Robot CheckTrue(Wiz.Parse(T, '(A . .)'));
2063*16467b97STreehugger Robot end;
2064*16467b97STreehugger Robot
2065*16467b97STreehugger Robot { TestITreeWizard.TRecordAllElementsVisitor }
2066*16467b97STreehugger Robot
2067*16467b97STreehugger Robot constructor TestITreeWizard.TRecordAllElementsVisitor.Create(
2068*16467b97STreehugger Robot const AList: IList<IANTLRInterface>);
2069*16467b97STreehugger Robot begin
2070*16467b97STreehugger Robot inherited Create;
2071*16467b97STreehugger Robot FList := AList;
2072*16467b97STreehugger Robot end;
2073*16467b97STreehugger Robot
2074*16467b97STreehugger Robot procedure TestITreeWizard.TRecordAllElementsVisitor.Visit(
2075*16467b97STreehugger Robot const T: IANTLRInterface);
2076*16467b97STreehugger Robot begin
2077*16467b97STreehugger Robot FList.Add(T);
2078*16467b97STreehugger Robot end;
2079*16467b97STreehugger Robot
2080*16467b97STreehugger Robot { TestITreeWizard.TTest1ContextVisitor }
2081*16467b97STreehugger Robot
2082*16467b97STreehugger Robot constructor TestITreeWizard.TTest1ContextVisitor.Create(
2083*16467b97STreehugger Robot const AAdaptor: ITreeAdaptor; const AList: IList<IANTLRInterface>);
2084*16467b97STreehugger Robot begin
2085*16467b97STreehugger Robot inherited Create;
2086*16467b97STreehugger Robot FAdaptor := AAdaptor;
2087*16467b97STreehugger Robot FList := AList;
2088*16467b97STreehugger Robot end;
2089*16467b97STreehugger Robot
2090*16467b97STreehugger Robot procedure TestITreeWizard.TTest1ContextVisitor.Visit(const T,
2091*16467b97STreehugger Robot Parent: IANTLRInterface; const ChildIndex: Integer;
2092*16467b97STreehugger Robot const Labels: IDictionary<String, IANTLRInterface>);
2093*16467b97STreehugger Robot var
2094*16467b97STreehugger Robot S: String;
2095*16467b97STreehugger Robot begin
2096*16467b97STreehugger Robot S := FAdaptor.GetNodeText(T) + '@';
2097*16467b97STreehugger Robot if Assigned(Parent) then
2098*16467b97STreehugger Robot S := S + FAdaptor.GetNodeText(Parent)
2099*16467b97STreehugger Robot else
2100*16467b97STreehugger Robot S := S + 'nil';
2101*16467b97STreehugger Robot FList.Add(TANTLRString.Create(S + '[' + IntToStr(ChildIndex) + ']'));
2102*16467b97STreehugger Robot end;
2103*16467b97STreehugger Robot
2104*16467b97STreehugger Robot { TestITreeWizard.TTest2ContextVisitor }
2105*16467b97STreehugger Robot
2106*16467b97STreehugger Robot constructor TestITreeWizard.TTest2ContextVisitor.Create(
2107*16467b97STreehugger Robot const AAdaptor: ITreeAdaptor; const AList: IList<IANTLRInterface>);
2108*16467b97STreehugger Robot begin
2109*16467b97STreehugger Robot inherited Create;
2110*16467b97STreehugger Robot FAdaptor := AAdaptor;
2111*16467b97STreehugger Robot FList := AList;
2112*16467b97STreehugger Robot end;
2113*16467b97STreehugger Robot
2114*16467b97STreehugger Robot procedure TestITreeWizard.TTest2ContextVisitor.Visit(const T,
2115*16467b97STreehugger Robot Parent: IANTLRInterface; const ChildIndex: Integer;
2116*16467b97STreehugger Robot const Labels: IDictionary<String, IANTLRInterface>);
2117*16467b97STreehugger Robot var
2118*16467b97STreehugger Robot S: String;
2119*16467b97STreehugger Robot begin
2120*16467b97STreehugger Robot S := FAdaptor.GetNodeText(T) + '@';
2121*16467b97STreehugger Robot if Assigned(Parent) then
2122*16467b97STreehugger Robot S := S + FAdaptor.GetNodeText(Parent)
2123*16467b97STreehugger Robot else
2124*16467b97STreehugger Robot S := S + 'nil';
2125*16467b97STreehugger Robot FList.Add(TANTLRString.Create(S + '[' + IntToStr(ChildIndex) + ']'
2126*16467b97STreehugger Robot + Labels['a'].ToString + '&' + Labels['b'].ToString));
2127*16467b97STreehugger Robot end;
2128*16467b97STreehugger Robot
2129*16467b97STreehugger Robot initialization
2130*16467b97STreehugger Robot // Register any test cases with the test runner
2131*16467b97STreehugger Robot RegisterTest(TestICommonTree.Suite);
2132*16467b97STreehugger Robot RegisterTest(TestICommonTreeNodeStream.Suite);
2133*16467b97STreehugger Robot RegisterTest(TestIRewriteRuleXxxxStream.Suite);
2134*16467b97STreehugger Robot RegisterTest(TestITreeWizard.Suite);
2135*16467b97STreehugger Robot end.
2136*16467b97STreehugger Robot
2137