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 }