1 /*
2 [The "BSD licence"]
3 Copyright (c) 2005-2007 Kunle Odutola
4 All rights reserved.
5 
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions
8 are met:
9 1. Redistributions of source code MUST RETAIN the above copyright
10    notice, this list of conditions and the following disclaimer.
11 2. Redistributions in binary form MUST REPRODUCE the above copyright
12    notice, this list of conditions and the following disclaimer in
13    the documentation and/or other materials provided with the
14    distribution.
15 3. The name of the author may not be used to endorse or promote products
16    derived from this software without specific prior WRITTEN permission.
17 4. Unless explicitly state otherwise, any contribution intentionally
18    submitted for inclusion in this work to the copyright owner or licensor
19    shall be under the terms and conditions of this license, without any
20    additional terms or conditions.
21 
22 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33 
34 
35 namespace Antlr.Runtime.Tests
36 {
37 	using System;
38 	using StringBuilder = System.Text.StringBuilder;
39 
40 	using IToken = Antlr.Runtime.IToken;
41 	using CommonToken = Antlr.Runtime.CommonToken;
42 	using ITree = Antlr.Runtime.Tree.ITree;
43 	using ITreeAdaptor = Antlr.Runtime.Tree.ITreeAdaptor;
44 	using CommonTree = Antlr.Runtime.Tree.CommonTree;
45 	using CommonTreeAdaptor = Antlr.Runtime.Tree.CommonTreeAdaptor;
46 
47 	using MbUnit.Framework;
48 
49 	[TestFixture]
50 	public class ITreeFixture : TestFixtureBase
51 	{
52 		#region CommonTree Tests
53 
54 		[Test]
testSingleNode()55 		public void testSingleNode()
56 		{
57 			CommonTree t = new CommonTree(new CommonToken(101));
58 			Assert.IsNull(t.Parent);
59 			Assert.AreEqual(-1, t.ChildIndex);
60 		}
61 
62 		[Test]
test4Nodes()63 		public void test4Nodes()
64 		{
65 			// ^(101 ^(102 103) 104)
66 			CommonTree r0 = new CommonTree(new CommonToken(101));
67 			r0.AddChild(new CommonTree(new CommonToken(102)));
68 			r0.GetChild(0).AddChild(new CommonTree(new CommonToken(103)));
69 			r0.AddChild(new CommonTree(new CommonToken(104)));
70 
71 			Assert.IsNull(r0.Parent);
72 			Assert.AreEqual(-1, r0.ChildIndex);
73 		}
74 
75 		[Test]
testList()76 		public void testList()
77 		{
78 			// ^(nil 101 102 103)
79 			CommonTree r0 = new CommonTree((IToken)null);
80 			CommonTree c0, c1, c2;
81 			r0.AddChild(c0 = new CommonTree(new CommonToken(101)));
82 			r0.AddChild(c1 = new CommonTree(new CommonToken(102)));
83 			r0.AddChild(c2 = new CommonTree(new CommonToken(103)));
84 
85 			Assert.IsNull(r0.Parent);
86 			Assert.AreEqual(-1, r0.ChildIndex);
87 			Assert.AreEqual(r0, c0.Parent);
88 			Assert.AreEqual(0, c0.ChildIndex);
89 			Assert.AreEqual(r0, c1.Parent);
90 			Assert.AreEqual(1, c1.ChildIndex);
91 			Assert.AreEqual(r0, c2.Parent);
92 			Assert.AreEqual(2, c2.ChildIndex);
93 		}
94 
95 		[Test]
testList2()96 		public void testList2()
97 		{
98 			// Add child ^(nil 101 102 103) to root 5
99 			// should pull 101 102 103 directly to become 5's child list
100 			CommonTree root = new CommonTree(new CommonToken(5));
101 
102 			// child tree
103 			CommonTree r0 = new CommonTree((IToken)null);
104 			CommonTree c0, c1, c2;
105 			r0.AddChild(c0 = new CommonTree(new CommonToken(101)));
106 			r0.AddChild(c1 = new CommonTree(new CommonToken(102)));
107 			r0.AddChild(c2 = new CommonTree(new CommonToken(103)));
108 
109 			root.AddChild(r0);
110 
111 			Assert.IsNull(root.Parent);
112 			Assert.AreEqual(-1, root.ChildIndex);
113 			// check children of root all point at root
114 			Assert.AreEqual(root, c0.Parent);
115 			Assert.AreEqual(0, c0.ChildIndex);
116 			Assert.AreEqual(root, c0.Parent);
117 			Assert.AreEqual(1, c1.ChildIndex);
118 			Assert.AreEqual(root, c0.Parent);
119 			Assert.AreEqual(2, c2.ChildIndex);
120 		}
121 
122 		[Test]
testAddListToExistChildren()123 		public void testAddListToExistChildren()
124 		{
125 			// Add child ^(nil 101 102 103) to root ^(5 6)
126 			// should add 101 102 103 to end of 5's child list
127 			CommonTree root = new CommonTree(new CommonToken(5));
128 			root.AddChild(new CommonTree(new CommonToken(6)));
129 
130 			// child tree
131 			CommonTree r0 = new CommonTree((IToken)null);
132 			CommonTree c0, c1, c2;
133 			r0.AddChild(c0 = new CommonTree(new CommonToken(101)));
134 			r0.AddChild(c1 = new CommonTree(new CommonToken(102)));
135 			r0.AddChild(c2 = new CommonTree(new CommonToken(103)));
136 
137 			root.AddChild(r0);
138 
139 			Assert.IsNull(root.Parent);
140 			Assert.AreEqual(-1, root.ChildIndex);
141 			// check children of root all point at root
142 			Assert.AreEqual(root, c0.Parent);
143 			Assert.AreEqual(1, c0.ChildIndex);
144 			Assert.AreEqual(root, c0.Parent);
145 			Assert.AreEqual(2, c1.ChildIndex);
146 			Assert.AreEqual(root, c0.Parent);
147 			Assert.AreEqual(3, c2.ChildIndex);
148 		}
149 
150 		[Test]
testDupTree()151 		public void testDupTree()
152 		{
153 			// ^(101 ^(102 103 ^(106 107) ) 104 105)
154 			CommonTree r0 = new CommonTree(new CommonToken(101));
155 			CommonTree r1 = new CommonTree(new CommonToken(102));
156 			r0.AddChild(r1);
157 			r1.AddChild(new CommonTree(new CommonToken(103)));
158 			ITree r2 = new CommonTree(new CommonToken(106));
159 			r2.AddChild(new CommonTree(new CommonToken(107)));
160 			r1.AddChild(r2);
161 			r0.AddChild(new CommonTree(new CommonToken(104)));
162 			r0.AddChild(new CommonTree(new CommonToken(105)));
163 
164 			CommonTree dup = (CommonTree)(new CommonTreeAdaptor()).DupTree(r0);
165 
166 			Assert.IsNull(dup.Parent);
167 			Assert.AreEqual(-1, dup.ChildIndex);
168 			dup.SanityCheckParentAndChildIndexes();
169 		}
170 
171 		[Test]
testBecomeRoot()172 		public void testBecomeRoot()
173 		{
174 			// 5 becomes new root of ^(nil 101 102 103)
175 			CommonTree newRoot = new CommonTree(new CommonToken(5));
176 
177 			CommonTree oldRoot = new CommonTree((IToken)null);
178 			oldRoot.AddChild(new CommonTree(new CommonToken(101)));
179 			oldRoot.AddChild(new CommonTree(new CommonToken(102)));
180 			oldRoot.AddChild(new CommonTree(new CommonToken(103)));
181 
182 			ITreeAdaptor adaptor = new CommonTreeAdaptor();
183 			adaptor.BecomeRoot(newRoot, oldRoot);
184 			newRoot.SanityCheckParentAndChildIndexes();
185 		}
186 
187 		[Test]
testBecomeRoot2()188 		public void testBecomeRoot2()
189 		{
190 			// 5 becomes new root of ^(101 102 103)
191 			CommonTree newRoot = new CommonTree(new CommonToken(5));
192 
193 			CommonTree oldRoot = new CommonTree(new CommonToken(101));
194 			oldRoot.AddChild(new CommonTree(new CommonToken(102)));
195 			oldRoot.AddChild(new CommonTree(new CommonToken(103)));
196 
197 			ITreeAdaptor adaptor = new CommonTreeAdaptor();
198 			adaptor.BecomeRoot(newRoot, oldRoot);
199 			newRoot.SanityCheckParentAndChildIndexes();
200 		}
201 
202 		[Test]
testBecomeRoot3()203 		public void testBecomeRoot3()
204 		{
205 			// ^(nil 5) becomes new root of ^(nil 101 102 103)
206 			CommonTree newRoot = new CommonTree((IToken)null);
207 			newRoot.AddChild(new CommonTree(new CommonToken(5)));
208 
209 			CommonTree oldRoot = new CommonTree((IToken)null);
210 			oldRoot.AddChild(new CommonTree(new CommonToken(101)));
211 			oldRoot.AddChild(new CommonTree(new CommonToken(102)));
212 			oldRoot.AddChild(new CommonTree(new CommonToken(103)));
213 
214 			ITreeAdaptor adaptor = new CommonTreeAdaptor();
215 			adaptor.BecomeRoot(newRoot, oldRoot);
216 			newRoot.SanityCheckParentAndChildIndexes();
217 		}
218 
219 		[Test]
testBecomeRoot5()220 		public void testBecomeRoot5()
221 		{
222 			// ^(nil 5) becomes new root of ^(101 102 103)
223 			CommonTree newRoot = new CommonTree((IToken)null);
224 			newRoot.AddChild(new CommonTree(new CommonToken(5)));
225 
226 			CommonTree oldRoot = new CommonTree(new CommonToken(101));
227 			oldRoot.AddChild(new CommonTree(new CommonToken(102)));
228 			oldRoot.AddChild(new CommonTree(new CommonToken(103)));
229 
230 			ITreeAdaptor adaptor = new CommonTreeAdaptor();
231 			adaptor.BecomeRoot(newRoot, oldRoot);
232 			newRoot.SanityCheckParentAndChildIndexes();
233 		}
234 
235 		[Test]
testBecomeRoot6()236 		public void testBecomeRoot6()
237 		{
238 			// emulates construction of ^(5 6)
239 			ITreeAdaptor adaptor = new CommonTreeAdaptor();
240 			CommonTree root_0 = (CommonTree)adaptor.Nil();
241 			CommonTree root_1 = (CommonTree)adaptor.Nil();
242 			root_1 = (CommonTree)adaptor.BecomeRoot(new CommonTree(new CommonToken(5)), root_1);
243 
244 			adaptor.AddChild(root_1, new CommonTree(new CommonToken(6)));
245 
246 			adaptor.AddChild(root_0, root_1);
247 
248 			root_0.SanityCheckParentAndChildIndexes();
249 		}
250 
251 		// Test replaceChildren
252 
253 		[Test]
testReplaceWithNoChildren()254 		public void testReplaceWithNoChildren()
255 		{
256 			CommonTree t = new CommonTree(new CommonToken(101));
257 			CommonTree newChild = new CommonTree(new CommonToken(5));
258 			bool error = false;
259 			try
260 			{
261 				t.ReplaceChildren(0, 0, newChild);
262 			}
263 			catch (Exception)
264 			{
265 				error = true;
266 			}
267 			Assert.IsTrue(error);
268 		}
269 
270 		[Test]
testReplaceWithOneChildren()271 		public void testReplaceWithOneChildren()
272 		{
273 			// assume token type 99 and use text
274 			CommonTree t = new CommonTree(new CommonToken(99, "a"));
275 			CommonTree c0 = new CommonTree(new CommonToken(99, "b"));
276 			t.AddChild(c0);
277 
278 			CommonTree newChild = new CommonTree(new CommonToken(99, "c"));
279 			t.ReplaceChildren(0, 0, newChild);
280 			String expected = "(a c)";
281 			Assert.AreEqual(expected, t.ToStringTree());
282 			t.SanityCheckParentAndChildIndexes();
283 		}
284 
285 		[Test]
testReplaceInMiddle()286 		public void testReplaceInMiddle()
287 		{
288 			CommonTree t = new CommonTree(new CommonToken(99, "a"));
289 			t.AddChild(new CommonTree(new CommonToken(99, "b")));
290 			t.AddChild(new CommonTree(new CommonToken(99, "c"))); // index 1
291 			t.AddChild(new CommonTree(new CommonToken(99, "d")));
292 
293 			CommonTree newChild = new CommonTree(new CommonToken(99, "x"));
294 			t.ReplaceChildren(1, 1, newChild);
295 			String expected = "(a b x d)";
296 			Assert.AreEqual(expected, t.ToStringTree());
297 			t.SanityCheckParentAndChildIndexes();
298 		}
299 
300 		[Test]
testReplaceAtLeft()301 		public void testReplaceAtLeft()
302 		{
303 			CommonTree t = new CommonTree(new CommonToken(99, "a"));
304 			t.AddChild(new CommonTree(new CommonToken(99, "b"))); // index 0
305 			t.AddChild(new CommonTree(new CommonToken(99, "c")));
306 			t.AddChild(new CommonTree(new CommonToken(99, "d")));
307 
308 			CommonTree newChild = new CommonTree(new CommonToken(99, "x"));
309 			t.ReplaceChildren(0, 0, newChild);
310 			String expected = "(a x c d)";
311 			Assert.AreEqual(expected, t.ToStringTree());
312 			t.SanityCheckParentAndChildIndexes();
313 		}
314 
315 		[Test]
testReplaceAtRight()316 		public void testReplaceAtRight()
317 		{
318 			CommonTree t = new CommonTree(new CommonToken(99, "a"));
319 			t.AddChild(new CommonTree(new CommonToken(99, "b")));
320 			t.AddChild(new CommonTree(new CommonToken(99, "c")));
321 			t.AddChild(new CommonTree(new CommonToken(99, "d"))); // index 2
322 
323 			CommonTree newChild = new CommonTree(new CommonToken(99, "x"));
324 			t.ReplaceChildren(2, 2, newChild);
325 			String expected = "(a b c x)";
326 			Assert.AreEqual(expected, t.ToStringTree());
327 			t.SanityCheckParentAndChildIndexes();
328 		}
329 
330 		[Test]
testReplaceOneWithTwoAtLeft()331 		public void testReplaceOneWithTwoAtLeft()
332 		{
333 			ITreeAdaptor adaptor = new CommonTreeAdaptor();
334 			CommonTree t = new CommonTree(new CommonToken(99, "a"));
335 			t.AddChild(new CommonTree(new CommonToken(99, "b")));
336 			t.AddChild(new CommonTree(new CommonToken(99, "c")));
337 			t.AddChild(new CommonTree(new CommonToken(99, "d")));
338 
339 			CommonTree newChildren = (CommonTree)adaptor.Nil();
340 			newChildren.AddChild(new CommonTree(new CommonToken(99, "x")));
341 			newChildren.AddChild(new CommonTree(new CommonToken(99, "y")));
342 
343 			t.ReplaceChildren(0, 0, newChildren);
344 			String expected = "(a x y c d)";
345 			Assert.AreEqual(expected, t.ToStringTree());
346 			t.SanityCheckParentAndChildIndexes();
347 		}
348 
349 		[Test]
testReplaceOneWithTwoAtRight()350 		public void testReplaceOneWithTwoAtRight()
351 		{
352 			ITreeAdaptor adaptor = new CommonTreeAdaptor();
353 			CommonTree t = new CommonTree(new CommonToken(99, "a"));
354 			t.AddChild(new CommonTree(new CommonToken(99, "b")));
355 			t.AddChild(new CommonTree(new CommonToken(99, "c")));
356 			t.AddChild(new CommonTree(new CommonToken(99, "d")));
357 
358 			CommonTree newChildren = (CommonTree)adaptor.Nil();
359 			newChildren.AddChild(new CommonTree(new CommonToken(99, "x")));
360 			newChildren.AddChild(new CommonTree(new CommonToken(99, "y")));
361 
362 			t.ReplaceChildren(2, 2, newChildren);
363 			String expected = "(a b c x y)";
364 			Assert.AreEqual(expected, t.ToStringTree());
365 			t.SanityCheckParentAndChildIndexes();
366 		}
367 
368 		[Test]
testReplaceOneWithTwoInMiddle()369 		public void testReplaceOneWithTwoInMiddle()
370 		{
371 			ITreeAdaptor adaptor = new CommonTreeAdaptor();
372 			CommonTree t = new CommonTree(new CommonToken(99, "a"));
373 			t.AddChild(new CommonTree(new CommonToken(99, "b")));
374 			t.AddChild(new CommonTree(new CommonToken(99, "c")));
375 			t.AddChild(new CommonTree(new CommonToken(99, "d")));
376 
377 			CommonTree newChildren = (CommonTree)adaptor.Nil();
378 			newChildren.AddChild(new CommonTree(new CommonToken(99, "x")));
379 			newChildren.AddChild(new CommonTree(new CommonToken(99, "y")));
380 
381 			t.ReplaceChildren(1, 1, newChildren);
382 			String expected = "(a b x y d)";
383 			Assert.AreEqual(expected, t.ToStringTree());
384 			t.SanityCheckParentAndChildIndexes();
385 		}
386 
387 		[Test]
testReplaceTwoWithOneAtLeft()388 		public void testReplaceTwoWithOneAtLeft()
389 		{
390 			CommonTree t = new CommonTree(new CommonToken(99, "a"));
391 			t.AddChild(new CommonTree(new CommonToken(99, "b")));
392 			t.AddChild(new CommonTree(new CommonToken(99, "c")));
393 			t.AddChild(new CommonTree(new CommonToken(99, "d")));
394 
395 			CommonTree newChild = new CommonTree(new CommonToken(99, "x"));
396 
397 			t.ReplaceChildren(0, 1, newChild);
398 			String expected = "(a x d)";
399 			Assert.AreEqual(expected, t.ToStringTree());
400 			t.SanityCheckParentAndChildIndexes();
401 		}
402 
403 		[Test]
testReplaceTwoWithOneAtRight()404 		public void testReplaceTwoWithOneAtRight()
405 		{
406 			CommonTree t = new CommonTree(new CommonToken(99, "a"));
407 			t.AddChild(new CommonTree(new CommonToken(99, "b")));
408 			t.AddChild(new CommonTree(new CommonToken(99, "c")));
409 			t.AddChild(new CommonTree(new CommonToken(99, "d")));
410 
411 			CommonTree newChild = new CommonTree(new CommonToken(99, "x"));
412 
413 			t.ReplaceChildren(1, 2, newChild);
414 			String expected = "(a b x)";
415 			Assert.AreEqual(expected, t.ToStringTree());
416 			t.SanityCheckParentAndChildIndexes();
417 		}
418 
419 		[Test]
testReplaceAllWithOne()420 		public void testReplaceAllWithOne()
421 		{
422 			CommonTree t = new CommonTree(new CommonToken(99, "a"));
423 			t.AddChild(new CommonTree(new CommonToken(99, "b")));
424 			t.AddChild(new CommonTree(new CommonToken(99, "c")));
425 			t.AddChild(new CommonTree(new CommonToken(99, "d")));
426 
427 			CommonTree newChild = new CommonTree(new CommonToken(99, "x"));
428 
429 			t.ReplaceChildren(0, 2, newChild);
430 			String expected = "(a x)";
431 			Assert.AreEqual(expected, t.ToStringTree());
432 			t.SanityCheckParentAndChildIndexes();
433 		}
434 
435 		[Test]
testReplaceAllWithTwo()436 		public void testReplaceAllWithTwo()
437 		{
438 			ITreeAdaptor adaptor = new CommonTreeAdaptor();
439 			CommonTree t = new CommonTree(new CommonToken(99, "a"));
440 			t.AddChild(new CommonTree(new CommonToken(99, "b")));
441 			t.AddChild(new CommonTree(new CommonToken(99, "c")));
442 			t.AddChild(new CommonTree(new CommonToken(99, "d")));
443 
444 			CommonTree newChildren = (CommonTree)adaptor.Nil();
445 			newChildren.AddChild(new CommonTree(new CommonToken(99, "x")));
446 			newChildren.AddChild(new CommonTree(new CommonToken(99, "y")));
447 
448 			t.ReplaceChildren(0, 2, newChildren);
449 			String expected = "(a x y)";
450 			Assert.AreEqual(expected, t.ToStringTree());
451 			t.SanityCheckParentAndChildIndexes();
452 		}
453 
454 		#endregion
455 	}
456 }