require 'test/minirunit' test_check "Test Source Positions:" require 'java' require 'jruby' def short_name(long_name) long_name.sub(/.*\./, '') end def node_string(node) return "#{short_name(node.java_class.name)}" unless node.position p = node.position "#{short_name(node.java_class.name)},#{p.startLine},#{p.endLine},#{p.startOffset},#{p.endOffset}" end def test_pos_ok(a, b, entry, node, test_name) test_ok(a == b, "Expected [#{entry.join(',')}] but got [#{node_string(node)}] for #{test_name}") end def compare_node(node, list, test_name) entry = list.delete_at(0) unless entry.nil? position = node.position test_pos_ok(entry[0], short_name(node.java_class.name), entry, node, test_name) test_pos_ok(entry[1], position.startLine, entry, node, test_name) test_pos_ok(entry[2], position.endLine, entry, node, test_name) test_pos_ok(entry[3], position.startOffset, entry, node, test_name) test_pos_ok(entry[4], position.endOffset, entry, node, test_name) end node.childNodes.each {|child| compare_node(child, list, test_name) } end def test_tree(expected_list, script_content, test_name=nil, verbose=false) root = JRuby::parse(script_content, "", true) print_tree(root) if verbose compare_node(root, expected_list, test_name) end def print_tree(node, indent="") puts indent + node_string(node) node.childNodes.each {|child| print_tree(child, indent + " ") } end ######################################################################## #### Call/method tests ######################################################################## list = [ nil, nil, #['NewlineNode',1,2,2,6], ['VCallNode',1,1,1,5] ] test_tree(list, <<'END', "operation [paren-less no args]") puts END list = [ nil, nil, #['NewlineNode',0,1,0,4], ['VCallNode',0,0,0,4], ] test_tree(list, <<'END', "operation [paren-less no args]") puts END list = [ nil, nil, #['NewlineNode',0,1,0,6], ['FCallNode',0,0,0,6], ['ArrayNode',0,0,5,6], ['FixnumNode',0,0,5,6], ] test_tree(list, <<'END', "operation [paren-less single arg]") puts 3 END list = [ nil, nil, #['NewlineNode',0,1,0,9], ['FCallNode',0,0,0,9], ['ArrayNode',0,0,5,9], ['FixnumNode',0,0,5,6], ['FixnumNode',0,0,8,9], ] test_tree(list, <<'END', "operation [paren-less n args]") puts 3, 5 END list = [ nil, nil, #['NewlineNode',0,1,0,5], ['FCallNode',0,0,0,6], ['ArrayNode',0,0,4,6] ] test_tree(list, <<'END', "operation [parens no args]") puts() END list = [ nil, nil, #['NewlineNode',0,1,0,9], ['FCallNode',0,0,0,7], ['ArrayNode',0,0,4,7], ['FixnumNode',0,0,5,6], ] test_tree(list, <<'END', "operation [parens single arg]") puts(3) END list = [ nil, nil, #['NewlineNode',0,1,0,10], ['FCallNode',0,0,0,10], ['ArrayNode',0,0,4,10], ['FixnumNode',0,0,5,6], ['FixnumNode',0,0,8,9], ] test_tree(list, <<'END', "operation [parens n args]") puts(3, 5) END list = [ nil, nil, #['NewlineNode',0,1,0,9], ['CallNode',0,0,0,9], ['ConstNode',0,0,0,5], ] test_tree(list, <<'END', "primary.operation [paren-less no args]") Array.new END list = [ nil, nil, #['NewlineNode',0,1,0,9], ['CallNode',0,0,0,11], ['ConstNode',0,0,0,5], ['ArrayNode',0,0,10,11], ['FixnumNode',0,0,10,11], ] test_tree(list, <<'END', "primary.operation [paren-less single arg]") Array.new 3 END list = [ nil, nil, #['NewlineNode',0,1,0,9], ['CallNode',0,0,0,14], ['ConstNode',0,0,0,5], ['ArrayNode',0,0,10,14], ['FixnumNode',0,0,10,11], ['FixnumNode',0,0,13,14] ] test_tree(list, <<'END', "primary.operation [paren-less n args]") Array.new 3, 5 END list = [ nil, nil, #['NewlineNode',0,1,0,11], ['CallNode',0,0,0,11], ['ConstNode',0,0,0,5], ['ArrayNode',0,0,9,11], ] test_tree(list, <<'END', "primary.operation [parens no args]") Array.new() END list = [ nil, nil, #['NewlineNode',0,1,0,14], ['CallNode',0,0,0,14], ['ConstNode',0,0,0,5], ['ArrayNode',0,0,9,14], ['StrNode',0,0,10,13], ] test_tree(list, <<'END', "primary.operation [parens one arg]") Array.new("a") END list = [ nil, nil, #['NewlineNode',0,1,0,14], ['CallNode',0,0,0,17], ['ConstNode',0,0,0,5], ['ArrayNode',0,0,9,17], ['StrNode',0,0,10,13], ['FixnumNode',0,0,15,16] ] test_tree(list, <<'END', "primary.operation [parens one arg]") Array.new("a", 3) END list = [ nil, nil, # ['NewlineNode',0,1,0,25] ['CallNode',0,0,0,24], ['ConstNode',0,0,0,6], ['ArrayNode',0,0,11,24], ['CallNode',0,0,11,24], ['StrNode',0,0,11,16], ['ArrayNode',0,0,19,24], ['StrNode',0,0,19,24] ] test_tree(list, <<'END', "postfix around infix method call [no-parens 1-args]") String.new "aaa" + "bbb" END list = [ nil, nil, #['NewlineNode',0,1,0,18] ['CallNode',0,0,0,17], ['ConstNode',0,0,0,6], ['ArrayNode',0,0,11,17], ['CallNode',0,0,11,17], ['FixnumNode',0,0,11,12] ] test_tree(list, <<'END', "postfix around postfix [1 arg around no arg]") String.new 5.to_s END list = [ nil, nil, # ['NewlineNode',0,1,0,27], ['CallNode',0,0,0,26], ['ConstNode',0,0,0,5], ['ArrayNode',0,0,10,26], ['CallNode',0,0,10,26], ['ConstNode',0,0,10,16], ['ArrayNode',0,0,20,26], ['FixnumNode',0,0,21,25] ] test_tree(list, <<'END', "postfix around postfix [1 arg parens around no arg]") Array.new String.new(1234) END list = [ nil, nil, #['NewlineNode',0,1,1,13], ['OrNode',0,0,0,6], ['FixnumNode',0,0,0,1], ['FixnumNode',0,0,5,6] ] test_tree(list, <<'END', "|| operator") 1 || 2 END list = [ nil, nil, #['NewlineNode',0,1,1,13], ['AndNode',0,0,0,6], ['FixnumNode',0,0,0,1], ['FixnumNode',0,0,5,6] ] test_tree(list, <<'END', "&& operator") 1 && 2 END list = [ nil, nil, #['NewlineNode',0,1,1,13], ['CallNode',0,0,0,6], ['FixnumNode',0,0,0,1], ['ArrayNode',0,0,5,6], ['FixnumNode',0,0,5,6] ] test_tree(list, <<'END', "== operator") 1 == 2 END list = [ nil, nil, #['NewlineNode',0,1,1,13], ['NotNode',0,0,0,6], ['CallNode',0,0,0,6], ['FixnumNode',0,0,0,1], ['ArrayNode',0,0,5,6], ['FixnumNode',0,0,5,6] ] test_tree(list, <<'END', "!= operator") 1 != 2 END list = [ nil, nil, #['NewlineNode',0,1,1,13], ['NotNode',0,0,0,2], ['FixnumNode',0,0,1,2] ] test_tree(list, <<'END', "! operator") !1 END list = [ nil, nil, #['NewlineNode',0,1,1,13], ['ZArrayNode',0,0,0,2] ] test_tree(list, <<'END', "[] ZArray") [] END list = [ nil, nil, #['NewlineNode',0,1,1,13], ['ArrayNode',0,0,0,12], ['FixnumNode',0,0,1,3], ['StrNode',0,0,5,11] ] test_tree(list, <<'END', "[] with multiple args") [55, "test"] END list = [ nil, #['NewlineNode',0,1,1,13], nil, ['ZArrayNode',0,0,0,4] ] test_tree(list, <<'END', "%w() ZArray") %w{} END list = [ nil, nil, #['NewlineNode',0,1,1,13], ['ArrayNode',0,0,0,11], ['StrNode',0,0,3,5], ['StrNode',0,0,6,10] ] test_tree(list, <<'END', "%w{} with multiple args") %w{55 test} END list = [ nil, nil, #['NewlineNode',0,1,0,6], ['FCallNode',0,0,0,6], ['IterNode',0,0,4,6] ] test_tree(list, <<'END', "operation brace_block [paren-less no-args block") foo {} END list = [ nil, nil, #['NewlineNode',0,1,0,6], ['FCallNode',0,1,0,10], ['IterNode',0,1,4,10] ] test_tree(list, <<'END', "operation brace_block [paren-less no-args block") foo do end END list = [ nil, nil, #['NewlineNode',0,1,6,9], ['FCallNode',0,0,0,8], ['ArrayNode',0,0,3,5], ['IterNode',0,0,6,8] ] test_tree(list, <<'END', "operation brace_block [parens no-args block") foo() {} END list = [ nil, nil, #['NewlineNode',0,1,6,9], ['FCallNode',0,1,0,12], ['ArrayNode',0,0,3,5], ['IterNode',0,1,6,12] ] test_tree(list, <<'END', "operation brace_block [parens no-args block") foo() do end END list = [ nil, nil, #['NewlineNode',0,2,6,17], ['FCallNode',0,1,0,16], ['ArrayNode',0,0,3,5], ['IterNode',0,1,6,16], ['DAsgnNode',0,0,10,11] ] test_tree(list, <<'END', "operation brace_block [parens no-args block arg") foo() do |a| end END list = [ nil, nil, #['NewlineNode',0,2,6,19], ['FCallNode',0,1,0,18], ['ArrayNode',0,0,3,5], ['IterNode',0,1,6,18], ['MultipleAsgnNode',0,0,9,14], ['ArrayNode',0,0,10,13], ['DAsgnNode',0,0,10,11], ['DAsgnNode',0,0,12,13] ] test_tree(list, <<'END', "operation brace_block [parens no-args block args") foo() do |a,b| end END list = [ nil, nil, #['NewlineNode',0,2,10,23], ['FCallNode',0,1,0,22], ['ArrayNode',0,0,3,9], ['VCallNode',0,0,4,5], ['VCallNode',0,0,7,8], ['IterNode',0,1,10,22], ['MultipleAsgnNode',0,0,13,18], ['ArrayNode',0,0,14,17], ['DAsgnNode',0,0,14,15], ['DAsgnNode',0,0,16,17] ] test_tree(list, <<'END', "operation brace_block [parens args block args") foo(c, d) do |a,b| end END list = [ nil, nil, #['NewlineNode',0,2,10,23], ['YieldNode',0,0,0,5], ] test_tree(list, <<'END', "yield") yield END list = [ nil, nil, #['NewlineNode',0,2,10,23], ['YieldNode',0,0,0,7], ] test_tree(list, <<'END', "yield()") yield() END list = [ nil, nil, #['NewlineNode',0,2,10,23], ['YieldNode',0,0,0,8], ['FixnumNode',0,0,6,7] ] test_tree(list, <<'END', "yield(1)") yield(1) END list = [ nil, nil, #['NewlineNode',0,2,10,23], ['ReturnNode',0,0,0,6], ] test_tree(list, <<'END', "return") return END list = [ nil, nil, #['NewlineNode',0,2,10,23], ['ReturnNode',0,0,0,8], ['FixnumNode',0,0,7,8] ] test_tree(list, <<'END', "return 1") return 1 END # FIXME: null values passed up cannot provide pos info while additional tokens may get read #list = [ #nil, #['NewlineNode',0,2,10,23], # ['ReturnNode',0,0,0,8] #] # #test_tree(list, <<'END', "return()", true) #return() #END list = [ nil, nil, #['NewlineNode',0,2,10,23], ['ReturnNode',0,0,0,9], nil, #['NewlineNode',0,2,10,23], ['FixnumNode',0,0,7,8] ] test_tree(list, <<'END', "return(1)") return(1) END list = [ nil, nil, #['NewlineNode',0,2,10,23], ['NextNode',0,0,0,4], ] test_tree(list, <<'END', "next") next END list = [ nil, nil, #['NewlineNode',0,2,10,23], ['NextNode',0,0,0,6], ] # FIXME: null values passed up cannot provide pos info while additional tokens may get read #test_tree(list, <<'END', "next()", true) #next() #END list = [ nil, nil, #['NewlineNode',0,2,10,23], ['NextNode',0,0,0,6], ['FixnumNode',0,0,5,6] ] test_tree(list, <<'END', "next 5") next 5 END list = [ nil, nil, #['NewlineNode',0,2,10,23], ['NextNode',0,0,0,7], nil, #['NewlineNode',0,2,10,23], ['FixnumNode',0,0,5,6] ] test_tree(list, <<'END', "next(5)") next(5) END list = [ nil, nil, #['NewlineNode',0,2,10,23], ['BreakNode',0,0,0,5], ] test_tree(list, <<'END', "break") break END list = [ nil, nil, #['NewlineNode',0,2,10,23], ['BreakNode',0,0,0,7], ['FixnumNode',0,0,6,7] ] test_tree(list, <<'END', "break 5") break 5 END list = [ nil, nil, #['NewlineNode',0,2,10,23], ['RedoNode',0,0,0,4], ] test_tree(list, <<'END', "redo") redo END ######################################################################## #### string tests ######################################################################## list = [ nil, nil, #['NewlineNode',0,1,0,8], ['StrNode',0,0,0,8] ] test_tree(list, <<'END', "' string") 'simple' END list = [ nil, nil, #['NewlineNode',0,1,0,8], ['StrNode',0,0,0,10] ] test_tree(list, <<'END', "%q{ string") %q{simple} END list = [ nil, nil, #['NewlineNode',0,1,0,8], ['StrNode',0,0,0,10] ] test_tree(list, <<'END', "%q[ (something other than {) string") %q[s{mple] END list = [ nil, nil, #['NewlineNode',0,1,0,8], ['StrNode',0,0,0,10] ] test_tree(list, <<'END', "%q[ (something other than { 2) string") %q END list = [ nil, nil, #['NewlineNode',0,1,0,8], ['StrNode',0,0,0,8] ] test_tree(list, <<'END', "\" string") "simple" END list = [ nil, nil, #['NewlineNode',0,1,0,8], ['StrNode',0,0,0,10] ] test_tree(list, <<'END', "%Q{ string") %Q{simple} END list = [ nil, nil, #['NewlineNode',0,1,0,8], ['StrNode',0,0,0,9] ] test_tree(list, <<'END', "%{ string") %{simple} END list = [ nil, nil, #['NewlineNode',0,1,0,8], ['DStrNode',0,0,0,17], ['StrNode',0,0,0,9], ['EvStrNode',0,0,9,16], nil, #['NewlineNode',0,0,11,16], ['VCallNode',0,0,11,15] ] test_tree(list, <<'END', "%{ string w expression") %{simple #{to_s}} END # FIXME: We optimize the source structure out of this by coallescing strnodes list = [ nil ] test_tree(list, <<'END', "double nested string") %{simple #{%{test}}} END list = [ nil, nil, #['NewlineNode',0,1,0,8], ['DStrNode',0,0,0,24], ['StrNode',0,0,0,9], ['EvStrNode',0,0,9,23], nil, #['NewlineNode',0,0,11,23], ['FCallNode',0,0,11,22], ['ArrayNode',0,0,15,22], ['StrNode',0,0,15,22] ] test_tree(list, <<'END', "double nested string") %{simple #{foo %{test}}} END list = [ nil, nil, #['NewlineNode',0,1,0,8], ['XStrNode',0,0,0,8] ] test_tree(list, <<'END', "simple string") `simple` END list = [ nil, nil, #['NewlineNode',0,1,0,17], ['DXStrNode',0,0,0,16], ['StrNode',0,0,0,8], ['EvStrNode',0,0,8,15], nil, #['NewlineNode',0,0,10,16], ['VCallNode',0,0,10,14] ] test_tree(list, <<'END', "simple string") `simple #{to_s}` END list = [ nil, nil, #['NewlineNode',0,1,0,18], ['DStrNode',0,0,0,16], ['StrNode',0,0,0,8], ['EvStrNode',0,0,8,15], nil, #['NewlineNode',0,0,10,16], ['VCallNode',0,0,10,14] ] test_tree(list, <<'END', "eval in string") "simple #{to_s}" END list = [ nil, nil, #['NewlineNode',0,1,0,8], ['StrNode',0,2,0,13] ] test_tree(list, <<'END', "heredoc") <> 10 END list = [ nil, nil, ['YieldNode',0,0,0,7], ['VCallNode',0,0,6,7] ] test_tree(list, <