xref: /aosp_15_r20/external/antlr/runtime/Ruby/test/unit/test-tree-wizard.rb (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robot#!/usr/bin/ruby
2*16467b97STreehugger Robot# encoding: utf-8
3*16467b97STreehugger Robot
4*16467b97STreehugger Robotrequire 'antlr3'
5*16467b97STreehugger Robotrequire 'antlr3/tree/wizard'
6*16467b97STreehugger Robotrequire 'test/unit'
7*16467b97STreehugger Robotrequire 'spec'
8*16467b97STreehugger Robot
9*16467b97STreehugger Robotinclude ANTLR3
10*16467b97STreehugger Robotinclude ANTLR3::AST
11*16467b97STreehugger Robot
12*16467b97STreehugger Robotclass TestPatternLexer < Test::Unit::TestCase
13*16467b97STreehugger Robot
14*16467b97STreehugger Robot  # vvvvvvvv tests vvvvvvvvv
15*16467b97STreehugger Robot
16*16467b97STreehugger Robot  def test_open
17*16467b97STreehugger Robot    lexer = Wizard::PatternLexer.new( '(' )
18*16467b97STreehugger Robot    type = lexer.next_token
19*16467b97STreehugger Robot    assert_equal( type, :open )
20*16467b97STreehugger Robot    assert_equal( lexer.text, '' )
21*16467b97STreehugger Robot    assert_equal( lexer.error, false )
22*16467b97STreehugger Robot  end
23*16467b97STreehugger Robot
24*16467b97STreehugger Robot  def test_close
25*16467b97STreehugger Robot    lexer = Wizard::PatternLexer.new(')')
26*16467b97STreehugger Robot    type = lexer.next_token
27*16467b97STreehugger Robot    assert_equal(type, :close)
28*16467b97STreehugger Robot    assert_equal(lexer.text, '')
29*16467b97STreehugger Robot    assert_equal(lexer.error, false)
30*16467b97STreehugger Robot  end
31*16467b97STreehugger Robot
32*16467b97STreehugger Robot  def test_percent
33*16467b97STreehugger Robot    lexer = Wizard::PatternLexer.new('%')
34*16467b97STreehugger Robot    type = lexer.next_token
35*16467b97STreehugger Robot    assert_equal(type, :percent)
36*16467b97STreehugger Robot    assert_equal(lexer.text, '')
37*16467b97STreehugger Robot    assert_equal(lexer.error, false)
38*16467b97STreehugger Robot  end
39*16467b97STreehugger Robot
40*16467b97STreehugger Robot  def test_dot
41*16467b97STreehugger Robot    lexer = Wizard::PatternLexer.new('.')
42*16467b97STreehugger Robot    type = lexer.next_token
43*16467b97STreehugger Robot    assert_equal(type, :dot)
44*16467b97STreehugger Robot    assert_equal(lexer.text, '')
45*16467b97STreehugger Robot    assert_equal(lexer.error, false)
46*16467b97STreehugger Robot  end
47*16467b97STreehugger Robot
48*16467b97STreehugger Robot  def test_eof
49*16467b97STreehugger Robot    lexer = Wizard::PatternLexer.new(" \n \r \t ")
50*16467b97STreehugger Robot    type = lexer.next_token
51*16467b97STreehugger Robot    assert_equal(type, EOF)
52*16467b97STreehugger Robot    assert_equal(lexer.text, '')
53*16467b97STreehugger Robot    assert_equal(lexer.error, false)
54*16467b97STreehugger Robot  end
55*16467b97STreehugger Robot
56*16467b97STreehugger Robot  def test_id
57*16467b97STreehugger Robot    lexer = Wizard::PatternLexer.new('__whatever_1__')
58*16467b97STreehugger Robot    type = lexer.next_token
59*16467b97STreehugger Robot    assert_equal(:identifier, type)
60*16467b97STreehugger Robot    assert_equal('__whatever_1__', lexer.text)
61*16467b97STreehugger Robot    assert( !(lexer.error) )
62*16467b97STreehugger Robot  end
63*16467b97STreehugger Robot
64*16467b97STreehugger Robot  def test_arg
65*16467b97STreehugger Robot    lexer = Wizard::PatternLexer.new('[ \]bla\n]')
66*16467b97STreehugger Robot    type = lexer.next_token
67*16467b97STreehugger Robot    assert_equal(type, :argument)
68*16467b97STreehugger Robot    assert_equal(' ]bla\n', lexer.text)
69*16467b97STreehugger Robot    assert( !(lexer.error) )
70*16467b97STreehugger Robot  end
71*16467b97STreehugger Robot
72*16467b97STreehugger Robot  def test_error
73*16467b97STreehugger Robot    lexer = Wizard::PatternLexer.new("1")
74*16467b97STreehugger Robot    type = lexer.next_token
75*16467b97STreehugger Robot    assert_equal(type, EOF)
76*16467b97STreehugger Robot    assert_equal(lexer.text, '')
77*16467b97STreehugger Robot    assert_equal(lexer.error, true)
78*16467b97STreehugger Robot  end
79*16467b97STreehugger Robot
80*16467b97STreehugger Robotend
81*16467b97STreehugger Robot
82*16467b97STreehugger Robot
83*16467b97STreehugger Robotclass TestPatternParser < Test::Unit::TestCase
84*16467b97STreehugger Robot  Tokens = TokenScheme.build %w(A B C D E ID VAR)
85*16467b97STreehugger Robot  include Tokens
86*16467b97STreehugger Robot
87*16467b97STreehugger Robot  def setup
88*16467b97STreehugger Robot    @adaptor = CommonTreeAdaptor.new( Tokens.token_class )
89*16467b97STreehugger Robot    @pattern_adaptor = Wizard::PatternAdaptor.new( Tokens.token_class )
90*16467b97STreehugger Robot    @wizard = Wizard.new( :adaptor => @adaptor, :token_scheme => Tokens )
91*16467b97STreehugger Robot  end
92*16467b97STreehugger Robot
93*16467b97STreehugger Robot  # vvvvvvvv tests vvvvvvvvv
94*16467b97STreehugger Robot  def test_single_node
95*16467b97STreehugger Robot    tree = Wizard::PatternParser.parse( 'ID', Tokens, @adaptor )
96*16467b97STreehugger Robot
97*16467b97STreehugger Robot    assert_instance_of(CommonTree, tree)
98*16467b97STreehugger Robot    assert_equal( ID, tree.type )
99*16467b97STreehugger Robot    assert_equal( 'ID', tree.text )
100*16467b97STreehugger Robot  end
101*16467b97STreehugger Robot
102*16467b97STreehugger Robot  def test_single_node_with_arg
103*16467b97STreehugger Robot    tree = Wizard::PatternParser.parse( 'ID[foo]', Tokens, @adaptor )
104*16467b97STreehugger Robot
105*16467b97STreehugger Robot    assert_instance_of( CommonTree, tree )
106*16467b97STreehugger Robot    assert_equal( ID, tree.type )
107*16467b97STreehugger Robot    assert_equal( 'foo', tree.text )
108*16467b97STreehugger Robot  end
109*16467b97STreehugger Robot
110*16467b97STreehugger Robot  def test_single_level_tree
111*16467b97STreehugger Robot    tree = Wizard::PatternParser.parse( '(A B)', Tokens, @adaptor )
112*16467b97STreehugger Robot
113*16467b97STreehugger Robot    assert_instance_of( CommonTree, tree )
114*16467b97STreehugger Robot    assert_equal(A, tree.type)
115*16467b97STreehugger Robot    assert_equal('A', tree.text)
116*16467b97STreehugger Robot    assert_equal(tree.child_count, 1)
117*16467b97STreehugger Robot    assert_equal(tree.child(0).type, B)
118*16467b97STreehugger Robot    assert_equal(tree.child(0).text, 'B')
119*16467b97STreehugger Robot  end
120*16467b97STreehugger Robot
121*16467b97STreehugger Robot  def test_nil
122*16467b97STreehugger Robot    tree = Wizard::PatternParser.parse( 'nil', Tokens, @adaptor )
123*16467b97STreehugger Robot
124*16467b97STreehugger Robot    assert_instance_of(CommonTree, tree)
125*16467b97STreehugger Robot    assert_equal(0, tree.type)
126*16467b97STreehugger Robot    assert_nil tree.text
127*16467b97STreehugger Robot  end
128*16467b97STreehugger Robot
129*16467b97STreehugger Robot  def test_wildcard
130*16467b97STreehugger Robot    tree = Wizard::PatternParser.parse( '(.)', Tokens, @adaptor )
131*16467b97STreehugger Robot    assert_instance_of( Wizard::WildcardPattern, tree )
132*16467b97STreehugger Robot  end
133*16467b97STreehugger Robot
134*16467b97STreehugger Robot  def test_label
135*16467b97STreehugger Robot    tree = Wizard::PatternParser.parse( '(%a:A)', Tokens, @pattern_adaptor )
136*16467b97STreehugger Robot    assert_instance_of(Wizard::Pattern, tree)
137*16467b97STreehugger Robot    assert_equal('a', tree.label)
138*16467b97STreehugger Robot  end
139*16467b97STreehugger Robot
140*16467b97STreehugger Robot  def test_error_1
141*16467b97STreehugger Robot    tree = Wizard::PatternParser.parse( ')', Tokens, @adaptor )
142*16467b97STreehugger Robot    assert_nil tree
143*16467b97STreehugger Robot  end
144*16467b97STreehugger Robot
145*16467b97STreehugger Robot  def test_error_2
146*16467b97STreehugger Robot    tree = Wizard::PatternParser.parse( '()', Tokens, @adaptor )
147*16467b97STreehugger Robot    assert_nil tree
148*16467b97STreehugger Robot  end
149*16467b97STreehugger Robot
150*16467b97STreehugger Robot  def test_error_3
151*16467b97STreehugger Robot    tree = Wizard::PatternParser.parse( '(A ])', Tokens, @adaptor )
152*16467b97STreehugger Robot    assert_nil tree
153*16467b97STreehugger Robot  end
154*16467b97STreehugger Robot
155*16467b97STreehugger Robotend
156*16467b97STreehugger Robot
157*16467b97STreehugger Robot
158*16467b97STreehugger Robotclass TestTreeWizard < Test::Unit::TestCase
159*16467b97STreehugger Robot  Tokens = TokenScheme.build %w(A B C D E ID VAR)
160*16467b97STreehugger Robot  include Tokens
161*16467b97STreehugger Robot
162*16467b97STreehugger Robot  def setup
163*16467b97STreehugger Robot    @adaptor = CommonTreeAdaptor.new( Tokens.token_class )
164*16467b97STreehugger Robot    @wizard = Wizard.new( :adaptor => @adaptor, :token_scheme => Tokens )
165*16467b97STreehugger Robot  end
166*16467b97STreehugger Robot
167*16467b97STreehugger Robot  def create_wizard( tokens )
168*16467b97STreehugger Robot    Wizard.new( :tokens => tokens )
169*16467b97STreehugger Robot  end
170*16467b97STreehugger Robot
171*16467b97STreehugger Robot  # vvvvvvvv tests vvvvvvvvv
172*16467b97STreehugger Robot  def test_init
173*16467b97STreehugger Robot    @wizard = Wizard.new( :tokens => %w(A B), :adaptor => @adaptor )
174*16467b97STreehugger Robot
175*16467b97STreehugger Robot    assert_equal( @wizard.adaptor, @adaptor )
176*16467b97STreehugger Robot    assert_kind_of( ANTLR3::TokenScheme, @wizard.token_scheme )
177*16467b97STreehugger Robot  end
178*16467b97STreehugger Robot
179*16467b97STreehugger Robot  def test_single_node
180*16467b97STreehugger Robot    t = @wizard.create("ID")
181*16467b97STreehugger Robot    assert_equal(t.inspect, 'ID')
182*16467b97STreehugger Robot  end
183*16467b97STreehugger Robot
184*16467b97STreehugger Robot  def test_single_node_with_arg
185*16467b97STreehugger Robot    t = @wizard.create("ID[foo]")
186*16467b97STreehugger Robot
187*16467b97STreehugger Robot    assert_equal(t.inspect, 'foo')
188*16467b97STreehugger Robot  end
189*16467b97STreehugger Robot
190*16467b97STreehugger Robot  def test_single_node_tree
191*16467b97STreehugger Robot    t = @wizard.create("(A)")
192*16467b97STreehugger Robot    assert_equal(t.inspect, 'A')
193*16467b97STreehugger Robot  end
194*16467b97STreehugger Robot
195*16467b97STreehugger Robot  def test_single_level_tree
196*16467b97STreehugger Robot    t = @wizard.create("(A B C D)")
197*16467b97STreehugger Robot    assert_equal(t.inspect, '(A B C D)')
198*16467b97STreehugger Robot  end
199*16467b97STreehugger Robot
200*16467b97STreehugger Robot  def test_list_tree
201*16467b97STreehugger Robot    t = @wizard.create("(nil A B C)")
202*16467b97STreehugger Robot    assert_equal(t.inspect, 'A B C')
203*16467b97STreehugger Robot  end
204*16467b97STreehugger Robot
205*16467b97STreehugger Robot  def test_invalid_list_tree
206*16467b97STreehugger Robot    t = @wizard.create("A B C")
207*16467b97STreehugger Robot    assert_nil t
208*16467b97STreehugger Robot  end
209*16467b97STreehugger Robot
210*16467b97STreehugger Robot  def test_double_level_tree
211*16467b97STreehugger Robot    t = @wizard.create("(A (B C) (B D) E)")
212*16467b97STreehugger Robot    assert_equal(t.inspect, "(A (B C) (B D) E)")
213*16467b97STreehugger Robot  end
214*16467b97STreehugger Robot
215*16467b97STreehugger Robot  SIMPLIFY_MAP = lambda do |imap|
216*16467b97STreehugger Robot    Hash[
217*16467b97STreehugger Robot      imap.map { |type, nodes| [type, nodes.map { |n| n.to_s }] }
218*16467b97STreehugger Robot    ]
219*16467b97STreehugger Robot  end
220*16467b97STreehugger Robot
221*16467b97STreehugger Robot  def test_single_node_index
222*16467b97STreehugger Robot    tree = @wizard.create("ID")
223*16467b97STreehugger Robot    index_map = SIMPLIFY_MAP[@wizard.index(tree)]
224*16467b97STreehugger Robot
225*16467b97STreehugger Robot    assert_equal(index_map, ID => %w(ID))
226*16467b97STreehugger Robot  end
227*16467b97STreehugger Robot
228*16467b97STreehugger Robot
229*16467b97STreehugger Robot  def test_no_repeats_index
230*16467b97STreehugger Robot    tree = @wizard.create("(A B C D)")
231*16467b97STreehugger Robot    index_map = SIMPLIFY_MAP[@wizard.index(tree)]
232*16467b97STreehugger Robot
233*16467b97STreehugger Robot    assert_equal(index_map,
234*16467b97STreehugger Robot        D => %w(D), B => %w(B),
235*16467b97STreehugger Robot        C => %w(C), A => %w(A)
236*16467b97STreehugger Robot    )
237*16467b97STreehugger Robot  end
238*16467b97STreehugger Robot
239*16467b97STreehugger Robot  def test_repeats_index
240*16467b97STreehugger Robot    tree = @wizard.create("(A B (A C B) B D D)")
241*16467b97STreehugger Robot    index_map = SIMPLIFY_MAP[@wizard.index(tree)]
242*16467b97STreehugger Robot
243*16467b97STreehugger Robot    assert_equal(index_map,
244*16467b97STreehugger Robot        D => %w(D D), B => %w(B B B),
245*16467b97STreehugger Robot        C => %w(C), A => %w(A A)
246*16467b97STreehugger Robot    )
247*16467b97STreehugger Robot  end
248*16467b97STreehugger Robot
249*16467b97STreehugger Robot
250*16467b97STreehugger Robot  def test_no_repeats_visit
251*16467b97STreehugger Robot    tree = @wizard.create("(A B C D)")
252*16467b97STreehugger Robot
253*16467b97STreehugger Robot    elements = []
254*16467b97STreehugger Robot    @wizard.visit( tree, B ) do |node, parent, child_index, labels|
255*16467b97STreehugger Robot      elements << node.to_s
256*16467b97STreehugger Robot    end
257*16467b97STreehugger Robot
258*16467b97STreehugger Robot    assert_equal( %w(B), elements )
259*16467b97STreehugger Robot  end
260*16467b97STreehugger Robot
261*16467b97STreehugger Robot
262*16467b97STreehugger Robot  def test_no_repeats_visit2
263*16467b97STreehugger Robot    tree = @wizard.create("(A B (A C B) B D D)")
264*16467b97STreehugger Robot
265*16467b97STreehugger Robot    elements = []
266*16467b97STreehugger Robot    @wizard.visit( tree, C ) do |node, parent, child_index, labels|
267*16467b97STreehugger Robot      elements << node.to_s
268*16467b97STreehugger Robot    end
269*16467b97STreehugger Robot
270*16467b97STreehugger Robot    assert_equal(%w(C), elements)
271*16467b97STreehugger Robot  end
272*16467b97STreehugger Robot
273*16467b97STreehugger Robot
274*16467b97STreehugger Robot  def test_repeats_visit
275*16467b97STreehugger Robot    tree = @wizard.create("(A B (A C B) B D D)")
276*16467b97STreehugger Robot
277*16467b97STreehugger Robot    elements = []
278*16467b97STreehugger Robot    @wizard.visit( tree, B ) do |node, parent, child_index, labels|
279*16467b97STreehugger Robot      elements << node.to_s
280*16467b97STreehugger Robot    end
281*16467b97STreehugger Robot
282*16467b97STreehugger Robot    assert_equal(%w(B B B), elements)
283*16467b97STreehugger Robot  end
284*16467b97STreehugger Robot
285*16467b97STreehugger Robot
286*16467b97STreehugger Robot  def test_repeats_visit2
287*16467b97STreehugger Robot    tree = @wizard.create("(A B (A C B) B D D)")
288*16467b97STreehugger Robot
289*16467b97STreehugger Robot    elements = []
290*16467b97STreehugger Robot    @wizard.visit( tree, A ) do |node, parent, child_index, labels|
291*16467b97STreehugger Robot      elements << node.to_s
292*16467b97STreehugger Robot    end
293*16467b97STreehugger Robot
294*16467b97STreehugger Robot    assert_equal(%w(A A), elements)
295*16467b97STreehugger Robot  end
296*16467b97STreehugger Robot
297*16467b97STreehugger Robot  def context(node, parent, index)
298*16467b97STreehugger Robot    '%s@%s[%d]' % [node.to_s, (parent || 'nil').to_s, index]
299*16467b97STreehugger Robot  end
300*16467b97STreehugger Robot
301*16467b97STreehugger Robot  def test_repeats_visit_with_context
302*16467b97STreehugger Robot    tree = @wizard.create("(A B (A C B) B D D)")
303*16467b97STreehugger Robot
304*16467b97STreehugger Robot    elements = []
305*16467b97STreehugger Robot    @wizard.visit( tree, B ) do |node, parent, child_index, labels|
306*16467b97STreehugger Robot      elements << context(node, parent, child_index)
307*16467b97STreehugger Robot    end
308*16467b97STreehugger Robot
309*16467b97STreehugger Robot    assert_equal(['B@A[0]', 'B@A[1]', 'B@A[2]'], elements)
310*16467b97STreehugger Robot  end
311*16467b97STreehugger Robot
312*16467b97STreehugger Robot
313*16467b97STreehugger Robot  def test_repeats_visit_with_null_parent_and_context
314*16467b97STreehugger Robot    tree = @wizard.create("(A B (A C B) B D D)")
315*16467b97STreehugger Robot
316*16467b97STreehugger Robot    elements = []
317*16467b97STreehugger Robot    @wizard.visit( tree, A ) do |node, parent, child_index, labels|
318*16467b97STreehugger Robot      elements << context(node, parent, child_index)
319*16467b97STreehugger Robot    end
320*16467b97STreehugger Robot
321*16467b97STreehugger Robot    assert_equal(['A@nil[-1]', 'A@A[1]'], elements)
322*16467b97STreehugger Robot  end
323*16467b97STreehugger Robot
324*16467b97STreehugger Robot  def test_visit_pattern
325*16467b97STreehugger Robot    tree = @wizard.create("(A B C (A B) D)")
326*16467b97STreehugger Robot
327*16467b97STreehugger Robot    elements = []
328*16467b97STreehugger Robot    @wizard.visit(tree, '(A B)') do |node, parent, child_index, labels|
329*16467b97STreehugger Robot      elements << node.to_s
330*16467b97STreehugger Robot    end
331*16467b97STreehugger Robot
332*16467b97STreehugger Robot    assert_equal(%w(A), elements)
333*16467b97STreehugger Robot  end
334*16467b97STreehugger Robot
335*16467b97STreehugger Robot
336*16467b97STreehugger Robot  def test_visit_pattern_multiple
337*16467b97STreehugger Robot    tree = @wizard.create("(A B C (A B) (D (A B)))")
338*16467b97STreehugger Robot
339*16467b97STreehugger Robot    elements = []
340*16467b97STreehugger Robot    @wizard.visit(tree, '(A B)') do |node, parent, child_index, labels|
341*16467b97STreehugger Robot      elements << context(node, parent, child_index)
342*16467b97STreehugger Robot    end
343*16467b97STreehugger Robot
344*16467b97STreehugger Robot    assert_equal( %w(A@A[2] A@D[0]) , elements )
345*16467b97STreehugger Robot  end
346*16467b97STreehugger Robot
347*16467b97STreehugger Robot  def labeled_context(node, parent, index, labels, *names)
348*16467b97STreehugger Robot    suffix = names.map { |n| labels[n].to_s }.join('&')
349*16467b97STreehugger Robot    '%s@%s[%d]%s' % [node.to_s, (parent || 'nil').to_s, index, suffix]
350*16467b97STreehugger Robot  end
351*16467b97STreehugger Robot
352*16467b97STreehugger Robot  def test_visit_pattern_multiple_with_labels
353*16467b97STreehugger Robot    tree = @wizard.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
354*16467b97STreehugger Robot
355*16467b97STreehugger Robot    elements = []
356*16467b97STreehugger Robot    @wizard.visit(tree, '(%a:A %b:B)') do |node, parent, child_index, labels|
357*16467b97STreehugger Robot      elements << labeled_context(node, parent, child_index, labels, 'a', 'b')
358*16467b97STreehugger Robot    end
359*16467b97STreehugger Robot
360*16467b97STreehugger Robot    assert_equal( ['foo@A[2]foo&bar', 'big@D[0]big&dog'] , elements )
361*16467b97STreehugger Robot  end
362*16467b97STreehugger Robot
363*16467b97STreehugger Robot
364*16467b97STreehugger Robot  def test_match
365*16467b97STreehugger Robot    tree = @wizard.create("(A B C)")
366*16467b97STreehugger Robot    assert @wizard.match(tree, "(A B C)")
367*16467b97STreehugger Robot  end
368*16467b97STreehugger Robot
369*16467b97STreehugger Robot  def test_match_single_node
370*16467b97STreehugger Robot    tree = @wizard.create('A')
371*16467b97STreehugger Robot    assert @wizard.match(tree, 'A')
372*16467b97STreehugger Robot  end
373*16467b97STreehugger Robot
374*16467b97STreehugger Robot  def test_match_single_node_fails
375*16467b97STreehugger Robot    tree = @wizard.create('A')
376*16467b97STreehugger Robot    assert( !(@wizard.match(tree, 'B')) )
377*16467b97STreehugger Robot  end
378*16467b97STreehugger Robot
379*16467b97STreehugger Robot
380*16467b97STreehugger Robot  def test_match_flat_tree
381*16467b97STreehugger Robot    tree = @wizard.create('(nil A B C)')
382*16467b97STreehugger Robot    assert @wizard.match(tree, '(nil A B C)')
383*16467b97STreehugger Robot  end
384*16467b97STreehugger Robot
385*16467b97STreehugger Robot  def test_match_flat_tree_fails
386*16467b97STreehugger Robot    tree = @wizard.create('(nil A B C)')
387*16467b97STreehugger Robot    assert( !(@wizard.match(tree, '(nil A B)')) )
388*16467b97STreehugger Robot  end
389*16467b97STreehugger Robot
390*16467b97STreehugger Robot  def test_match_flat_tree_fails2
391*16467b97STreehugger Robot    tree = @wizard.create('(nil A B C)')
392*16467b97STreehugger Robot    assert( !(@wizard.match(tree, '(nil A B A)')) )
393*16467b97STreehugger Robot  end
394*16467b97STreehugger Robot
395*16467b97STreehugger Robot  def test_wildcard
396*16467b97STreehugger Robot    tree = @wizard.create('(A B C)')
397*16467b97STreehugger Robot    assert @wizard.match(tree, '(A . .)')
398*16467b97STreehugger Robot  end
399*16467b97STreehugger Robot
400*16467b97STreehugger Robot  def test_match_with_text
401*16467b97STreehugger Robot    tree = @wizard.create('(A B[foo] C[bar])')
402*16467b97STreehugger Robot    assert @wizard.match(tree, '(A B[foo] C)')
403*16467b97STreehugger Robot  end
404*16467b97STreehugger Robot
405*16467b97STreehugger Robot  def test_match_with_text_fails
406*16467b97STreehugger Robot    tree = @wizard.create('(A B C)')
407*16467b97STreehugger Robot    assert( !(@wizard.match(tree, '(A[foo] B C)')) )
408*16467b97STreehugger Robot  end
409*16467b97STreehugger Robot
410*16467b97STreehugger Robot  def test_match_labels
411*16467b97STreehugger Robot    tree = @wizard.create('(A B C)')
412*16467b97STreehugger Robot    labels = @wizard.match( tree, '(%a:A %b:B %c:C)' )
413*16467b97STreehugger Robot
414*16467b97STreehugger Robot    assert_equal('A', labels['a'].to_s)
415*16467b97STreehugger Robot    assert_equal('B', labels['b'].to_s)
416*16467b97STreehugger Robot    assert_equal('C', labels['c'].to_s)
417*16467b97STreehugger Robot  end
418*16467b97STreehugger Robot
419*16467b97STreehugger Robot  def test_match_with_wildcard_labels
420*16467b97STreehugger Robot    tree = @wizard.create('(A B C)')
421*16467b97STreehugger Robot    labels = @wizard.match(tree, '(A %b:. %c:.)')
422*16467b97STreehugger Robot    assert_kind_of( Hash, labels )
423*16467b97STreehugger Robot    assert_equal('B', labels['b'].to_s)
424*16467b97STreehugger Robot    assert_equal('C', labels['c'].to_s)
425*16467b97STreehugger Robot  end
426*16467b97STreehugger Robot
427*16467b97STreehugger Robot
428*16467b97STreehugger Robot  def test_match_labels_and_test_text
429*16467b97STreehugger Robot    tree = @wizard.create('(A B[foo] C)')
430*16467b97STreehugger Robot    labels = @wizard.match( tree, '(%a:A %b:B[foo] %c:C)' )
431*16467b97STreehugger Robot    assert_kind_of( Hash, labels )
432*16467b97STreehugger Robot    assert_equal('A', labels['a'].to_s)
433*16467b97STreehugger Robot    assert_equal('foo', labels['b'].to_s)
434*16467b97STreehugger Robot    assert_equal('C', labels['c'].to_s)
435*16467b97STreehugger Robot  end
436*16467b97STreehugger Robot
437*16467b97STreehugger Robot  def test_match_labels_in_nested_tree
438*16467b97STreehugger Robot    tree = @wizard.create('(A (B C) (D E))')
439*16467b97STreehugger Robot    labels = @wizard.match( tree, '(%a:A (%b:B %c:C) (%d:D %e:E))' )
440*16467b97STreehugger Robot    assert_kind_of( Hash, labels )
441*16467b97STreehugger Robot    assert_equal('A', labels['a'].to_s)
442*16467b97STreehugger Robot    assert_equal('B', labels['b'].to_s)
443*16467b97STreehugger Robot    assert_equal('C', labels['c'].to_s)
444*16467b97STreehugger Robot    assert_equal('D', labels['d'].to_s)
445*16467b97STreehugger Robot    assert_equal('E', labels['e'].to_s)
446*16467b97STreehugger Robot  end
447*16467b97STreehugger Robot
448*16467b97STreehugger Robot
449*16467b97STreehugger Robot  def test_equals
450*16467b97STreehugger Robot    tree1 = @wizard.create("(A B C)")
451*16467b97STreehugger Robot    tree2 = @wizard.create("(A B C)")
452*16467b97STreehugger Robot    assert @wizard.equals(tree1, tree2)
453*16467b97STreehugger Robot  end
454*16467b97STreehugger Robot
455*16467b97STreehugger Robot
456*16467b97STreehugger Robot  def test_equals_with_text
457*16467b97STreehugger Robot    tree1 = @wizard.create("(A B[foo] C)")
458*16467b97STreehugger Robot    tree2 = @wizard.create("(A B[foo] C)")
459*16467b97STreehugger Robot    assert @wizard.equals(tree1, tree2)
460*16467b97STreehugger Robot  end
461*16467b97STreehugger Robot
462*16467b97STreehugger Robot
463*16467b97STreehugger Robot  def test_equals_with_mismatched_text
464*16467b97STreehugger Robot    tree1 = @wizard.create("(A B[foo] C)")
465*16467b97STreehugger Robot    tree2 = @wizard.create("(A B C)")
466*16467b97STreehugger Robot    assert( !(@wizard.equals(tree1, tree2)) )
467*16467b97STreehugger Robot  end
468*16467b97STreehugger Robot
469*16467b97STreehugger Robot
470*16467b97STreehugger Robot  def test_equals_with_mismatched_list
471*16467b97STreehugger Robot    tree1 = @wizard.create("(A B C)")
472*16467b97STreehugger Robot    tree2 = @wizard.create("(A B A)")
473*16467b97STreehugger Robot    assert( !(@wizard.equals(tree1, tree2)) )
474*16467b97STreehugger Robot  end
475*16467b97STreehugger Robot
476*16467b97STreehugger Robot  def test_equals_with_mismatched_list_length
477*16467b97STreehugger Robot    tree1 = @wizard.create("(A B C)")
478*16467b97STreehugger Robot    tree2 = @wizard.create("(A B)")
479*16467b97STreehugger Robot    assert( !(@wizard.equals(tree1, tree2)) )
480*16467b97STreehugger Robot  end
481*16467b97STreehugger Robot
482*16467b97STreehugger Robot  def test_find_pattern
483*16467b97STreehugger Robot    tree = @wizard.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
484*16467b97STreehugger Robot    subtrees = @wizard.find(tree, "(A B)").map { |t| t.to_s }
485*16467b97STreehugger Robot    assert_equal(%w(foo big), subtrees)
486*16467b97STreehugger Robot  end
487*16467b97STreehugger Robot
488*16467b97STreehugger Robot  def test_find_token_type
489*16467b97STreehugger Robot    tree = @wizard.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
490*16467b97STreehugger Robot    subtrees = @wizard.find( tree, A ).map { |t| t.to_s }
491*16467b97STreehugger Robot    assert_equal(%w(A foo big), subtrees)
492*16467b97STreehugger Robot  end
493*16467b97STreehugger Robotend
494*16467b97STreehugger Robot
495