1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# -*- coding: utf-8 -*-
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport os
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport unittest
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfrom StringIO import StringIO
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfrom antlr3.tree import CommonTreeAdaptor, CommonTree, INVALID_TOKEN_TYPE
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfrom antlr3.treewizard import TreeWizard, computeTokenTypes, \
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     TreePatternLexer, EOF, ID, BEGIN, END, PERCENT, COLON, DOT, ARG, \
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     TreePatternParser, \
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     TreePattern, WildcardTreePattern, TreePatternTreeAdaptor
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestComputeTokenTypes(unittest.TestCase):
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """Test case for the computeTokenTypes function."""
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNone(self):
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """computeTokenTypes(None) -> {}"""
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        typeMap = computeTokenTypes(None)
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(isinstance(typeMap, dict))
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(typeMap, {})
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testList(self):
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """computeTokenTypes(['a', 'b']) -> { 'a': 0, 'b': 1 }"""
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        typeMap = computeTokenTypes(['a', 'b'])
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(isinstance(typeMap, dict))
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(typeMap, { 'a': 0, 'b': 1 })
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestTreePatternLexer(unittest.TestCase):
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """Test case for the TreePatternLexer class."""
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testBegin(self):
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreePatternLexer(): '('"""
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = TreePatternLexer('(')
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        type = lexer.nextToken()
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(type, BEGIN)
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(lexer.sval, '')
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(lexer.error, False)
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testEnd(self):
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreePatternLexer(): ')'"""
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = TreePatternLexer(')')
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        type = lexer.nextToken()
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(type, END)
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(lexer.sval, '')
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(lexer.error, False)
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testPercent(self):
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreePatternLexer(): '%'"""
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = TreePatternLexer('%')
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        type = lexer.nextToken()
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(type, PERCENT)
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(lexer.sval, '')
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(lexer.error, False)
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testDot(self):
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreePatternLexer(): '.'"""
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = TreePatternLexer('.')
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        type = lexer.nextToken()
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(type, DOT)
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(lexer.sval, '')
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(lexer.error, False)
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testColon(self):
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreePatternLexer(): ':'"""
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = TreePatternLexer(':')
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        type = lexer.nextToken()
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(type, COLON)
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(lexer.sval, '')
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(lexer.error, False)
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testEOF(self):
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreePatternLexer(): EOF"""
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = TreePatternLexer('  \n \r \t ')
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        type = lexer.nextToken()
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(type, EOF)
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(lexer.sval, '')
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(lexer.error, False)
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testID(self):
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreePatternLexer(): ID"""
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = TreePatternLexer('_foo12_bar')
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        type = lexer.nextToken()
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(type, ID)
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(lexer.sval, '_foo12_bar')
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(lexer.error, False)
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testARG(self):
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreePatternLexer(): ARG"""
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = TreePatternLexer('[ \\]bla\\n]')
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        type = lexer.nextToken()
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(type, ARG)
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(lexer.sval, ' ]bla\\n')
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(lexer.error, False)
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testError(self):
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreePatternLexer(): error"""
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = TreePatternLexer('1')
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        type = lexer.nextToken()
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(type, EOF)
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(lexer.sval, '')
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(lexer.error, True)
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestTreePatternParser(unittest.TestCase):
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """Test case for the TreePatternParser class."""
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setUp(self):
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """Setup text fixure
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        We need a tree adaptor, use CommonTreeAdaptor.
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        And a constant list of token names.
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor = CommonTreeAdaptor()
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.tokens = [
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "", "", "", "", "", "A", "B", "C", "D", "E", "ID", "VAR"
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ]
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.wizard = TreeWizard(self.adaptor, tokenNames=self.tokens)
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSingleNode(self):
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreePatternParser: 'ID'"""
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = TreePatternLexer('ID')
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = parser.pattern()
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(isinstance(tree, CommonTree))
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(tree.getType(), 10)
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(tree.getText(), 'ID')
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSingleNodeWithArg(self):
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreePatternParser: 'ID[foo]'"""
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = TreePatternLexer('ID[foo]')
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = parser.pattern()
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(isinstance(tree, CommonTree))
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(tree.getType(), 10)
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(tree.getText(), 'foo')
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSingleLevelTree(self):
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreePatternParser: '(A B)'"""
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = TreePatternLexer('(A B)')
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = parser.pattern()
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(isinstance(tree, CommonTree))
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(tree.getType(), 5)
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(tree.getText(), 'A')
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(tree.getChildCount(), 1)
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(tree.getChild(0).getType(), 6)
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(tree.getChild(0).getText(), 'B')
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNil(self):
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreePatternParser: 'nil'"""
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = TreePatternLexer('nil')
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = parser.pattern()
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(isinstance(tree, CommonTree))
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(tree.getType(), 0)
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(tree.getText(), None)
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testWildcard(self):
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreePatternParser: '(.)'"""
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = TreePatternLexer('(.)')
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = parser.pattern()
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(isinstance(tree, WildcardTreePattern))
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testLabel(self):
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreePatternParser: '(%a:A)'"""
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = TreePatternLexer('(%a:A)')
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser = TreePatternParser(lexer, self.wizard, TreePatternTreeAdaptor())
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = parser.pattern()
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(isinstance(tree, TreePattern))
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(tree.label, 'a')
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testError1(self):
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreePatternParser: ')'"""
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = TreePatternLexer(')')
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = parser.pattern()
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(tree is None)
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testError2(self):
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreePatternParser: '()'"""
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = TreePatternLexer('()')
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = parser.pattern()
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(tree is None)
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testError3(self):
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreePatternParser: '(A ])'"""
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = TreePatternLexer('(A ])')
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser = TreePatternParser(lexer, self.wizard, self.adaptor)
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = parser.pattern()
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(tree is None)
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestTreeWizard(unittest.TestCase):
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """Test case for the TreeWizard class."""
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setUp(self):
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """Setup text fixure
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        We need a tree adaptor, use CommonTreeAdaptor.
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        And a constant list of token names.
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor = CommonTreeAdaptor()
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.tokens = [
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "", "", "", "", "", "A", "B", "C", "D", "E", "ID", "VAR"
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ]
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testInit(self):
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreeWizard.__init__()"""
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.adaptor,
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokenNames=['a', 'b']
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(wiz.adaptor is self.adaptor)
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            wiz.tokenNameToTypeMap,
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            { 'a': 0, 'b': 1 }
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testGetTokenType(self):
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """TreeWizard.getTokenType()"""
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.adaptor,
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokenNames=self.tokens
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            wiz.getTokenType('A'),
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            5
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            wiz.getTokenType('VAR'),
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            11
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            wiz.getTokenType('invalid'),
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INVALID_TOKEN_TYPE
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSingleNode(self):
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("ID")
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = t.toStringTree()
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "ID"
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSingleNodeWithArg(self):
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("ID[foo]")
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = t.toStringTree()
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "foo"
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSingleNodeTree(self):
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A)")
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = t.toStringTree()
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "A"
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSingleLevelTree(self):
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A B C D)")
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = t.toStringTree()
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "(A B C D)"
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testListTree(self):
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(nil A B C)")
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = t.toStringTree()
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "A B C"
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testInvalidListTree(self):
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("A B C")
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(t is None)
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testDoubleLevelTree(self):
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A (B C) (B D) E)")
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = t.toStringTree()
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "(A (B C) (B D) E)"
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __simplifyIndexMap(self, indexMap):
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return dict( # stringify nodes for easy comparing
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            (ttype, [str(node) for node in nodes])
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for ttype, nodes in indexMap.items()
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSingleNodeIndex(self):
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = wiz.create("ID")
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        indexMap = wiz.index(tree)
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.__simplifyIndexMap(indexMap)
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = { 10: ["ID"] }
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNoRepeatsIndex(self):
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = wiz.create("(A B C D)")
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        indexMap = wiz.index(tree)
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.__simplifyIndexMap(indexMap)
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = { 8:['D'], 6:['B'], 7:['C'], 5:['A'] }
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRepeatsIndex(self):
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = wiz.create("(A B (A C B) B D D)")
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        indexMap = wiz.index(tree)
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.__simplifyIndexMap(indexMap)
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = { 8: ['D', 'D'], 6: ['B', 'B', 'B'], 7: ['C'], 5: ['A', 'A'] }
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNoRepeatsVisit(self):
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = wiz.create("(A B C D)")
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        elements = []
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def visitor(node, parent, childIndex, labels):
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            elements.append(str(node))
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(tree, wiz.getTokenType("B"), visitor)
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = ['B']
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, elements)
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNoRepeatsVisit2(self):
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = wiz.create("(A B (A C B) B D D)")
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        elements = []
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def visitor(node, parent, childIndex, labels):
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            elements.append(str(node))
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(tree, wiz.getTokenType("C"), visitor)
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = ['C']
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, elements)
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRepeatsVisit(self):
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = wiz.create("(A B (A C B) B D D)")
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        elements = []
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def visitor(node, parent, childIndex, labels):
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            elements.append(str(node))
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(tree, wiz.getTokenType("B"), visitor)
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = ['B', 'B', 'B']
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, elements)
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRepeatsVisit2(self):
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = wiz.create("(A B (A C B) B D D)")
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        elements = []
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def visitor(node, parent, childIndex, labels):
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            elements.append(str(node))
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(tree, wiz.getTokenType("A"), visitor)
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = ['A', 'A']
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, elements)
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRepeatsVisitWithContext(self):
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = wiz.create("(A B (A C B) B D D)")
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        elements = []
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def visitor(node, parent, childIndex, labels):
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            elements.append('%s@%s[%d]' % (node, parent, childIndex))
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(tree, wiz.getTokenType("B"), visitor)
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = ['B@A[0]', 'B@A[1]', 'B@A[2]']
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, elements)
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRepeatsVisitWithNullParentAndContext(self):
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = wiz.create("(A B (A C B) B D D)")
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        elements = []
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def visitor(node, parent, childIndex, labels):
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            elements.append(
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                '%s@%s[%d]'
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                % (node, ['nil', parent][parent is not None], childIndex)
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                )
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(tree, wiz.getTokenType("A"), visitor)
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = ['A@nil[0]', 'A@A[1]']
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, elements)
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testVisitPattern(self):
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = wiz.create("(A B C (A B) D)")
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        elements = []
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def visitor(node, parent, childIndex, labels):
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            elements.append(
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                str(node)
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                )
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(tree, '(A B)', visitor)
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = ['A'] # shouldn't match overall root, just (A B)
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, elements)
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testVisitPatternMultiple(self):
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = wiz.create("(A B C (A B) (D (A B)))")
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        elements = []
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def visitor(node, parent, childIndex, labels):
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            elements.append(
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                '%s@%s[%d]'
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                % (node, ['nil', parent][parent is not None], childIndex)
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                )
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(tree, '(A B)', visitor)
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = ['A@A[2]', 'A@D[0]']
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, elements)
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testVisitPatternMultipleWithLabels(self):
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        elements = []
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def visitor(node, parent, childIndex, labels):
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            elements.append(
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                '%s@%s[%d]%s&%s'
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                % (node,
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                   ['nil', parent][parent is not None],
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                   childIndex,
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                   labels['a'],
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                   labels['b'],
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                   )
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                )
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(tree, '(%a:A %b:B)', visitor)
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = ['foo@A[2]foo&bar', 'big@D[0]big&dog']
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, elements)
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testParse(self):
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A B C)")
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(t, "(A B C)")
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(valid)
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testParseSingleNode(self):
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("A")
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(t, "A")
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(valid)
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testParseSingleNodeFails(self):
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("A")
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(t, "B")
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(not valid)
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testParseFlatTree(self):
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(nil A B C)")
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(t, "(nil A B C)")
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(valid)
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testParseFlatTreeFails(self):
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(nil A B C)")
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(t, "(nil A B)")
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(not valid)
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testParseFlatTreeFails2(self):
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(nil A B C)")
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(t, "(nil A B A)")
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(not valid)
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testWildcard(self):
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A B C)")
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(t, "(A . .)")
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(valid)
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testParseWithText(self):
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A B[foo] C[bar])")
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # C pattern has no text arg so despite [bar] in t, no need
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # to match text--check structure only.
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(t, "(A B[foo] C)")
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(valid)
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testParseWithText2(self):
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A B[T__32] (C (D E[a])))")
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # C pattern has no text arg so despite [bar] in t, no need
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # to match text--check structure only.
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(t, "(A B[foo] C)")
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(A T__32 (C (D a)))", t.toStringTree())
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testParseWithTextFails(self):
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A B C)")
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(t, "(A[foo] B C)")
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(not valid) # fails
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testParseLabels(self):
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A B C)")
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(t, "(%a:A %b:B %c:C)", labels)
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(valid)
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("A", str(labels["a"]))
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("B", str(labels["b"]))
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("C", str(labels["c"]))
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testParseWithWildcardLabels(self):
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A B C)")
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(t, "(A %b:. %c:.)", labels)
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(valid)
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("B", str(labels["b"]))
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("C", str(labels["c"]))
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testParseLabelsAndTestText(self):
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A B[foo] C)")
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(t, "(%a:A %b:B[foo] %c:C)", labels)
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(valid)
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("A", str(labels["a"]))
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("foo", str(labels["b"]))
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("C", str(labels["c"]))
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testParseLabelsInNestedTree(self):
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A (B C) (D E))")
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(t, "(%a:A (%b:B %c:C) (%d:D %e:E) )", labels)
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(valid)
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("A", str(labels["a"]))
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("B", str(labels["b"]))
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("C", str(labels["c"]))
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("D", str(labels["d"]))
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("E", str(labels["e"]))
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testEquals(self):
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t1 = wiz.create("(A B C)")
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t2 = wiz.create("(A B C)")
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        same = wiz.equals(t1, t2)
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(same)
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testEqualsWithText(self):
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t1 = wiz.create("(A B[foo] C)")
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t2 = wiz.create("(A B[foo] C)")
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        same = wiz.equals(t1, t2)
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(same)
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testEqualsWithMismatchedText(self):
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t1 = wiz.create("(A B[foo] C)")
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t2 = wiz.create("(A B C)")
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        same = wiz.equals(t1, t2)
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(not same)
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testEqualsWithMismatchedList(self):
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t1 = wiz.create("(A B C)")
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t2 = wiz.create("(A B A)")
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        same = wiz.equals(t1, t2)
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(not same)
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testEqualsWithMismatchedListLength(self):
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t1 = wiz.create("(A B C)")
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t2 = wiz.create("(A B)")
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        same = wiz.equals(t1, t2)
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(not same)
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testFindPattern(self):
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        subtrees = wiz.find(t, "(A B)")
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = [str(node) for node in subtrees]
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = ['foo', 'big']
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testFindTokenType(self):
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(self.adaptor, self.tokens)
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        subtrees = wiz.find(t, wiz.getTokenType('A'))
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = [str(node) for node in subtrees]
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = ['A', 'foo', 'big']
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif __name__ == "__main__":
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    unittest.main(testRunner=unittest.TextTestRunner(verbosity=2))
692