1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverunit Antlr.Runtime.Tree.Tests;
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Delphi DUnit Test Case
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ----------------------
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  This unit contains a skeleton test case class generated by the Test Case Wizard.
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Modify the generated code to correctly setup and call the methods from the unit
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  being tested.
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinterface
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruses
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TestFramework,
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Antlr.Runtime.Collections,
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Antlr.Runtime.Tree,
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Classes,
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SysUtils,
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Antlr.Runtime,
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Antlr.Runtime.Tools;
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test methods for class ICommonTree
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TestICommonTree = class(TTestCase)
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetUp; override;
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TearDown; override;
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  published
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestSingleNode;
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Test4Nodes;
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestList;
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestList2;
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestAddListToExistChildren;
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestDupTree;
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestBecomeRoot;
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestBecomeRoot2;
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestBecomeRoot3;
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestBecomeRoot5;
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestBecomeRoot6;
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestReplaceWithNoChildren;
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestReplaceWithOneChildren;
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestReplaceInMiddle;
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestReplaceAtLeft;
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestReplaceAtRight;
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestReplaceOneWithTwoAtLeft;
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestReplaceOneWithTwoAtRight;
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestReplaceOneWithTwoInMiddle;
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestReplaceTwoWithOneAtLeft;
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestReplaceTwoWithOneAtRight;
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestReplaceAllWithOne;
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestReplaceAllWithTwo;
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test methods for class ICommonTreeNodeStream
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TestICommonTreeNodeStream = class(TTestCase)
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  private
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function CreateCommonTreeNodeStream(const T: IANTLRInterface): ITreeNodeStream;
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetStringOfEntireStreamContentsWithNodeTypesOnly(
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Nodes: ITreeNodeStream): String;
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function CreateUnBufferedTreeNodeStream(const T: IANTLRInterface): ITreeNodeStream;
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetUp; override;
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TearDown; override;
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  published
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestSingleNode;
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Test4Nodes;
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestList;
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestFlatList;
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestListWithOneNode;
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestAoverB;
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestLT;
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestMarkRewindEntire;
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestMarkRewindInMiddle;
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestMarkRewindNested;
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestSeek;
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestSeekFromStart;
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestPushPop;
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestNestedPushPop;
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestPushPopFromEOF;
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestStackStretch;
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestBufferOverflow;
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestBufferWrap;
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test methods for class IRewriteRuleXxxxStream
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TestIRewriteRuleXxxxStream = class(TTestCase)
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function CreateTreeAdaptor: ITreeAdaptor;
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function CreateTree(const Token: IToken): ITree;
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function CreateToken(const TokenType: Integer; const Text: String): IToken;
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function CreateTokenList(const Count: Integer): IList<IToken>;
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetUp; override;
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TearDown; override;
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  published
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestRewriteRuleTokenStreamConstructors;
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestRewriteRuleSubtreeStreamConstructors;
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestRewriteRuleNodeStreamConstructors;
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestRRTokenStreamBehaviourWhileEmpty1;
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestRRSubtreeStreamBehaviourWhileEmpty1;
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestRRNodeStreamBehaviourWhileEmpty1;
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestRRTokenStreamBehaviourWhileEmpty2;
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestRRSubtreeStreamBehaviourWhileEmpty2;
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestRRNodeStreamBehaviourWhileEmpty2;
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestRRTokenStreamBehaviourWhileEmpty3;
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestRRTokenStreamBehaviourWithElements;
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestRRSubtreeStreamBehaviourWithElements;
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestRRNodeStreamBehaviourWithElements;
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test methods for class ITreeWizard
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TestITreeWizard = class(TTestCase)
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FTokens: TStringArray;
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      TRecordAllElementsVisitor = class sealed(TTreeWizard.TVisitor)
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      strict private
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FList: IList<IANTLRInterface>;
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      strict protected
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        procedure Visit(const T: IANTLRInterface); override;
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      public
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        constructor Create(const AList: IList<IANTLRInterface>);
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      TTest1ContextVisitor = class sealed(TANTLRObject, IContextVisitor)
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      strict private
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FAdaptor: ITreeAdaptor;
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FList: IList<IANTLRInterface>;
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      protected
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        { IContextVisitor }
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        procedure Visit(const T, Parent: IANTLRInterface; const ChildIndex: Integer;
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          const Labels: IDictionary<String, IANTLRInterface>);
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      public
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        constructor Create(const AAdaptor: ITreeAdaptor;
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          const AList: IList<IANTLRInterface>);
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      TTest2ContextVisitor = class sealed(TANTLRObject, IContextVisitor)
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      strict private
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FAdaptor: ITreeAdaptor;
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FList: IList<IANTLRInterface>;
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      protected
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        { IContextVisitor }
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        procedure Visit(const T, Parent: IANTLRInterface; const ChildIndex: Integer;
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          const Labels: IDictionary<String, IANTLRInterface>);
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      public
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        constructor Create(const AAdaptor: ITreeAdaptor;
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          const AList: IList<IANTLRInterface>);
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(MethodName: String); override;
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetUp; override;
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TearDown; override;
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  published
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestSingleNode;
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestSingleNodeWithArg;
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestSingleNodeTree;
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestSingleLevelTree;
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestListTree;
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestInvalidListTree;
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestDoubleLevelTree;
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestSingleNodeIndex;
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestNoRepeatsIndex;
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestRepeatsIndex;
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestNoRepeatsVisit;
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestNoRepeatsVisit2;
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestRepeatsVisit;
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestRepeatsVisit2;
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestRepeatsVisitWithContext;
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestRepeatsVisitWithNullParentAndContext;
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestVisitPattern;
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestVisitPatternMultiple;
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestVisitPatternMultipleWithLabels;
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestParse;
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestParseSingleNode;
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestParseFlatTree;
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestWildcard;
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestParseWithText;
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestParseWithTextFails;
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestParseLabels;
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestParseWithWildcardLabels;
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestParseLabelsAndTestText;
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestParseLabelsInNestedTree;
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestEquals;
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestEqualsWithText;
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestEqualsWithMismatchedText;
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TestFindPattern;
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimplementation
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.SetUp;
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TearDown;
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.Test4Nodes;
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0: ICommonTree;
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // ^(101 ^(102 103) 104)
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0 := TCommonTree.Create(TCommonToken.Create(101));
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.GetChild(0).AddChild(TCommonTree.Create(TCommonToken.Create(103)));
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckNull(R0.Parent);
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(R0.ChildIndex,-1);
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestAddListToExistChildren;
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root, R0, C0, C1, C2: ICommonTree;
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Add child ^(nil 101 102 103) to root ^(5 6)
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // should add 101 102 103 to end of 5's child list
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root := TCommonTree.Create(TCommonToken.Create(5));
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root.AddChild(TCommonTree.Create(TCommonToken.Create(6)));
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // child tree
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0 := TCommonTree.Create(IToken(nil));
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  C0 := TCommonTree.Create(TCommonToken.Create(101));
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  C1 := TCommonTree.Create(TCommonToken.Create(102));
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  C2 := TCommonTree.Create(TCommonToken.Create(103));
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(C0);
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(C1);
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(C2);
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root.AddChild(R0);
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckNull(Root.Parent);
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(Root.ChildIndex, -1);
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // check children of root all point at root
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(C0.Parent = Root);
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(C0.ChildIndex = 1);
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(C1.Parent = Root);
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(C1.ChildIndex = 2);
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(C2.Parent = Root);
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(C2.ChildIndex = 3);
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestBecomeRoot;
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldRoot, NewRoot: ICommonTree;
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // 5 becomes new root of ^(nil 101 102 103)
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewRoot := TCommonTree.Create(TCommonToken.Create(5));
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldRoot := TCommonTree.Create(IToken(nil));
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(101)));
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor.BecomeRoot(NewRoot, OldRoot);
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewRoot.SanityCheckParentAndChildIndexes;
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestBecomeRoot2;
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldRoot, NewRoot: ICommonTree;
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // 5 becomes new root of ^(101 102 103)
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewRoot := TCommonTree.Create(TCommonToken.Create(5));
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldRoot := TCommonTree.Create(TCommonToken.Create(101));
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor.BecomeRoot(NewRoot, OldRoot);
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewRoot.SanityCheckParentAndChildIndexes;
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestBecomeRoot3;
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldRoot, NewRoot: ICommonTree;
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // ^(nil 5) becomes new root of ^(nil 101 102 103)
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewRoot := TCommonTree.Create(IToken(nil));
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewRoot.AddChild(TCommonTree.Create(TCommonToken.Create(5)));
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldRoot := TCommonTree.Create(IToken(nil));
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(101)));
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor.BecomeRoot(NewRoot, OldRoot);
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewRoot.SanityCheckParentAndChildIndexes;
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestBecomeRoot5;
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldRoot, NewRoot: ICommonTree;
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // ^(nil 5) becomes new root of ^(101 102 103)
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewRoot := TCommonTree.Create(IToken(nil));
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewRoot.AddChild(TCommonTree.Create(TCommonToken.Create(5)));
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldRoot := TCommonTree.Create(TCommonToken.Create(101));
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldRoot.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor.BecomeRoot(NewRoot, OldRoot);
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewRoot.SanityCheckParentAndChildIndexes;
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestBecomeRoot6;
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root0, Root1: ICommonTree;
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // emulates construction of ^(5 6)
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root0 := Adaptor.GetNilNode as ICommonTree;
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root1 := Adaptor.GetNilNode as ICommonTree;
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root1 := Adaptor.BecomeRoot(TCommonTree.Create(TCommonToken.Create(5)), Root1) as ICommonTree;
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor.AddChild(Root1, TCommonTree.Create(TCommonToken.Create(6)));
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor.AddChild(Root0, Root1);
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root0.SanityCheckParentAndChildIndexes;
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestDupTree;
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0, R1, Dup: ICommonTree;
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2: ITree;
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ICommonTreeAdaptor;
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // ^(101 ^(102 103 ^(106 107) ) 104 105)
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0 := TCommonTree.Create(TCommonToken.Create(101));
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1 := TCommonTree.Create(TCommonToken.Create(102));
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(R1);
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2 := TCommonTree.Create(TCommonToken.Create(106));
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2.AddChild(TCommonTree.Create(TCommonToken.Create(107)));
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1.AddChild(R2);
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(105)));
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Dup := Adaptor.DupTree(R0) as ICommonTree;
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckNull(Dup.Parent);
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(Dup.ChildIndex, -1);
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Dup.SanityCheckParentAndChildIndexes;
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestList;
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0, C0, C1, C2: ICommonTree;
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // ^(nil 101 102 103)
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0 := TCommonTree.Create(IToken(nil));
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  C0 := TCommonTree.Create(TCommonToken.Create(101));
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  C1 := TCommonTree.Create(TCommonToken.Create(102));
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  C2 := TCommonTree.Create(TCommonToken.Create(103));
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(C0);
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(C1);
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(C2);
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckNull(R0.Parent);
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(R0.ChildIndex, -1);
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(C0.Parent = R0);
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(C0.ChildIndex, 0);
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(C1.Parent = R0);
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(C1.ChildIndex, 1);
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(C2.Parent = R0);
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(C2.ChildIndex, 2);
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestList2;
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root, R0, C0, C1, C2: ICommonTree;
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Add child ^(nil 101 102 103) to root 5
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // should pull 101 102 103 directly to become 5's child list
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root := TCommonTree.Create(TClassicToken.Create(5));
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // child tree
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0 := TCommonTree.Create(IToken(nil));
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  C0 := TCommonTree.Create(TCommonToken.Create(101));
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  C1 := TCommonTree.Create(TCommonToken.Create(102));
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  C2 := TCommonTree.Create(TCommonToken.Create(103));
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(C0);
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(C1);
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(C2);
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root.AddChild(R0);
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckNull(Root.Parent);
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(Root.ChildIndex, -1);
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // check children of root all point at root
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(C0.Parent = Root);
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(C0.ChildIndex = 0);
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(C1.Parent = Root);
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(C1.ChildIndex = 1);
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(C2.Parent = Root);
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(C2.ChildIndex = 2);
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestReplaceAllWithOne;
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T, NewChild: ICommonTree;
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b')));
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c')));
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd')));
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChild := TCommonTree.Create(TCommonToken.Create(99, 'x'));
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.ReplaceChildren(0, 2, NewChild);
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(T.ToStringTree, '(a x)');
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.SanityCheckParentAndChildIndexes;
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestReplaceAllWithTwo;
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T, NewChildren: ICommonTree;
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b')));
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c')));
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd')));
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChildren := Adaptor.GetNilNode as ICommonTree;
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChildren.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'x')));
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChildren.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'y')));
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.ReplaceChildren(0, 2, NewChildren);
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(T.ToStringTree, '(a x y)');
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.SanityCheckParentAndChildIndexes;
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestReplaceAtLeft;
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T, NewChild: ICommonTree;
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b'))); // index 0
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c')));
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd')));
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChild := TCommonTree.Create(TCommonToken.Create(99, 'x'));
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.ReplaceChildren(0, 0, NewChild);
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(T.ToStringTree, '(a x c d)');
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.SanityCheckParentAndChildIndexes;
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestReplaceAtRight;
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T, NewChild: ICommonTree;
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b')));
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c')));
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd'))); // index 2
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChild := TCommonTree.Create(TCommonToken.Create(99, 'x'));
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.ReplaceChildren(2, 2, NewChild);
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(T.ToStringTree, '(a b c x)');
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.SanityCheckParentAndChildIndexes;
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestReplaceInMiddle;
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T, NewChild: ICommonTree;
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b')));
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c'))); // index 1
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd')));
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChild := TCommonTree.Create(TCommonToken.Create(99, 'x'));
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.ReplaceChildren(1, 1, NewChild);
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(T.ToStringTree, '(a b x d)');
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.SanityCheckParentAndChildIndexes;
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestReplaceOneWithTwoAtLeft;
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T, NewChildren: ICommonTree;
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b')));
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c')));
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd')));
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChildren := Adaptor.GetNilNode as ICommonTree;
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChildren.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'x')));
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChildren.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'y')));
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.ReplaceChildren(0, 0, NewChildren);
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(T.ToStringTree, '(a x y c d)');
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.SanityCheckParentAndChildIndexes;
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestReplaceOneWithTwoAtRight;
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T, NewChildren: ICommonTree;
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b')));
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c')));
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd')));
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChildren := Adaptor.GetNilNode as ICommonTree;
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChildren.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'x')));
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChildren.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'y')));
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.ReplaceChildren(2, 2, NewChildren);
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(T.ToStringTree, '(a b c x y)');
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.SanityCheckParentAndChildIndexes;
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestReplaceOneWithTwoInMiddle;
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T, NewChildren: ICommonTree;
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b')));
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c')));
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd')));
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChildren := Adaptor.GetNilNode as ICommonTree;
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChildren.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'x')));
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChildren.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'y')));
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.ReplaceChildren(1, 1, NewChildren);
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(T.ToStringTree, '(a b x y d)');
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.SanityCheckParentAndChildIndexes;
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestReplaceTwoWithOneAtLeft;
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T, NewChild: ICommonTree;
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b')));
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c')));
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd')));
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChild := TCommonTree.Create(TCommonToken.Create(99, 'x'));
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.ReplaceChildren(0, 1, NewChild);
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(T.ToStringTree, '(a x d)');
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.SanityCheckParentAndChildIndexes;
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestReplaceTwoWithOneAtRight;
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T, NewChild: ICommonTree;
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'b')));
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'c')));
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(99, 'd')));
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChild := TCommonTree.Create(TCommonToken.Create(99, 'x'));
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.ReplaceChildren(1, 2, NewChild);
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(T.ToStringTree, '(a b x)');
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.SanityCheckParentAndChildIndexes;
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestReplaceWithNoChildren;
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T, NewChild: ICommonTree;
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Error: Boolean;
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Exit; // already checked. Avoid exception
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(TCommonToken.Create(101));
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChild := TCommonTree.Create(TCommonToken.Create(5));
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Error := False;
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  try
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    T.ReplaceChildren(0, 0, NewChild);
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  except
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Error := True;
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(Error);
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestReplaceWithOneChildren;
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T, C0, NewChild: ICommonTree;
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // assume token type 99 and use text
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(TCommonToken.Create(99, 'a'));
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  C0 := TCommonTree.Create(TCommonToken.Create(99, 'b'));
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(C0);
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewChild := TCommonTree.Create(TCommonToken.Create(99, 'c'));
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.ReplaceChildren(0, 0, NewChild);
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(T.ToStringTree,'(a c)');
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.SanityCheckParentAndChildIndexes;
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTree.TestSingleNode;
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(TCommonToken.Create(101));
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckNull(T.Parent);
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(T.ChildIndex, -1);
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TestICommonTreeNodeStream.CreateCommonTreeNodeStream(
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const T: IANTLRInterface): ITreeNodeStream;
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := TCommonTreeNodeStream.Create(T);
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TestICommonTreeNodeStream.CreateUnBufferedTreeNodeStream(
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const T: IANTLRInterface): ITreeNodeStream;
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := TUnBufferedTreeNodeStream.Create(T);
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TestICommonTreeNodeStream.GetStringOfEntireStreamContentsWithNodeTypesOnly(
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Nodes: ITreeNodeStream): String;
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Buf: TStringBuilder;
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I, TokenType: Integer;
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: IANTLRInterface;
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Buf := TStringBuilder.Create;
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  try
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for I := 0 to Nodes.Size - 1 do
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      T := Nodes.LT(I + 1);
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      TokenType := Nodes.TreeAdaptor.GetNodeType(T);
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (TokenType <> TToken.DOWN) and (TokenType <> TToken.UP) then
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Buf.Append(' ');
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Buf.Append(TokenType)
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := Buf.ToString;
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  finally
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Buf.Free;
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.SetUp;
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.TearDown;
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.Test4Nodes;
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ITree;
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream: ITreeNodeStream;
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Test a tree with four nodes - ^(101 ^(102 103) 104)
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(TCommonToken.Create(101));
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.GetChild(0).AddChild(TCommonTree.Create(TCommonToken.Create(103)));
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream := CreateCommonTreeNodeStream(T);
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(GetStringOfEntireStreamContentsWithNodeTypesOnly(Stream),' 101 102 103 104');
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(Stream.ToString, ' 101 2 102 2 103 3 104 3');
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.TestAoverB;
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ITree;
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream: ITreeNodeStream;
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(TCommonToken.Create(101));
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream := CreateCommonTreeNodeStream(T);
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(GetStringOfEntireStreamContentsWithNodeTypesOnly(Stream),' 101 102');
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(Stream.ToString, ' 101 2 102 3');
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.TestBufferOverflow;
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Buf, Buf2: TStringBuilder;
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream: ITreeNodeStream;
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ITree;
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I: Integer;
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Buf := TStringBuilder.Create;
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Buf2 := TStringBuilder.Create;
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  try
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // make ^(101 102 ... n)
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    T := TCommonTree.Create(TCommonToken.Create(101));
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Buf.Append(' 101');
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Buf2.Append(' 101');
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Buf2.Append(' ');
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Buf2.Append(TToken.DOWN);
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for I := 0 to TUnBufferedTreeNodeStream.INITIAL_LOOKAHEAD_BUFFER_SIZE + 10 do
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      T.AddChild(TCommonTree.Create(TCommonToken.Create(102 + I)));
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Buf.Append(' ');
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Buf.Append(102 + I);
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Buf2.Append(' ');
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Buf2.Append(102 + I);
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Buf2.Append(' ');
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Buf2.Append(TToken.UP);
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Stream := CreateUnBufferedTreeNodeStream(T);
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    CheckEquals(GetStringOfEntireStreamContentsWithNodeTypesOnly(Stream), Buf.ToString);
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    CheckEquals(Stream.ToString, Buf2.ToString);
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  finally
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Buf2.Free;
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Buf.Free;
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// <summary>
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Test what happens when tail hits the end of the buffer, but there
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// is more room left.
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// </summary>
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// <remarks>
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Specifically that would mean that head is not at 0 but has
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// advanced somewhere to the middle of the lookahead buffer.
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Use Consume() to advance N nodes into lookahead.  Then use LT()
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// to load at least INITIAL_LOOKAHEAD_BUFFER_SIZE-N nodes so the
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// buffer has to wrap.
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// </remarks>
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.TestBufferWrap;
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  N = 10;
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  WrapBy = 4; // wrap around by 4 nodes
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ITree;
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I, Remaining: Integer;
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream: ITreeNodeStream;
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Node: ITree;
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // make tree with types: 1 2 ... INITIAL_LOOKAHEAD_BUFFER_SIZE+N
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(IToken(nil));
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for I := 0 to TUnBufferedTreeNodeStream.INITIAL_LOOKAHEAD_BUFFER_SIZE + N - 1 do
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    T.AddChild(TCommonTree.Create(TCommonToken.Create(I + 1)));
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // move head to index N
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream := CreateUnBufferedTreeNodeStream(T);
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for I := 1 to N do
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // consume N
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Node := Stream.LT(1) as ITree;
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    CheckEquals(Node.TokenType, I);
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Stream.Consume;
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // now use LT to lookahead past end of buffer
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Remaining := TUnBufferedTreeNodeStream.INITIAL_LOOKAHEAD_BUFFER_SIZE - N;
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(WrapBy < N);
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for I := 1 to Remaining + WrapBy do
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // wrap past end of buffer
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Node := Stream.LT(I) as ITree; // look ahead to ith token
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    CheckEquals(Node.TokenType, N + I);
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.TestFlatList;
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root: ITree;
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream: ITreeNodeStream;
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root := TCommonTree.Create(IToken(nil));
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root.AddChild(TCommonTree.Create(TCommonToken.Create(101)));
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream := CreateCommonTreeNodeStream(Root);
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(GetStringOfEntireStreamContentsWithNodeTypesOnly(Stream),' 101 102 103');
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(Stream.ToString, ' 101 102 103');
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.TestList;
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root, T, U: ITree;
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream: ITreeNodeStream;
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root := TCommonTree.Create(IToken(nil));
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(TCommonToken.Create(101));
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.GetChild(0).AddChild(TCommonTree.Create(TCommonToken.Create(103)));
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  U := TCommonTree.Create(TCommonToken.Create(105));
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root.AddChild(T);
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root.AddChild(U);
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream := CreateCommonTreeNodeStream(Root);
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(GetStringOfEntireStreamContentsWithNodeTypesOnly(Stream),' 101 102 103 104 105');
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(Stream.ToString, ' 101 2 102 2 103 3 104 3 105');
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.TestListWithOneNode;
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root: ITree;
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream: ITreeNodeStream;
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root := TCommonTree.Create(IToken(nil));
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Root.AddChild(TCommonTree.Create(TCommonToken.Create(101)));
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream := CreateCommonTreeNodeStream(Root);
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(GetStringOfEntireStreamContentsWithNodeTypesOnly(Stream),' 101');
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(Stream.ToString, ' 101');
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.TestLT;
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ITree;
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream: ITreeNodeStream;
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // ^(101 ^(102 103) 104)
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(TCommonToken.Create(101));
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(102)));
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.GetChild(0).AddChild(TCommonTree.Create(TCommonToken.Create(103)));
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream := CreateCommonTreeNodeStream(T);
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,101);
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(2) as ITree).TokenType,TToken.DOWN);
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(3) as ITree).TokenType,102);
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(4) as ITree).TokenType,TToken.DOWN);
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(5) as ITree).TokenType,103);
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(6) as ITree).TokenType,TToken.UP);
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(7) as ITree).TokenType,104);
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(8) as ITree).TokenType,TToken.UP);
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(9) as ITree).TokenType,TToken.EOF);
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // check way ahead
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(100) as ITree).TokenType,TToken.EOF);
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.TestMarkRewindEntire;
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0, R1, R2: ITree;
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream: ICommonTreeNodeStream;
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  M, K: Integer;
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // ^(101 ^(102 103 ^(106 107) ) 104 105)
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // stream has 7 real + 6 nav nodes
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0 := TCommonTree.Create(TCommonToken.Create(101));
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1 := TCommonTree.Create(TCommonToken.Create(102));
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(R1);
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2 := TCommonTree.Create(TCommonToken.Create(106));
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2.AddChild(TCommonTree.Create(TCommonToken.Create(107)));
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1.AddChild(R2);
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(105)));
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream := TCommonTreeNodeStream.Create(R0);
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  M := Stream.Mark;
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for K := 1 to 13 do
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // consume til end
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Stream.LT(1);
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Stream.Consume;
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.EOF);
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(-1) as ITree).TokenType,TToken.UP);
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Rewind(M);
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for K := 1 to 13 do
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // consume til end
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Stream.LT(1);
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Stream.Consume;
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.EOF);
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(-1) as ITree).TokenType,TToken.UP);
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.TestMarkRewindInMiddle;
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0, R1, R2: ITree;
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream: ICommonTreeNodeStream;
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  M, K: Integer;
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // ^(101 ^(102 103 ^(106 107) ) 104 105)
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // stream has 7 real + 6 nav nodes
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0 := TCommonTree.Create(TCommonToken.Create(101));
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1 := TCommonTree.Create(TCommonToken.Create(102));
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(R1);
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2 := TCommonTree.Create(TCommonToken.Create(106));
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2.AddChild(TCommonTree.Create(TCommonToken.Create(107)));
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1.AddChild(R2);
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(105)));
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream := TCommonTreeNodeStream.Create(R0);
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for K := 1 to 7 do
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // consume til middle
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Stream.Consume;
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,107);
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  M := Stream.Mark;
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 107
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume UP
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume UP
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 104
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Rewind(M);
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,107);
914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume;
915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.UP);
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume;
917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.UP);
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume;
919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,104);
920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume;
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // now we're past rewind position
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,105);
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume;
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.UP);
925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume;
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.EOF);
927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(-1) as ITree).TokenType,TToken.UP);
928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.TestMarkRewindNested;
931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0, R1, R2: ITree;
933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream: ICommonTreeNodeStream;
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  M, M2: Integer;
935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // ^(101 ^(102 103 ^(106 107) ) 104 105)
937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // stream has 7 real + 6 nav nodes
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0 := TCommonTree.Create(TCommonToken.Create(101));
940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1 := TCommonTree.Create(TCommonToken.Create(102));
941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(R1);
942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2 := TCommonTree.Create(TCommonToken.Create(106));
944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2.AddChild(TCommonTree.Create(TCommonToken.Create(107)));
945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1.AddChild(R2);
946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(105)));
948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream := TCommonTreeNodeStream.Create(R0);
950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  M := Stream.Mark; // MARK at start
951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 101
952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume DN
953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  M2:= Stream.Mark; // MARK on 102
954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 102
955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume DN
956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 103
957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 106
958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Rewind(M2);
959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,102);
960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume;
961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.DOWN);
962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume;
963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // stop at 103 and rewind to start
964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Rewind(M); // REWIND to 101
965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,101);
966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume;
967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.DOWN);
968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume;
969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,102);
970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume;
971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.DOWN);
972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.TestNestedPushPop;
975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst
976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IndexOf102 = 2;
977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IndexOf104 = 6;
978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IndexOf107 = 12;
979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0, R1, R2, R3: ITree;
981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream: ICommonTreeNodeStream;
982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  K: Integer;
983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // ^(101 ^(102 103) ^(104 105) ^(106 107) 108 109)
985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // stream has 9 real + 8 nav nodes
986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Sequence of types: 101 DN 102 DN 103 UP 104 DN 105 UP 106 DN 107 UP 108 109 UP
987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0 := TCommonTree.Create(TCommonToken.Create(101));
988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1 := TCommonTree.Create(TCommonToken.Create(102));
989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(R1);
991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2 := TCommonTree.Create(TCommonToken.Create(104));
992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2.AddChild(TCommonTree.Create(TCommonToken.Create(105)));
993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(R2);
994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R3 := TCommonTree.Create(TCommonToken.Create(106));
995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R3.AddChild(TCommonTree.Create(TCommonToken.Create(107)));
996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(R3);
997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(108)));
998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(109)));
999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream := TCommonTreeNodeStream.Create(R0);
1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(Stream.ToString, ' 101 2 102 2 103 3 104 2 105 3 106 2 107 3 108 109 3');
1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Assume we want to hit node 107 and then "call 102", which
1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // calls 104, then return
1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for K := 1 to IndexOf107 do
1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // consume til 107 node
1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Stream.Consume;
1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,107);
1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // CALL 102
1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Push(IndexOf102);
1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,102);
1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 102
1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.DOWN);
1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume DN
1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,103);
1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 103
1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // CALL 104
1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Push(IndexOf104);
1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,104);
1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 104
1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.DOWN);
1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume DN
1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,105);
1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 1045
1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.UP);
1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // RETURN (to UP node in 102 subtree)
1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Pop;
1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.UP);
1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // RETURN (to empty stack)
1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Pop;
1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,107);
1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.TestPushPop;
1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst
1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IndexOf102 = 2;
1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IndexOf107 = 12;
1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0, R1, R2, R3: ITree;
1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream: ICommonTreeNodeStream;
1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  K: Integer;
1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // ^(101 ^(102 103) ^(104 105) ^(106 107) 108 109)
1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // stream has 9 real + 8 nav nodes
1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Sequence of types: 101 DN 102 DN 103 UP 104 DN 105 UP 106 DN 107 UP 108 109 UP
1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0 := TCommonTree.Create(TCommonToken.Create(101));
1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1 := TCommonTree.Create(TCommonToken.Create(102));
1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(R1);
1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2 := TCommonTree.Create(TCommonToken.Create(104));
1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2.AddChild(TCommonTree.Create(TCommonToken.Create(105)));
1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(R2);
1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R3 := TCommonTree.Create(TCommonToken.Create(106));
1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R3.AddChild(TCommonTree.Create(TCommonToken.Create(107)));
1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(R3);
1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(108)));
1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(109)));
1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream := TCommonTreeNodeStream.Create(R0);
1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(Stream.ToString, ' 101 2 102 2 103 3 104 2 105 3 106 2 107 3 108 109 3');
1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Assume we want to hit node 107 and then "call 102" then return
1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for K := 1 to IndexOf107 do
1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // consume til 107 node
1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Stream.Consume;
1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // CALL 102
1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,107);
1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Push(IndexOf102);
1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,102);
1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 102
1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.DOWN);
1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume DN
1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,103);
1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 103
1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.UP);
1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // RETURN
1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Pop;
1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,107);
1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.TestPushPopFromEOF;
1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst
1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IndexOf102 = 2;
1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IndexOf104 = 6;
1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0, R1, R2, R3: ITree;
1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream: ICommonTreeNodeStream;
1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // ^(101 ^(102 103) ^(104 105) ^(106 107) 108 109)
1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // stream has 9 real + 8 nav nodes
1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Sequence of types: 101 DN 102 DN 103 UP 104 DN 105 UP 106 DN 107 UP 108 109 UP
1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0 := TCommonTree.Create(TCommonToken.Create(101));
1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1 := TCommonTree.Create(TCommonToken.Create(102));
1099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(R1);
1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2 := TCommonTree.Create(TCommonToken.Create(104));
1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2.AddChild(TCommonTree.Create(TCommonToken.Create(105)));
1103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(R2);
1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R3 := TCommonTree.Create(TCommonToken.Create(106));
1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R3.AddChild(TCommonTree.Create(TCommonToken.Create(107)));
1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(R3);
1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(108)));
1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(109)));
1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream := TCommonTreeNodeStream.Create(R0);
1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(Stream.ToString, ' 101 2 102 2 103 3 104 2 105 3 106 2 107 3 108 109 3');
1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  while (Stream.LA(1) <> TToken.EOF) do
1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Stream.Consume;
1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.EOF);
1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // CALL 102
1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Push(IndexOf102);
1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,102);
1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 102
1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.DOWN);
1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume DN
1123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,103);
1124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 103
1125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.UP);
1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // RETURN (to empty stack)
1127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Pop;
1128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.EOF);
1129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // CALL 104
1131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Push(IndexOf104);
1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,104);
1133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 104
1134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.DOWN);
1135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume DN
1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,105);
1137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 105
1138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.UP);
1139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // RETURN (to empty stack)
1140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Pop;
1141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,TToken.EOF);
1142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.TestSeek;
1145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0, R1, R2: ITree;
1147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream: ICommonTreeNodeStream;
1148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // ^(101 ^(102 103 ^(106 107) ) 104 105)
1150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // stream has 7 real + 6 nav nodes
1151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
1152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0 := TCommonTree.Create(TCommonToken.Create(101));
1153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1 := TCommonTree.Create(TCommonToken.Create(102));
1154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(R1);
1155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
1156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2 := TCommonTree.Create(TCommonToken.Create(106));
1157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2.AddChild(TCommonTree.Create(TCommonToken.Create(107)));
1158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1.AddChild(R2);
1159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
1160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(105)));
1161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream := TCommonTreeNodeStream.Create(R0);
1163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 101
1164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume DN
1165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 102
1166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Seek(7); // seek to 107
1167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,107);
1168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 107
1169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume UP
1170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume UP
1171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,104);
1172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.TestSeekFromStart;
1175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0, R1, R2: ITree;
1177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream: ICommonTreeNodeStream;
1178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // ^(101 ^(102 103 ^(106 107) ) 104 105)
1180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // stream has 7 real + 6 nav nodes
1181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
1182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0 := TCommonTree.Create(TCommonToken.Create(101));
1183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1 := TCommonTree.Create(TCommonToken.Create(102));
1184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(R1);
1185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1.AddChild(TCommonTree.Create(TCommonToken.Create(103)));
1186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2 := TCommonTree.Create(TCommonToken.Create(106));
1187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R2.AddChild(TCommonTree.Create(TCommonToken.Create(107)));
1188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R1.AddChild(R2);
1189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(104)));
1190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0.AddChild(TCommonTree.Create(TCommonToken.Create(105)));
1191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream := TCommonTreeNodeStream.Create(R0);
1193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Seek(7); // seek to 107
1194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,107);
1195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume 107
1196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume UP
1197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream.Consume; // consume UP
1198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals((Stream.LT(1) as ITree).TokenType,104);
1199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.TestSingleNode;
1202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ITree;
1204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream: ITreeNodeStream;
1205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonTree.Create(TCommonToken.Create(101));
1207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream := CreateCommonTreeNodeStream(T);
1208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(GetStringOfEntireStreamContentsWithNodeTypesOnly(Stream),' 101');
1209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(Stream.ToString, ' 101');
1210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestICommonTreeNodeStream.TestStackStretch;
1213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0: ICommonTree;
1215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream: ICommonTreeNodeStream;
1216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I: Integer;
1217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // make more than INITIAL_CALL_STACK_SIZE pushes
1219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  R0 := TCommonTree.Create(TCommonToken.Create(101));
1220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stream := TCommonTreeNodeStream.Create(R0);
1221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // go 1 over initial size
1223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for I := 1 to TCommonTreeNodeStream.INITIAL_CALL_STACK_SIZE + 1 do
1224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Stream.Push(I);
1225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(Stream.Pop, 10);
1227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(Stream.Pop, 9);
1228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TestIRewriteRuleXxxxStream.CreateToken(const TokenType: Integer;
1231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Text: String): IToken;
1232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := TCommonToken.Create(TokenType, Text);
1234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TestIRewriteRuleXxxxStream.CreateTokenList(
1237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Count: Integer): IList<IToken>;
1238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I: Integer;
1240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := TList<IToken>.Create;
1242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for I := 0 to Count - 1 do
1243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result.Add(TCommonToken.Create(I + 1,'test token ' + IntToStr(I + 1)
1244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      + ' without any real context'));
1245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TestIRewriteRuleXxxxStream.CreateTree(const Token: IToken): ITree;
1248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := TCommonTree.Create(Token);
1250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TestIRewriteRuleXxxxStream.CreateTreeAdaptor: ITreeAdaptor;
1253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := TCommonTreeAdaptor.Create;
1255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestIRewriteRuleXxxxStream.SetUp;
1258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestIRewriteRuleXxxxStream.TearDown;
1262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestIRewriteRuleXxxxStream.TestRewriteRuleNodeStreamConstructors;
1266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NodeTest1, NodeTest2, NodeTest3: IRewriteRuleNodeStream;
1268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NodeTest1 := TRewriteRuleNodeStream.Create(CreateTreeAdaptor,
1270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'RewriteRuleNodeStream test1');
1271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NodeTest2 := TRewriteRuleNodeStream.Create(CreateTreeAdaptor,
1273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'RewriteRuleNodeStream test2',
1274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    CreateToken(1,'test token without any real context'));
1275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NodeTest3 := TRewriteRuleNodeStream.Create(CreateTreeAdaptor,
1277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'RewriteRuleNodeStream test3', CreateTokenList(4));
1278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestIRewriteRuleXxxxStream.TestRewriteRuleSubtreeStreamConstructors;
1281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubtreeTest1, SubtreeTest2, SubtreeTest3: IRewriteRuleSubtreeStream;
1283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubtreeTest1 := TRewriteRuleSubtreeStream.Create(CreateTreeAdaptor,
1285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'RewriteRuleSubtreeStream test1');
1286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubtreeTest2 := TRewriteRuleSubtreeStream.Create(CreateTreeAdaptor,
1288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'RewriteRuleSubtreeStream test2',
1289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    CreateToken(1,'test token without any real context'));
1290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubtreeTest3 := TRewriteRuleSubtreeStream.Create(CreateTreeAdaptor,
1292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'RewriteRuleSubtreeStream test3', CreateTokenList(4));
1293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestIRewriteRuleXxxxStream.TestRewriteRuleTokenStreamConstructors;
1296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest1, TokenTest2, TokenTest3: IRewriteRuleTokenStream;
1298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest1 := TRewriteRuleTokenStream.Create(CreateTreeAdaptor,
1300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'RewriteRuleTokenStream test1');
1301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest2 := TRewriteRuleTokenStream.Create(CreateTreeAdaptor,
1303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'RewriteRuleTokenStream test2',
1304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    CreateToken(1, 'test token without any real context'));
1305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest3 := TRewriteRuleTokenStream.Create(CreateTreeAdaptor,
1307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'RewriteRuleTokenStream test3', CreateTokenList(4));
1308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestIRewriteRuleXxxxStream.TestRRNodeStreamBehaviourWhileEmpty1;
1311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst
1312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Description = 'RewriteRuleNodeStream test';
1313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NodeTest: IRewriteRuleNodeStream;
1315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ExpectedException := ERewriteEmptyStreamException;
1317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NodeTest := TRewriteRuleNodeStream.Create(CreateTreeAdaptor, Description);
1318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckFalse(NodeTest.HasNext);
1320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(Description, NodeTest.Description);
1321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(NodeTest.Size, 0);
1322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NodeTest.Reset;
1323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(NodeTest.Size, 0);
1324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NodeTest.NextNode;
1325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestIRewriteRuleXxxxStream.TestRRNodeStreamBehaviourWhileEmpty2;
1328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst
1329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Description = 'RewriteRuleNodeStream test';
1330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NodeTest: IRewriteRuleNodeStream;
1332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ExpectedException := ERewriteEmptyStreamException;
1334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NodeTest := TRewriteRuleNodeStream.Create(CreateTreeAdaptor, Description);
1335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NodeTest.NextTree;
1336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestIRewriteRuleXxxxStream.TestRRNodeStreamBehaviourWithElements;
1339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NodeTest: IRewriteRuleNodeStream;
1341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Token1, Token2: IToken;
1342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Tree1, Tree2: ITree;
1343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ReturnedTree: ICommonTree;
1344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ExpectedException := ERewriteCardinalityException;
1346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NodeTest := TRewriteRuleNodeStream.Create(CreateTreeAdaptor, 'RewriteRuleNodeStream test');
1347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Token1 := CreateToken(1, 'test token without any real context');
1348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Tree1 := CreateTree(Token1);
1349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test Add()
1351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NodeTest.Add(Tree1);
1352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(NodeTest.Size, 1);
1353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(NodeTest.HasNext);
1354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test NextNode()
1356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ReturnedTree := NodeTest.NextNode as ICommoNTree;
1357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(ReturnedTree.TokenType, Tree1.TokenType);
1358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(NodeTest.Size, 1);
1359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckFalse(NodeTest.HasNext);
1360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NodeTest.Reset;
1361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(NodeTest.Size, 1);
1362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(NodeTest.HasNext);
1363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test NextTree()
1365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ReturnedTree := NodeTest.NextTree as ICommonTree;
1366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(SameObj(Token1, ReturnedTree.Token));
1367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(NodeTest.Size, 1);
1368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckFalse(NodeTest.HasNext);
1369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NodeTest.Reset;
1370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(NodeTest.Size, 1);
1371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(NodeTest.HasNext);
1372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test, what happens with two elements
1374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Token2 := CreateToken(2, 'test token without any real context');
1375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Tree2 := CreateTree(Token2);
1376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NodeTest.Add(Tree2);
1377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(NodeTest.Size, 2);
1378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(NodeTest.HasNext);
1379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ReturnedTree := NodeTest.NextTree as ICommonTree;
1380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(SameObj(Token1, ReturnedTree.Token));
1381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(NodeTest.Size, 2);
1382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(NodeTest.HasNext);
1383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ReturnedTree := NodeTest.NextTree as ICommonTree;
1384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(SameObj(Token2, ReturnedTree.Token));
1385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckFalse(NodeTest.HasNext);
1386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test exception
1388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NodeTest.NextTree;
1389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestIRewriteRuleXxxxStream.TestRRSubtreeStreamBehaviourWhileEmpty1;
1392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst
1393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Description = 'RewriteRuleSubtreeStream test';
1394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubtreeTest: IRewriteRuleSubtreeStream;
1396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ExpectedException := ERewriteEmptyStreamException;
1398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubtreeTest := TRewriteRuleSubtreeStream.Create(CreateTreeAdaptor, Description);
1399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckFalse(SubtreeTest.HasNext);
1401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(Description, SubtreeTest.Description);
1402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(SubtreeTest.Size, 0);
1403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubtreeTest.Reset;
1404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(SubtreeTest.Size, 0);
1405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubtreeTest.NextNode;
1406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestIRewriteRuleXxxxStream.TestRRSubtreeStreamBehaviourWhileEmpty2;
1409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst
1410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Description = 'RewriteRuleSubtreeStream test';
1411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubtreeTest: IRewriteRuleSubtreeStream;
1413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ExpectedException := ERewriteEmptyStreamException;
1415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubtreeTest := TRewriteRuleSubtreeStream.Create(CreateTreeAdaptor, Description);
1416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubtreeTest.NextTree;
1417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestIRewriteRuleXxxxStream.TestRRSubtreeStreamBehaviourWithElements;
1420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubtreeTest: IRewriteRuleSubtreeStream;
1422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Token1, Token2: IToken;
1423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Tree1, Tree2: ITree;
1424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ReturnedTree: ICommonTree;
1425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ExpectedException := ERewriteCardinalityException;
1427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubtreeTest := TRewriteRuleSubtreeStream.Create(CreateTreeAdaptor, 'RewriteRuleSubtreeStream test');
1428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Token1 := CreateToken(1, 'test token without any real context');
1429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Tree1 := CreateTree(Token1);
1430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test Add()
1432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubtreeTest.Add(Tree1);
1433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(SubtreeTest.Size, 1);
1434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(SubtreeTest.HasNext);
1435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test NextNode()
1437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(SameObj(SubtreeTest.NextNode, Tree1));
1438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(SubtreeTest.Size, 1);
1439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckFalse(SubtreeTest.HasNext);
1440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubtreeTest.Reset;
1441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(SubtreeTest.Size, 1);
1442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(SubtreeTest.HasNext);
1443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test NextTree()
1445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ReturnedTree := SubtreeTest.NextTree as ICommonTree;
1446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(SameObj(Token1, ReturnedTree.Token));
1447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(SubtreeTest.Size, 1);
1448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckFalse(SubtreeTest.HasNext);
1449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubtreeTest.Reset;
1450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(SubtreeTest.Size, 1);
1451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(SubtreeTest.HasNext);
1452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test, what happens with two elements
1454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Token2 := CreateToken(2, 'test token without any real context');
1455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Tree2 := CreateTree(Token2);
1456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubtreeTest.Add(Tree2);
1457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(SubtreeTest.Size, 2);
1458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(SubtreeTest.HasNext);
1459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ReturnedTree := SubtreeTest.NextTree as ICommonTree;
1460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(SameObj(Token1, ReturnedTree.Token));
1461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(SubtreeTest.Size, 2);
1462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(SubtreeTest.HasNext);
1463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ReturnedTree := SubtreeTest.NextTree as ICommonTree;
1464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(SameObj(Token2, ReturnedTree.Token));
1465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckFalse(SubtreeTest.HasNext);
1466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test exception
1468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SubtreeTest.NextTree;
1469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestIRewriteRuleXxxxStream.TestRRTokenStreamBehaviourWhileEmpty1;
1472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst
1473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Description = 'RewriteRuleTokenStream test';
1474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest: IRewriteRuleTokenStream;
1476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ExpectedException := ERewriteEmptyStreamException;
1478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest := TRewriteRuleTokenStream.Create(CreateTreeAdaptor, Description);
1479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckFalse(TokenTest.HasNext);
1481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(Description, TokenTest.Description);
1482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(TokenTest.Size, 0);
1483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest.Reset;
1484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(TokenTest.Size, 0);
1485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest.NextNode;
1486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestIRewriteRuleXxxxStream.TestRRTokenStreamBehaviourWhileEmpty2;
1489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst
1490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Description = 'RewriteRuleTokenStream test';
1491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest: IRewriteRuleTokenStream;
1493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ExpectedException := ERewriteEmptyStreamException;
1495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest := TRewriteRuleTokenStream.Create(CreateTreeAdaptor, Description);
1496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest.NextTree;
1497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestIRewriteRuleXxxxStream.TestRRTokenStreamBehaviourWhileEmpty3;
1500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst
1501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Description = 'RewriteRuleTokenStream test';
1502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest: IRewriteRuleTokenStream;
1504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ExpectedException := ERewriteEmptyStreamException;
1506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest := TRewriteRuleTokenStream.Create(CreateTreeAdaptor, Description);
1507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest.NextToken;
1508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestIRewriteRuleXxxxStream.TestRRTokenStreamBehaviourWithElements;
1511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest: IRewriteRuleTokenStream;
1513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Token1, Token2, ReturnedToken: IToken;
1514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Tree: ICommonTree;
1515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ExpectedException := ERewriteCardinalityException;
1517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest := TRewriteRuleTokenStream.Create(CreateTreeAdaptor, 'RewriteRuleTokenStream test');
1518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Token1 := CreateToken(1, 'test token without any real context');
1519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test Add()
1521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest.Add(Token1);
1522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(TokenTest.Size, 1);
1523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(TokenTest.HasNext);
1524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test NextNode()
1526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Tree := TokenTest.NextNode as ICommonTree;
1527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(SameObj(Tree.Token, Token1));
1528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(TokenTest.Size, 1);
1529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckFalse(TokenTest.HasNext);
1530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest.Reset;
1531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(TokenTest.Size, 1);
1532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(TokenTest.HasNext);
1533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test NextToken()
1535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ReturnedToken := TokenTest.NextToken;
1536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(SameObj(Token1, ReturnedToken));
1537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(TokenTest.Size, 1);
1538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckFalse(TokenTest.HasNext);
1539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest.Reset;
1540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(TokenTest.Size, 1);
1541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(TokenTest.HasNext);
1542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test NextTree()
1544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ReturnedToken := TokenTest.NextTree as IToken;
1545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(SameObj(Token1, ReturnedToken));
1546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(TokenTest.Size, 1);
1547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckFalse(TokenTest.HasNext);
1548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest.Reset;
1549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(TokenTest.Size, 1);
1550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(TokenTest.HasNext);
1551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test, what happens with two elements
1553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Token2 := CreateToken(2, 'test token without any real context');
1554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest.Add(Token2);
1555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(TokenTest.Size, 2);
1556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(TokenTest.HasNext);
1557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ReturnedToken := TokenTest.NextToken;
1558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(SameObj(Token1, ReturnedToken));
1559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(TokenTest.Size, 2);
1560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(TokenTest.HasNext);
1561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ReturnedToken := TokenTest.NextToken;
1562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Check(SameObj(Token2, ReturnedToken));
1563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckFalse(TokenTest.HasNext);
1564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Test exception
1566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenTest.NextToken;
1567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TestITreeWizard.Create(MethodName: String);
1570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst
1571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TOKENS: array [0..11] of String = ('', '', '', '', '', 'A', 'B', 'C', 'D', 'E', 'ID', 'VAR');
1572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I: Integer;
1574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited;
1576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SetLength(FTokens,Length(TOKENS));
1577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for I := 0 to Length(TOKENS) - 1 do
1578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FTokens[I] := TOKENS[I];
1579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.SetUp;
1582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TearDown;
1586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestDoubleLevelTree;
1590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A (B C) (B D) E)') as ICommonTree;
1598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(T.ToStringTree, '(A (B C) (B D) E)');
1599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestEquals;
1602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T1, T2: ICommonTree;
1606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T1 := Wiz.CreateTreeOrNode('(A B C)') as ICommonTree;
1610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T2 := Wiz.CreateTreeOrNode('(A B C)') as ICommonTree;
1611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(Wiz.Equals(T1, T2, Adaptor));
1612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestEqualsWithMismatchedText;
1615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T1, T2: ICommonTree;
1619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T1 := Wiz.CreateTreeOrNode('(A B[foo] C)') as ICommonTree;
1623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T2 := Wiz.CreateTreeOrNode('(A B C)') as ICommonTree;
1624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckFalse(Wiz.Equals(T1, T2, Adaptor));
1625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestEqualsWithText;
1628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T1, T2: ICommonTree;
1632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T1 := Wiz.CreateTreeOrNode('(A B[foo] C)') as ICommonTree;
1636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T2 := Wiz.CreateTreeOrNode('(A B[foo] C)') as ICommonTree;
1637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(Wiz.Equals(T1, T2, Adaptor));
1638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestFindPattern;
1641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Subtrees, Elements: IList<IANTLRInterface>;
1646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B C (A[foo] B[bar]) (D (A[big] B[dog])))') as ICommonTree;
1650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Subtrees := Wiz.Find(T, '(A B)');
1651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements := Subtrees;
1652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('[foo, big]', TCollectionUtils.ListToString(Elements));
1653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestInvalidListTree;
1656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('A B C') as ICommonTree;
1664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckNull(T);
1665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestListTree;
1668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(nil A B C)') as ICommonTree;
1676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(T.ToStringTree, 'A B C');
1677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestNoRepeatsIndex;
1680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  M: IDictionary<Integer, IList<IANTLRInterface>>;
1685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B C D)') as ICommonTree;
1689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  M := Wiz.Index(T);
1690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('{5=[A], 8=[D], 7=[C], 6=[B]}' ,TCollectionUtils.DictionaryToString(M));
1691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestNoRepeatsVisit;
1694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements: IList<IANTLRInterface>;
1699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Visitor: IContextVisitor;
1700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B C D)') as ICommonTree;
1704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements := TList<IANTLRInterface>.Create;
1705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Visitor := TRecordAllElementsVisitor.Create(Elements);
1706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz.Visit(T, Wiz.GetTokenType('B'), Visitor);
1707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('[B]' ,TCollectionUtils.ListToString(Elements));
1708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestNoRepeatsVisit2;
1711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements: IList<IANTLRInterface>;
1716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Visitor: IContextVisitor;
1717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B (A C B) B D D)') as ICommonTree;
1721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements := TList<IANTLRInterface>.Create;
1722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Visitor := TRecordAllElementsVisitor.Create(Elements);
1723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz.Visit(T, Wiz.GetTokenType('C'), Visitor);
1724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('[C]' ,TCollectionUtils.ListToString(Elements));
1725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestParse;
1728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B C)') as ICommonTree;
1736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(Wiz.Parse(T, '(A B C)'));
1737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestParseFlatTree;
1740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(nil A B C)') as ICommonTree;
1748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(Wiz.Parse(T, '(nil A B C)'));
1749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestParseLabels;
1752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Labels: IDictionary<String, IANTLRInterface>;
1757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B C)') as ICommonTree;
1761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Labels := TDictionary<String, IANTLRInterface>.Create;
1762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(Wiz.Parse(T, '(%a:A %b:B %c:C)', Labels));
1763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('A', Labels['a'].ToString);
1764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('B', Labels['b'].ToString);
1765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('C', Labels['c'].ToString);
1766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestParseLabelsAndTestText;
1769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Labels: IDictionary<String, IANTLRInterface>;
1774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B[foo] C)') as ICommonTree;
1778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Labels := TDictionary<String, IANTLRInterface>.Create;
1779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(Wiz.Parse(T, '(%a:A %b:B[foo] %c:C)', Labels));
1780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('A', Labels['a'].ToString);
1781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('foo', Labels['b'].ToString);
1782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('C', Labels['c'].ToString);
1783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestParseLabelsInNestedTree;
1786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Labels: IDictionary<String, IANTLRInterface>;
1791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A (B C) (D E))') as ICommonTree;
1795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Labels := TDictionary<String, IANTLRInterface>.Create;
1796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(Wiz.Parse(T, '(%a:A (%b:B %c:C) (%d:D %e:E) )', Labels));
1797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('A', Labels['a'].ToString);
1798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('B', Labels['b'].ToString);
1799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('C', Labels['c'].ToString);
1800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('D', Labels['d'].ToString);
1801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('E', Labels['e'].ToString);
1802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestParseSingleNode;
1805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('A') as ICommonTree;
1813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(Wiz.Parse(T, 'A'));
1814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestParseWithText;
1817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B[foo] C[bar])') as ICommonTree;
1825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // C pattern has no text arg so despite [bar] in t, no need
1826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // to match text--check structure only.
1827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(Wiz.Parse(T, '(A B[foo] C)'));
1828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestParseWithTextFails;
1831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B C)') as ICommonTree;
1839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckFalse(Wiz.Parse(T, '(A[foo] B C)'));
1840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestParseWithWildcardLabels;
1843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Labels: IDictionary<String, IANTLRInterface>;
1848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B C)') as ICommonTree;
1852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Labels := TDictionary<String, IANTLRInterface>.Create;
1853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(Wiz.Parse(T, '(A %b:. %c:.)', Labels));
1854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('B', Labels['b'].ToString);
1855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('C', Labels['c'].ToString);
1856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestRepeatsIndex;
1859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  M: IDictionary<Integer, IList<IANTLRInterface>>;
1864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B (A C B) B D D)') as ICommonTree;
1868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  M := Wiz.Index(T);
1869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('{5=[A, A], 8=[D, D], 7=[C], 6=[B, B, B]}' ,TCollectionUtils.DictionaryToString(M));
1870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestRepeatsVisit;
1873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements: IList<IANTLRInterface>;
1878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Visitor: IContextVisitor;
1879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B (A C B) B D D)') as ICommonTree;
1883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements := TList<IANTLRInterface>.Create;
1884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Visitor := TRecordAllElementsVisitor.Create(Elements);
1885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz.Visit(T, Wiz.GetTokenType('B'), Visitor);
1886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('[B, B, B]' ,TCollectionUtils.ListToString(Elements));
1887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestRepeatsVisit2;
1890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements: IList<IANTLRInterface>;
1895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Visitor: IContextVisitor;
1896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B (A C B) B D D)') as ICommonTree;
1900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements := TList<IANTLRInterface>.Create;
1901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Visitor := TRecordAllElementsVisitor.Create(Elements);
1902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz.Visit(T, Wiz.GetTokenType('A'), Visitor);
1903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('[A, A]' ,TCollectionUtils.ListToString(Elements));
1904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestRepeatsVisitWithContext;
1907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements: IList<IANTLRInterface>;
1912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Visitor: IContextVisitor;
1913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B (A C B) B D D)') as ICommonTree;
1917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements := TList<IANTLRInterface>.Create;
1918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Visitor := TTest1ContextVisitor.Create(Adaptor, Elements);
1919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz.Visit(T, Wiz.GetTokenType('B'), Visitor);
1920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('[B@A[0], B@A[1], B@A[2]]', TCollectionUtils.ListToString(Elements));
1921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestRepeatsVisitWithNullParentAndContext;
1924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements: IList<IANTLRInterface>;
1929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Visitor: IContextVisitor;
1930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B (A C B) B D D)') as ICommonTree;
1934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements := TList<IANTLRInterface>.Create;
1935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Visitor := TTest1ContextVisitor.Create(Adaptor, Elements);
1936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz.Visit(T, Wiz.GetTokenType('A'), Visitor);
1937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('[A@nil[0], A@A[1]]', TCollectionUtils.ListToString(Elements));
1938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestSingleLevelTree;
1941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B C D)') as ICommonTree;
1949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(T.ToStringTree, '(A B C D)');
1950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestSingleNode;
1953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('ID') as ICommonTree;
1961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(T.ToStringTree, 'ID');
1962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestSingleNodeIndex;
1965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  M: IDictionary<Integer, IList<IANTLRInterface>>;
1970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('ID') as ICommonTree;
1974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  M := Wiz.Index(T);
1975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('{10=[ID]}' ,TCollectionUtils.DictionaryToString(M));
1976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestSingleNodeTree;
1979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A)') as ICommonTree;
1987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(T.ToStringTree, 'A');
1988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
1989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestSingleNodeWithArg;
1991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
1992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
1993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
1994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
1995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
1996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
1997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
1998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('ID[foo]') as ICommonTree;
1999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals(T.ToStringTree, 'foo');
2000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestVisitPattern;
2003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
2004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
2005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
2006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
2007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements: IList<IANTLRInterface>;
2008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Visitor: IContextVisitor;
2009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
2011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
2012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B C (A B) D)') as ICommonTree;
2013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements := TList<IANTLRInterface>.Create;
2014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Visitor := TRecordAllElementsVisitor.Create(Elements);
2015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz.Visit(T, '(A B)', Visitor);
2016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('[A]', TCollectionUtils.ListToString(Elements));
2017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestVisitPatternMultiple;
2020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
2021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
2022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
2023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
2024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements: IList<IANTLRInterface>;
2025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Visitor: IContextVisitor;
2026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
2028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
2029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B C (A B) (D (A B)))') as ICommonTree;
2030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements := TList<IANTLRInterface>.Create;
2031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Visitor := TTest1ContextVisitor.Create(Adaptor, Elements);
2032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz.Visit(T, '(A B)', Visitor);
2033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('[A@A[2], A@D[0]]', TCollectionUtils.ListToString(Elements));
2034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestVisitPatternMultipleWithLabels;
2037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
2038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
2039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
2040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
2041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements: IList<IANTLRInterface>;
2042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Visitor: IContextVisitor;
2043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
2045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
2046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B C (A[foo] B[bar]) (D (A[big] B[dog])))') as ICommonTree;
2047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Elements := TList<IANTLRInterface>.Create;
2048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Visitor := TTest2ContextVisitor.Create(Adaptor, Elements);
2049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz.Visit(T, '(%a:A %b:B)', Visitor);
2050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckEquals('[foo@A[2]foo&bar, big@D[0]big&dog]', TCollectionUtils.ListToString(Elements));
2051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TestWildcard;
2054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
2055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
2056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz: ITreeWizard;
2057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonTree;
2058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := TCommonTreeAdaptor.Create;
2060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Wiz := TTreeWizard.Create(Adaptor, FTokens);
2061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := Wiz.CreateTreeOrNode('(A B C)') as ICommonTree;
2062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CheckTrue(Wiz.Parse(T, '(A . .)'));
2063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TestITreeWizard.TRecordAllElementsVisitor }
2066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TestITreeWizard.TRecordAllElementsVisitor.Create(
2068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AList: IList<IANTLRInterface>);
2069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create;
2071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FList := AList;
2072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TRecordAllElementsVisitor.Visit(
2075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const T: IANTLRInterface);
2076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FList.Add(T);
2078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TestITreeWizard.TTest1ContextVisitor }
2081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TestITreeWizard.TTest1ContextVisitor.Create(
2083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AAdaptor: ITreeAdaptor; const AList: IList<IANTLRInterface>);
2084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create;
2086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FAdaptor := AAdaptor;
2087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FList := AList;
2088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TTest1ContextVisitor.Visit(const T,
2091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Parent: IANTLRInterface; const ChildIndex: Integer;
2092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Labels: IDictionary<String, IANTLRInterface>);
2093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
2094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S: String;
2095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S := FAdaptor.GetNodeText(T) + '@';
2097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Assigned(Parent) then
2098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    S := S + FAdaptor.GetNodeText(Parent)
2099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
2100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    S := S + 'nil';
2101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FList.Add(TANTLRString.Create(S + '[' + IntToStr(ChildIndex) + ']'));
2102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TestITreeWizard.TTest2ContextVisitor }
2105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TestITreeWizard.TTest2ContextVisitor.Create(
2107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AAdaptor: ITreeAdaptor; const AList: IList<IANTLRInterface>);
2108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create;
2110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FAdaptor := AAdaptor;
2111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FList := AList;
2112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TestITreeWizard.TTest2ContextVisitor.Visit(const T,
2115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Parent: IANTLRInterface; const ChildIndex: Integer;
2116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Labels: IDictionary<String, IANTLRInterface>);
2117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
2118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S: String;
2119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S := FAdaptor.GetNodeText(T) + '@';
2121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Assigned(Parent) then
2122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    S := S + FAdaptor.GetNodeText(Parent)
2123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
2124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    S := S + 'nil';
2125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FList.Add(TANTLRString.Create(S + '[' + IntToStr(ChildIndex) + ']'
2126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    + Labels['a'].ToString + '&' + Labels['b'].ToString));
2127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinitialization
2130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // Register any test cases with the test runner
2131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  RegisterTest(TestICommonTree.Suite);
2132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  RegisterTest(TestICommonTreeNodeStream.Suite);
2133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  RegisterTest(TestIRewriteRuleXxxxStream.Suite);
2134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  RegisterTest(TestITreeWizard.Suite);
2135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend.
2136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2137