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