1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[The "BSD licence"]
3324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverCopyright (c) 2005-2007 Kunle Odutola
4324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverAll rights reserved.
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverRedistribution and use in source and binary forms, with or without
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodification, are permitted provided that the following conditions
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverare met:
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver1. Redistributions of source code MUST RETAIN the above copyright
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   notice, this list of conditions and the following disclaimer.
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver2. Redistributions in binary form MUST REPRODUCE the above copyright
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   notice, this list of conditions and the following disclaimer in
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   the documentation and/or other materials provided with the
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   distribution.
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver3. The name of the author may not be used to endorse or promote products
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   derived from this software without specific prior WRITTEN permission.
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver4. Unless explicitly state otherwise, any contribution intentionally
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   submitted for inclusion in this work to the copyright owner or licensor
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   shall be under the terms and conditions of this license, without any
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   additional terms or conditions.
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
22324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace Antlr.Runtime.Tests
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	using System;
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	using StringBuilder = System.Text.StringBuilder;
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	using IToken = Antlr.Runtime.IToken;
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using Token = Antlr.Runtime.TokenTypes;
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	using CommonToken = Antlr.Runtime.CommonToken;
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	using ITree = Antlr.Runtime.Tree.ITree;
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	using ITreeNodeStream = Antlr.Runtime.Tree.ITreeNodeStream;
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	using CommonTree = Antlr.Runtime.Tree.CommonTree;
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	using CommonTreeNodeStream = Antlr.Runtime.Tree.CommonTreeNodeStream;
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	using BufferedTreeNodeStream = Antlr.Runtime.Tree.BufferedTreeNodeStream;
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	using MbUnit.Framework;
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	[TestFixture]
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public class ITreeNodeStreamFixture : TestFixtureBase
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #region BufferedTreeNodeStream Tests
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        [Test]
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void testSingleNode()
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree t = new CommonTree(new CommonToken(101));
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITreeNodeStream stream = CreateCommonTreeNodeStream(t);
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			string expected = " 101";
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			string actual = GetStringOfEntireStreamContentsWithNodeTypesOnly(stream);
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(expected, actual);
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			expected = " 101";
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			actual = stream.ToString();
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(expected, actual);
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		[Test]
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/// <summary>
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/// Test a tree with four nodes - ^(101 ^(102 103) 104)
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/// </summary>
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void test4Nodes()
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree t = new CommonTree(new CommonToken(101));
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			t.AddChild(new CommonTree(new CommonToken(102)));
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			t.GetChild(0).AddChild(new CommonTree(new CommonToken(103)));
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			t.AddChild(new CommonTree(new CommonToken(104)));
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ITreeNodeStream stream = CreateBufferedTreeNodeStream(t);
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			string expected = " 101 102 103 104";
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			string actual = GetStringOfEntireStreamContentsWithNodeTypesOnly(stream);
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(expected, actual);
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			expected = " 101 2 102 2 103 3 104 3";
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			actual = stream.ToString();
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(expected, actual);
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		[Test]
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void testList()
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree root = new CommonTree((IToken)null);
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree t = new CommonTree(new CommonToken(101));
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			t.AddChild(new CommonTree(new CommonToken(102)));
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			t.GetChild(0).AddChild(new CommonTree(new CommonToken(103)));
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			t.AddChild(new CommonTree(new CommonToken(104)));
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree u = new CommonTree(new CommonToken(105));
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			root.AddChild(t);
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			root.AddChild(u);
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            BufferedTreeNodeStream stream = new BufferedTreeNodeStream(root);
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			string expected = " 101 102 103 104 105";
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			string actual = GetStringOfEntireStreamContentsWithNodeTypesOnly(stream);
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(expected, actual);
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			expected = " 101 2 102 2 103 3 104 3 105";
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			actual = stream.ToString();
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(expected, actual);
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		[Test]
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void testFlatList()
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree root = new CommonTree((IToken)null);
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			root.AddChild(new CommonTree(new CommonToken(101)));
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			root.AddChild(new CommonTree(new CommonToken(102)));
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			root.AddChild(new CommonTree(new CommonToken(103)));
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            BufferedTreeNodeStream stream = new BufferedTreeNodeStream(root);
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			string expected = " 101 102 103";
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			string actual = GetStringOfEntireStreamContentsWithNodeTypesOnly(stream);
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(expected, actual);
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			expected = " 101 102 103";
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			actual = stream.ToString();
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(expected, actual);
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		[Test]
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void testListWithOneNode()
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree root = new CommonTree((IToken)null);
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			root.AddChild(new CommonTree(new CommonToken(101)));
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            BufferedTreeNodeStream stream = new BufferedTreeNodeStream(root);
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			string expected = " 101";
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			string actual = GetStringOfEntireStreamContentsWithNodeTypesOnly(stream);
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(expected, actual);
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			expected = " 101";
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			actual = stream.ToString();
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(expected, actual);
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		[Test]
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void testAoverB()
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree t = new CommonTree(new CommonToken(101));
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			t.AddChild(new CommonTree(new CommonToken(102)));
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ITreeNodeStream stream = CreateBufferedTreeNodeStream(t);
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			string expected = " 101 102";
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			string actual = GetStringOfEntireStreamContentsWithNodeTypesOnly(stream);
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(expected, actual);
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			expected = " 101 2 102 3";
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			actual = stream.ToString();
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(expected, actual);
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		[Test]
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void testLT()
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// ^(101 ^(102 103) 104)
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree t = new CommonTree(new CommonToken(101));
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			t.AddChild(new CommonTree(new CommonToken(102)));
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			t.GetChild(0).AddChild(new CommonTree(new CommonToken(103)));
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			t.AddChild(new CommonTree(new CommonToken(104)));
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ITreeNodeStream stream = CreateBufferedTreeNodeStream(t);
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(101, ((ITree)stream.LT(1)).Type);
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Down, ((ITree)stream.LT(2)).Type);
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(102, ((ITree)stream.LT(3)).Type);
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Down, ((ITree)stream.LT(4)).Type);
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(103, ((ITree)stream.LT(5)).Type);
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Up, ((ITree)stream.LT(6)).Type);
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(104, ((ITree)stream.LT(7)).Type);
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Up, ((ITree)stream.LT(8)).Type);
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.EndOfFile, ((ITree)stream.LT(9)).Type);
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// check way ahead
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.EndOfFile, ((ITree)stream.LT(100)).Type);
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		[Test]
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void testMarkRewindEntire()
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// ^(101 ^(102 103 ^(106 107) ) 104 105)
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// stream has 7 real + 6 nav nodes
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// Sequence of types: 101 DN 102 DN 103 106 DN 107 Up Up 104 105 Up EndOfFile
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r0 = new CommonTree(new CommonToken(101));
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r1 = new CommonTree(new CommonToken(102));
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(r1);
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r1.AddChild(new CommonTree(new CommonToken(103)));
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r2 = new CommonTree(new CommonToken(106));
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r2.AddChild(new CommonTree(new CommonToken(107)));
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r1.AddChild(r2);
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(new CommonTree(new CommonToken(104)));
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(new CommonTree(new CommonToken(105)));
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            BufferedTreeNodeStream stream = new BufferedTreeNodeStream(r0);
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			int m = stream.Mark(); // MARK
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			for (int k = 1; k <= 13; k++)
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{ // consume til end
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				stream.LT(1);
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				stream.Consume();
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.EndOfFile, ((ITree)stream.LT(1)).Type);
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Up, ((ITree)stream.LT(-1)).Type);
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Rewind(m);      // REWIND
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// consume til end again :)
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			for (int k = 1; k <= 13; k++)
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{ // consume til end
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				stream.LT(1);
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				stream.Consume();
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.EndOfFile, ((ITree)stream.LT(1)).Type);
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Up, ((ITree)stream.LT(-1)).Type);
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		[Test]
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void testMarkRewindInMiddle()
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// ^(101 ^(102 103 ^(106 107) ) 104 105)
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// stream has 7 real + 6 nav nodes
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// Sequence of types: 101 DN 102 DN 103 106 DN 107 Up Up 104 105 Up EndOfFile
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r0 = new CommonTree(new CommonToken(101));
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r1 = new CommonTree(new CommonToken(102));
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(r1);
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r1.AddChild(new CommonTree(new CommonToken(103)));
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r2 = new CommonTree(new CommonToken(106));
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r2.AddChild(new CommonTree(new CommonToken(107)));
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r1.AddChild(r2);
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(new CommonTree(new CommonToken(104)));
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(new CommonTree(new CommonToken(105)));
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            BufferedTreeNodeStream stream = new BufferedTreeNodeStream(r0);
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			for (int k = 1; k <= 7; k++)
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{ // consume til middle
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				//System.out.println(((ITree)stream.LT(1)).Type);
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				stream.Consume();
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(107, ((ITree)stream.LT(1)).Type);
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			int m = stream.Mark(); // MARK
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 107
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume Up
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume Up
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 104
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Rewind(m);      // REWIND
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(107, ((ITree)stream.LT(1)).Type);
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume();
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Up, ((ITree)stream.LT(1)).Type);
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume();
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Up, ((ITree)stream.LT(1)).Type);
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume();
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(104, ((ITree)stream.LT(1)).Type);
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume();
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// now we're past rewind position
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(105, ((ITree)stream.LT(1)).Type);
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume();
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Up, ((ITree)stream.LT(1)).Type);
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume();
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.EndOfFile, ((ITree)stream.LT(1)).Type);
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Up, ((ITree)stream.LT(-1)).Type);
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		[Test]
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void testMarkRewindNested()
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// ^(101 ^(102 103 ^(106 107) ) 104 105)
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// stream has 7 real + 6 nav nodes
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// Sequence of types: 101 DN 102 DN 103 106 DN 107 Up Up 104 105 Up EndOfFile
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r0 = new CommonTree(new CommonToken(101));
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r1 = new CommonTree(new CommonToken(102));
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(r1);
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r1.AddChild(new CommonTree(new CommonToken(103)));
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r2 = new CommonTree(new CommonToken(106));
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r2.AddChild(new CommonTree(new CommonToken(107)));
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r1.AddChild(r2);
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(new CommonTree(new CommonToken(104)));
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(new CommonTree(new CommonToken(105)));
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            BufferedTreeNodeStream stream = new BufferedTreeNodeStream(r0);
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			int m = stream.Mark(); // MARK at start
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 101
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume DN
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			int m2 = stream.Mark(); // MARK on 102
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 102
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume DN
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 103
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 106
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Rewind(m2);      // REWIND to 102
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(102, ((ITree)stream.LT(1)).Type);
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume();
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Down, ((ITree)stream.LT(1)).Type);
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume();
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// stop at 103 and rewind to start
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Rewind(m); // REWIND to 101
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(101, ((ITree)stream.LT(1)).Type);
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume();
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Down, ((ITree)stream.LT(1)).Type);
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume();
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(102, ((ITree)stream.LT(1)).Type);
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume();
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Down, ((ITree)stream.LT(1)).Type);
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		[Test]
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void testSeek()
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// ^(101 ^(102 103 ^(106 107) ) 104 105)
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// stream has 7 real + 6 nav nodes
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// Sequence of types: 101 DN 102 DN 103 106 DN 107 Up Up 104 105 Up EndOfFile
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r0 = new CommonTree(new CommonToken(101));
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r1 = new CommonTree(new CommonToken(102));
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(r1);
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r1.AddChild(new CommonTree(new CommonToken(103)));
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r2 = new CommonTree(new CommonToken(106));
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r2.AddChild(new CommonTree(new CommonToken(107)));
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r1.AddChild(r2);
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(new CommonTree(new CommonToken(104)));
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(new CommonTree(new CommonToken(105)));
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            BufferedTreeNodeStream stream = new BufferedTreeNodeStream(r0);
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 101
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume DN
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 102
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Seek(7);   // seek to 107
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(107, ((ITree)stream.LT(1)).Type);
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 107
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume Up
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume Up
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(104, ((ITree)stream.LT(1)).Type);
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		[Test]
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void testSeekFromStart()
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// ^(101 ^(102 103 ^(106 107) ) 104 105)
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// stream has 7 real + 6 nav nodes
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// Sequence of types: 101 DN 102 DN 103 106 DN 107 Up Up 104 105 Up EndOfFile
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r0 = new CommonTree(new CommonToken(101));
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r1 = new CommonTree(new CommonToken(102));
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(r1);
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r1.AddChild(new CommonTree(new CommonToken(103)));
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r2 = new CommonTree(new CommonToken(106));
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r2.AddChild(new CommonTree(new CommonToken(107)));
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r1.AddChild(r2);
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(new CommonTree(new CommonToken(104)));
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(new CommonTree(new CommonToken(105)));
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            BufferedTreeNodeStream stream = new BufferedTreeNodeStream(r0);
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Seek(7);   // seek to 107
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(107, ((ITree)stream.LT(1)).Type);
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 107
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume Up
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume Up
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(104, ((ITree)stream.LT(1)).Type);
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		[Test]
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void testPushPop()
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// ^(101 ^(102 103) ^(104 105) ^(106 107) 108 109)
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// stream has 9 real + 8 nav nodes
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// Sequence of types: 101 DN 102 DN 103 Up 104 DN 105 Up 106 DN 107 Up 108 109 Up
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r0 = new CommonTree(new CommonToken(101));
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r1 = new CommonTree(new CommonToken(102));
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r1.AddChild(new CommonTree(new CommonToken(103)));
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(r1);
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r2 = new CommonTree(new CommonToken(104));
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r2.AddChild(new CommonTree(new CommonToken(105)));
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(r2);
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r3 = new CommonTree(new CommonToken(106));
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r3.AddChild(new CommonTree(new CommonToken(107)));
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(r3);
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(new CommonTree(new CommonToken(108)));
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(new CommonTree(new CommonToken(109)));
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            BufferedTreeNodeStream stream = new BufferedTreeNodeStream(r0);
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			String expecting = " 101 2 102 2 103 3 104 2 105 3 106 2 107 3 108 109 3";
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			String found = stream.ToString();
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(expecting, found);
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// Assume we want to hit node 107 and then "call 102" then return
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			int indexOf102 = 2;
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			int indexOf107 = 12;
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			for (int k = 1; k <= indexOf107; k++)
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{ // consume til 107 node
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				stream.Consume();
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// CALL 102
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(107, ((ITree)stream.LT(1)).Type);
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Push(indexOf102);
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(102, ((ITree)stream.LT(1)).Type);
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 102
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Down, ((ITree)stream.LT(1)).Type);
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume DN
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(103, ((ITree)stream.LT(1)).Type);
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 103
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Up, ((ITree)stream.LT(1)).Type);
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// RETURN
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Pop();
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(107, ((ITree)stream.LT(1)).Type);
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		[Test]
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void testNestedPushPop()
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// ^(101 ^(102 103) ^(104 105) ^(106 107) 108 109)
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// stream has 9 real + 8 nav nodes
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// Sequence of types: 101 DN 102 DN 103 Up 104 DN 105 Up 106 DN 107 Up 108 109 Up
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r0 = new CommonTree(new CommonToken(101));
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r1 = new CommonTree(new CommonToken(102));
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r1.AddChild(new CommonTree(new CommonToken(103)));
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(r1);
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r2 = new CommonTree(new CommonToken(104));
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r2.AddChild(new CommonTree(new CommonToken(105)));
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(r2);
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r3 = new CommonTree(new CommonToken(106));
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r3.AddChild(new CommonTree(new CommonToken(107)));
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(r3);
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(new CommonTree(new CommonToken(108)));
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(new CommonTree(new CommonToken(109)));
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            BufferedTreeNodeStream stream = new BufferedTreeNodeStream(r0);
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// Assume we want to hit node 107 and then "call 102", which
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// calls 104, then return
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			int indexOf102 = 2;
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			int indexOf107 = 12;
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			for (int k = 1; k <= indexOf107; k++)
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{ // consume til 107 node
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				stream.Consume();
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(107, ((ITree)stream.LT(1)).Type);
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// CALL 102
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Push(indexOf102);
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(102, ((ITree)stream.LT(1)).Type);
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 102
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Down, ((ITree)stream.LT(1)).Type);
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume DN
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(103, ((ITree)stream.LT(1)).Type);
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 103
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// CALL 104
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			int indexOf104 = 6;
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Push(indexOf104);
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(104, ((ITree)stream.LT(1)).Type);
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 102
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Down, ((ITree)stream.LT(1)).Type);
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume DN
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(105, ((ITree)stream.LT(1)).Type);
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 103
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Up, ((ITree)stream.LT(1)).Type);
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// RETURN (to Up node in 102 subtree)
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Pop();
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Up, ((ITree)stream.LT(1)).Type);
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// RETURN (to empty stack)
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Pop();
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(107, ((ITree)stream.LT(1)).Type);
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		[Test]
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void testPushPopFromEOF()
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// ^(101 ^(102 103) ^(104 105) ^(106 107) 108 109)
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// stream has 9 real + 8 nav nodes
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// Sequence of types: 101 DN 102 DN 103 Up 104 DN 105 Up 106 DN 107 Up 108 109 Up
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r0 = new CommonTree(new CommonToken(101));
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r1 = new CommonTree(new CommonToken(102));
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r1.AddChild(new CommonTree(new CommonToken(103)));
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(r1);
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r2 = new CommonTree(new CommonToken(104));
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r2.AddChild(new CommonTree(new CommonToken(105)));
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(r2);
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r3 = new CommonTree(new CommonToken(106));
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r3.AddChild(new CommonTree(new CommonToken(107)));
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(r3);
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(new CommonTree(new CommonToken(108)));
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			r0.AddChild(new CommonTree(new CommonToken(109)));
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            BufferedTreeNodeStream stream = new BufferedTreeNodeStream(r0);
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			while (stream.LA(1) != Token.EndOfFile)
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				stream.Consume();
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			int indexOf102 = 2;
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			int indexOf104 = 6;
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.EndOfFile, ((ITree)stream.LT(1)).Type);
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// CALL 102
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Push(indexOf102);
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(102, ((ITree)stream.LT(1)).Type);
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 102
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Down, ((ITree)stream.LT(1)).Type);
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume DN
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(103, ((ITree)stream.LT(1)).Type);
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 103
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Up, ((ITree)stream.LT(1)).Type);
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// RETURN (to empty stack)
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Pop();
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.EndOfFile, ((ITree)stream.LT(1)).Type);
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// CALL 104
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Push(indexOf104);
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(104, ((ITree)stream.LT(1)).Type);
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 102
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Down, ((ITree)stream.LT(1)).Type);
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume DN
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(105, ((ITree)stream.LT(1)).Type);
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Consume(); // consume 103
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.Up, ((ITree)stream.LT(1)).Type);
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// RETURN (to empty stack)
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			stream.Pop();
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(Token.EndOfFile, ((ITree)stream.LT(1)).Type);
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		[Test]
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void testStackStretch()
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// make more than INITIAL_CALL_STACK_SIZE pushes
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree r0 = new CommonTree(new CommonToken(101));
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            BufferedTreeNodeStream stream = new BufferedTreeNodeStream(r0);
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// go 1 over initial size
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 1; i <= BufferedTreeNodeStream.INITIAL_CALL_STACK_SIZE + 1; i++)
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				stream.Push(i);
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(10, stream.Pop());
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(9, stream.Pop());
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		#endregion
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		#region CommonTreeNodeStream Tests
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		[Test]
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void testBufferOverflow()
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			StringBuilder buf = new StringBuilder();
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			StringBuilder buf2 = new StringBuilder();
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// make ^(101 102 ... n)
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree t = new CommonTree(new CommonToken(101));
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			buf.Append(" 101");
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			buf2.Append(" 101");
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			buf2.Append(" ");
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			buf2.Append(Token.Down);
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i <= CommonTreeNodeStream.DEFAULT_INITIAL_BUFFER_SIZE + 10; i++)
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				t.AddChild(new CommonTree(new CommonToken(102 + i)));
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				buf.Append(" ");
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				buf.Append(102 + i);
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				buf2.Append(" ");
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				buf2.Append(102 + i);
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			buf2.Append(" ");
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			buf2.Append(Token.Up);
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ITreeNodeStream stream = CreateCommonTreeNodeStream(t);
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			String expecting = buf.ToString();
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			String found = GetStringOfEntireStreamContentsWithNodeTypesOnly(stream);
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(expecting, found);
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			expecting = buf2.ToString();
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			found = stream.ToString();
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.AreEqual(expecting, found);
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/// <summary>
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/// Test what happens when tail hits the end of the buffer, but there
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/// is more room left.
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/// </summary>
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/// <remarks>
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/// Specifically that would mean that head is not at 0 but has
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/// advanced somewhere to the middle of the lookahead buffer.
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		///
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/// Use Consume() to advance N nodes into lookahead.  Then use LT()
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/// to load at least INITIAL_LOOKAHEAD_BUFFER_SIZE-N nodes so the
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/// buffer has to wrap.
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/// </remarks>
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		[Test]
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public void testBufferWrap()
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			int N = 10;
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// make tree with types: 1 2 ... INITIAL_LOOKAHEAD_BUFFER_SIZE+N
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ITree t = new CommonTree((IToken)null);
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (int i = 0; i < CommonTreeNodeStream.DEFAULT_INITIAL_BUFFER_SIZE + N; i++)
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				t.AddChild(new CommonTree(new CommonToken(i + 1)));
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// move head to index N
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ITreeNodeStream stream = CreateCommonTreeNodeStream(t);
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			for (int i = 1; i <= N; i++)
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{ // consume N
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				ITree node = (ITree)stream.LT(1);
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				Assert.AreEqual(i, node.Type);
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				stream.Consume();
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// now use LT to lookahead past end of buffer
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int remaining = CommonTreeNodeStream.DEFAULT_INITIAL_BUFFER_SIZE - N;
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			int wrapBy = 4; // wrap around by 4 nodes
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Assert.IsTrue(wrapBy < N, "bad test code; wrapBy must be less than N");
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			for (int i = 1; i <= remaining + wrapBy; i++)
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{ // wrap past end of buffer
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				ITree node = (ITree)stream.LT(i); // look ahead to ith token
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				Assert.AreEqual(N + i, node.Type);
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		#endregion
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		#region Helper Methods
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected ITreeNodeStream CreateBufferedTreeNodeStream(object t)
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return new BufferedTreeNodeStream(t);
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		protected ITreeNodeStream CreateCommonTreeNodeStream(object t)
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return new CommonTreeNodeStream(t);
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		public string GetStringOfEntireStreamContentsWithNodeTypesOnly(ITreeNodeStream nodes)
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			StringBuilder buf = new StringBuilder();
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			for (int i = 0; i < nodes.Count; i++)
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				object t = nodes.LT(i + 1);
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				int type = nodes.TreeAdaptor.GetType(t);
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				if (!((type == Token.Down) || (type == Token.Up)))
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				{
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					buf.Append(" ");
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					buf.Append(type);
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				}
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			return buf.ToString();
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		#endregion
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}