00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 namespace Antlr.Runtime.Tests
00036 {
00037 using System;
00038 using IList = System.Collections.IList;
00039 using IDictionary = System.Collections.IDictionary;
00040 using ArrayList = System.Collections.ArrayList;
00041 using Hashtable = System.Collections.Hashtable;
00042 using StringBuilder = System.Text.StringBuilder;
00043
00044 using IToken = Antlr.Runtime.IToken;
00045 using Token = Antlr.Runtime.Token;
00046 using CommonToken = Antlr.Runtime.CommonToken;
00047 using ITree = Antlr.Runtime.Tree.ITree;
00048 using TreeWizard = Antlr.Runtime.Tree.TreeWizard;
00049 using CommonTree = Antlr.Runtime.Tree.CommonTree;
00050 using ITreeAdaptor = Antlr.Runtime.Tree.ITreeAdaptor;
00051 using CommonTreeAdaptor = Antlr.Runtime.Tree.CommonTreeAdaptor;
00052 using CollectionUtils = Antlr.Runtime.Collections.CollectionUtils;
00053
00054 using MbUnit.Framework;
00055
00056 [TestFixture]
00057 public class TreeWizardFixture : TestFixtureBase
00058 {
00059 protected static readonly String[] tokens =
00060 new String[] { "", "", "", "", "", "A", "B", "C", "D", "E", "ID", "VAR" };
00061
00062 private sealed class RecordAllElementsVisitor : TreeWizard.Visitor
00063 {
00064 private IList list;
00065
00066 public RecordAllElementsVisitor(IList list)
00067 {
00068 this.list = list;
00069 }
00070
00071 override public void Visit(object t)
00072 {
00073 list.Add(t);
00074 }
00075 }
00076
00077 private sealed class Test1ContextVisitor : TreeWizard.ContextVisitor
00078 {
00079 private ITreeAdaptor adaptor;
00080 private IList list;
00081
00082 public Test1ContextVisitor(ITreeAdaptor adaptor, IList list)
00083 {
00084 this.adaptor = adaptor;
00085 this.list = list;
00086 }
00087
00088 public void Visit(object t, object parent, int childIndex, IDictionary labels)
00089 {
00090 list.Add(adaptor.GetNodeText(t)
00091 + "@" + ((parent != null) ? adaptor.GetNodeText(parent) : "nil")
00092 + "[" + childIndex + "]");
00093 }
00094 }
00095
00096 private sealed class Test2ContextVisitor : TreeWizard.ContextVisitor
00097 {
00098 private ITreeAdaptor adaptor;
00099 private IList list;
00100
00101 public Test2ContextVisitor(ITreeAdaptor adaptor, IList list)
00102 {
00103 this.adaptor = adaptor;
00104 this.list = list;
00105 }
00106
00107 public void Visit(object t, object parent, int childIndex, IDictionary labels)
00108 {
00109
00110 list.Add(adaptor.GetNodeText(t)
00111 + "@" + ((parent != null) ? adaptor.GetNodeText(parent) : "nil")
00112 + "[" + childIndex + "]" + labels["a"] + "&" + labels["b"]);
00113 }
00114 }
00115
00116 #region TreeWizard Tests
00117
00118 [Test]
00119 public void testSingleNode()
00120 {
00121 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00122 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00123 CommonTree t = (CommonTree)wiz.Create("ID");
00124 string actual = t.ToStringTree();
00125 string expected = "ID";
00126 Assert.AreEqual(expected, actual);
00127 }
00128
00129 [Test]
00130 public void testSingleNodeWithArg()
00131 {
00132 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00133 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00134 CommonTree t = (CommonTree)wiz.Create("ID[foo]");
00135 string actual = t.ToStringTree();
00136 string expected = "foo";
00137 Assert.AreEqual(expected, actual);
00138 }
00139
00140 [Test]
00141 public void testSingleNodeTree()
00142 {
00143 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00144 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00145 CommonTree t = (CommonTree)wiz.Create("(A)");
00146 string actual = t.ToStringTree();
00147 string expected = "A";
00148 Assert.AreEqual(expected, actual);
00149 }
00150
00151 [Test]
00152 public void testSingleLevelTree()
00153 {
00154 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00155 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00156 CommonTree t = (CommonTree)wiz.Create("(A B C D)");
00157 string actual = t.ToStringTree();
00158 string expected = "(A B C D)";
00159 Assert.AreEqual(expected, actual);
00160 }
00161
00162 [Test]
00163 public void testListTree()
00164 {
00165 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00166 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00167 CommonTree t = (CommonTree)wiz.Create("(nil A B C)");
00168 string actual = t.ToStringTree();
00169 string expected = "A B C";
00170 Assert.AreEqual(expected, actual);
00171 }
00172
00173 [Test]
00174 public void testInvalidListTree()
00175 {
00176 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00177 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00178 CommonTree t = (CommonTree)wiz.Create("A B C");
00179 Assert.IsTrue(t == null);
00180 }
00181
00182 [Test]
00183 public void testDoubleLevelTree()
00184 {
00185 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00186 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00187 CommonTree t = (CommonTree)wiz.Create("(A (B C) (B D) E)");
00188 string actual = t.ToStringTree();
00189 string expected = "(A (B C) (B D) E)";
00190 Assert.AreEqual(expected, actual);
00191 }
00192
00193 [Test]
00194 public void testSingleNodeIndex()
00195 {
00196 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00197 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00198 CommonTree t = (CommonTree)wiz.Create("ID");
00199 IDictionary m = wiz.Index(t);
00200 string actual = CollectionUtils.DictionaryToString(m);
00201 string expected = "{10=[ID]}";
00202 Assert.AreEqual(expected, actual);
00203 }
00204
00205 [Test]
00206 public void testNoRepeatsIndex()
00207 {
00208 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00209 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00210 CommonTree t = (CommonTree)wiz.Create("(A B C D)");
00211 IDictionary m = wiz.Index(t);
00212 string actual = CollectionUtils.DictionaryToString(m);
00213
00214 string expected = "{8=[D], 7=[C], 6=[B], 5=[A]}";
00215 Assert.AreEqual(expected, actual);
00216 }
00217
00218 [Test]
00219 public void testRepeatsIndex()
00220 {
00221 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00222 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00223 CommonTree t = (CommonTree)wiz.Create("(A B (A C B) B D D)");
00224 IDictionary m = wiz.Index(t);
00225 string actual = CollectionUtils.DictionaryToString(m);
00226
00227 string expected = "{8=[D, D], 7=[C], 6=[B, B, B], 5=[A, A]}";
00228 Assert.AreEqual(expected, actual);
00229 }
00230
00231 [Test]
00232 public void testNoRepeatsVisit()
00233 {
00234 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00235 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00236 CommonTree t = (CommonTree)wiz.Create("(A B C D)");
00237 IList elements = new ArrayList();
00238 wiz.Visit(t, wiz.GetTokenType("B"), new RecordAllElementsVisitor(elements));
00239 string actual = CollectionUtils.ListToString(elements);
00240 string expected = "[B]";
00241 Assert.AreEqual(expected, actual);
00242 }
00243
00244 [Test]
00245 public void testNoRepeatsVisit2()
00246 {
00247 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00248 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00249 CommonTree t = (CommonTree)wiz.Create("(A B (A C B) B D D)");
00250 IList elements = new ArrayList();
00251 wiz.Visit(t, wiz.GetTokenType("C"), new RecordAllElementsVisitor(elements));
00252 string actual = CollectionUtils.ListToString(elements);
00253 string expected = "[C]";
00254 Assert.AreEqual(expected, actual);
00255 }
00256
00257 [Test]
00258 public void testRepeatsVisit()
00259 {
00260 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00261 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00262 CommonTree t = (CommonTree)wiz.Create("(A B (A C B) B D D)");
00263 IList elements = new ArrayList();
00264 wiz.Visit(t, wiz.GetTokenType("B"), new RecordAllElementsVisitor(elements));
00265 string actual = CollectionUtils.ListToString(elements);
00266 string expected = "[B, B, B]";
00267 Assert.AreEqual(expected, actual);
00268 }
00269
00270 [Test]
00271 public void testRepeatsVisit2()
00272 {
00273 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00274 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00275 CommonTree t = (CommonTree)wiz.Create("(A B (A C B) B D D)");
00276 IList elements = new ArrayList();
00277 wiz.Visit(t, wiz.GetTokenType("A"), new RecordAllElementsVisitor(elements));
00278 string actual = CollectionUtils.ListToString(elements);
00279 string expected = "[A, A]";
00280 Assert.AreEqual(expected, actual);
00281 }
00282
00283 [Test]
00284 public void testRepeatsVisitWithContext()
00285 {
00286 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00287 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00288 CommonTree t = (CommonTree)wiz.Create("(A B (A C B) B D D)");
00289 IList elements = new ArrayList();
00290 wiz.Visit(t, wiz.GetTokenType("B"), new Test1ContextVisitor(adaptor, elements));
00291 string actual = CollectionUtils.ListToString(elements);
00292 string expected = "[B@A[0], B@A[1], B@A[2]]";
00293 Assert.AreEqual(expected, actual);
00294 }
00295
00296 [Test]
00297 public void testRepeatsVisitWithNullParentAndContext()
00298 {
00299 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00300 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00301 CommonTree t = (CommonTree)wiz.Create("(A B (A C B) B D D)");
00302 IList elements = new ArrayList();
00303 wiz.Visit(t, wiz.GetTokenType("A"), new Test1ContextVisitor(adaptor, elements));
00304 string actual = CollectionUtils.ListToString(elements);
00305 string expected = "[A@nil[0], A@A[1]]";
00306 Assert.AreEqual(expected, actual);
00307 }
00308
00309 [Test]
00310 public void testVisitPattern()
00311 {
00312 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00313 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00314 CommonTree t = (CommonTree)wiz.Create("(A B C (A B) D)");
00315 IList elements = new ArrayList();
00316 wiz.Visit(t, "(A B)", new RecordAllElementsVisitor(elements));
00317 string actual = CollectionUtils.ListToString(elements);
00318 string expected = "[A]";
00319 Assert.AreEqual(expected, actual);
00320 }
00321
00322 [Test]
00323 public void testVisitPatternMultiple()
00324 {
00325 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00326 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00327 CommonTree t = (CommonTree)wiz.Create("(A B C (A B) (D (A B)))");
00328 IList elements = new ArrayList();
00329 wiz.Visit(t, "(A B)", new Test1ContextVisitor(adaptor, elements));
00330 string actual = CollectionUtils.ListToString(elements);
00331 string expected = "[A@A[2], A@D[0]]";
00332 Assert.AreEqual(expected, actual);
00333 }
00334
00335 [Test]
00336 public void testVisitPatternMultipleWithLabels()
00337 {
00338 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00339 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00340 CommonTree t = (CommonTree)wiz.Create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))");
00341 IList elements = new ArrayList();
00342 wiz.Visit(t, "(%a:A %b:B)", new Test2ContextVisitor(adaptor, elements));
00343 string actual = CollectionUtils.ListToString(elements);
00344 string expected = "[foo@A[2]foo&bar, big@D[0]big&dog]";
00345 Assert.AreEqual(expected, actual);
00346 }
00347
00348 [Test]
00349 public void testParse()
00350 {
00351 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00352 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00353 CommonTree t = (CommonTree)wiz.Create("(A B C)");
00354 bool valid = wiz.Parse(t, "(A B C)");
00355 Assert.IsTrue(valid);
00356 }
00357
00358 [Test]
00359 public void testParseSingleNode()
00360 {
00361 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00362 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00363 CommonTree t = (CommonTree)wiz.Create("A");
00364 bool valid = wiz.Parse(t, "A");
00365 Assert.IsTrue(valid);
00366 }
00367
00368 [Test]
00369 public void testParseFlatTree()
00370 {
00371 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00372 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00373 CommonTree t = (CommonTree)wiz.Create("(nil A B C)");
00374 bool valid = wiz.Parse(t, "(nil A B C)");
00375 Assert.IsTrue(valid);
00376 }
00377
00378 [Test]
00379 public void testWildcard()
00380 {
00381 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00382 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00383 CommonTree t = (CommonTree)wiz.Create("(A B C)");
00384 bool valid = wiz.Parse(t, "(A . .)");
00385 Assert.IsTrue(valid);
00386 }
00387
00388 [Test]
00389 public void testParseWithText()
00390 {
00391 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00392 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00393 CommonTree t = (CommonTree)wiz.Create("(A B[foo] C[bar])");
00394
00395
00396 bool valid = wiz.Parse(t, "(A B[foo] C)");
00397 Assert.IsTrue(valid);
00398 }
00399
00400 [Test]
00401 public void testParseWithTextFails()
00402 {
00403 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00404 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00405 CommonTree t = (CommonTree)wiz.Create("(A B C)");
00406 bool valid = wiz.Parse(t, "(A[foo] B C)");
00407 Assert.IsTrue(!valid);
00408 }
00409
00410 [Test]
00411 public void testParseLabels()
00412 {
00413 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00414 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00415 CommonTree t = (CommonTree)wiz.Create("(A B C)");
00416 IDictionary labels = new Hashtable();
00417 bool valid = wiz.Parse(t, "(%a:A %b:B %c:C)", labels);
00418 Assert.IsTrue(valid);
00419 Assert.AreEqual("A", labels["a"].ToString());
00420 Assert.AreEqual("B", labels["b"].ToString());
00421 Assert.AreEqual("C", labels["c"].ToString());
00422 }
00423
00424 [Test]
00425 public void testParseWithWildcardLabels()
00426 {
00427 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00428 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00429 CommonTree t = (CommonTree)wiz.Create("(A B C)");
00430 IDictionary labels = new Hashtable();
00431 bool valid = wiz.Parse(t, "(A %b:. %c:.)", labels);
00432 Assert.IsTrue(valid);
00433 Assert.AreEqual("B", labels["b"].ToString());
00434 Assert.AreEqual("C", labels["c"].ToString());
00435 }
00436
00437 [Test]
00438 public void testParseLabelsAndTestText()
00439 {
00440 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00441 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00442 CommonTree t = (CommonTree)wiz.Create("(A B[foo] C)");
00443 IDictionary labels = new Hashtable();
00444 bool valid = wiz.Parse(t, "(%a:A %b:B[foo] %c:C)", labels);
00445 Assert.IsTrue(valid);
00446 Assert.AreEqual("A", labels["a"].ToString());
00447 Assert.AreEqual("foo", labels["b"].ToString());
00448 Assert.AreEqual("C", labels["c"].ToString());
00449 }
00450
00451 [Test]
00452 public void testParseLabelsInNestedTree()
00453 {
00454 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00455 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00456 CommonTree t = (CommonTree)wiz.Create("(A (B C) (D E))");
00457 IDictionary labels = new Hashtable();
00458 bool valid = wiz.Parse(t, "(%a:A (%b:B %c:C) (%d:D %e:E) )", labels);
00459 Assert.IsTrue(valid);
00460 Assert.AreEqual("A", labels["a"].ToString());
00461 Assert.AreEqual("B", labels["b"].ToString());
00462 Assert.AreEqual("C", labels["c"].ToString());
00463 Assert.AreEqual("D", labels["d"].ToString());
00464 Assert.AreEqual("E", labels["e"].ToString());
00465 }
00466
00467 [Test]
00468 public void testEquals()
00469 {
00470 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00471 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00472 CommonTree t1 = (CommonTree)wiz.Create("(A B C)");
00473 CommonTree t2 = (CommonTree)wiz.Create("(A B C)");
00474 bool same = TreeWizard.Equals(t1, t2, adaptor);
00475 Assert.IsTrue(same);
00476 }
00477
00478 [Test]
00479 public void testEqualsWithText()
00480 {
00481 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00482 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00483 CommonTree t1 = (CommonTree)wiz.Create("(A B[foo] C)");
00484 CommonTree t2 = (CommonTree)wiz.Create("(A B[foo] C)");
00485 bool same = TreeWizard.Equals(t1, t2, adaptor);
00486 Assert.IsTrue(same);
00487 }
00488
00489 [Test]
00490 public void testEqualsWithMismatchedText()
00491 {
00492 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00493 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00494 CommonTree t1 = (CommonTree)wiz.Create("(A B[foo] C)");
00495 CommonTree t2 = (CommonTree)wiz.Create("(A B C)");
00496 bool same = TreeWizard.Equals(t1, t2, adaptor);
00497 Assert.IsTrue(!same);
00498 }
00499
00500 [Test]
00501 public void testFindPattern()
00502 {
00503 ITreeAdaptor adaptor = new CommonTreeAdaptor();
00504 TreeWizard wiz = new TreeWizard(adaptor, tokens);
00505 CommonTree t = (CommonTree)wiz.Create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))");
00506 IList subtrees = wiz.Find(t, "(A B)");
00507 IList elements = subtrees;
00508 string actual = CollectionUtils.ListToString(elements);
00509 string expected = "[foo, big]";
00510 Assert.AreEqual(expected, actual);
00511 }
00512
00513 #endregion
00514 }
00515 }