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