require 'runit/testcase'
require 'runit/cui/testrunner'
require 'rrb/parser'
class TestNode < RUNIT::TestCase
TEST_SCRIPT_NAME = 'samples/visitor_sample.rb'
class Visitor1 < RRB::Visitor
def initialize
@classes = []
@methods = []
end
def visit_method( namespace, method_node )
@methods << [ namespace.last, method_node.name ]
end
def visit_class( namespace, class_node )
@classes << class_node.name
end
attr_reader :classes, :methods
end
class Visitor2 < RRB::Visitor
def initialize
@classes = []
end
attr_reader :classes
def visit_class( namespace, class_node )
@classes << [ namespace, class_node.name ]
end
end
class Visitor3 < RRB::Visitor
def visit_toplevel( namespace, top_node )
@top_classes = top_node.class_defs.map{|i| i.name}
end
attr_reader :top_classes
end
class Visitor4 < RRB::Visitor
def initialize
@nodes = []
end
attr_reader :nodes
def visit_node( namespace, node )
@nodes << [namespace, node.name]
end
end
class Visitor5 < RRB::Visitor
def initialize
@singleton_methods = []
end
def visit_singleton_method( namespace, node )
@singleton_methods << [ namespace, node.name ]
end
attr_reader :singleton_methods
end
class Visitor6 < RRB::Visitor
def initialize
@class_methods = []
end
def visit_class_method( namespace, node )
@class_methods << [ namespace, node.name ]
end
attr_reader :class_methods
end
def test_accept
parser = RRB::Parser.new
tree = parser.run File.open( TEST_SCRIPT_NAME, "r" )
# test visit_class and visit_method
visitor1 = Visitor1.new
tree.accept( visitor1 )
assert_equals( [ 'TestClassA', 'TestClassB', 'TestClassC',
'TestModuleA', 'TestModuleB' ],
visitor1.classes )
assert_equals( [[ 'TestClassA', 'method_1'],
[ 'TestClassA', 'method_2'],
[ 'TestClassA', 'method_3'],
[ 'TestClassB', 'method_4'],
[ 'TestModuleB', 'method_5'],
[ '[sclass]', 'method_8' ],
],
visitor1.methods.sort )
# test visit_class and namespace
visitor2 = Visitor2.new
tree.accept( visitor2 )
assert_equals( [ [RRB::NS[''], 'TestClassA'],
[RRB::NS['TestClassA'],'TestClassB'],
[RRB::NS['TestClassA::TestClassB'],'TestClassC'],
[RRB::NS['TestClassA'],'TestModuleA'],
[RRB::NS['TestClassA::TestModuleA'],'TestModuleB'],
],
visitor2.classes )
# test visit_toplevel
visitor3 = Visitor3.new
tree.accept( visitor3 )
assert_equals( [ 'TestClassA' ], visitor3.top_classes )
# test visit_node
visitor4 = Visitor4.new
tree.accept( visitor4 )
assert_equals( [[RRB::NS[''],'toplevel'],
[RRB::NS[''],'TestClassA'],
[RRB::NS['TestClassA'],'method_1'],
[RRB::NS['TestClassA'],'method_2'],
[RRB::NS['TestClassA'],'method_3'],
[RRB::NS['TestClassA'],'TestClassB'],
[RRB::NS['TestClassA::TestClassB'],'method_4'],
[RRB::NS['TestClassA::TestClassB'],'TestClassC'],
[RRB::NS['TestClassA'],'TestModuleA'],
[RRB::NS['TestClassA::TestModuleA'],'TestModuleB'],
[RRB::NS['TestClassA::TestModuleA::TestModuleB'],'method_5'],
[RRB::NS['TestClassA'],'method_6'],
[RRB::NS['TestClassA'],'method_7'],
[RRB::NS['TestClassA'], '[sclass]' ],
[RRB::NS['TestClassA::[sclass]'], 'method_8' ],
].sort, visitor4.nodes.sort )
# test visit_singleton_method
visitor5 = Visitor5.new
tree.accept( visitor5 )
assert_equals( [ [RRB::NS['TestClassA'],'method_6'] ].sort,
visitor5.singleton_methods.sort )
# test visit_class_method
visitor6 = Visitor6.new
tree.accept( visitor6 )
assert_equals( [ [RRB::NS['TestClassA'],'method_7'] ].sort,
visitor6.class_methods.sort )
end
def test_range
parser = RRB::Parser.new
tree = parser.run File.open( TEST_SCRIPT_NAME, "r" )
def_range = tree.class_info( "TestClassA" ).range
assert_equals( 2, def_range.head.lineno )
assert_equals( 51, def_range.tail.lineno )
assert( def_range.contain?( 3..50 ) )
assert( !def_range.contain?( 2..50 ) )
assert( !def_range.contain?( 3..51 ) )
assert( def_range.out_of?( 52..55 ) )
assert( !def_range.out_of?( 3..50 ) )
assert( !def_range.out_of?( 1..2 ) )
assert( !def_range.out_of?( 51..55 ) )
end
end
class TestConstInfo < RUNIT::TestCase
TEST_SCRIPT_NAME = 'samples/parser_sample.rb'
def test_body
parser = RRB::Parser.new
tree = parser.run File.open( TEST_SCRIPT_NAME, "r" )
consts = tree.class_info("TestClassA").method_info("method_9").consts
assert_equals( [ "Const1",
"Const2", "Const1",
"Const2", "Const1",
"Const4", "Const5",
"Const6", "Const7",
"Const8", "Const9",
"Const10", "Const11",
"Const12"
],
consts.map{|const| const.body.name} )
end
end
class TestNodeMethod < RUNIT::TestCase
class Visitor1 < RRB::Visitor
def initialize
@methods = []
end
attr_reader :methods
def visit_method(namespace, node)
@methods << RRB::NodeMethod.new(namespace, node)
end
end
def test_name
parser = RRB::Parser.new
tree = parser.run File.open( "samples/parser_sample.rb", "r" )
# test visit_class and visit_method
visitor1 = Visitor1.new
tree.accept( visitor1 )
assert_equal(["TestClassA::TestClassB#method_4", "TestClassA#<=>", "TestClassA#method_1", "TestClassA#method_2", "TestClassA#method_3", "TestClassA#method_8", "TestClassA#method_9", "TestClassA::[sclass]#method_7"],
visitor1.methods.map{|method| method.name})
assert_equal(["method_4", "<=>", "method_1", "method_2", "method_3", "method_8", "method_9", "method_7"],
visitor1.methods.map{|method| method.bare_name})
end
end
if $0 == __FILE__
if ARGV.size == 0
suite = RUNIT::TestSuite.new
suite.add_test( TestNode.suite )
suite.add_test( TestConstInfo.suite )
else
suite = RUNIT::TestSuite.new
ARGV.each do |testmethod|
suite.add_test(TestNode.new(testmethod))
end
end
RUNIT::CUI::TestRunner.run(suite)
end
syntax highlighted by Code2HTML, v. 0.9.1