From 4790c08906f296eea070c06933a5c2484b30584e Mon Sep 17 00:00:00 2001 From: hsbt Date: Tue, 29 Aug 2017 11:52:50 +0000 Subject: Merge rdoc-6.0.0.beta1. This version fixed strange behavior of ruby code parser. We will list all of impromovement to Changelog when 6.0.0 releasing. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59686 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- test/rdoc/test_rdoc_code_object.rb | 6 - test/rdoc/test_rdoc_context.rb | 26 ++ test/rdoc/test_rdoc_markup_to_html.rb | 146 +++++++ test/rdoc/test_rdoc_parser_c.rb | 3 - test/rdoc/test_rdoc_parser_ruby.rb | 336 +++++++++++++++- test/rdoc/test_rdoc_ruby_lex.rb | 729 ++++++++++++++++++++++++++++++++-- test/rdoc/test_rdoc_store.rb | 4 +- test/rdoc/xref_data.rb | 12 + test/rdoc/xref_test_case.rb | 1 + 9 files changed, 1202 insertions(+), 61 deletions(-) (limited to 'test/rdoc') diff --git a/test/rdoc/test_rdoc_code_object.rb b/test/rdoc/test_rdoc_code_object.rb index e0d89e4e67..be4ca268e4 100644 --- a/test/rdoc/test_rdoc_code_object.rb +++ b/test/rdoc/test_rdoc_code_object.rb @@ -276,12 +276,6 @@ class TestRDocCodeObject < XrefTestCase assert_equal 'not_rdoc', @co.metadata['markup'] end - def test_offset - @c1_m.offset = 5 - - assert_equal 5, @c1_m.offset - end - def test_options assert_kind_of RDoc::Options, @co.options diff --git a/test/rdoc/test_rdoc_context.rb b/test/rdoc/test_rdoc_context.rb index 9af1401f94..54e365f7f4 100644 --- a/test/rdoc/test_rdoc_context.rb +++ b/test/rdoc/test_rdoc_context.rb @@ -481,6 +481,32 @@ class TestRDocContext < XrefTestCase assert_equal expected_attrs, attrs end + def test_each_section_only_display + sects = [] + consts = [] + attrs = [] + + @c7.each_section do |section, constants, attributes| + sects << section + consts << constants + attrs << attributes + end + + assert_equal [nil], sects.map { |section| section.title } + + expected_consts = [ + @c7.constants.select(&:display?).sort + ] + + assert_equal expected_consts, consts + + expected_attrs = [ + @c7.attributes.select(&:display?).sort + ] + + assert_equal expected_attrs, attrs + end + def test_each_section_enumerator assert_kind_of Enumerator, @c1.each_section end diff --git a/test/rdoc/test_rdoc_markup_to_html.rb b/test/rdoc/test_rdoc_markup_to_html.rb index 2e5b4b9300..fd8a7bb0ca 100644 --- a/test/rdoc/test_rdoc_markup_to_html.rb +++ b/test/rdoc/test_rdoc_markup_to_html.rb @@ -451,6 +451,22 @@ class TestRDocMarkupToHtml < RDoc::Markup::FormatterTestCase assert_equal expected, @to.res.join end + def test_accept_verbatim_nl_after_backslash + verb = @RM::Verbatim.new("a = 1 if first_flag_var and \\\n", " this_is_flag_var\n") + + @to.start_accepting + @to.accept_verbatim verb + + expected = <<-EXPECTED + +
a = 1 if first_flag_var and \\
+  this_is_flag_var
+
+ EXPECTED + + assert_equal expected, @to.res.join + end + def test_accept_verbatim_pipe @options.pipe = true @@ -469,6 +485,106 @@ class TestRDocMarkupToHtml < RDoc::Markup::FormatterTestCase assert_equal expected, @to.res.join end + def test_accept_verbatim_escape_in_string + code = <<-'RUBY' +def foo + [ + '\\', + '\'', + "'", + "\'\"\`", + "\#", + "\#{}", + "#", + "#{}", + /'"/, + /\'\"/, + /\//, + /\\/, + /\#/, + /\#{}/, + /#/, + /#{}/ + ] +end +def bar +end + RUBY + verb = @RM::Verbatim.new(*code.split(/(?<=\n)/)) + + @to.start_accepting + @to.accept_verbatim verb + + expected = <<-'EXPECTED' + +
def foo
+  [
+    '\\',
+    '\'',
+    "'",
+    "\'\"\`",
+    "\#",
+    "\#{}",
+    "#",
+    "#{}",
+    /'"/,
+    /\'\"/,
+    /\//,
+    /\\/,
+    /\#/,
+    /\#{}/,
+    /#/,
+    /#{}/
+  ]
+end
+def bar
+end
+
+ EXPECTED + + assert_equal expected, @to.res.join + end + + def test_accept_verbatim_escape_in_backtick + code = <<-'RUBY' +def foo + [ + `\\`, + `\'\"\``, + `\#`, + `\#{}`, + `#`, + `#{}` + ] +end +def bar +end + RUBY + verb = @RM::Verbatim.new(*code.split(/(?<=\n)/)) + + @to.start_accepting + @to.accept_verbatim verb + + expected = <<-'EXPECTED' + +
def foo
+  [
+    `\\`,
+    `\'\"\``,
+    `\#`,
+    `\#{}`,
+    `#`,
+    `#{}`
+  ]
+end
+def bar
+end
+
+ EXPECTED + + assert_equal expected, @to.res.join + end + def test_accept_verbatim_ruby verb = @RM::Verbatim.new("1 + 1\n") verb.format = :ruby @@ -485,6 +601,36 @@ class TestRDocMarkupToHtml < RDoc::Markup::FormatterTestCase assert_equal expected, @to.res.join end + def test_accept_verbatim_redefinable_operators + functions = %w[| ^ & <=> == === =~ > >= < <= << >> + - * / % ** ~ +@ -@ [] []= ` ! != !~].map { |redefinable_op| + ["def #{redefinable_op}\n", "end\n"] + }.flatten + + verb = @RM::Verbatim.new(*functions) + + @to.start_accepting + @to.accept_verbatim verb + + expected = <<-EXPECTED + +
+    EXPECTED
+    expected = expected.rstrip
+
+    %w[| ^ & <=> == === =~ > >= < <= << >> + - * / % ** ~ +@ -@ [] []= ` !  != !~].each do |html_escaped_op|
+      expected += <<-EXPECTED
+def #{html_escaped_op}
+end
+      EXPECTED
+    end
+
+    expected += <<-EXPECTED
+
+EXPECTED + + assert_equal expected, @to.res.join + end + def test_convert_string assert_equal '<>', @to.convert_string('<>') end diff --git a/test/rdoc/test_rdoc_parser_c.rb b/test/rdoc/test_rdoc_parser_c.rb index 09d7c4b16d..d0732597dc 100644 --- a/test/rdoc/test_rdoc_parser_c.rb +++ b/test/rdoc/test_rdoc_parser_c.rb @@ -1139,7 +1139,6 @@ Init_Foo(void) { assert_equal 'my_method', other_function.name assert_equal 'a comment for rb_other_function', other_function.comment.text assert_equal '()', other_function.params - assert_equal 118, other_function.offset assert_equal 8, other_function.line code = other_function.token_stream.first.text @@ -1173,7 +1172,6 @@ Init_Foo(void) { assert_equal 'my_method', other_function.name assert_equal 'a comment for other_function', other_function.comment.text assert_equal '()', other_function.params - assert_equal 39, other_function.offset assert_equal 4, other_function.line code = other_function.token_stream.first.text @@ -1402,7 +1400,6 @@ rb_m(int argc, VALUE *argv, VALUE obj) { assert_equal 'm', m.name assert_equal @top_level, m.file - assert_equal 115, m.offset assert_equal 7, m.line assert_equal '(p1)', m.params diff --git a/test/rdoc/test_rdoc_parser_ruby.rb b/test/rdoc/test_rdoc_parser_ruby.rb index 44b38c28aa..55c03d4628 100644 --- a/test/rdoc/test_rdoc_parser_ruby.rb +++ b/test/rdoc/test_rdoc_parser_ruby.rb @@ -74,7 +74,7 @@ class C; end comment = parser.collect_first_comment - assert_equal RDoc::Comment.new("first\n\n", @top_level), comment + assert_equal RDoc::Comment.new("=begin\nfirst\n=end\n\n", @top_level), comment end def test_get_class_or_module @@ -282,6 +282,31 @@ class C; end assert_equal 'blah', @top_level.metadata['unhandled'] end + def test_parse_for_in + klass = RDoc::NormalClass.new 'Foo' + klass.parent = @top_level + + comment = RDoc::Comment.new '', @top_level + + util_parser < == === =~ > >= < <= << >> + - * / % ** ~ +@ -@ [] []= ` ! != !~] + redefinable_ops.each do |redefinable_op| + util_parser "def #{redefinable_op}\nend\n" + tk = @parser.get_tk + @parser.parse_method klass, RDoc::Parser::Ruby::NORMAL, tk, comment + end + + klass.method_list.each do |method| + assert_kind_of RDoc::RubyToken::TkId, method.token_stream[5] + assert_includes redefinable_ops, method.token_stream[5].text + end + end + + def test_parse_method_bracket + util_parser <<-RUBY +class C + def [] end + def self.[] end + def []= end + def self.[]= end +end + RUBY + + @parser.scan + + c = @store.find_class_named 'C' + + assert_equal 4, c.method_list.size + assert_equal 'C#[]', c.method_list[0].full_name + assert_equal 'C::[]', c.method_list[1].full_name + assert_equal 'C#[]=', c.method_list[2].full_name + assert_equal 'C::[]=', c.method_list[3].full_name + assert c.aliases.empty? + end + def test_parse_method_alias klass = RDoc::NormalClass.new 'Foo' klass.parent = @top_level @@ -1978,6 +2042,30 @@ end assert_equal 'Foo#blah', methods.first.full_name end + def test_parse_statements_postfix_if_unless + util_parser <<-CODE +class C + def foo + 1 if nil + end + + def bar + 2 unless nil + end +end + CODE + + @parser.parse_statements @top_level, RDoc::Parser::Ruby::NORMAL, nil + + c = @top_level.classes.first + assert_equal 'C', c.full_name, 'class C' + + methods = c.method_list + assert_equal 2, methods.length + assert_equal 'C#foo', methods[0].full_name + assert_equal 'C#bar', methods[1].full_name + end + def test_parse_statements_class_nested comment = RDoc::Comment.new "##\n# my method\n", @top_level @@ -1994,7 +2082,7 @@ end end def test_parse_statements_def_percent_string_pound - util_parser "class C\ndef a\n%r{#}\nend\ndef b() end\nend" + util_parser "class C\ndef a\n%r{#}\n%r{\#{}}\nend\ndef b() end\nend" @parser.parse_statements @top_level, RDoc::Parser::Ruby::NORMAL @@ -2011,9 +2099,11 @@ end tk(:SPACE, 11, 2, 3, nil, ' '), tk(:IDENTIFIER, 12, 2, 4, 'a', 'a'), tk(:NL, 13, 2, 5, nil, "\n"), - tk(:DREGEXP, 14, 3, 0, nil, '%r{#}'), + tk(:REGEXP, 14, 3, 0, nil, '%r{#}'), tk(:NL, 19, 3, 5, nil, "\n"), - tk(:END, 20, 4, 0, 'end', 'end'), + tk(:DREGEXP, 20, 4, 0, nil, '%r{#{}}'), + tk(:NL, 27, 4, 7, nil, "\n"), + tk(:END, 28, 5, 0, 'end', 'end'), ] assert_equal expected, a.token_stream @@ -2377,6 +2467,162 @@ end assert_equal :private, date_time_now.visibility, date_time_now.full_name end + def test_parse_statements_complex_condition_in_for + util_parser <def blah() + for i in (k)...n do + end + for i in (k)...n + end +end +EXPTECTED + expected = expected.rstrip + + @parser.scan + + foo = @top_level.classes.first + assert_equal 'Foo', foo.full_name + + blah = foo.method_list.first + markup_code = blah.markup_code.sub(/^.*\n/, '') + assert_equal markup_code, expected + end + + def test_parse_statements_postfix_if_after_heredocbeg + @filename = 'file.rb' + util_parser <def blah() + <<~EOM if true + EOM + end +EXPTECTED + expected = expected.rstrip + + @parser.scan + + foo = @top_level.classes.first + assert_equal 'Foo', foo.full_name + + blah = foo.method_list.first + markup_code = blah.markup_code.sub(/^.*\n/, '') + assert_equal markup_code, expected + end + + def test_parse_statements_method_oneliner_with_regexp + util_parser <def blah() /bar/ end +EXPTECTED + expected = expected.rstrip + + @parser.scan + + foo = @top_level.classes.first + assert_equal 'Foo', foo.full_name + + blah = foo.method_list.first + markup_code = blah.markup_code.sub(/^.*\n/, '') + assert_equal expected, markup_code + end + + def test_parse_statements_embdoc_in_document + @filename = 'file.rb' + util_parser <doc + +
=begin
+test embdoc
+=end
+
+EXPTECTED + + @parser.scan + + foo = @top_level.classes.first + assert_equal 'Foo', foo.full_name + + blah = foo.method_list.first + markup_comment = blah.search_record[6] + assert_equal markup_comment, expected + end + + def test_parse_require_dynamic_string + content = <<-RUBY +prefix = 'path' +require "\#{prefix}/a_library" +require 'test' +RUBY + + util_parser content + + @parser.parse_statements @top_level + + assert_equal 1, @top_level.requires.length + end + + def test_parse_postfix_nodoc + util_parser <<-RUBY +class A +end # :nodoc: + +class B + def a + end # :nodoc: + + def b + end +end +RUBY + + @parser.parse_statements @top_level + + c_a = @top_level.classes.select(&:document_self).first + assert_equal 'B', c_a.full_name + + assert_equal 2, @top_level.classes.length + assert_equal 1, @top_level.classes.count(&:document_self) + assert_equal 1, c_a.method_list.length + assert_equal 'B#b', c_a.method_list.first.full_name + end + def test_parse_statements_identifier_require content = "require 'bar'" @@ -2504,6 +2750,25 @@ end assert_equal 'A#b', m_b.full_name end + + def test_parse_symbol_in_paren_arg + util_parser < "foo" }', nil + expected = [ @TK::TkLBRACE .new( 0, 1, 0, '{'), @TK::TkSPACE .new( 1, 1, 1, ' '), - @TK::TkIDENTIFIER.new( 2, 1, 2, 'class'), - @TK::TkSYMBEG .new( 7, 1, 7, ':'), - @TK::TkSTRING .new( 8, 1, 8, '"foo"'), - @TK::TkSPACE .new(13, 1, 13, ' '), - @TK::TkRBRACE .new(14, 1, 14, '}'), - @TK::TkNL .new(15, 1, 15, "\n"), + @TK::TkSYMBOL .new( 2, 1, 2, ':class'), + @TK::TkSPACE .new( 8, 1, 8, ' '), + @TK::TkHASHROCKET.new( 9, 1, 9, '=>'), + @TK::TkSPACE .new(11, 1, 11, ' '), + @TK::TkSTRING .new(12, 1, 12, '"foo"'), + @TK::TkSPACE .new(17, 1, 17, ' '), + @TK::TkRBRACE .new(18, 1, 18, '}'), + @TK::TkNL .new(19, 1, 19, "\n"), ] assert_equal expected, tokens @@ -104,10 +224,106 @@ Line 2\r @TK::TkSPACE .new( 6, 1, 6, ' '), @TK::TkASSIGN .new( 7, 1, 7, '='), @TK::TkSPACE .new( 8, 1, 8, ' '), - @TK::TkHEREDOC .new( 9, 1, 9, - %Q{<<-STRING\nLine 1\nLine 2\n STRING}), - @TK::TkSPACE .new(44, 4, 45, "\r"), - @TK::TkNL .new(45, 4, 46, "\n"), + @TK::TkHEREDOCBEG.new( 9, 1, 9, '<<-STRING'), + @TK::TkSPACE .new(18, 1, 18, "\r"), + @TK::TkNL .new(19, 1, 19, "\n"), + @TK::TkHEREDOC .new(19, 1, 19, + %Q{Line 1\nLine 2\n}), + @TK::TkHEREDOCEND.new(45, 4, 36, " STRING\n"), + ] + + assert_equal expected, tokens + end + + def test_class_tokenize_opassign + tokens = RDoc::RubyLex.tokenize <<'RUBY', nil +a %= b +a /= b +a -= b +a += b +a |= b +a &= b +a >>= b +a <<= b +a *= b +a &&= b +a ||= b +a **= b +RUBY + + expected = [ + @TK::TkIDENTIFIER.new( 0, 1, 0, "a"), + @TK::TkSPACE .new( 1, 1, 1, " "), + @TK::TkOPASGN .new( 2, 1, 2, "%"), + @TK::TkSPACE .new( 4, 1, 4, " "), + @TK::TkIDENTIFIER.new( 5, 1, 5, "b"), + @TK::TkNL .new( 6, 1, 6, "\n"), + @TK::TkIDENTIFIER.new( 7, 2, 0, "a"), + @TK::TkSPACE .new( 8, 2, 1, " "), + @TK::TkOPASGN .new( 9, 2, 2, "/"), + @TK::TkSPACE .new( 11, 2, 4, " "), + @TK::TkIDENTIFIER.new( 12, 2, 5, "b"), + @TK::TkNL .new( 13, 2, 7, "\n"), + @TK::TkIDENTIFIER.new( 14, 3, 0, "a"), + @TK::TkSPACE .new( 15, 3, 1, " "), + @TK::TkOPASGN .new( 16, 3, 2, "-"), + @TK::TkSPACE .new( 18, 3, 4, " "), + @TK::TkIDENTIFIER.new( 19, 3, 5, "b"), + @TK::TkNL .new( 20, 3, 14, "\n"), + @TK::TkIDENTIFIER.new( 21, 4, 0, "a"), + @TK::TkSPACE .new( 22, 4, 1, " "), + @TK::TkOPASGN .new( 23, 4, 2, "+"), + @TK::TkSPACE .new( 25, 4, 4, " "), + @TK::TkIDENTIFIER.new( 26, 4, 5, "b"), + @TK::TkNL .new( 27, 4, 21, "\n"), + @TK::TkIDENTIFIER.new( 28, 5, 0, "a"), + @TK::TkSPACE .new( 29, 5, 1, " "), + @TK::TkOPASGN .new( 30, 5, 2, "|"), + @TK::TkSPACE .new( 32, 5, 4, " "), + @TK::TkIDENTIFIER.new( 33, 5, 5, "b"), + @TK::TkNL .new( 34, 5, 28, "\n"), + @TK::TkIDENTIFIER.new( 35, 6, 0, "a"), + @TK::TkSPACE .new( 36, 6, 1, " "), + @TK::TkOPASGN .new( 37, 6, 2, "&"), + @TK::TkSPACE .new( 39, 6, 4, " "), + @TK::TkIDENTIFIER.new( 40, 6, 5, "b"), + @TK::TkNL .new( 41, 6, 35, "\n"), + @TK::TkIDENTIFIER.new( 42, 7, 0, "a"), + @TK::TkSPACE .new( 43, 7, 1, " "), + @TK::TkOPASGN .new( 44, 7, 2, ">>"), + @TK::TkSPACE .new( 47, 7, 5, " "), + @TK::TkIDENTIFIER.new( 48, 7, 6, "b"), + @TK::TkNL .new( 49, 7, 42, "\n"), + @TK::TkIDENTIFIER.new( 50, 8, 0, "a"), + @TK::TkSPACE .new( 51, 8, 1, " "), + @TK::TkOPASGN .new( 52, 8, 2, "<<"), + @TK::TkSPACE .new( 55, 8, 5, " "), + @TK::TkIDENTIFIER.new( 56, 8, 6, "b"), + @TK::TkNL .new( 57, 8, 50, "\n"), + @TK::TkIDENTIFIER.new( 58, 9, 0, "a"), + @TK::TkSPACE .new( 59, 9, 1, " "), + @TK::TkOPASGN .new( 60, 9, 2, "*"), + @TK::TkSPACE .new( 62, 9, 4, " "), + @TK::TkIDENTIFIER.new( 63, 9, 5, "b"), + @TK::TkNL .new( 64, 9, 58, "\n"), + @TK::TkIDENTIFIER.new( 65, 10, 0, "a"), + @TK::TkSPACE .new( 66, 10, 1, " "), + @TK::TkOPASGN .new( 67, 10, 2, "&&"), + @TK::TkSPACE .new( 70, 10, 5, " "), + @TK::TkIDENTIFIER.new( 71, 10, 6, "b"), + @TK::TkNL .new( 72, 10, 65, "\n"), + @TK::TkIDENTIFIER.new( 73, 11, 0, "a"), + @TK::TkSPACE .new( 74, 11, 1, " "), + @TK::TkOPASGN .new( 75, 11, 2, "||"), + @TK::TkSPACE .new( 78, 11, 5, " "), + @TK::TkIDENTIFIER.new( 79, 11, 6, "b"), + @TK::TkNL .new( 80, 11, 73, "\n"), + @TK::TkIDENTIFIER.new( 81, 12, 0, "a"), + @TK::TkSPACE .new( 82, 12, 1, " "), + @TK::TkOPASGN .new( 83, 12, 2, "**"), + @TK::TkSPACE .new( 86, 12, 5, " "), + @TK::TkIDENTIFIER.new( 87, 12, 6, "b"), + @TK::TkNL .new( 88, 12, 81, "\n"), ] assert_equal expected, tokens @@ -126,10 +342,12 @@ Line 2 @TK::TkSPACE .new( 6, 1, 6, ' '), @TK::TkASSIGN .new( 7, 1, 7, '='), @TK::TkSPACE .new( 8, 1, 8, ' '), - @TK::TkSTRING .new( 9, 1, 9, %Q{"Line 1\nLine 2\n"}), - @TK::TkDOT .new(41, 4, 42, '.'), - @TK::TkIDENTIFIER.new(42, 4, 43, 'chomp'), - @TK::TkNL .new(47, 4, 48, "\n"), + @TK::TkHEREDOCBEG.new( 9, 1, 9, '<<-STRING'), + @TK::TkDOT .new(18, 1, 18, '.'), + @TK::TkIDENTIFIER.new(19, 1, 19, 'chomp'), + @TK::TkNL .new(24, 1, 24, "\n"), + @TK::TkHEREDOC .new(24, 1, 24, "Line 1\nLine 2\n"), + @TK::TkHEREDOCEND.new(47, 4, 39, " STRING\n"), ] assert_equal expected, tokens @@ -148,9 +366,12 @@ Line 2 @TK::TkSPACE .new( 6, 1, 6, ' '), @TK::TkASSIGN .new( 7, 1, 7, '='), @TK::TkSPACE .new( 8, 1, 8, ' '), - @TK::TkHEREDOC .new( 9, 1, 9, - %Q{<<-STRING\nLine 1\nLine 2\n STRING}), - @TK::TkNL .new(41, 4, 42, "\n"), + + + @TK::TkHEREDOCBEG.new( 9, 1, 9, '<<-STRING'), + @TK::TkNL .new(18, 1, 18, "\n"), + @TK::TkHEREDOC .new(18, 1, 18, "Line 1\nLine 2\n"), + @TK::TkHEREDOCEND.new(41, 4, 33, " STRING\n") ] assert_equal expected, tokens @@ -180,8 +401,10 @@ U @TK::TkSPACE .new( 1, 1, 1, ' '), @TK::TkIDENTIFIER.new( 2, 1, 2, 'b'), @TK::TkSPACE .new( 3, 1, 3, ' '), - @TK::TkHEREDOC .new( 4, 1, 4, %Q{<<-U\n%N\nU}), - @TK::TkNL .new(13, 3, 14, "\n"), + @TK::TkHEREDOCBEG.new( 4, 1, 4, '<<-U'), + @TK::TkNL .new( 8, 1, 8, "\n"), + @TK::TkHEREDOC .new( 8, 1, 8, "%N\n"), + @TK::TkHEREDOCEND.new(13, 3, 12, "U\n") ] assert_equal expected, tokens @@ -195,6 +418,36 @@ U assert_equal expected, tokens.first end + def test_class_tokenize_lambda + tokens = RDoc::RubyLex.tokenize 'a = -> x, y { x + y }', nil + + expected = [ + @TK::TkIDENTIFIER.new( 0, 1, 0, 'a'), + @TK::TkSPACE .new( 1, 1, 1, ' '), + @TK::TkASSIGN .new( 2, 1, 2, '='), + @TK::TkSPACE .new( 3, 1, 3, ' '), + @TK::TkLAMBDA .new( 4, 1, 4, '->'), + @TK::TkSPACE .new( 6, 1, 6, ' '), + @TK::TkIDENTIFIER.new( 7, 1, 7, 'x'), + @TK::TkCOMMA .new( 8, 1, 8, ','), + @TK::TkSPACE .new( 9, 1, 9, ' '), + @TK::TkIDENTIFIER.new(10, 1, 10, 'y'), + @TK::TkSPACE .new(11, 1, 11, ' '), + @TK::TkfLBRACE .new(12, 1, 12, '{'), + @TK::TkSPACE .new(13, 1, 13, ' '), + @TK::TkIDENTIFIER.new(14, 1, 14, 'x'), + @TK::TkSPACE .new(15, 1, 15, ' '), + @TK::TkPLUS .new(16, 1, 16, '+'), + @TK::TkSPACE .new(17, 1, 17, ' '), + @TK::TkIDENTIFIER.new(18, 1, 18, 'y'), + @TK::TkSPACE .new(19, 1, 19, ' '), + @TK::TkRBRACE .new(20, 1, 20, '}'), + @TK::TkNL .new(21, 1, 21, "\n") + ] + + assert_equal expected, tokens + end + def test_class_tokenize_percent_1 tokens = RDoc::RubyLex.tokenize 'v%10==10', nil @@ -221,6 +474,39 @@ U assert_equal expected, tokens end + def test_class_tokenize_percent_r_with_slash + tokens = RDoc::RubyLex.tokenize '%r/hi/', nil + + expected = [ + @TK::TkREGEXP.new( 0, 1, 0, '%r/hi/'), + @TK::TkNL .new( 6, 1, 6, "\n"), + ] + + assert_equal expected, tokens + end + + def test_class_tokenize_percent_large_q + tokens = RDoc::RubyLex.tokenize '%Q/hi/', nil + + expected = [ + @TK::TkSTRING.new( 0, 1, 0, '%Q/hi/'), + @TK::TkNL .new( 6, 1, 6, "\n"), + ] + + assert_equal expected, tokens + end + + def test_class_tokenize_percent_large_q_with_double_quote + tokens = RDoc::RubyLex.tokenize '%Q"hi"', nil + + expected = [ + @TK::TkSTRING.new( 0, 1, 0, '%Q"hi"'), + @TK::TkNL .new( 6, 1, 6, "\n"), + ] + + assert_equal expected, tokens + end + def test_class_tokenize_percent_w tokens = RDoc::RubyLex.tokenize '%w[hi]', nil @@ -243,6 +529,35 @@ U assert_equal expected, tokens end + def test_class_tokenize_hash_rocket + tokens = RDoc::RubyLex.tokenize "{ :foo=> 1 }", nil + + expected = [ + @TK::TkLBRACE .new( 0, 1, 0, '{'), + @TK::TkSPACE .new( 1, 1, 1, ' '), + @TK::TkSYMBOL .new( 2, 1, 2, ':foo'), + @TK::TkHASHROCKET.new( 6, 1, 6, '=>'), + @TK::TkSPACE .new( 8, 1, 8, ' '), + @TK::TkINTEGER .new( 9, 1, 9, '1'), + @TK::TkSPACE .new(10, 1, 10, ' '), + @TK::TkRBRACE .new(11, 1, 11, '}'), + @TK::TkNL .new(12, 1, 12, "\n") + ] + + assert_equal expected, tokens + end + + def test_class_tokenize_percent_sign_quote + tokens = RDoc::RubyLex.tokenize '%%hi%', nil + + expected = [ + @TK::TkSTRING.new( 0, 1, 0, '%%hi%'), + @TK::TkNL .new( 5, 1, 5, "\n"), + ] + + assert_equal expected, tokens + end + def test_class_tokenize_regexp tokens = RDoc::RubyLex.tokenize "/hay/", nil @@ -296,6 +611,41 @@ U assert_equal expected, tokens end + def test_class_tokenize_number_with_sign_character + tokens = RDoc::RubyLex.tokenize "+3--3r", nil + + expected = [ + @TK::TkINTEGER .new(0, 1, 0, "+3"), + @TK::TkMINUS .new(2, 1, 2, "-"), + @TK::TkRATIONAL.new(3, 1, 3, "-3r"), + @TK::TkNL .new(6, 1, 6, "\n"), + ] + + assert_equal expected, tokens + end + + def test_class_tokenize_regexp_continuing_backslash + tokens = RDoc::RubyLex.tokenize "/(?