xref: /aosp_15_r20/external/antlr/runtime/Ruby/test/unit/test-trees.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 'test/unit'
6*16467b97STreehugger Robotrequire 'spec'
7*16467b97STreehugger Robot
8*16467b97STreehugger Robotinclude ANTLR3
9*16467b97STreehugger Robotinclude ANTLR3::AST
10*16467b97STreehugger Robot
11*16467b97STreehugger Robotclass TestTreeNodeStream < Test::Unit::TestCase
12*16467b97STreehugger Robot  def setup
13*16467b97STreehugger Robot    @adaptor = CommonTreeAdaptor.new
14*16467b97STreehugger Robot  end
15*16467b97STreehugger Robot
16*16467b97STreehugger Robot  def new_stream(t)
17*16467b97STreehugger Robot    CommonTreeNodeStream.new(t)
18*16467b97STreehugger Robot  end
19*16467b97STreehugger Robot
20*16467b97STreehugger Robot  def test_single_node
21*16467b97STreehugger Robot    t = CommonTree.new(CommonToken.new { |t| t.type = 101 })
22*16467b97STreehugger Robot    stream = new_stream(t)
23*16467b97STreehugger Robot    expecting = '101'
24*16467b97STreehugger Robot
25*16467b97STreehugger Robot    found = nodes_only_string(stream)
26*16467b97STreehugger Robot
27*16467b97STreehugger Robot    found.should == expecting
28*16467b97STreehugger Robot
29*16467b97STreehugger Robot    expecting = '<UNKNOWN: 101>'
30*16467b97STreehugger Robot    found = stream.inspect
31*16467b97STreehugger Robot
32*16467b97STreehugger Robot    found.should == expecting
33*16467b97STreehugger Robot  end
34*16467b97STreehugger Robot
35*16467b97STreehugger Robot  def test_two_children_of_nil_root
36*16467b97STreehugger Robot    v = Class.new(CommonTree) do
37*16467b97STreehugger Robot      def initialize(token = nil, type = nil, x = nil)
38*16467b97STreehugger Robot        @x = x
39*16467b97STreehugger Robot        super(token || (CommonToken.new { |t| t.type = type } if type))
40*16467b97STreehugger Robot      end
41*16467b97STreehugger Robot      def to_s
42*16467b97STreehugger Robot        (@token.text rescue '') + '<V>'
43*16467b97STreehugger Robot      end
44*16467b97STreehugger Robot    end
45*16467b97STreehugger Robot
46*16467b97STreehugger Robot    root_0 = @adaptor.create_flat_list
47*16467b97STreehugger Robot    t = v.new(nil, 101, 2)
48*16467b97STreehugger Robot    u = v.new CommonToken.create(:type => 102, :text => '102')
49*16467b97STreehugger Robot    @adaptor.add_child(root_0, t)
50*16467b97STreehugger Robot    @adaptor.add_child(root_0, u)
51*16467b97STreehugger Robot
52*16467b97STreehugger Robot    assert(root_0.parent.nil?)
53*16467b97STreehugger Robot    root_0.child_index.should == -1
54*16467b97STreehugger Robot    t.child_index.should == 0
55*16467b97STreehugger Robot    u.child_index.should == 1
56*16467b97STreehugger Robot
57*16467b97STreehugger Robot  end
58*16467b97STreehugger Robot
59*16467b97STreehugger Robot  def test_4_nodes
60*16467b97STreehugger Robot    t = CommonTree.new CommonToken[101]
61*16467b97STreehugger Robot    t.add_child( CommonTree.new CommonToken[102] )
62*16467b97STreehugger Robot    t.child(0).add_child(CommonTree.new CommonToken[103])
63*16467b97STreehugger Robot    t.add_child(CommonTree.new CommonToken[104])
64*16467b97STreehugger Robot
65*16467b97STreehugger Robot    stream = new_stream(t)
66*16467b97STreehugger Robot
67*16467b97STreehugger Robot    expecting = "101 102 103 104"
68*16467b97STreehugger Robot    found = nodes_only_string(stream)
69*16467b97STreehugger Robot    found.should == expecting
70*16467b97STreehugger Robot
71*16467b97STreehugger Robot    expecting = "<UNKNOWN: 101> <DOWN> <UNKNOWN: 102> <DOWN> <UNKNOWN: 103> <UP> <UNKNOWN: 104> <UP>"
72*16467b97STreehugger Robot    found = stream.inspect
73*16467b97STreehugger Robot    found.should == expecting
74*16467b97STreehugger Robot  end
75*16467b97STreehugger Robot
76*16467b97STreehugger Robot  def test_list
77*16467b97STreehugger Robot    root = CommonTree.new(nil)
78*16467b97STreehugger Robot    t = CommonTree.new CommonToken[101]
79*16467b97STreehugger Robot    t.add_child CommonTree.new(CommonToken[102])
80*16467b97STreehugger Robot    t.child(0).add_child(CommonTree.new(CommonToken[103]))
81*16467b97STreehugger Robot    t.add_child(CommonTree.new(CommonToken[104]))
82*16467b97STreehugger Robot
83*16467b97STreehugger Robot    u = CommonTree.new CommonToken[105]
84*16467b97STreehugger Robot
85*16467b97STreehugger Robot    root.add_child(t)
86*16467b97STreehugger Robot    root.add_child(u)
87*16467b97STreehugger Robot
88*16467b97STreehugger Robot    stream = CommonTreeNodeStream.new(root)
89*16467b97STreehugger Robot
90*16467b97STreehugger Robot    expecting = '101 102 103 104 105'
91*16467b97STreehugger Robot    found = nodes_only_string(stream)
92*16467b97STreehugger Robot    found.should == expecting
93*16467b97STreehugger Robot
94*16467b97STreehugger Robot    expecting = "<UNKNOWN: 101> <DOWN> <UNKNOWN: 102> <DOWN> <UNKNOWN: 103> <UP> <UNKNOWN: 104> <UP> <UNKNOWN: 105>"
95*16467b97STreehugger Robot    found = stream.inspect
96*16467b97STreehugger Robot    found.should == expecting
97*16467b97STreehugger Robot  end
98*16467b97STreehugger Robot
99*16467b97STreehugger Robot  def test_flat_list
100*16467b97STreehugger Robot    root = CommonTree.new(nil)
101*16467b97STreehugger Robot
102*16467b97STreehugger Robot    root.add_child CommonTree.new(CommonToken[101])
103*16467b97STreehugger Robot    root.add_child(CommonTree.new(CommonToken[102]))
104*16467b97STreehugger Robot    root.add_child(CommonTree.new(CommonToken[103]))
105*16467b97STreehugger Robot
106*16467b97STreehugger Robot    stream = CommonTreeNodeStream.new( root )
107*16467b97STreehugger Robot
108*16467b97STreehugger Robot    expecting = '101 102 103'
109*16467b97STreehugger Robot    found = nodes_only_string(stream)
110*16467b97STreehugger Robot    found.should == expecting
111*16467b97STreehugger Robot
112*16467b97STreehugger Robot    expecting = '<UNKNOWN: 101> <UNKNOWN: 102> <UNKNOWN: 103>'
113*16467b97STreehugger Robot    found = stream.inspect
114*16467b97STreehugger Robot    found.should == expecting
115*16467b97STreehugger Robot  end
116*16467b97STreehugger Robot
117*16467b97STreehugger Robot  def test_list_with_one_node
118*16467b97STreehugger Robot    root = CommonTree.new(nil)
119*16467b97STreehugger Robot
120*16467b97STreehugger Robot    root.add_child(CommonTree.new(CommonToken[101]))
121*16467b97STreehugger Robot
122*16467b97STreehugger Robot    stream = CommonTreeNodeStream.new(root)
123*16467b97STreehugger Robot
124*16467b97STreehugger Robot    expecting = '101'
125*16467b97STreehugger Robot    found = nodes_only_string(stream)
126*16467b97STreehugger Robot    found.should == expecting
127*16467b97STreehugger Robot
128*16467b97STreehugger Robot    expecting = "<UNKNOWN: 101>"
129*16467b97STreehugger Robot    found = stream.inspect
130*16467b97STreehugger Robot    found.should == expecting
131*16467b97STreehugger Robot  end
132*16467b97STreehugger Robot
133*16467b97STreehugger Robot  def test_a_over_b
134*16467b97STreehugger Robot    t = CommonTree.new(CommonToken[101])
135*16467b97STreehugger Robot    t.add_child(CommonTree.new(CommonToken[102]))
136*16467b97STreehugger Robot
137*16467b97STreehugger Robot    stream = new_stream(t)
138*16467b97STreehugger Robot    expecting = '101 102'
139*16467b97STreehugger Robot    found = nodes_only_string(stream)
140*16467b97STreehugger Robot    found.should == expecting
141*16467b97STreehugger Robot
142*16467b97STreehugger Robot    expecting = '<UNKNOWN: 101> <DOWN> <UNKNOWN: 102> <UP>'
143*16467b97STreehugger Robot    found = stream.inspect
144*16467b97STreehugger Robot    found.should == expecting
145*16467b97STreehugger Robot  end
146*16467b97STreehugger Robot
147*16467b97STreehugger Robot  def test_LT
148*16467b97STreehugger Robot    # ^(101 ^(102 103) 104)
149*16467b97STreehugger Robot    t = CommonTree.new CommonToken[101]
150*16467b97STreehugger Robot    t.add_child CommonTree.new(CommonToken[102])
151*16467b97STreehugger Robot    t.child(0).add_child(CommonTree.new(CommonToken[103]))
152*16467b97STreehugger Robot    t.add_child(CommonTree.new(CommonToken[104]))
153*16467b97STreehugger Robot
154*16467b97STreehugger Robot    stream = new_stream(t)
155*16467b97STreehugger Robot    [101, DOWN, 102, DOWN, 103, UP, 104, UP, EOF].each_with_index do |type, index|
156*16467b97STreehugger Robot      stream.look(index + 1).type.should == type
157*16467b97STreehugger Robot    end
158*16467b97STreehugger Robot    stream.look(100).type.should == EOF
159*16467b97STreehugger Robot  end
160*16467b97STreehugger Robot
161*16467b97STreehugger Robot  def test_mark_rewind_entire
162*16467b97STreehugger Robot    # ^(101 ^(102 103 ^(106 107)) 104 105)
163*16467b97STreehugger Robot    r0 = new_node new_token(101)
164*16467b97STreehugger Robot    r1 = new_node new_token(102)
165*16467b97STreehugger Robot    r0.add_child(r1)
166*16467b97STreehugger Robot    r1.add_child(new_node new_token(103))
167*16467b97STreehugger Robot    r2 = new_node new_token(106)
168*16467b97STreehugger Robot    r2.add_child new_node( new_token 107 )
169*16467b97STreehugger Robot    r1.add_child r2
170*16467b97STreehugger Robot    r0.add_child new_node( new_token 104 )
171*16467b97STreehugger Robot    r0.add_child new_node( new_token 105 )
172*16467b97STreehugger Robot
173*16467b97STreehugger Robot    stream = CommonTreeNodeStream.new(r0)
174*16467b97STreehugger Robot    m = stream.mark
175*16467b97STreehugger Robot    13.times { stream.look(1); stream.consume } # consume until end
176*16467b97STreehugger Robot
177*16467b97STreehugger Robot    stream.look(1).type.should == EOF
178*16467b97STreehugger Robot    stream.look(-1).type.should == UP
179*16467b97STreehugger Robot    stream.rewind(m)
180*16467b97STreehugger Robot
181*16467b97STreehugger Robot    13.times { stream.look(1); stream.consume } # consume until end
182*16467b97STreehugger Robot
183*16467b97STreehugger Robot    stream.look(1).type.should == EOF
184*16467b97STreehugger Robot    stream.look(-1).type.should == UP
185*16467b97STreehugger Robot  end
186*16467b97STreehugger Robot
187*16467b97STreehugger Robot  def test_mark_rewind_in_middle
188*16467b97STreehugger Robot    # ^(101 ^(102 103 ^(106 107)) 104 105)
189*16467b97STreehugger Robot    r0 = new_node new_token(101)
190*16467b97STreehugger Robot    r1 = new_node new_token(102)
191*16467b97STreehugger Robot    r0.add_child r1
192*16467b97STreehugger Robot    r1.add_child new_node( new_token 103 )
193*16467b97STreehugger Robot    r2 = new_node new_token(106)
194*16467b97STreehugger Robot    r2.add_child new_node( new_token 107 )
195*16467b97STreehugger Robot    r1.add_child r2
196*16467b97STreehugger Robot    r0.add_child new_node( new_token 104 )
197*16467b97STreehugger Robot    r0.add_child new_node( new_token 105 )
198*16467b97STreehugger Robot
199*16467b97STreehugger Robot    stream = CommonTreeNodeStream.new(r0)
200*16467b97STreehugger Robot    7.times { stream.consume }
201*16467b97STreehugger Robot
202*16467b97STreehugger Robot    stream.look(1).type.should == 107
203*16467b97STreehugger Robot    m = stream.mark
204*16467b97STreehugger Robot    4.times { stream.consume }
205*16467b97STreehugger Robot    stream.rewind(m)
206*16467b97STreehugger Robot
207*16467b97STreehugger Robot    [107, UP, UP, 104].each do |val|
208*16467b97STreehugger Robot      stream.look(1).type.should == val
209*16467b97STreehugger Robot      stream.consume
210*16467b97STreehugger Robot    end
211*16467b97STreehugger Robot    # past rewind position now
212*16467b97STreehugger Robot    [105, UP].each do |val|
213*16467b97STreehugger Robot      stream.look(1).type.should == val
214*16467b97STreehugger Robot      stream.consume
215*16467b97STreehugger Robot    end
216*16467b97STreehugger Robot    stream.look(1).type.should == EOF
217*16467b97STreehugger Robot    stream.look(-1).type.should == UP
218*16467b97STreehugger Robot  end
219*16467b97STreehugger Robot
220*16467b97STreehugger Robot  def test_mark_rewind_nested
221*16467b97STreehugger Robot    # ^(101 ^(102 103 ^(106 107)) 104 105)
222*16467b97STreehugger Robot    r0 = new_node new_token(101)
223*16467b97STreehugger Robot    r1 = new_node new_token(102)
224*16467b97STreehugger Robot    r0.add_child r1
225*16467b97STreehugger Robot    r1.add_child new_node( new_token 103 )
226*16467b97STreehugger Robot    r2 = new_node new_token(106)
227*16467b97STreehugger Robot    r2.add_child new_node( new_token 107 )
228*16467b97STreehugger Robot    r1.add_child r2
229*16467b97STreehugger Robot    r0.add_child new_node( new_token 104 )
230*16467b97STreehugger Robot    r0.add_child new_node( new_token 105 )
231*16467b97STreehugger Robot
232*16467b97STreehugger Robot    stream = CommonTreeNodeStream.new(r0)
233*16467b97STreehugger Robot    m = stream.mark
234*16467b97STreehugger Robot    2.times { stream.consume }
235*16467b97STreehugger Robot    m2 = stream.mark
236*16467b97STreehugger Robot    4.times { stream.consume }
237*16467b97STreehugger Robot    stream.rewind(m2)
238*16467b97STreehugger Robot    stream.look(1).type.should == 102
239*16467b97STreehugger Robot    stream.consume
240*16467b97STreehugger Robot    stream.look(1).type.should == DOWN
241*16467b97STreehugger Robot    stream.consume
242*16467b97STreehugger Robot
243*16467b97STreehugger Robot    stream.rewind(m)
244*16467b97STreehugger Robot    [101, DOWN, 102].each do |val|
245*16467b97STreehugger Robot      stream.look(1).type.should == val
246*16467b97STreehugger Robot      stream.consume
247*16467b97STreehugger Robot    end
248*16467b97STreehugger Robot    stream.look(1).type.should == DOWN
249*16467b97STreehugger Robot  end
250*16467b97STreehugger Robot
251*16467b97STreehugger Robot  def test_seek
252*16467b97STreehugger Robot    # ^(101 ^(102 103 ^(106 107) ) 104 105)
253*16467b97STreehugger Robot    # stream has 7 real + 6 nav nodes
254*16467b97STreehugger Robot    # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
255*16467b97STreehugger Robot
256*16467b97STreehugger Robot    r0 = new_node new_token(101)
257*16467b97STreehugger Robot    r1 = new_node new_token(102)
258*16467b97STreehugger Robot    r0.add_child r1
259*16467b97STreehugger Robot    r1.add_child new_node( new_token 103 )
260*16467b97STreehugger Robot    r2 = new_node new_token(106)
261*16467b97STreehugger Robot    r2.add_child new_node( new_token 107 )
262*16467b97STreehugger Robot    r1.add_child r2
263*16467b97STreehugger Robot    r0.add_child new_node( new_token 104 )
264*16467b97STreehugger Robot    r0.add_child new_node( new_token 105 )
265*16467b97STreehugger Robot
266*16467b97STreehugger Robot    stream = CommonTreeNodeStream.new(r0)
267*16467b97STreehugger Robot    3.times { stream.consume }
268*16467b97STreehugger Robot    stream.seek(7)
269*16467b97STreehugger Robot    stream.look(1).type.should == 107
270*16467b97STreehugger Robot    3.times { stream.consume }
271*16467b97STreehugger Robot    stream.look(1).type.should == 104
272*16467b97STreehugger Robot  end
273*16467b97STreehugger Robot
274*16467b97STreehugger Robot  def test_seek_from_start
275*16467b97STreehugger Robot    r0 = new_node new_token(101)
276*16467b97STreehugger Robot    r1 = new_node new_token(102)
277*16467b97STreehugger Robot    r0.add_child r1
278*16467b97STreehugger Robot    r1.add_child new_node( new_token 103 )
279*16467b97STreehugger Robot    r2 = new_node new_token(106)
280*16467b97STreehugger Robot    r2.add_child new_node( new_token 107 )
281*16467b97STreehugger Robot    r1.add_child r2
282*16467b97STreehugger Robot    r0.add_child new_node( new_token 104 )
283*16467b97STreehugger Robot    r0.add_child new_node( new_token 105 )
284*16467b97STreehugger Robot
285*16467b97STreehugger Robot    stream = CommonTreeNodeStream.new(r0)
286*16467b97STreehugger Robot    stream.seek(7)
287*16467b97STreehugger Robot    stream.look(1).type.should == 107
288*16467b97STreehugger Robot    3.times { stream.consume }
289*16467b97STreehugger Robot    stream.look(1).type.should == 104
290*16467b97STreehugger Robot  end
291*16467b97STreehugger Robot
292*16467b97STreehugger Robot  def nodes_only_string(nodes)
293*16467b97STreehugger Robot    buffer = []
294*16467b97STreehugger Robot    nodes.size.times do |index|
295*16467b97STreehugger Robot      t = nodes.look(index + 1)
296*16467b97STreehugger Robot      type = nodes.tree_adaptor.type_of(t)
297*16467b97STreehugger Robot      buffer << type.to_s unless type == DOWN or type == UP
298*16467b97STreehugger Robot    end
299*16467b97STreehugger Robot    return buffer.join(' ')
300*16467b97STreehugger Robot  end
301*16467b97STreehugger Robot
302*16467b97STreehugger Robot  def new_token(type, opts = {})
303*16467b97STreehugger Robot    opts[:type] = type
304*16467b97STreehugger Robot    CommonToken.create(opts)
305*16467b97STreehugger Robot  end
306*16467b97STreehugger Robot  def new_node(token)
307*16467b97STreehugger Robot    CommonTree.new(token)
308*16467b97STreehugger Robot  end
309*16467b97STreehugger Robot
310*16467b97STreehugger Robot
311*16467b97STreehugger Robotend
312*16467b97STreehugger Robot
313*16467b97STreehugger Robotclass TestCommonTreeNodeStream < Test::Unit::TestCase
314*16467b97STreehugger Robot  def setup
315*16467b97STreehugger Robot    # before-each-test code
316*16467b97STreehugger Robot  end
317*16467b97STreehugger Robot  def teardown
318*16467b97STreehugger Robot    # after-each-test code
319*16467b97STreehugger Robot  end
320*16467b97STreehugger Robot
321*16467b97STreehugger Robot  # vvvvvvvv tests vvvvvvvvv
322*16467b97STreehugger Robot
323*16467b97STreehugger Robot  def test_push_pop
324*16467b97STreehugger Robot    r0 = new_node new_token(101)
325*16467b97STreehugger Robot    r1 = new_node new_token(102)
326*16467b97STreehugger Robot    r1.add_child new_node( new_token 103 )
327*16467b97STreehugger Robot    r0.add_child r1
328*16467b97STreehugger Robot    r2 = new_node new_token(104)
329*16467b97STreehugger Robot    r2.add_child new_node( new_token 105 )
330*16467b97STreehugger Robot    r0.add_child r2
331*16467b97STreehugger Robot    r3 = new_node new_token(106)
332*16467b97STreehugger Robot    r3.add_child new_node( new_token 107 )
333*16467b97STreehugger Robot    r0.add_child r3
334*16467b97STreehugger Robot    r0.add_child new_node( new_token 108 )
335*16467b97STreehugger Robot    r0.add_child new_node( new_token 109 )
336*16467b97STreehugger Robot
337*16467b97STreehugger Robot    stream = CommonTreeNodeStream.new(r0)
338*16467b97STreehugger Robot    expecting = '<UNKNOWN: 101> <DOWN> <UNKNOWN: 102> <DOWN> <UNKNOWN: 103> <UP> <UNKNOWN: 104> ' +
339*16467b97STreehugger Robot                '<DOWN> <UNKNOWN: 105> <UP> <UNKNOWN: 106> <DOWN> <UNKNOWN: 107> <UP> ' +
340*16467b97STreehugger Robot                '<UNKNOWN: 108> <UNKNOWN: 109> <UP>'
341*16467b97STreehugger Robot    found = stream.inspect
342*16467b97STreehugger Robot    found.should == expecting
343*16467b97STreehugger Robot
344*16467b97STreehugger Robot    index_of_102 = 2
345*16467b97STreehugger Robot    index_of_107 = 12
346*16467b97STreehugger Robot    index_of_107.times { stream.consume }
347*16467b97STreehugger Robot
348*16467b97STreehugger Robot    stream.look(1).type.should == 107
349*16467b97STreehugger Robot    stream.push(index_of_102)
350*16467b97STreehugger Robot    stream.look(1).type.should == 102
351*16467b97STreehugger Robot    stream.consume
352*16467b97STreehugger Robot    stream.look(1).type.should == DOWN
353*16467b97STreehugger Robot    stream.consume
354*16467b97STreehugger Robot    stream.look(1).type.should == 103
355*16467b97STreehugger Robot    stream.consume
356*16467b97STreehugger Robot    stream.look(1).type.should == UP
357*16467b97STreehugger Robot    stream.pop
358*16467b97STreehugger Robot    stream.look(1).type.should == 107
359*16467b97STreehugger Robot  end
360*16467b97STreehugger Robot
361*16467b97STreehugger Robot  def test_nested_push_pop
362*16467b97STreehugger Robot    r0 = new_node new_token(101)
363*16467b97STreehugger Robot    r1 = new_node new_token(102)
364*16467b97STreehugger Robot    r1.add_child new_node( new_token 103 )
365*16467b97STreehugger Robot    r0.add_child r1
366*16467b97STreehugger Robot    r2 = new_node new_token(104)
367*16467b97STreehugger Robot    r2.add_child new_node( new_token 105 )
368*16467b97STreehugger Robot    r0.add_child r2
369*16467b97STreehugger Robot    r3 = new_node new_token(106)
370*16467b97STreehugger Robot    r3.add_child new_node( new_token 107 )
371*16467b97STreehugger Robot    r0.add_child r3
372*16467b97STreehugger Robot    r0.add_child new_node( new_token 108 )
373*16467b97STreehugger Robot    r0.add_child new_node( new_token 109 )
374*16467b97STreehugger Robot
375*16467b97STreehugger Robot    stream = CommonTreeNodeStream.new(r0)
376*16467b97STreehugger Robot
377*16467b97STreehugger Robot    index_of_102 = 2
378*16467b97STreehugger Robot    index_of_107 = 12
379*16467b97STreehugger Robot
380*16467b97STreehugger Robot    index_of_107.times { stream.consume }
381*16467b97STreehugger Robot
382*16467b97STreehugger Robot    stream.look(1).type.should == 107
383*16467b97STreehugger Robot    stream.push(index_of_102)
384*16467b97STreehugger Robot    [102, DOWN, 103].each do |val|
385*16467b97STreehugger Robot      stream.look(1).type.should == val
386*16467b97STreehugger Robot      stream.consume
387*16467b97STreehugger Robot    end
388*16467b97STreehugger Robot
389*16467b97STreehugger Robot    index_of_104 = 6
390*16467b97STreehugger Robot    stream.push(index_of_104)
391*16467b97STreehugger Robot    [104,DOWN,105].each do |val|
392*16467b97STreehugger Robot      stream.look(1).type.should == val
393*16467b97STreehugger Robot      stream.consume
394*16467b97STreehugger Robot    end
395*16467b97STreehugger Robot    stream.look(1).type.should == UP
396*16467b97STreehugger Robot    stream.pop
397*16467b97STreehugger Robot
398*16467b97STreehugger Robot    stream.look(1).type.should == UP
399*16467b97STreehugger Robot    stream.pop
400*16467b97STreehugger Robot    stream.look(1).type.should == 107
401*16467b97STreehugger Robot  end
402*16467b97STreehugger Robot
403*16467b97STreehugger Robot  def test_push_pop_from_eof
404*16467b97STreehugger Robot    r0 = new_node new_token(101)
405*16467b97STreehugger Robot    r1 = new_node new_token(102)
406*16467b97STreehugger Robot    r1.add_child new_node( new_token 103 )
407*16467b97STreehugger Robot    r0.add_child r1
408*16467b97STreehugger Robot    r2 = new_node new_token(104)
409*16467b97STreehugger Robot    r2.add_child new_node( new_token 105 )
410*16467b97STreehugger Robot    r0.add_child r2
411*16467b97STreehugger Robot    r3 = new_node new_token(106)
412*16467b97STreehugger Robot    r3.add_child new_node( new_token 107 )
413*16467b97STreehugger Robot    r0.add_child r3
414*16467b97STreehugger Robot    r0.add_child new_node( new_token 108 )
415*16467b97STreehugger Robot    r0.add_child new_node( new_token 109 )
416*16467b97STreehugger Robot
417*16467b97STreehugger Robot    stream = CommonTreeNodeStream.new(r0)
418*16467b97STreehugger Robot    stream.consume until stream.peek(1) == EOF
419*16467b97STreehugger Robot
420*16467b97STreehugger Robot    index_of_102 = 2
421*16467b97STreehugger Robot    index_of_104 = 6
422*16467b97STreehugger Robot    stream.look(1).type.should == EOF
423*16467b97STreehugger Robot
424*16467b97STreehugger Robot    stream.push(index_of_102)
425*16467b97STreehugger Robot    [102, DOWN, 103].each do |val|
426*16467b97STreehugger Robot      stream.look(1).type.should == val
427*16467b97STreehugger Robot      stream.consume
428*16467b97STreehugger Robot    end
429*16467b97STreehugger Robot    stream.look(1).type.should == UP
430*16467b97STreehugger Robot
431*16467b97STreehugger Robot    stream.pop
432*16467b97STreehugger Robot    stream.look(1).type.should == EOF
433*16467b97STreehugger Robot
434*16467b97STreehugger Robot    stream.push(index_of_104)
435*16467b97STreehugger Robot    [104, DOWN, 105].each do |val|
436*16467b97STreehugger Robot      stream.look(1).type.should == val
437*16467b97STreehugger Robot      stream.consume
438*16467b97STreehugger Robot    end
439*16467b97STreehugger Robot    stream.look(1).type.should == UP
440*16467b97STreehugger Robot
441*16467b97STreehugger Robot    stream.pop
442*16467b97STreehugger Robot    stream.look(1).type.should == EOF
443*16467b97STreehugger Robot  end
444*16467b97STreehugger Robot
445*16467b97STreehugger Robot
446*16467b97STreehugger Robot  def new_token(type, opts = {})
447*16467b97STreehugger Robot    opts[:type] = type
448*16467b97STreehugger Robot    CommonToken.create(opts)
449*16467b97STreehugger Robot  end
450*16467b97STreehugger Robot  def new_node(token)
451*16467b97STreehugger Robot    CommonTree.new(token)
452*16467b97STreehugger Robot  end
453*16467b97STreehugger Robotend
454*16467b97STreehugger Robot
455*16467b97STreehugger Robot
456*16467b97STreehugger Robotclass TestCommonTree < Test::Unit::TestCase
457*16467b97STreehugger Robot  def setup
458*16467b97STreehugger Robot    @adaptor = CommonTreeAdaptor.new
459*16467b97STreehugger Robot  end
460*16467b97STreehugger Robot  def teardown
461*16467b97STreehugger Robot    # after-each-test code
462*16467b97STreehugger Robot  end
463*16467b97STreehugger Robot
464*16467b97STreehugger Robot  # vvvvvvvv tests vvvvvvvvv
465*16467b97STreehugger Robot
466*16467b97STreehugger Robot  def test_single_node
467*16467b97STreehugger Robot    t = new_node( new_token 101 )
468*16467b97STreehugger Robot    assert_nil t.parent
469*16467b97STreehugger Robot    t.child_index.should == -1
470*16467b97STreehugger Robot  end
471*16467b97STreehugger Robot
472*16467b97STreehugger Robot  def test_4_nodes
473*16467b97STreehugger Robot    # ^(101 ^(102 103) 104)
474*16467b97STreehugger Robot    r0 = new_node( new_token 101 )
475*16467b97STreehugger Robot    r0.add_child new_node( new_token 102 )
476*16467b97STreehugger Robot    r0.child(0).add_child new_node( new_token 103 )
477*16467b97STreehugger Robot    r0.add_child new_node( new_token 104 )
478*16467b97STreehugger Robot
479*16467b97STreehugger Robot    assert_nil r0.parent
480*16467b97STreehugger Robot    r0.child_index.should == -1
481*16467b97STreehugger Robot  end
482*16467b97STreehugger Robot
483*16467b97STreehugger Robot  def test_list
484*16467b97STreehugger Robot    # ^(nil 101 102 103)
485*16467b97STreehugger Robot    r0 = CommonTree.new(nil)
486*16467b97STreehugger Robot    c0 = new_node( new_token 101 )
487*16467b97STreehugger Robot    r0.add_child c0
488*16467b97STreehugger Robot    c1 = new_node( new_token 102 )
489*16467b97STreehugger Robot    r0.add_child c1
490*16467b97STreehugger Robot    c2 = new_node( new_token 103 )
491*16467b97STreehugger Robot    r0.add_child c2
492*16467b97STreehugger Robot
493*16467b97STreehugger Robot    assert_nil r0.parent
494*16467b97STreehugger Robot    r0.child_index.should == -1
495*16467b97STreehugger Robot    c0.parent.should == r0
496*16467b97STreehugger Robot    c0.child_index.should == 0
497*16467b97STreehugger Robot    c1.parent.should == r0
498*16467b97STreehugger Robot    c1.child_index.should == 1
499*16467b97STreehugger Robot    c2.parent.should == r0
500*16467b97STreehugger Robot    c2.child_index.should == 2
501*16467b97STreehugger Robot  end
502*16467b97STreehugger Robot
503*16467b97STreehugger Robot  def test_list2
504*16467b97STreehugger Robot    # ^(nil 101 102 103)
505*16467b97STreehugger Robot    root = new_node( new_token 5 )
506*16467b97STreehugger Robot    r0 = CommonTree.new(nil)
507*16467b97STreehugger Robot    c0 = new_node( new_token 101 )
508*16467b97STreehugger Robot    r0.add_child c0
509*16467b97STreehugger Robot    c1 = new_node( new_token 102 )
510*16467b97STreehugger Robot    r0.add_child c1
511*16467b97STreehugger Robot    c2 = new_node( new_token 103 )
512*16467b97STreehugger Robot    r0.add_child c2
513*16467b97STreehugger Robot
514*16467b97STreehugger Robot    root.add_child r0
515*16467b97STreehugger Robot
516*16467b97STreehugger Robot    assert_nil root.parent
517*16467b97STreehugger Robot    root.child_index.should == -1
518*16467b97STreehugger Robot    c0.parent.should == root
519*16467b97STreehugger Robot    c0.child_index.should == 0
520*16467b97STreehugger Robot    c1.parent.should == root            # note -- actual python tests all use c0 here, which i think might be wrong
521*16467b97STreehugger Robot    c1.child_index.should == 1
522*16467b97STreehugger Robot    c2.parent.should == root            # note -- actual python tests all use c0 here, which i think might be wrong
523*16467b97STreehugger Robot    c2.child_index.should == 2
524*16467b97STreehugger Robot  end
525*16467b97STreehugger Robot
526*16467b97STreehugger Robot  def test_add_list_to_exist_children
527*16467b97STreehugger Robot    root = new_node( new_token 5 )
528*16467b97STreehugger Robot    root.add_child new_node( new_token 6 )
529*16467b97STreehugger Robot
530*16467b97STreehugger Robot    r0 = CommonTree.new(nil)
531*16467b97STreehugger Robot    c0 = new_node( new_token 101 )
532*16467b97STreehugger Robot    r0.add_child c0
533*16467b97STreehugger Robot    c1 = new_node( new_token 102 )
534*16467b97STreehugger Robot    r0.add_child c1
535*16467b97STreehugger Robot    c2 = new_node( new_token 103 )
536*16467b97STreehugger Robot    r0.add_child c2
537*16467b97STreehugger Robot    # ^(nil c0=101 c1=102 c2=103)
538*16467b97STreehugger Robot
539*16467b97STreehugger Robot    root.add_child(r0)
540*16467b97STreehugger Robot
541*16467b97STreehugger Robot    assert_nil root.parent
542*16467b97STreehugger Robot    root.child_index.should == -1
543*16467b97STreehugger Robot    c0.parent.should == root
544*16467b97STreehugger Robot    c0.child_index.should == 1
545*16467b97STreehugger Robot    c1.parent.should == root
546*16467b97STreehugger Robot    c1.child_index.should == 2
547*16467b97STreehugger Robot    c2.parent.should == root
548*16467b97STreehugger Robot    c2.child_index.should == 3
549*16467b97STreehugger Robot  end
550*16467b97STreehugger Robot
551*16467b97STreehugger Robot  def test_copy_tree
552*16467b97STreehugger Robot    r0 = new_node( new_token 101 )
553*16467b97STreehugger Robot    r1 = new_node( new_token 102 )
554*16467b97STreehugger Robot    r2 = new_node( new_token 106 )
555*16467b97STreehugger Robot    r0.add_child( r1 )
556*16467b97STreehugger Robot    r1.add_child( new_node( new_token 103 ) )
557*16467b97STreehugger Robot    r2.add_child( new_node( new_token 107 ) )
558*16467b97STreehugger Robot    r1.add_child( r2 )
559*16467b97STreehugger Robot    r0.add_child( new_node( new_token 104 ) )
560*16467b97STreehugger Robot    r0.add_child( new_node( new_token 105 ) )
561*16467b97STreehugger Robot
562*16467b97STreehugger Robot    dup = @adaptor.copy_tree( r0 )
563*16467b97STreehugger Robot    assert_nil dup.parent
564*16467b97STreehugger Robot    dup.child_index.should == -1
565*16467b97STreehugger Robot    dup.sanity_check
566*16467b97STreehugger Robot  end
567*16467b97STreehugger Robot
568*16467b97STreehugger Robot  def test_become_root
569*16467b97STreehugger Robot    new_root = new_node( new_token 5 )
570*16467b97STreehugger Robot
571*16467b97STreehugger Robot    old_root = new_node nil
572*16467b97STreehugger Robot    old_root.add_child( new_node( new_token 101 ) )
573*16467b97STreehugger Robot    old_root.add_child( new_node( new_token 102 ) )
574*16467b97STreehugger Robot    old_root.add_child( new_node( new_token 103 ) )
575*16467b97STreehugger Robot
576*16467b97STreehugger Robot    @adaptor.become_root(new_root, old_root)
577*16467b97STreehugger Robot    new_root.sanity_check
578*16467b97STreehugger Robot  end
579*16467b97STreehugger Robot
580*16467b97STreehugger Robot  def test_become_root2
581*16467b97STreehugger Robot    new_root = new_node( new_token 5 )
582*16467b97STreehugger Robot
583*16467b97STreehugger Robot    old_root = new_node( new_token 101 )
584*16467b97STreehugger Robot    old_root.add_child( new_node( new_token 102 ) )
585*16467b97STreehugger Robot    old_root.add_child( new_node( new_token 103 ) )
586*16467b97STreehugger Robot
587*16467b97STreehugger Robot    @adaptor.become_root(new_root, old_root)
588*16467b97STreehugger Robot    new_root.sanity_check
589*16467b97STreehugger Robot  end
590*16467b97STreehugger Robot
591*16467b97STreehugger Robot  def test_become_root3
592*16467b97STreehugger Robot    new_root = new_node nil
593*16467b97STreehugger Robot    new_root.add_child( new_node( new_token 5 ) )
594*16467b97STreehugger Robot
595*16467b97STreehugger Robot    old_root = new_node nil
596*16467b97STreehugger Robot    old_root.add_child( new_node( new_token 101 ) )
597*16467b97STreehugger Robot    old_root.add_child( new_node( new_token 102 ) )
598*16467b97STreehugger Robot    old_root.add_child( new_node( new_token 103 ) )
599*16467b97STreehugger Robot
600*16467b97STreehugger Robot    @adaptor.become_root(new_root, old_root)
601*16467b97STreehugger Robot    new_root.sanity_check
602*16467b97STreehugger Robot  end
603*16467b97STreehugger Robot
604*16467b97STreehugger Robot  def test_become_root5
605*16467b97STreehugger Robot    new_root = new_node nil
606*16467b97STreehugger Robot    new_root.add_child( new_node( new_token 5 ) )
607*16467b97STreehugger Robot
608*16467b97STreehugger Robot    old_root = new_node( new_token 101 )
609*16467b97STreehugger Robot    old_root.add_child( new_node( new_token 102 ) )
610*16467b97STreehugger Robot    old_root.add_child( new_node( new_token 103 ) )
611*16467b97STreehugger Robot
612*16467b97STreehugger Robot    @adaptor.become_root(new_root, old_root)
613*16467b97STreehugger Robot    new_root.sanity_check
614*16467b97STreehugger Robot  end
615*16467b97STreehugger Robot
616*16467b97STreehugger Robot  def test_become_root6
617*16467b97STreehugger Robot    root_0 = @adaptor.create_flat_list
618*16467b97STreehugger Robot    root_1 = @adaptor.create_flat_list
619*16467b97STreehugger Robot    root_1 = @adaptor.become_root( new_node( new_token 5 ), root_1 )
620*16467b97STreehugger Robot
621*16467b97STreehugger Robot    @adaptor.add_child( root_1, new_node( new_token 6 ) )
622*16467b97STreehugger Robot    @adaptor.add_child( root_0, root_1 )
623*16467b97STreehugger Robot    root_0.sanity_check
624*16467b97STreehugger Robot  end
625*16467b97STreehugger Robot
626*16467b97STreehugger Robot  def test_replace_with_no_children
627*16467b97STreehugger Robot    t = new_node( new_token 101 )
628*16467b97STreehugger Robot    new_child = new_node( new_token 5 )
629*16467b97STreehugger Robot    error = false
630*16467b97STreehugger Robot    assert_raise(IndexError) do
631*16467b97STreehugger Robot      t.replace_children(0, 0, new_child)
632*16467b97STreehugger Robot    end
633*16467b97STreehugger Robot  end
634*16467b97STreehugger Robot
635*16467b97STreehugger Robot  def test_replace_with_one_children
636*16467b97STreehugger Robot    t = new_node( new_token 99, :text => 'a' )
637*16467b97STreehugger Robot    c0 = new_node( new_token 99, :text => 'b' )
638*16467b97STreehugger Robot    t.add_child(c0)
639*16467b97STreehugger Robot
640*16467b97STreehugger Robot    new_child = new_node( new_token 99, :text => 'c' )
641*16467b97STreehugger Robot    t.replace_children(0,0,new_child)
642*16467b97STreehugger Robot
643*16467b97STreehugger Robot    t.inspect.should == '(a c)'
644*16467b97STreehugger Robot    t.sanity_check
645*16467b97STreehugger Robot
646*16467b97STreehugger Robot  end
647*16467b97STreehugger Robot  def test_replace_in_middle
648*16467b97STreehugger Robot    t = new_node( new_token 99, :text => 'a' )
649*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'b' )
650*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'c' )
651*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'd' )
652*16467b97STreehugger Robot
653*16467b97STreehugger Robot    new_child = new_node( new_token 99, :text => 'x' )
654*16467b97STreehugger Robot    t.replace_children(1, 1, new_child)
655*16467b97STreehugger Robot    t.inspect.should == '(a b x d)'
656*16467b97STreehugger Robot    t.sanity_check
657*16467b97STreehugger Robot  end
658*16467b97STreehugger Robot
659*16467b97STreehugger Robot  def test_replace_at_left
660*16467b97STreehugger Robot    t = new_node( new_token 99, :text => 'a' )
661*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'b' )
662*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'c' )
663*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'd' )
664*16467b97STreehugger Robot
665*16467b97STreehugger Robot    new_child = new_node( new_token 99, :text => 'x' )
666*16467b97STreehugger Robot    t.replace_children(0, 0, new_child)
667*16467b97STreehugger Robot    t.inspect.should == '(a x c d)'
668*16467b97STreehugger Robot    t.sanity_check
669*16467b97STreehugger Robot  end
670*16467b97STreehugger Robot
671*16467b97STreehugger Robot  def test_replace_at_left
672*16467b97STreehugger Robot    t = new_node( new_token 99, :text => 'a' )
673*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'b' )
674*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'c' )
675*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'd' )
676*16467b97STreehugger Robot
677*16467b97STreehugger Robot    new_child = new_node( new_token 99, :text => 'x' )
678*16467b97STreehugger Robot    t.replace_children(2, 2, new_child)
679*16467b97STreehugger Robot    t.inspect.should == '(a b c x)'
680*16467b97STreehugger Robot    t.sanity_check
681*16467b97STreehugger Robot  end
682*16467b97STreehugger Robot
683*16467b97STreehugger Robot  def test_replace_one_with_two_at_left
684*16467b97STreehugger Robot    t = new_node( new_token 99, :text => 'a' )
685*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'b' )
686*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'c' )
687*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'd' )
688*16467b97STreehugger Robot
689*16467b97STreehugger Robot    new_children = @adaptor.create_flat_list
690*16467b97STreehugger Robot    new_children.add_child new_node( new_token 99, :text => 'x' )
691*16467b97STreehugger Robot    new_children.add_child new_node( new_token 99, :text => 'y' )
692*16467b97STreehugger Robot
693*16467b97STreehugger Robot    t.replace_children(0, 0, new_children)
694*16467b97STreehugger Robot    t.inspect.should == '(a x y c d)'
695*16467b97STreehugger Robot    t.sanity_check
696*16467b97STreehugger Robot  end
697*16467b97STreehugger Robot
698*16467b97STreehugger Robot  def test_replace_one_with_two_at_right
699*16467b97STreehugger Robot    t = new_node( new_token 99, :text => 'a' )
700*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'b' )
701*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'c' )
702*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'd' )
703*16467b97STreehugger Robot
704*16467b97STreehugger Robot    new_children = @adaptor.create_flat_list
705*16467b97STreehugger Robot    new_children.add_child new_node( new_token 99, :text => 'x' )
706*16467b97STreehugger Robot    new_children.add_child new_node( new_token 99, :text => 'y' )
707*16467b97STreehugger Robot
708*16467b97STreehugger Robot    t.replace_children(2, 2, new_children)
709*16467b97STreehugger Robot    t.inspect.should == '(a b c x y)'
710*16467b97STreehugger Robot    t.sanity_check
711*16467b97STreehugger Robot  end
712*16467b97STreehugger Robot
713*16467b97STreehugger Robot  def test_replace_one_with_two_in_middle
714*16467b97STreehugger Robot    t = new_node( new_token 99, :text => 'a' )
715*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'b' )
716*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'c' )
717*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'd' )
718*16467b97STreehugger Robot
719*16467b97STreehugger Robot    new_children = @adaptor.create_flat_list
720*16467b97STreehugger Robot    new_children.add_child new_node( new_token 99, :text => 'x' )
721*16467b97STreehugger Robot    new_children.add_child new_node( new_token 99, :text => 'y' )
722*16467b97STreehugger Robot
723*16467b97STreehugger Robot    t.replace_children(1, 1, new_children)
724*16467b97STreehugger Robot    t.inspect.should == '(a b x y d)'
725*16467b97STreehugger Robot    t.sanity_check
726*16467b97STreehugger Robot  end
727*16467b97STreehugger Robot
728*16467b97STreehugger Robot  def test_replace_two_with_one_at_left
729*16467b97STreehugger Robot    t = new_node( new_token 99, :text => 'a' )
730*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'b' )
731*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'c' )
732*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'd' )
733*16467b97STreehugger Robot
734*16467b97STreehugger Robot    new_child = new_node( new_token 99, :text => 'x' )
735*16467b97STreehugger Robot
736*16467b97STreehugger Robot    t.replace_children(0, 1, new_child)
737*16467b97STreehugger Robot    t.inspect.should == '(a x d)'
738*16467b97STreehugger Robot    t.sanity_check
739*16467b97STreehugger Robot  end
740*16467b97STreehugger Robot
741*16467b97STreehugger Robot  def test_replace_two_with_one_at_right
742*16467b97STreehugger Robot    t = new_node( new_token 99, :text => 'a' )
743*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'b' )
744*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'c' )
745*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'd' )
746*16467b97STreehugger Robot
747*16467b97STreehugger Robot    new_child = new_node( new_token 99, :text => 'x' )
748*16467b97STreehugger Robot
749*16467b97STreehugger Robot    t.replace_children(1, 2, new_child)
750*16467b97STreehugger Robot    t.inspect.should == '(a b x)'
751*16467b97STreehugger Robot    t.sanity_check
752*16467b97STreehugger Robot  end
753*16467b97STreehugger Robot
754*16467b97STreehugger Robot  def test_replace_all_with_one
755*16467b97STreehugger Robot    t = new_node( new_token 99, :text => 'a' )
756*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'b' )
757*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'c' )
758*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'd' )
759*16467b97STreehugger Robot
760*16467b97STreehugger Robot    new_child = new_node( new_token 99, :text => 'x' )
761*16467b97STreehugger Robot
762*16467b97STreehugger Robot    t.replace_children(0, 2, new_child)
763*16467b97STreehugger Robot    t.inspect.should == '(a x)'
764*16467b97STreehugger Robot    t.sanity_check
765*16467b97STreehugger Robot  end
766*16467b97STreehugger Robot
767*16467b97STreehugger Robot  def test_replace_all_with_two
768*16467b97STreehugger Robot    t = new_node( new_token 99, :text => 'a' )
769*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'b' )
770*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'c' )
771*16467b97STreehugger Robot    t.add_child new_node( new_token 99, :text => 'd' )
772*16467b97STreehugger Robot
773*16467b97STreehugger Robot    new_children = @adaptor.create_flat_list
774*16467b97STreehugger Robot    new_children.add_child new_node( new_token 99, :text => 'x' )
775*16467b97STreehugger Robot    new_children.add_child new_node( new_token 99, :text => 'y' )
776*16467b97STreehugger Robot
777*16467b97STreehugger Robot    t.replace_children(0, 1, new_children)
778*16467b97STreehugger Robot    t.inspect.should == '(a x y d)'
779*16467b97STreehugger Robot    t.sanity_check
780*16467b97STreehugger Robot  end
781*16467b97STreehugger Robot
782*16467b97STreehugger Robot  def new_token(type, opts = {})
783*16467b97STreehugger Robot    opts[:type] = type
784*16467b97STreehugger Robot    CommonToken.create(opts)
785*16467b97STreehugger Robot  end
786*16467b97STreehugger Robot  def new_node(token)
787*16467b97STreehugger Robot    CommonTree.new(token)
788*16467b97STreehugger Robot  end
789*16467b97STreehugger Robotend
790*16467b97STreehugger Robot
791*16467b97STreehugger Robot
792*16467b97STreehugger Robotclass TestTreeContext < Test::Unit::TestCase
793*16467b97STreehugger Robot  TOKEN_NAMES = %w(
794*16467b97STreehugger Robot    <invalid> <EOR> <DOWN> <UP> VEC ASSIGN PRINT
795*16467b97STreehugger Robot    PLUS MULT DOT ID INT WS '[' ',' ']'
796*16467b97STreehugger Robot  )
797*16467b97STreehugger Robot  Tokens = TokenScheme.build( TOKEN_NAMES )
798*16467b97STreehugger Robot
799*16467b97STreehugger Robot  def setup
800*16467b97STreehugger Robot    @wizard = Wizard.new( :token_scheme => Tokens )
801*16467b97STreehugger Robot  end
802*16467b97STreehugger Robot
803*16467b97STreehugger Robot  def teardown
804*16467b97STreehugger Robot    # after-each-test code
805*16467b97STreehugger Robot  end
806*16467b97STreehugger Robot
807*16467b97STreehugger Robot  # vvvvvvvv tests vvvvvvvvv
808*16467b97STreehugger Robot
809*16467b97STreehugger Robot  def test_simple_parent
810*16467b97STreehugger Robot    tree = @wizard.create(
811*16467b97STreehugger Robot      "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
812*16467b97STreehugger Robot    )
813*16467b97STreehugger Robot    labels = @wizard.match( tree,
814*16467b97STreehugger Robot      "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))"
815*16467b97STreehugger Robot    )
816*16467b97STreehugger Robot
817*16467b97STreehugger Robot    assert_kind_of( Hash, labels )
818*16467b97STreehugger Robot    @wizard.in_context?( labels.fetch( 'x' ), 'VEC' ).should be_true
819*16467b97STreehugger Robot  end
820*16467b97STreehugger Robot
821*16467b97STreehugger Robot  def test_no_parent
822*16467b97STreehugger Robot    tree = @wizard.create(
823*16467b97STreehugger Robot      '(PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3])))'
824*16467b97STreehugger Robot    )
825*16467b97STreehugger Robot
826*16467b97STreehugger Robot    labels = @wizard.match( tree, "(%x:PRINT (MULT ID (VEC INT INT INT)))" )
827*16467b97STreehugger Robot    assert_kind_of( Hash, labels )
828*16467b97STreehugger Robot    @wizard.in_context?( labels.fetch( 'x' ), 'VEC' ).should be_false
829*16467b97STreehugger Robot  end
830*16467b97STreehugger Robot
831*16467b97STreehugger Robot  def test_parent_with_wildcard
832*16467b97STreehugger Robot    tree = @wizard.create(
833*16467b97STreehugger Robot      "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
834*16467b97STreehugger Robot    )
835*16467b97STreehugger Robot
836*16467b97STreehugger Robot    labels = @wizard.match( tree,
837*16467b97STreehugger Robot      "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))"
838*16467b97STreehugger Robot    )
839*16467b97STreehugger Robot    assert_kind_of( Hash, labels )
840*16467b97STreehugger Robot    node = labels.fetch( 'x' )
841*16467b97STreehugger Robot    @wizard.in_context?( node, 'VEC ...' ).should be_true
842*16467b97STreehugger Robot  end
843*16467b97STreehugger Robotend
844