PageRenderTime 52ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/tool/src/test/java/org/antlr/test/TestTreeWizard.java

https://bitbucket.org/jwalton/antlr3
Java | 411 lines | 341 code | 39 blank | 31 comment | 0 complexity | 40ac68f46e0e927c79e275c5181388e1 MD5 | raw file
  1. /*
  2. * [The "BSD license"]
  3. * Copyright (c) 2010 Terence Parr
  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 the
  13. * documentation and/or other materials provided with the distribution.
  14. * 3. The name of the author may not be used to endorse or promote products
  15. * derived from this software without specific prior written permission.
  16. *
  17. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18. * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. */
  28. package org.antlr.test;
  29. import org.antlr.runtime.tree.CommonTree;
  30. import org.antlr.runtime.tree.CommonTreeAdaptor;
  31. import org.antlr.runtime.tree.TreeAdaptor;
  32. import org.antlr.runtime.tree.TreeWizard;
  33. import org.junit.Test;
  34. import java.util.ArrayList;
  35. import java.util.HashMap;
  36. import java.util.List;
  37. import java.util.Map;
  38. public class TestTreeWizard extends BaseTest {
  39. protected static final String[] tokens =
  40. new String[] {"", "", "", "", "", "A", "B", "C", "D", "E", "ID", "VAR"};
  41. protected static final TreeAdaptor adaptor = new CommonTreeAdaptor();
  42. @Test public void testSingleNode() throws Exception {
  43. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  44. CommonTree t = (CommonTree)wiz.create("ID");
  45. String found = t.toStringTree();
  46. String expecting = "ID";
  47. assertEquals(expecting, found);
  48. }
  49. @Test public void testSingleNodeWithArg() throws Exception {
  50. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  51. CommonTree t = (CommonTree)wiz.create("ID[foo]");
  52. String found = t.toStringTree();
  53. String expecting = "foo";
  54. assertEquals(expecting, found);
  55. }
  56. @Test public void testSingleNodeTree() throws Exception {
  57. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  58. CommonTree t = (CommonTree)wiz.create("(A)");
  59. String found = t.toStringTree();
  60. String expecting = "A";
  61. assertEquals(expecting, found);
  62. }
  63. @Test public void testSingleLevelTree() throws Exception {
  64. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  65. CommonTree t = (CommonTree)wiz.create("(A B C D)");
  66. String found = t.toStringTree();
  67. String expecting = "(A B C D)";
  68. assertEquals(expecting, found);
  69. }
  70. @Test public void testListTree() throws Exception {
  71. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  72. CommonTree t = (CommonTree)wiz.create("(nil A B C)");
  73. String found = t.toStringTree();
  74. String expecting = "A B C";
  75. assertEquals(expecting, found);
  76. }
  77. @Test public void testInvalidListTree() throws Exception {
  78. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  79. CommonTree t = (CommonTree)wiz.create("A B C");
  80. assertTrue(t==null);
  81. }
  82. @Test public void testDoubleLevelTree() throws Exception {
  83. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  84. CommonTree t = (CommonTree)wiz.create("(A (B C) (B D) E)");
  85. String found = t.toStringTree();
  86. String expecting = "(A (B C) (B D) E)";
  87. assertEquals(expecting, found);
  88. }
  89. @Test public void testSingleNodeIndex() throws Exception {
  90. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  91. CommonTree t = (CommonTree)wiz.create("ID");
  92. Map<Integer, List<Object>> m = wiz.index(t);
  93. String found = m.toString();
  94. String expecting = "{10=[ID]}";
  95. assertEquals(expecting, found);
  96. }
  97. @Test public void testNoRepeatsIndex() throws Exception {
  98. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  99. CommonTree t = (CommonTree)wiz.create("(A B C D)");
  100. Map<Integer, List<Object>> m = wiz.index(t);
  101. String found = sortMapToString(m);
  102. String expecting = "{5=[A], 6=[B], 7=[C], 8=[D]}";
  103. assertEquals(expecting, found);
  104. }
  105. @Test public void testRepeatsIndex() throws Exception {
  106. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  107. CommonTree t = (CommonTree)wiz.create("(A B (A C B) B D D)");
  108. Map<Integer, List<Object>> m = wiz.index(t);
  109. String found = sortMapToString(m);
  110. String expecting = "{5=[A, A], 6=[B, B, B], 7=[C], 8=[D, D]}";
  111. assertEquals(expecting, found);
  112. }
  113. @Test public void testNoRepeatsVisit() throws Exception {
  114. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  115. CommonTree t = (CommonTree)wiz.create("(A B C D)");
  116. final List<Object> elements = new ArrayList<Object>();
  117. wiz.visit(t, wiz.getTokenType("B"), new TreeWizard.Visitor() {
  118. @Override
  119. public void visit(Object t) {
  120. elements.add(t);
  121. }
  122. });
  123. String found = elements.toString();
  124. String expecting = "[B]";
  125. assertEquals(expecting, found);
  126. }
  127. @Test public void testNoRepeatsVisit2() throws Exception {
  128. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  129. CommonTree t = (CommonTree)wiz.create("(A B (A C B) B D D)");
  130. final List<Object> elements = new ArrayList<Object>();
  131. wiz.visit(t, wiz.getTokenType("C"),
  132. new TreeWizard.Visitor() {
  133. @Override
  134. public void visit(Object t) {
  135. elements.add(t);
  136. }
  137. });
  138. String found = elements.toString();
  139. String expecting = "[C]";
  140. assertEquals(expecting, found);
  141. }
  142. @Test public void testRepeatsVisit() throws Exception {
  143. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  144. CommonTree t = (CommonTree)wiz.create("(A B (A C B) B D D)");
  145. final List<Object> elements = new ArrayList<Object>();
  146. wiz.visit(t, wiz.getTokenType("B"),
  147. new TreeWizard.Visitor() {
  148. @Override
  149. public void visit(Object t) {
  150. elements.add(t);
  151. }
  152. });
  153. String found = elements.toString();
  154. String expecting = "[B, B, B]";
  155. assertEquals(expecting, found);
  156. }
  157. @Test public void testRepeatsVisit2() throws Exception {
  158. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  159. CommonTree t = (CommonTree)wiz.create("(A B (A C B) B D D)");
  160. final List<Object> elements = new ArrayList<Object>();
  161. wiz.visit(t, wiz.getTokenType("A"),
  162. new TreeWizard.Visitor() {
  163. @Override
  164. public void visit(Object t) {
  165. elements.add(t);
  166. }
  167. });
  168. String found = elements.toString();
  169. String expecting = "[A, A]";
  170. assertEquals(expecting, found);
  171. }
  172. @Test public void testRepeatsVisitWithContext() throws Exception {
  173. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  174. CommonTree t = (CommonTree)wiz.create("(A B (A C B) B D D)");
  175. final List<String> elements = new ArrayList<String>();
  176. wiz.visit(t, wiz.getTokenType("B"),
  177. new TreeWizard.ContextVisitor() {
  178. @Override
  179. public void visit(Object t, Object parent, int childIndex, Map<String, Object> labels) {
  180. elements.add(adaptor.getText(t)+"@"+
  181. (parent!=null?adaptor.getText(parent):"nil")+
  182. "["+childIndex+"]");
  183. }
  184. });
  185. String found = elements.toString();
  186. String expecting = "[B@A[0], B@A[1], B@A[2]]";
  187. assertEquals(expecting, found);
  188. }
  189. @Test public void testRepeatsVisitWithNullParentAndContext() throws Exception {
  190. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  191. CommonTree t = (CommonTree)wiz.create("(A B (A C B) B D D)");
  192. final List<String> elements = new ArrayList<String>();
  193. wiz.visit(t, wiz.getTokenType("A"),
  194. new TreeWizard.ContextVisitor() {
  195. @Override
  196. public void visit(Object t, Object parent, int childIndex, Map<String, Object> labels) {
  197. elements.add(adaptor.getText(t)+"@"+
  198. (parent!=null?adaptor.getText(parent):"nil")+
  199. "["+childIndex+"]");
  200. }
  201. });
  202. String found = elements.toString();
  203. String expecting = "[A@nil[0], A@A[1]]";
  204. assertEquals(expecting, found);
  205. }
  206. @Test public void testVisitPattern() throws Exception {
  207. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  208. CommonTree t = (CommonTree)wiz.create("(A B C (A B) D)");
  209. final List<Object> elements = new ArrayList<Object>();
  210. wiz.visit(t, "(A B)",
  211. new TreeWizard.Visitor() {
  212. @Override
  213. public void visit(Object t) {
  214. elements.add(t);
  215. }
  216. });
  217. String found = elements.toString();
  218. String expecting = "[A]"; // shouldn't match overall root, just (A B)
  219. assertEquals(expecting, found);
  220. }
  221. @Test public void testVisitPatternMultiple() throws Exception {
  222. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  223. CommonTree t = (CommonTree)wiz.create("(A B C (A B) (D (A B)))");
  224. final List<String> elements = new ArrayList<String>();
  225. wiz.visit(t, "(A B)",
  226. new TreeWizard.ContextVisitor() {
  227. @Override
  228. public void visit(Object t, Object parent, int childIndex, Map<String, Object> labels) {
  229. elements.add(adaptor.getText(t)+"@"+
  230. (parent!=null?adaptor.getText(parent):"nil")+
  231. "["+childIndex+"]");
  232. }
  233. });
  234. String found = elements.toString();
  235. String expecting = "[A@A[2], A@D[0]]"; // shouldn't match overall root, just (A B)
  236. assertEquals(expecting, found);
  237. }
  238. @Test public void testVisitPatternMultipleWithLabels() throws Exception {
  239. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  240. CommonTree t = (CommonTree)wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))");
  241. final List<String> elements = new ArrayList<String>();
  242. wiz.visit(t, "(%a:A %b:B)",
  243. new TreeWizard.ContextVisitor() {
  244. @Override
  245. public void visit(Object t, Object parent, int childIndex, Map<String, Object> labels) {
  246. elements.add(adaptor.getText(t)+"@"+
  247. (parent!=null?adaptor.getText(parent):"nil")+
  248. "["+childIndex+"]"+labels.get("a")+"&"+labels.get("b"));
  249. }
  250. });
  251. String found = elements.toString();
  252. String expecting = "[foo@A[2]foo&bar, big@D[0]big&dog]";
  253. assertEquals(expecting, found);
  254. }
  255. @Test public void testParse() throws Exception {
  256. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  257. CommonTree t = (CommonTree)wiz.create("(A B C)");
  258. boolean valid = wiz.parse(t, "(A B C)");
  259. assertTrue(valid);
  260. }
  261. @Test public void testParseSingleNode() throws Exception {
  262. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  263. CommonTree t = (CommonTree)wiz.create("A");
  264. boolean valid = wiz.parse(t, "A");
  265. assertTrue(valid);
  266. }
  267. @Test public void testParseFlatTree() throws Exception {
  268. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  269. CommonTree t = (CommonTree)wiz.create("(nil A B C)");
  270. boolean valid = wiz.parse(t, "(nil A B C)");
  271. assertTrue(valid);
  272. }
  273. @Test public void testWildcard() throws Exception {
  274. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  275. CommonTree t = (CommonTree)wiz.create("(A B C)");
  276. boolean valid = wiz.parse(t, "(A . .)");
  277. assertTrue(valid);
  278. }
  279. @Test public void testParseWithText() throws Exception {
  280. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  281. CommonTree t = (CommonTree)wiz.create("(A B[foo] C[bar])");
  282. // C pattern has no text arg so despite [bar] in t, no need
  283. // to match text--check structure only.
  284. boolean valid = wiz.parse(t, "(A B[foo] C)");
  285. assertTrue(valid);
  286. }
  287. @Test public void testParseWithText2() throws Exception {
  288. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  289. CommonTree t = (CommonTree)wiz.create("(A B[T__32] (C (D E[a])))");
  290. // C pattern has no text arg so despite [bar] in t, no need
  291. // to match text--check structure only.
  292. boolean valid = wiz.parse(t, "(A B[foo] C)");
  293. assertEquals("(A T__32 (C (D a)))", t.toStringTree());
  294. }
  295. @Test public void testParseWithTextFails() throws Exception {
  296. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  297. CommonTree t = (CommonTree)wiz.create("(A B C)");
  298. boolean valid = wiz.parse(t, "(A[foo] B C)");
  299. assertTrue(!valid); // fails
  300. }
  301. @Test public void testParseLabels() throws Exception {
  302. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  303. CommonTree t = (CommonTree)wiz.create("(A B C)");
  304. Map<String, Object> labels = new HashMap<String, Object>();
  305. boolean valid = wiz.parse(t, "(%a:A %b:B %c:C)", labels);
  306. assertTrue(valid);
  307. assertEquals("A", labels.get("a").toString());
  308. assertEquals("B", labels.get("b").toString());
  309. assertEquals("C", labels.get("c").toString());
  310. }
  311. @Test public void testParseWithWildcardLabels() throws Exception {
  312. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  313. CommonTree t = (CommonTree)wiz.create("(A B C)");
  314. Map<String, Object> labels = new HashMap<String, Object>();
  315. boolean valid = wiz.parse(t, "(A %b:. %c:.)", labels);
  316. assertTrue(valid);
  317. assertEquals("B", labels.get("b").toString());
  318. assertEquals("C", labels.get("c").toString());
  319. }
  320. @Test public void testParseLabelsAndTestText() throws Exception {
  321. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  322. CommonTree t = (CommonTree)wiz.create("(A B[foo] C)");
  323. Map<String, Object> labels = new HashMap<String, Object>();
  324. boolean valid = wiz.parse(t, "(%a:A %b:B[foo] %c:C)", labels);
  325. assertTrue(valid);
  326. assertEquals("A", labels.get("a").toString());
  327. assertEquals("foo", labels.get("b").toString());
  328. assertEquals("C", labels.get("c").toString());
  329. }
  330. @Test public void testParseLabelsInNestedTree() throws Exception {
  331. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  332. CommonTree t = (CommonTree)wiz.create("(A (B C) (D E))");
  333. Map<String, Object> labels = new HashMap<String, Object>();
  334. boolean valid = wiz.parse(t, "(%a:A (%b:B %c:C) (%d:D %e:E) )", labels);
  335. assertTrue(valid);
  336. assertEquals("A", labels.get("a").toString());
  337. assertEquals("B", labels.get("b").toString());
  338. assertEquals("C", labels.get("c").toString());
  339. assertEquals("D", labels.get("d").toString());
  340. assertEquals("E", labels.get("e").toString());
  341. }
  342. @Test public void testEquals() throws Exception {
  343. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  344. CommonTree t1 = (CommonTree)wiz.create("(A B C)");
  345. CommonTree t2 = (CommonTree)wiz.create("(A B C)");
  346. boolean same = TreeWizard.equals(t1, t2, adaptor);
  347. assertTrue(same);
  348. }
  349. @Test public void testEqualsWithText() throws Exception {
  350. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  351. CommonTree t1 = (CommonTree)wiz.create("(A B[foo] C)");
  352. CommonTree t2 = (CommonTree)wiz.create("(A B[foo] C)");
  353. boolean same = TreeWizard.equals(t1, t2, adaptor);
  354. assertTrue(same);
  355. }
  356. @Test public void testEqualsWithMismatchedText() throws Exception {
  357. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  358. CommonTree t1 = (CommonTree)wiz.create("(A B[foo] C)");
  359. CommonTree t2 = (CommonTree)wiz.create("(A B C)");
  360. boolean same = TreeWizard.equals(t1, t2, adaptor);
  361. assertTrue(!same);
  362. }
  363. @Test public void testFindPattern() throws Exception {
  364. TreeWizard wiz = new TreeWizard(adaptor, tokens);
  365. CommonTree t = (CommonTree)wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))");
  366. final List<? extends Object> subtrees = wiz.find(t, "(A B)");
  367. List<? extends Object> elements = subtrees;
  368. String found = elements.toString();
  369. String expecting = "[foo, big]";
  370. assertEquals(expecting, found);
  371. }
  372. }