xref: /aosp_15_r20/external/antlr/runtime/Python3/unittests/testtreewizard.py (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robot
2*16467b97STreehugger Robotfrom io import StringIO
3*16467b97STreehugger Robotimport os
4*16467b97STreehugger Robotimport unittest
5*16467b97STreehugger Robot
6*16467b97STreehugger Robotfrom antlr3.tree import CommonTreeAdaptor, CommonTree, INVALID_TOKEN_TYPE
7*16467b97STreehugger Robotfrom antlr3.treewizard import TreeWizard, computeTokenTypes, \
8*16467b97STreehugger Robot     TreePatternLexer, EOF, ID, BEGIN, END, PERCENT, COLON, DOT, ARG, \
9*16467b97STreehugger Robot     TreePatternParser, \
10*16467b97STreehugger Robot     TreePattern, WildcardTreePattern, TreePatternTreeAdaptor
11*16467b97STreehugger Robot
12*16467b97STreehugger Robot
13*16467b97STreehugger Robotclass TestComputeTokenTypes(unittest.TestCase):
14*16467b97STreehugger Robot    """Test case for the computeTokenTypes function."""
15*16467b97STreehugger Robot
16*16467b97STreehugger Robot    def testNone(self):
17*16467b97STreehugger Robot        """computeTokenTypes(None) -> {}"""
18*16467b97STreehugger Robot
19*16467b97STreehugger Robot        typeMap = computeTokenTypes(None)
20*16467b97STreehugger Robot        self.assertIsInstance(typeMap, dict)
21*16467b97STreehugger Robot        self.assertEqual(typeMap, {})
22*16467b97STreehugger Robot
23*16467b97STreehugger Robot
24*16467b97STreehugger Robot    def testList(self):
25*16467b97STreehugger Robot        """computeTokenTypes(['a', 'b']) -> { 'a': 0, 'b': 1 }"""
26*16467b97STreehugger Robot
27*16467b97STreehugger Robot        typeMap = computeTokenTypes(['a', 'b'])
28*16467b97STreehugger Robot        self.assertIsInstance(typeMap, dict)
29*16467b97STreehugger Robot        self.assertEqual(typeMap, { 'a': 0, 'b': 1 })
30*16467b97STreehugger Robot
31*16467b97STreehugger Robot
32*16467b97STreehugger Robotclass TestTreePatternLexer(unittest.TestCase):
33*16467b97STreehugger Robot    """Test case for the TreePatternLexer class."""
34*16467b97STreehugger Robot
35*16467b97STreehugger Robot    def testBegin(self):
36*16467b97STreehugger Robot        """TreePatternLexer(): '('"""
37*16467b97STreehugger Robot
38*16467b97STreehugger Robot        lexer = TreePatternLexer('(')
39*16467b97STreehugger Robot        type = lexer.nextToken()
40*16467b97STreehugger Robot        self.assertEqual(type, BEGIN)
41*16467b97STreehugger Robot        self.assertEqual(lexer.sval, '')
42*16467b97STreehugger Robot        self.assertFalse(lexer.error)
43*16467b97STreehugger Robot
44*16467b97STreehugger Robot
45*16467b97STreehugger Robot    def testEnd(self):
46*16467b97STreehugger Robot        """TreePatternLexer(): ')'"""
47*16467b97STreehugger Robot
48*16467b97STreehugger Robot        lexer = TreePatternLexer(')')
49*16467b97STreehugger Robot        type = lexer.nextToken()
50*16467b97STreehugger Robot        self.assertEqual(type, END)
51*16467b97STreehugger Robot        self.assertEqual(lexer.sval, '')
52*16467b97STreehugger Robot        self.assertFalse(lexer.error)
53*16467b97STreehugger Robot
54*16467b97STreehugger Robot
55*16467b97STreehugger Robot    def testPercent(self):
56*16467b97STreehugger Robot        """TreePatternLexer(): '%'"""
57*16467b97STreehugger Robot
58*16467b97STreehugger Robot        lexer = TreePatternLexer('%')
59*16467b97STreehugger Robot        type = lexer.nextToken()
60*16467b97STreehugger Robot        self.assertEqual(type, PERCENT)
61*16467b97STreehugger Robot        self.assertEqual(lexer.sval, '')
62*16467b97STreehugger Robot        self.assertFalse(lexer.error)
63*16467b97STreehugger Robot
64*16467b97STreehugger Robot
65*16467b97STreehugger Robot    def testDot(self):
66*16467b97STreehugger Robot        """TreePatternLexer(): '.'"""
67*16467b97STreehugger Robot
68*16467b97STreehugger Robot        lexer = TreePatternLexer('.')
69*16467b97STreehugger Robot        type = lexer.nextToken()
70*16467b97STreehugger Robot        self.assertEqual(type, DOT)
71*16467b97STreehugger Robot        self.assertEqual(lexer.sval, '')
72*16467b97STreehugger Robot        self.assertFalse(lexer.error)
73*16467b97STreehugger Robot
74*16467b97STreehugger Robot
75*16467b97STreehugger Robot    def testColon(self):
76*16467b97STreehugger Robot        """TreePatternLexer(): ':'"""
77*16467b97STreehugger Robot
78*16467b97STreehugger Robot        lexer = TreePatternLexer(':')
79*16467b97STreehugger Robot        type = lexer.nextToken()
80*16467b97STreehugger Robot        self.assertEqual(type, COLON)
81*16467b97STreehugger Robot        self.assertEqual(lexer.sval, '')
82*16467b97STreehugger Robot        self.assertFalse(lexer.error)
83*16467b97STreehugger Robot
84*16467b97STreehugger Robot
85*16467b97STreehugger Robot    def testEOF(self):
86*16467b97STreehugger Robot        """TreePatternLexer(): EOF"""
87*16467b97STreehugger Robot
88*16467b97STreehugger Robot        lexer = TreePatternLexer('  \n \r \t ')
89*16467b97STreehugger Robot        type = lexer.nextToken()
90*16467b97STreehugger Robot        self.assertEqual(type, EOF)
91*16467b97STreehugger Robot        self.assertEqual(lexer.sval, '')
92*16467b97STreehugger Robot        self.assertFalse(lexer.error)
93*16467b97STreehugger Robot
94*16467b97STreehugger Robot
95*16467b97STreehugger Robot    def testID(self):
96*16467b97STreehugger Robot        """TreePatternLexer(): ID"""
97*16467b97STreehugger Robot
98*16467b97STreehugger Robot        lexer = TreePatternLexer('_foo12_bar')
99*16467b97STreehugger Robot        type = lexer.nextToken()
100*16467b97STreehugger Robot        self.assertEqual(type, ID)
101*16467b97STreehugger Robot        self.assertEqual(lexer.sval, '_foo12_bar')
102*16467b97STreehugger Robot        self.assertFalse(lexer.error)
103*16467b97STreehugger Robot
104*16467b97STreehugger Robot
105*16467b97STreehugger Robot    def testARG(self):
106*16467b97STreehugger Robot        """TreePatternLexer(): ARG"""
107*16467b97STreehugger Robot
108*16467b97STreehugger Robot        lexer = TreePatternLexer(r'[ \]bla\n]')
109*16467b97STreehugger Robot        type = lexer.nextToken()
110*16467b97STreehugger Robot        self.assertEqual(type, ARG)
111*16467b97STreehugger Robot        self.assertEqual(lexer.sval, r' ]bla\n')
112*16467b97STreehugger Robot        self.assertFalse(lexer.error)
113*16467b97STreehugger Robot
114*16467b97STreehugger Robot
115*16467b97STreehugger Robot    def testError(self):
116*16467b97STreehugger Robot        """TreePatternLexer(): error"""
117*16467b97STreehugger Robot
118*16467b97STreehugger Robot        lexer = TreePatternLexer('1')
119*16467b97STreehugger Robot        type = lexer.nextToken()
120*16467b97STreehugger Robot        self.assertEqual(type, EOF)
121*16467b97STreehugger Robot        self.assertEqual(lexer.sval, '')
122*16467b97STreehugger Robot        self.assertTrue(lexer.error)
123*16467b97STreehugger Robot
124*16467b97STreehugger Robot
125*16467b97STreehugger Robotclass TestTreePatternParser(unittest.TestCase):
126*16467b97STreehugger Robot    """Test case for the TreePatternParser class."""
127*16467b97STreehugger Robot
128*16467b97STreehugger Robot    def setUp(self):
129*16467b97STreehugger Robot        """Setup text fixure
130*16467b97STreehugger Robot
131*16467b97STreehugger Robot        We need a tree adaptor, use CommonTreeAdaptor.
132*16467b97STreehugger Robot        And a constant list of token names.
133*16467b97STreehugger Robot
134*16467b97STreehugger Robot        """
135*16467b97STreehugger Robot
136*16467b97STreehugger Robot        self.adaptor = CommonTreeAdaptor()
137*16467b97STreehugger Robot        self.tokens = [
138*16467b97STreehugger Robot            "", "", "", "", "", "A", "B", "C", "D", "E", "ID", "VAR"
139*16467b97STreehugger Robot            ]
140*16467b97STreehugger Robot        self.wizard = TreeWizard(self.adaptor, tokenNames=self.tokens)
141*16467b97STreehugger Robot
142*16467b97STreehugger Robot
143*16467b97STreehugger Robot    def testSingleNode(self):
144*16467b97STreehugger Robot        """TreePatternParser: 'ID'"""
145*16467b97STreehugger Robot        lexer = TreePatternLexer('ID')
146*16467b97STreehugger Robot        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
147*16467b97STreehugger Robot        tree = parser.pattern()
148*16467b97STreehugger Robot        self.assertIsInstance(tree, CommonTree)
149*16467b97STreehugger Robot        self.assertEqual(tree.getType(), 10)
150*16467b97STreehugger Robot        self.assertEqual(tree.getText(), 'ID')
151*16467b97STreehugger Robot
152*16467b97STreehugger Robot
153*16467b97STreehugger Robot    def testSingleNodeWithArg(self):
154*16467b97STreehugger Robot        """TreePatternParser: 'ID[foo]'"""
155*16467b97STreehugger Robot        lexer = TreePatternLexer('ID[foo]')
156*16467b97STreehugger Robot        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
157*16467b97STreehugger Robot        tree = parser.pattern()
158*16467b97STreehugger Robot        self.assertIsInstance(tree, CommonTree)
159*16467b97STreehugger Robot        self.assertEqual(tree.getType(), 10)
160*16467b97STreehugger Robot        self.assertEqual(tree.getText(), 'foo')
161*16467b97STreehugger Robot
162*16467b97STreehugger Robot
163*16467b97STreehugger Robot    def testSingleLevelTree(self):
164*16467b97STreehugger Robot        """TreePatternParser: '(A B)'"""
165*16467b97STreehugger Robot        lexer = TreePatternLexer('(A B)')
166*16467b97STreehugger Robot        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
167*16467b97STreehugger Robot        tree = parser.pattern()
168*16467b97STreehugger Robot        self.assertIsInstance(tree, CommonTree)
169*16467b97STreehugger Robot        self.assertEqual(tree.getType(), 5)
170*16467b97STreehugger Robot        self.assertEqual(tree.getText(), 'A')
171*16467b97STreehugger Robot        self.assertEqual(tree.getChildCount(), 1)
172*16467b97STreehugger Robot        self.assertEqual(tree.getChild(0).getType(), 6)
173*16467b97STreehugger Robot        self.assertEqual(tree.getChild(0).getText(), 'B')
174*16467b97STreehugger Robot
175*16467b97STreehugger Robot
176*16467b97STreehugger Robot    def testNil(self):
177*16467b97STreehugger Robot        """TreePatternParser: 'nil'"""
178*16467b97STreehugger Robot        lexer = TreePatternLexer('nil')
179*16467b97STreehugger Robot        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
180*16467b97STreehugger Robot        tree = parser.pattern()
181*16467b97STreehugger Robot        self.assertIsInstance(tree, CommonTree)
182*16467b97STreehugger Robot        self.assertEqual(tree.getType(), 0)
183*16467b97STreehugger Robot        self.assertIsNone(tree.getText())
184*16467b97STreehugger Robot
185*16467b97STreehugger Robot
186*16467b97STreehugger Robot    def testWildcard(self):
187*16467b97STreehugger Robot        """TreePatternParser: '(.)'"""
188*16467b97STreehugger Robot        lexer = TreePatternLexer('(.)')
189*16467b97STreehugger Robot        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
190*16467b97STreehugger Robot        tree = parser.pattern()
191*16467b97STreehugger Robot        self.assertIsInstance(tree, WildcardTreePattern)
192*16467b97STreehugger Robot
193*16467b97STreehugger Robot
194*16467b97STreehugger Robot    def testLabel(self):
195*16467b97STreehugger Robot        """TreePatternParser: '(%a:A)'"""
196*16467b97STreehugger Robot        lexer = TreePatternLexer('(%a:A)')
197*16467b97STreehugger Robot        parser = TreePatternParser(lexer, self.wizard, TreePatternTreeAdaptor())
198*16467b97STreehugger Robot        tree = parser.pattern()
199*16467b97STreehugger Robot        self.assertIsInstance(tree, TreePattern)
200*16467b97STreehugger Robot        self.assertEqual(tree.label, 'a')
201*16467b97STreehugger Robot
202*16467b97STreehugger Robot
203*16467b97STreehugger Robot    def testError1(self):
204*16467b97STreehugger Robot        """TreePatternParser: ')'"""
205*16467b97STreehugger Robot        lexer = TreePatternLexer(')')
206*16467b97STreehugger Robot        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
207*16467b97STreehugger Robot        tree = parser.pattern()
208*16467b97STreehugger Robot        self.assertIsNone(tree)
209*16467b97STreehugger Robot
210*16467b97STreehugger Robot
211*16467b97STreehugger Robot    def testError2(self):
212*16467b97STreehugger Robot        """TreePatternParser: '()'"""
213*16467b97STreehugger Robot        lexer = TreePatternLexer('()')
214*16467b97STreehugger Robot        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
215*16467b97STreehugger Robot        tree = parser.pattern()
216*16467b97STreehugger Robot        self.assertIsNone(tree)
217*16467b97STreehugger Robot
218*16467b97STreehugger Robot
219*16467b97STreehugger Robot    def testError3(self):
220*16467b97STreehugger Robot        """TreePatternParser: '(A ])'"""
221*16467b97STreehugger Robot        lexer = TreePatternLexer('(A ])')
222*16467b97STreehugger Robot        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
223*16467b97STreehugger Robot        tree = parser.pattern()
224*16467b97STreehugger Robot        self.assertIsNone(tree)
225*16467b97STreehugger Robot
226*16467b97STreehugger Robot
227*16467b97STreehugger Robotclass TestTreeWizard(unittest.TestCase):
228*16467b97STreehugger Robot    """Test case for the TreeWizard class."""
229*16467b97STreehugger Robot
230*16467b97STreehugger Robot    def setUp(self):
231*16467b97STreehugger Robot        """Setup text fixure
232*16467b97STreehugger Robot
233*16467b97STreehugger Robot        We need a tree adaptor, use CommonTreeAdaptor.
234*16467b97STreehugger Robot        And a constant list of token names.
235*16467b97STreehugger Robot
236*16467b97STreehugger Robot        """
237*16467b97STreehugger Robot
238*16467b97STreehugger Robot        self.adaptor = CommonTreeAdaptor()
239*16467b97STreehugger Robot        self.tokens = [
240*16467b97STreehugger Robot            "", "", "", "", "", "A", "B", "C", "D", "E", "ID", "VAR"
241*16467b97STreehugger Robot            ]
242*16467b97STreehugger Robot
243*16467b97STreehugger Robot
244*16467b97STreehugger Robot    def testInit(self):
245*16467b97STreehugger Robot        """TreeWizard.__init__()"""
246*16467b97STreehugger Robot
247*16467b97STreehugger Robot        wiz = TreeWizard(
248*16467b97STreehugger Robot            self.adaptor,
249*16467b97STreehugger Robot            tokenNames=['a', 'b']
250*16467b97STreehugger Robot            )
251*16467b97STreehugger Robot
252*16467b97STreehugger Robot        self.assertIs(wiz.adaptor, self.adaptor)
253*16467b97STreehugger Robot        self.assertEqual(
254*16467b97STreehugger Robot            wiz.tokenNameToTypeMap,
255*16467b97STreehugger Robot            { 'a': 0, 'b': 1 }
256*16467b97STreehugger Robot            )
257*16467b97STreehugger Robot
258*16467b97STreehugger Robot
259*16467b97STreehugger Robot    def testGetTokenType(self):
260*16467b97STreehugger Robot        """TreeWizard.getTokenType()"""
261*16467b97STreehugger Robot
262*16467b97STreehugger Robot        wiz = TreeWizard(
263*16467b97STreehugger Robot            self.adaptor,
264*16467b97STreehugger Robot            tokenNames=self.tokens
265*16467b97STreehugger Robot            )
266*16467b97STreehugger Robot
267*16467b97STreehugger Robot        self.assertEqual(
268*16467b97STreehugger Robot            wiz.getTokenType('A'),
269*16467b97STreehugger Robot            5
270*16467b97STreehugger Robot            )
271*16467b97STreehugger Robot
272*16467b97STreehugger Robot        self.assertEqual(
273*16467b97STreehugger Robot            wiz.getTokenType('VAR'),
274*16467b97STreehugger Robot            11
275*16467b97STreehugger Robot            )
276*16467b97STreehugger Robot
277*16467b97STreehugger Robot        self.assertEqual(
278*16467b97STreehugger Robot            wiz.getTokenType('invalid'),
279*16467b97STreehugger Robot            INVALID_TOKEN_TYPE
280*16467b97STreehugger Robot            )
281*16467b97STreehugger Robot
282*16467b97STreehugger Robot    def testSingleNode(self):
283*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
284*16467b97STreehugger Robot        t = wiz.create("ID")
285*16467b97STreehugger Robot        found = t.toStringTree()
286*16467b97STreehugger Robot        expecting = "ID"
287*16467b97STreehugger Robot        self.assertEqual(expecting, found)
288*16467b97STreehugger Robot
289*16467b97STreehugger Robot
290*16467b97STreehugger Robot    def testSingleNodeWithArg(self):
291*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
292*16467b97STreehugger Robot        t = wiz.create("ID[foo]")
293*16467b97STreehugger Robot        found = t.toStringTree()
294*16467b97STreehugger Robot        expecting = "foo"
295*16467b97STreehugger Robot        self.assertEqual(expecting, found)
296*16467b97STreehugger Robot
297*16467b97STreehugger Robot
298*16467b97STreehugger Robot    def testSingleNodeTree(self):
299*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
300*16467b97STreehugger Robot        t = wiz.create("(A)")
301*16467b97STreehugger Robot        found = t.toStringTree()
302*16467b97STreehugger Robot        expecting = "A"
303*16467b97STreehugger Robot        self.assertEqual(expecting, found)
304*16467b97STreehugger Robot
305*16467b97STreehugger Robot
306*16467b97STreehugger Robot    def testSingleLevelTree(self):
307*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
308*16467b97STreehugger Robot        t = wiz.create("(A B C D)")
309*16467b97STreehugger Robot        found = t.toStringTree()
310*16467b97STreehugger Robot        expecting = "(A B C D)"
311*16467b97STreehugger Robot        self.assertEqual(expecting, found)
312*16467b97STreehugger Robot
313*16467b97STreehugger Robot
314*16467b97STreehugger Robot    def testListTree(self):
315*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
316*16467b97STreehugger Robot        t = wiz.create("(nil A B C)")
317*16467b97STreehugger Robot        found = t.toStringTree()
318*16467b97STreehugger Robot        expecting = "A B C"
319*16467b97STreehugger Robot        self.assertEqual(expecting, found)
320*16467b97STreehugger Robot
321*16467b97STreehugger Robot
322*16467b97STreehugger Robot    def testInvalidListTree(self):
323*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
324*16467b97STreehugger Robot        t = wiz.create("A B C")
325*16467b97STreehugger Robot        self.assertIsNone(t)
326*16467b97STreehugger Robot
327*16467b97STreehugger Robot
328*16467b97STreehugger Robot    def testDoubleLevelTree(self):
329*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
330*16467b97STreehugger Robot        t = wiz.create("(A (B C) (B D) E)")
331*16467b97STreehugger Robot        found = t.toStringTree()
332*16467b97STreehugger Robot        expecting = "(A (B C) (B D) E)"
333*16467b97STreehugger Robot        self.assertEqual(expecting, found)
334*16467b97STreehugger Robot
335*16467b97STreehugger Robot
336*16467b97STreehugger Robot    def __simplifyIndexMap(self, indexMap):
337*16467b97STreehugger Robot        return dict( # stringify nodes for easy comparing
338*16467b97STreehugger Robot            (ttype, [str(node) for node in nodes])
339*16467b97STreehugger Robot            for ttype, nodes in indexMap.items()
340*16467b97STreehugger Robot            )
341*16467b97STreehugger Robot
342*16467b97STreehugger Robot    def testSingleNodeIndex(self):
343*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
344*16467b97STreehugger Robot        tree = wiz.create("ID")
345*16467b97STreehugger Robot        indexMap = wiz.index(tree)
346*16467b97STreehugger Robot        found = self.__simplifyIndexMap(indexMap)
347*16467b97STreehugger Robot        expecting = { 10: ["ID"] }
348*16467b97STreehugger Robot        self.assertEqual(expecting, found)
349*16467b97STreehugger Robot
350*16467b97STreehugger Robot
351*16467b97STreehugger Robot    def testNoRepeatsIndex(self):
352*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
353*16467b97STreehugger Robot        tree = wiz.create("(A B C D)")
354*16467b97STreehugger Robot        indexMap = wiz.index(tree)
355*16467b97STreehugger Robot        found = self.__simplifyIndexMap(indexMap)
356*16467b97STreehugger Robot        expecting = { 8:['D'], 6:['B'], 7:['C'], 5:['A'] }
357*16467b97STreehugger Robot        self.assertEqual(expecting, found)
358*16467b97STreehugger Robot
359*16467b97STreehugger Robot
360*16467b97STreehugger Robot    def testRepeatsIndex(self):
361*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
362*16467b97STreehugger Robot        tree = wiz.create("(A B (A C B) B D D)")
363*16467b97STreehugger Robot        indexMap = wiz.index(tree)
364*16467b97STreehugger Robot        found = self.__simplifyIndexMap(indexMap)
365*16467b97STreehugger Robot        expecting = { 8: ['D', 'D'], 6: ['B', 'B', 'B'], 7: ['C'], 5: ['A', 'A'] }
366*16467b97STreehugger Robot        self.assertEqual(expecting, found)
367*16467b97STreehugger Robot
368*16467b97STreehugger Robot
369*16467b97STreehugger Robot    def testNoRepeatsVisit(self):
370*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
371*16467b97STreehugger Robot        tree = wiz.create("(A B C D)")
372*16467b97STreehugger Robot
373*16467b97STreehugger Robot        elements = []
374*16467b97STreehugger Robot        def visitor(node, parent, childIndex, labels):
375*16467b97STreehugger Robot            elements.append(str(node))
376*16467b97STreehugger Robot
377*16467b97STreehugger Robot        wiz.visit(tree, wiz.getTokenType("B"), visitor)
378*16467b97STreehugger Robot
379*16467b97STreehugger Robot        expecting = ['B']
380*16467b97STreehugger Robot        self.assertEqual(expecting, elements)
381*16467b97STreehugger Robot
382*16467b97STreehugger Robot
383*16467b97STreehugger Robot    def testNoRepeatsVisit2(self):
384*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
385*16467b97STreehugger Robot        tree = wiz.create("(A B (A C B) B D D)")
386*16467b97STreehugger Robot
387*16467b97STreehugger Robot        elements = []
388*16467b97STreehugger Robot        def visitor(node, parent, childIndex, labels):
389*16467b97STreehugger Robot            elements.append(str(node))
390*16467b97STreehugger Robot
391*16467b97STreehugger Robot        wiz.visit(tree, wiz.getTokenType("C"), visitor)
392*16467b97STreehugger Robot
393*16467b97STreehugger Robot        expecting = ['C']
394*16467b97STreehugger Robot        self.assertEqual(expecting, elements)
395*16467b97STreehugger Robot
396*16467b97STreehugger Robot
397*16467b97STreehugger Robot    def testRepeatsVisit(self):
398*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
399*16467b97STreehugger Robot        tree = wiz.create("(A B (A C B) B D D)")
400*16467b97STreehugger Robot
401*16467b97STreehugger Robot        elements = []
402*16467b97STreehugger Robot        def visitor(node, parent, childIndex, labels):
403*16467b97STreehugger Robot            elements.append(str(node))
404*16467b97STreehugger Robot
405*16467b97STreehugger Robot        wiz.visit(tree, wiz.getTokenType("B"), visitor)
406*16467b97STreehugger Robot
407*16467b97STreehugger Robot        expecting = ['B', 'B', 'B']
408*16467b97STreehugger Robot        self.assertEqual(expecting, elements)
409*16467b97STreehugger Robot
410*16467b97STreehugger Robot
411*16467b97STreehugger Robot    def testRepeatsVisit2(self):
412*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
413*16467b97STreehugger Robot        tree = wiz.create("(A B (A C B) B D D)")
414*16467b97STreehugger Robot
415*16467b97STreehugger Robot        elements = []
416*16467b97STreehugger Robot        def visitor(node, parent, childIndex, labels):
417*16467b97STreehugger Robot            elements.append(str(node))
418*16467b97STreehugger Robot
419*16467b97STreehugger Robot        wiz.visit(tree, wiz.getTokenType("A"), visitor)
420*16467b97STreehugger Robot
421*16467b97STreehugger Robot        expecting = ['A', 'A']
422*16467b97STreehugger Robot        self.assertEqual(expecting, elements)
423*16467b97STreehugger Robot
424*16467b97STreehugger Robot
425*16467b97STreehugger Robot    def testRepeatsVisitWithContext(self):
426*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
427*16467b97STreehugger Robot        tree = wiz.create("(A B (A C B) B D D)")
428*16467b97STreehugger Robot
429*16467b97STreehugger Robot        elements = []
430*16467b97STreehugger Robot        def visitor(node, parent, childIndex, labels):
431*16467b97STreehugger Robot            elements.append('{}@{}[{}]'.format(node, parent, childIndex))
432*16467b97STreehugger Robot
433*16467b97STreehugger Robot        wiz.visit(tree, wiz.getTokenType("B"), visitor)
434*16467b97STreehugger Robot
435*16467b97STreehugger Robot        expecting = ['B@A[0]', 'B@A[1]', 'B@A[2]']
436*16467b97STreehugger Robot        self.assertEqual(expecting, elements)
437*16467b97STreehugger Robot
438*16467b97STreehugger Robot
439*16467b97STreehugger Robot    def testRepeatsVisitWithNullParentAndContext(self):
440*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
441*16467b97STreehugger Robot        tree = wiz.create("(A B (A C B) B D D)")
442*16467b97STreehugger Robot
443*16467b97STreehugger Robot        elements = []
444*16467b97STreehugger Robot        def visitor(node, parent, childIndex, labels):
445*16467b97STreehugger Robot            elements.append(
446*16467b97STreehugger Robot                '{}@{}[{}]'.format(
447*16467b97STreehugger Robot                    node, parent or 'nil', childIndex)
448*16467b97STreehugger Robot                )
449*16467b97STreehugger Robot
450*16467b97STreehugger Robot        wiz.visit(tree, wiz.getTokenType("A"), visitor)
451*16467b97STreehugger Robot
452*16467b97STreehugger Robot        expecting = ['A@nil[0]', 'A@A[1]']
453*16467b97STreehugger Robot        self.assertEqual(expecting, elements)
454*16467b97STreehugger Robot
455*16467b97STreehugger Robot
456*16467b97STreehugger Robot    def testVisitPattern(self):
457*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
458*16467b97STreehugger Robot        tree = wiz.create("(A B C (A B) D)")
459*16467b97STreehugger Robot
460*16467b97STreehugger Robot        elements = []
461*16467b97STreehugger Robot        def visitor(node, parent, childIndex, labels):
462*16467b97STreehugger Robot            elements.append(
463*16467b97STreehugger Robot                str(node)
464*16467b97STreehugger Robot                )
465*16467b97STreehugger Robot
466*16467b97STreehugger Robot        wiz.visit(tree, '(A B)', visitor)
467*16467b97STreehugger Robot
468*16467b97STreehugger Robot        expecting = ['A'] # shouldn't match overall root, just (A B)
469*16467b97STreehugger Robot        self.assertEqual(expecting, elements)
470*16467b97STreehugger Robot
471*16467b97STreehugger Robot
472*16467b97STreehugger Robot    def testVisitPatternMultiple(self):
473*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
474*16467b97STreehugger Robot        tree = wiz.create("(A B C (A B) (D (A B)))")
475*16467b97STreehugger Robot
476*16467b97STreehugger Robot        elements = []
477*16467b97STreehugger Robot        def visitor(node, parent, childIndex, labels):
478*16467b97STreehugger Robot            elements.append(
479*16467b97STreehugger Robot                '{}@{}[{}]'.format(node, parent or 'nil', childIndex)
480*16467b97STreehugger Robot                )
481*16467b97STreehugger Robot
482*16467b97STreehugger Robot        wiz.visit(tree, '(A B)', visitor)
483*16467b97STreehugger Robot
484*16467b97STreehugger Robot        expecting = ['A@A[2]', 'A@D[0]']
485*16467b97STreehugger Robot        self.assertEqual(expecting, elements)
486*16467b97STreehugger Robot
487*16467b97STreehugger Robot
488*16467b97STreehugger Robot    def testVisitPatternMultipleWithLabels(self):
489*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
490*16467b97STreehugger Robot        tree = wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
491*16467b97STreehugger Robot
492*16467b97STreehugger Robot        elements = []
493*16467b97STreehugger Robot        def visitor(node, parent, childIndex, labels):
494*16467b97STreehugger Robot            elements.append(
495*16467b97STreehugger Robot                '{}@{}[{}]{}&{}'.format(
496*16467b97STreehugger Robot                    node,
497*16467b97STreehugger Robot                    parent or 'nil',
498*16467b97STreehugger Robot                    childIndex,
499*16467b97STreehugger Robot                    labels['a'],
500*16467b97STreehugger Robot                    labels['b'],
501*16467b97STreehugger Robot                    )
502*16467b97STreehugger Robot                )
503*16467b97STreehugger Robot
504*16467b97STreehugger Robot        wiz.visit(tree, '(%a:A %b:B)', visitor)
505*16467b97STreehugger Robot
506*16467b97STreehugger Robot        expecting = ['foo@A[2]foo&bar', 'big@D[0]big&dog']
507*16467b97STreehugger Robot        self.assertEqual(expecting, elements)
508*16467b97STreehugger Robot
509*16467b97STreehugger Robot
510*16467b97STreehugger Robot    def testParse(self):
511*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
512*16467b97STreehugger Robot        t = wiz.create("(A B C)")
513*16467b97STreehugger Robot        valid = wiz.parse(t, "(A B C)")
514*16467b97STreehugger Robot        self.assertTrue(valid)
515*16467b97STreehugger Robot
516*16467b97STreehugger Robot
517*16467b97STreehugger Robot    def testParseSingleNode(self):
518*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
519*16467b97STreehugger Robot        t = wiz.create("A")
520*16467b97STreehugger Robot        valid = wiz.parse(t, "A")
521*16467b97STreehugger Robot        self.assertTrue(valid)
522*16467b97STreehugger Robot
523*16467b97STreehugger Robot
524*16467b97STreehugger Robot    def testParseSingleNodeFails(self):
525*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
526*16467b97STreehugger Robot        t = wiz.create("A")
527*16467b97STreehugger Robot        valid = wiz.parse(t, "B")
528*16467b97STreehugger Robot        self.assertFalse(valid)
529*16467b97STreehugger Robot
530*16467b97STreehugger Robot
531*16467b97STreehugger Robot    def testParseFlatTree(self):
532*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
533*16467b97STreehugger Robot        t = wiz.create("(nil A B C)")
534*16467b97STreehugger Robot        valid = wiz.parse(t, "(nil A B C)")
535*16467b97STreehugger Robot        self.assertTrue(valid)
536*16467b97STreehugger Robot
537*16467b97STreehugger Robot
538*16467b97STreehugger Robot    def testParseFlatTreeFails(self):
539*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
540*16467b97STreehugger Robot        t = wiz.create("(nil A B C)")
541*16467b97STreehugger Robot        valid = wiz.parse(t, "(nil A B)")
542*16467b97STreehugger Robot        self.assertFalse(valid)
543*16467b97STreehugger Robot
544*16467b97STreehugger Robot
545*16467b97STreehugger Robot    def testParseFlatTreeFails2(self):
546*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
547*16467b97STreehugger Robot        t = wiz.create("(nil A B C)")
548*16467b97STreehugger Robot        valid = wiz.parse(t, "(nil A B A)")
549*16467b97STreehugger Robot        self.assertFalse(valid)
550*16467b97STreehugger Robot
551*16467b97STreehugger Robot
552*16467b97STreehugger Robot    def testWildcard(self):
553*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
554*16467b97STreehugger Robot        t = wiz.create("(A B C)")
555*16467b97STreehugger Robot        valid = wiz.parse(t, "(A . .)")
556*16467b97STreehugger Robot        self.assertTrue(valid)
557*16467b97STreehugger Robot
558*16467b97STreehugger Robot
559*16467b97STreehugger Robot    def testParseWithText(self):
560*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
561*16467b97STreehugger Robot        t = wiz.create("(A B[foo] C[bar])")
562*16467b97STreehugger Robot        # C pattern has no text arg so despite [bar] in t, no need
563*16467b97STreehugger Robot        # to match text--check structure only.
564*16467b97STreehugger Robot        valid = wiz.parse(t, "(A B[foo] C)")
565*16467b97STreehugger Robot        self.assertTrue(valid)
566*16467b97STreehugger Robot
567*16467b97STreehugger Robot
568*16467b97STreehugger Robot    def testParseWithText2(self):
569*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
570*16467b97STreehugger Robot        t = wiz.create("(A B[T__32] (C (D E[a])))")
571*16467b97STreehugger Robot        # C pattern has no text arg so despite [bar] in t, no need
572*16467b97STreehugger Robot        # to match text--check structure only.
573*16467b97STreehugger Robot        valid = wiz.parse(t, "(A B[foo] C)")
574*16467b97STreehugger Robot        self.assertEqual("(A T__32 (C (D a)))", t.toStringTree())
575*16467b97STreehugger Robot
576*16467b97STreehugger Robot
577*16467b97STreehugger Robot    def testParseWithTextFails(self):
578*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
579*16467b97STreehugger Robot        t = wiz.create("(A B C)")
580*16467b97STreehugger Robot        valid = wiz.parse(t, "(A[foo] B C)")
581*16467b97STreehugger Robot        self.assertFalse(valid) # fails
582*16467b97STreehugger Robot
583*16467b97STreehugger Robot
584*16467b97STreehugger Robot    def testParseLabels(self):
585*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
586*16467b97STreehugger Robot        t = wiz.create("(A B C)")
587*16467b97STreehugger Robot        labels = {}
588*16467b97STreehugger Robot        valid = wiz.parse(t, "(%a:A %b:B %c:C)", labels)
589*16467b97STreehugger Robot        self.assertTrue(valid)
590*16467b97STreehugger Robot        self.assertEqual("A", str(labels["a"]))
591*16467b97STreehugger Robot        self.assertEqual("B", str(labels["b"]))
592*16467b97STreehugger Robot        self.assertEqual("C", str(labels["c"]))
593*16467b97STreehugger Robot
594*16467b97STreehugger Robot
595*16467b97STreehugger Robot    def testParseWithWildcardLabels(self):
596*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
597*16467b97STreehugger Robot        t = wiz.create("(A B C)")
598*16467b97STreehugger Robot        labels = {}
599*16467b97STreehugger Robot        valid = wiz.parse(t, "(A %b:. %c:.)", labels)
600*16467b97STreehugger Robot        self.assertTrue(valid)
601*16467b97STreehugger Robot        self.assertEqual("B", str(labels["b"]))
602*16467b97STreehugger Robot        self.assertEqual("C", str(labels["c"]))
603*16467b97STreehugger Robot
604*16467b97STreehugger Robot
605*16467b97STreehugger Robot    def testParseLabelsAndTestText(self):
606*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
607*16467b97STreehugger Robot        t = wiz.create("(A B[foo] C)")
608*16467b97STreehugger Robot        labels = {}
609*16467b97STreehugger Robot        valid = wiz.parse(t, "(%a:A %b:B[foo] %c:C)", labels)
610*16467b97STreehugger Robot        self.assertTrue(valid)
611*16467b97STreehugger Robot        self.assertEqual("A", str(labels["a"]))
612*16467b97STreehugger Robot        self.assertEqual("foo", str(labels["b"]))
613*16467b97STreehugger Robot        self.assertEqual("C", str(labels["c"]))
614*16467b97STreehugger Robot
615*16467b97STreehugger Robot
616*16467b97STreehugger Robot    def testParseLabelsInNestedTree(self):
617*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
618*16467b97STreehugger Robot        t = wiz.create("(A (B C) (D E))")
619*16467b97STreehugger Robot        labels = {}
620*16467b97STreehugger Robot        valid = wiz.parse(t, "(%a:A (%b:B %c:C) (%d:D %e:E) )", labels)
621*16467b97STreehugger Robot        self.assertTrue(valid)
622*16467b97STreehugger Robot        self.assertEqual("A", str(labels["a"]))
623*16467b97STreehugger Robot        self.assertEqual("B", str(labels["b"]))
624*16467b97STreehugger Robot        self.assertEqual("C", str(labels["c"]))
625*16467b97STreehugger Robot        self.assertEqual("D", str(labels["d"]))
626*16467b97STreehugger Robot        self.assertEqual("E", str(labels["e"]))
627*16467b97STreehugger Robot
628*16467b97STreehugger Robot
629*16467b97STreehugger Robot    def testEquals(self):
630*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
631*16467b97STreehugger Robot        t1 = wiz.create("(A B C)")
632*16467b97STreehugger Robot        t2 = wiz.create("(A B C)")
633*16467b97STreehugger Robot        same = wiz.equals(t1, t2)
634*16467b97STreehugger Robot        self.assertTrue(same)
635*16467b97STreehugger Robot
636*16467b97STreehugger Robot
637*16467b97STreehugger Robot    def testEqualsWithText(self):
638*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
639*16467b97STreehugger Robot        t1 = wiz.create("(A B[foo] C)")
640*16467b97STreehugger Robot        t2 = wiz.create("(A B[foo] C)")
641*16467b97STreehugger Robot        same = wiz.equals(t1, t2)
642*16467b97STreehugger Robot        self.assertTrue(same)
643*16467b97STreehugger Robot
644*16467b97STreehugger Robot
645*16467b97STreehugger Robot    def testEqualsWithMismatchedText(self):
646*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
647*16467b97STreehugger Robot        t1 = wiz.create("(A B[foo] C)")
648*16467b97STreehugger Robot        t2 = wiz.create("(A B C)")
649*16467b97STreehugger Robot        same = wiz.equals(t1, t2)
650*16467b97STreehugger Robot        self.assertFalse(same)
651*16467b97STreehugger Robot
652*16467b97STreehugger Robot
653*16467b97STreehugger Robot    def testEqualsWithMismatchedList(self):
654*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
655*16467b97STreehugger Robot        t1 = wiz.create("(A B C)")
656*16467b97STreehugger Robot        t2 = wiz.create("(A B A)")
657*16467b97STreehugger Robot        same = wiz.equals(t1, t2)
658*16467b97STreehugger Robot        self.assertFalse(same)
659*16467b97STreehugger Robot
660*16467b97STreehugger Robot
661*16467b97STreehugger Robot    def testEqualsWithMismatchedListLength(self):
662*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
663*16467b97STreehugger Robot        t1 = wiz.create("(A B C)")
664*16467b97STreehugger Robot        t2 = wiz.create("(A B)")
665*16467b97STreehugger Robot        same = wiz.equals(t1, t2)
666*16467b97STreehugger Robot        self.assertFalse(same)
667*16467b97STreehugger Robot
668*16467b97STreehugger Robot
669*16467b97STreehugger Robot    def testFindPattern(self):
670*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
671*16467b97STreehugger Robot        t = wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
672*16467b97STreehugger Robot        subtrees = wiz.find(t, "(A B)")
673*16467b97STreehugger Robot        found = [str(node) for node in subtrees]
674*16467b97STreehugger Robot        expecting = ['foo', 'big']
675*16467b97STreehugger Robot        self.assertEqual(expecting, found)
676*16467b97STreehugger Robot
677*16467b97STreehugger Robot
678*16467b97STreehugger Robot    def testFindTokenType(self):
679*16467b97STreehugger Robot        wiz = TreeWizard(self.adaptor, self.tokens)
680*16467b97STreehugger Robot        t = wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
681*16467b97STreehugger Robot        subtrees = wiz.find(t, wiz.getTokenType('A'))
682*16467b97STreehugger Robot        found = [str(node) for node in subtrees]
683*16467b97STreehugger Robot        expecting = ['A', 'foo', 'big']
684*16467b97STreehugger Robot        self.assertEqual(expecting, found)
685*16467b97STreehugger Robot
686*16467b97STreehugger Robot
687*16467b97STreehugger Robot
688*16467b97STreehugger Robotif __name__ == "__main__":
689*16467b97STreehugger Robot    unittest.main(testRunner=unittest.TextTestRunner(verbosity=2))
690