1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3'
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/tree/wizard'
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'test/unit'
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'spec'
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinclude ANTLR3
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinclude ANTLR3::AST
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestPatternLexer < Test::Unit::TestCase
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # vvvvvvvv tests vvvvvvvvv
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_open
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = Wizard::PatternLexer.new( '(' )
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type = lexer.next_token
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal( type, :open )
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal( lexer.text, '' )
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal( lexer.error, false )
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_close
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = Wizard::PatternLexer.new(')')
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type = lexer.next_token
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(type, :close)
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(lexer.text, '')
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(lexer.error, false)
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_percent
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = Wizard::PatternLexer.new('%')
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type = lexer.next_token
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(type, :percent)
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(lexer.text, '')
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(lexer.error, false)
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_dot
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = Wizard::PatternLexer.new('.')
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type = lexer.next_token
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(type, :dot)
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(lexer.text, '')
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(lexer.error, false)
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_eof
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = Wizard::PatternLexer.new(" \n \r \t ")
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type = lexer.next_token
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(type, EOF)
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(lexer.text, '')
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(lexer.error, false)
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_id
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = Wizard::PatternLexer.new('__whatever_1__')
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type = lexer.next_token
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(:identifier, type)
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal('__whatever_1__', lexer.text)
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert( !(lexer.error) )
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_arg
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = Wizard::PatternLexer.new('[ \]bla\n]')
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type = lexer.next_token
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(type, :argument)
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(' ]bla\n', lexer.text)
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert( !(lexer.error) )
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_error
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = Wizard::PatternLexer.new("1")
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type = lexer.next_token
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(type, EOF)
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(lexer.text, '')
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(lexer.error, true)
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestPatternParser < Test::Unit::TestCase
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Tokens = TokenScheme.build %w(A B C D E ID VAR)
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  include Tokens
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def setup
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @adaptor = CommonTreeAdaptor.new( Tokens.token_class )
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @pattern_adaptor = Wizard::PatternAdaptor.new( Tokens.token_class )
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @wizard = Wizard.new( :adaptor => @adaptor, :token_scheme => Tokens )
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # vvvvvvvv tests vvvvvvvvv
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_single_node
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = Wizard::PatternParser.parse( 'ID', Tokens, @adaptor )
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_instance_of(CommonTree, tree)
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal( ID, tree.type )
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal( 'ID', tree.text )
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_single_node_with_arg
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = Wizard::PatternParser.parse( 'ID[foo]', Tokens, @adaptor )
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_instance_of( CommonTree, tree )
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal( ID, tree.type )
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal( 'foo', tree.text )
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_single_level_tree
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = Wizard::PatternParser.parse( '(A B)', Tokens, @adaptor )
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_instance_of( CommonTree, tree )
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(A, tree.type)
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal('A', tree.text)
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(tree.child_count, 1)
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(tree.child(0).type, B)
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(tree.child(0).text, 'B')
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_nil
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = Wizard::PatternParser.parse( 'nil', Tokens, @adaptor )
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_instance_of(CommonTree, tree)
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(0, tree.type)
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_nil tree.text
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_wildcard
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = Wizard::PatternParser.parse( '(.)', Tokens, @adaptor )
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_instance_of( Wizard::WildcardPattern, tree )
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_label
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = Wizard::PatternParser.parse( '(%a:A)', Tokens, @pattern_adaptor )
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_instance_of(Wizard::Pattern, tree)
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal('a', tree.label)
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_error_1
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = Wizard::PatternParser.parse( ')', Tokens, @adaptor )
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_nil tree
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_error_2
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = Wizard::PatternParser.parse( '()', Tokens, @adaptor )
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_nil tree
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_error_3
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = Wizard::PatternParser.parse( '(A ])', Tokens, @adaptor )
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_nil tree
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestTreeWizard < Test::Unit::TestCase
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Tokens = TokenScheme.build %w(A B C D E ID VAR)
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  include Tokens
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def setup
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @adaptor = CommonTreeAdaptor.new( Tokens.token_class )
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @wizard = Wizard.new( :adaptor => @adaptor, :token_scheme => Tokens )
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def create_wizard( tokens )
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Wizard.new( :tokens => tokens )
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  # vvvvvvvv tests vvvvvvvvv
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_init
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @wizard = Wizard.new( :tokens => %w(A B), :adaptor => @adaptor )
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal( @wizard.adaptor, @adaptor )
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_kind_of( ANTLR3::TokenScheme, @wizard.token_scheme )
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_single_node
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    t = @wizard.create("ID")
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(t.inspect, 'ID')
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_single_node_with_arg
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    t = @wizard.create("ID[foo]")
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(t.inspect, 'foo')
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_single_node_tree
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    t = @wizard.create("(A)")
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(t.inspect, 'A')
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_single_level_tree
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    t = @wizard.create("(A B C D)")
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(t.inspect, '(A B C D)')
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_list_tree
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    t = @wizard.create("(nil A B C)")
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(t.inspect, 'A B C')
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_invalid_list_tree
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    t = @wizard.create("A B C")
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_nil t
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_double_level_tree
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    t = @wizard.create("(A (B C) (B D) E)")
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(t.inspect, "(A (B C) (B D) E)")
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SIMPLIFY_MAP = lambda do |imap|
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Hash[
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      imap.map { |type, nodes| [type, nodes.map { |n| n.to_s }] }
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ]
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_single_node_index
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create("ID")
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    index_map = SIMPLIFY_MAP[@wizard.index(tree)]
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(index_map, ID => %w(ID))
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_no_repeats_index
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create("(A B C D)")
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    index_map = SIMPLIFY_MAP[@wizard.index(tree)]
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(index_map,
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        D => %w(D), B => %w(B),
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        C => %w(C), A => %w(A)
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    )
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_repeats_index
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create("(A B (A C B) B D D)")
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    index_map = SIMPLIFY_MAP[@wizard.index(tree)]
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(index_map,
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        D => %w(D D), B => %w(B B B),
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        C => %w(C), A => %w(A A)
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    )
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_no_repeats_visit
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create("(A B C D)")
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    elements = []
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @wizard.visit( tree, B ) do |node, parent, child_index, labels|
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      elements << node.to_s
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal( %w(B), elements )
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_no_repeats_visit2
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create("(A B (A C B) B D D)")
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    elements = []
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @wizard.visit( tree, C ) do |node, parent, child_index, labels|
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      elements << node.to_s
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(%w(C), elements)
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_repeats_visit
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create("(A B (A C B) B D D)")
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    elements = []
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @wizard.visit( tree, B ) do |node, parent, child_index, labels|
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      elements << node.to_s
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(%w(B B B), elements)
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_repeats_visit2
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create("(A B (A C B) B D D)")
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    elements = []
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @wizard.visit( tree, A ) do |node, parent, child_index, labels|
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      elements << node.to_s
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(%w(A A), elements)
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def context(node, parent, index)
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    '%s@%s[%d]' % [node.to_s, (parent || 'nil').to_s, index]
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_repeats_visit_with_context
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create("(A B (A C B) B D D)")
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    elements = []
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @wizard.visit( tree, B ) do |node, parent, child_index, labels|
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      elements << context(node, parent, child_index)
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(['B@A[0]', 'B@A[1]', 'B@A[2]'], elements)
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_repeats_visit_with_null_parent_and_context
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create("(A B (A C B) B D D)")
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    elements = []
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @wizard.visit( tree, A ) do |node, parent, child_index, labels|
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      elements << context(node, parent, child_index)
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(['A@nil[-1]', 'A@A[1]'], elements)
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_visit_pattern
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create("(A B C (A B) D)")
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    elements = []
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @wizard.visit(tree, '(A B)') do |node, parent, child_index, labels|
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      elements << node.to_s
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(%w(A), elements)
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_visit_pattern_multiple
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create("(A B C (A B) (D (A B)))")
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    elements = []
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @wizard.visit(tree, '(A B)') do |node, parent, child_index, labels|
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      elements << context(node, parent, child_index)
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal( %w(A@A[2] A@D[0]) , elements )
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def labeled_context(node, parent, index, labels, *names)
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    suffix = names.map { |n| labels[n].to_s }.join('&')
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    '%s@%s[%d]%s' % [node.to_s, (parent || 'nil').to_s, index, suffix]
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_visit_pattern_multiple_with_labels
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    elements = []
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @wizard.visit(tree, '(%a:A %b:B)') do |node, parent, child_index, labels|
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      elements << labeled_context(node, parent, child_index, labels, 'a', 'b')
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal( ['foo@A[2]foo&bar', 'big@D[0]big&dog'] , elements )
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_match
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create("(A B C)")
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert @wizard.match(tree, "(A B C)")
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_match_single_node
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create('A')
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert @wizard.match(tree, 'A')
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_match_single_node_fails
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create('A')
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert( !(@wizard.match(tree, 'B')) )
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_match_flat_tree
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create('(nil A B C)')
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert @wizard.match(tree, '(nil A B C)')
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_match_flat_tree_fails
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create('(nil A B C)')
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert( !(@wizard.match(tree, '(nil A B)')) )
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_match_flat_tree_fails2
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create('(nil A B C)')
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert( !(@wizard.match(tree, '(nil A B A)')) )
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_wildcard
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create('(A B C)')
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert @wizard.match(tree, '(A . .)')
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_match_with_text
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create('(A B[foo] C[bar])')
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert @wizard.match(tree, '(A B[foo] C)')
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_match_with_text_fails
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create('(A B C)')
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert( !(@wizard.match(tree, '(A[foo] B C)')) )
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_match_labels
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create('(A B C)')
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    labels = @wizard.match( tree, '(%a:A %b:B %c:C)' )
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal('A', labels['a'].to_s)
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal('B', labels['b'].to_s)
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal('C', labels['c'].to_s)
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_match_with_wildcard_labels
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create('(A B C)')
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    labels = @wizard.match(tree, '(A %b:. %c:.)')
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_kind_of( Hash, labels )
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal('B', labels['b'].to_s)
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal('C', labels['c'].to_s)
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_match_labels_and_test_text
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create('(A B[foo] C)')
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    labels = @wizard.match( tree, '(%a:A %b:B[foo] %c:C)' )
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_kind_of( Hash, labels )
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal('A', labels['a'].to_s)
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal('foo', labels['b'].to_s)
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal('C', labels['c'].to_s)
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_match_labels_in_nested_tree
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create('(A (B C) (D E))')
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    labels = @wizard.match( tree, '(%a:A (%b:B %c:C) (%d:D %e:E))' )
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_kind_of( Hash, labels )
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal('A', labels['a'].to_s)
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal('B', labels['b'].to_s)
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal('C', labels['c'].to_s)
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal('D', labels['d'].to_s)
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal('E', labels['e'].to_s)
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_equals
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree1 = @wizard.create("(A B C)")
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree2 = @wizard.create("(A B C)")
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert @wizard.equals(tree1, tree2)
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_equals_with_text
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree1 = @wizard.create("(A B[foo] C)")
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree2 = @wizard.create("(A B[foo] C)")
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert @wizard.equals(tree1, tree2)
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_equals_with_mismatched_text
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree1 = @wizard.create("(A B[foo] C)")
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree2 = @wizard.create("(A B C)")
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert( !(@wizard.equals(tree1, tree2)) )
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_equals_with_mismatched_list
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree1 = @wizard.create("(A B C)")
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree2 = @wizard.create("(A B A)")
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert( !(@wizard.equals(tree1, tree2)) )
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_equals_with_mismatched_list_length
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree1 = @wizard.create("(A B C)")
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree2 = @wizard.create("(A B)")
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert( !(@wizard.equals(tree1, tree2)) )
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_find_pattern
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    subtrees = @wizard.find(tree, "(A B)").map { |t| t.to_s }
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(%w(foo big), subtrees)
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def test_find_token_type
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree = @wizard.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    subtrees = @wizard.find( tree, A ).map { |t| t.to_s }
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assert_equal(%w(A foo big), subtrees)
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
495