mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			960 lines
		
	
	
	
		
			26 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			960 lines
		
	
	
	
		
			26 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: true
 | |
| require_relative 'helper'
 | |
| 
 | |
| class TestRDocMarkupToHtml < RDoc::Markup::FormatterTestCase
 | |
| 
 | |
|   add_visitor_tests
 | |
| 
 | |
|   def setup
 | |
|     super
 | |
| 
 | |
|     @to = RDoc::Markup::ToHtml.new @options
 | |
|   end
 | |
| 
 | |
|   def accept_blank_line
 | |
|     assert_empty @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_block_quote
 | |
|     assert_equal "\n<blockquote>\n<p>quote</p>\n</blockquote>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_document
 | |
|     assert_equal "\n<p>hello</p>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_heading
 | |
|     links = '<span><a href="#label-Hello">¶</a> ' +
 | |
|             '<a href="#top">↑</a></span>'
 | |
|     expected = "\n<h5 id=\"label-Hello\">Hello#{links}</h5>\n"
 | |
| 
 | |
|     assert_equal expected, @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_heading_1
 | |
|     links = '<span><a href="#label-Hello">¶</a> ' +
 | |
|             '<a href="#top">↑</a></span>'
 | |
| 
 | |
|     assert_equal "\n<h1 id=\"label-Hello\">Hello#{links}</h1>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_heading_2
 | |
|     links = '<span><a href="#label-Hello">¶</a> ' +
 | |
|             '<a href="#top">↑</a></span>'
 | |
| 
 | |
|     assert_equal "\n<h2 id=\"label-Hello\">Hello#{links}</h2>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_heading_3
 | |
|     links = '<span><a href="#label-Hello">¶</a> ' +
 | |
|             '<a href="#top">↑</a></span>'
 | |
| 
 | |
|     assert_equal "\n<h3 id=\"label-Hello\">Hello#{links}</h3>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_heading_4
 | |
|     links = '<span><a href="#label-Hello">¶</a> ' +
 | |
|             '<a href="#top">↑</a></span>'
 | |
| 
 | |
|     assert_equal "\n<h4 id=\"label-Hello\">Hello#{links}</h4>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_heading_b
 | |
|     links = '<span><a href="#label-Hello">¶</a> ' +
 | |
|             '<a href="#top">↑</a></span>'
 | |
|     inner = "<strong>Hello</strong>"
 | |
| 
 | |
|     assert_equal "\n<h1 id=\"label-Hello\">#{inner}#{links}</h1>\n",
 | |
|                  @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_heading_suppressed_crossref
 | |
|     links = '<span><a href="#label-Hello">¶</a> ' +
 | |
|             '<a href="#top">↑</a></span>'
 | |
| 
 | |
|     assert_equal "\n<h1 id=\"label-Hello\">Hello#{links}</h1>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_end_bullet
 | |
|     assert_equal [], @to.list
 | |
|     assert_equal [], @to.in_list_entry
 | |
| 
 | |
|     assert_equal "<ul></ul>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_end_label
 | |
|     assert_equal [], @to.list
 | |
|     assert_equal [], @to.in_list_entry
 | |
| 
 | |
|     assert_equal "<dl class=\"rdoc-list label-list\"></dl>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_end_lalpha
 | |
|     assert_equal [], @to.list
 | |
|     assert_equal [], @to.in_list_entry
 | |
| 
 | |
|     assert_equal "<ol style=\"list-style-type: lower-alpha\"></ol>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_end_number
 | |
|     assert_equal [], @to.list
 | |
|     assert_equal [], @to.in_list_entry
 | |
| 
 | |
|     assert_equal "<ol></ol>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_end_note
 | |
|     assert_equal [], @to.list
 | |
|     assert_equal [], @to.in_list_entry
 | |
| 
 | |
|     assert_equal "<dl class=\"rdoc-list note-list\"></dl>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_end_ualpha
 | |
|     assert_equal [], @to.list
 | |
|     assert_equal [], @to.in_list_entry
 | |
| 
 | |
|     assert_equal "<ol style=\"list-style-type: upper-alpha\"></ol>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_item_end_bullet
 | |
|     assert_equal %w[</li>], @to.in_list_entry
 | |
|   end
 | |
| 
 | |
|   def accept_list_item_end_label
 | |
|     assert_equal %w[</dd>], @to.in_list_entry
 | |
|   end
 | |
| 
 | |
|   def accept_list_item_end_lalpha
 | |
|     assert_equal %w[</li>], @to.in_list_entry
 | |
|   end
 | |
| 
 | |
|   def accept_list_item_end_note
 | |
|     assert_equal %w[</dd>], @to.in_list_entry
 | |
|   end
 | |
| 
 | |
|   def accept_list_item_end_number
 | |
|     assert_equal %w[</li>], @to.in_list_entry
 | |
|   end
 | |
| 
 | |
|   def accept_list_item_end_ualpha
 | |
|     assert_equal %w[</li>], @to.in_list_entry
 | |
|   end
 | |
| 
 | |
|   def accept_list_item_start_bullet
 | |
|     assert_equal "<ul><li>", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_item_start_label
 | |
|     assert_equal "<dl class=\"rdoc-list label-list\"><dt>cat\n<dd>", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_item_start_lalpha
 | |
|     assert_equal "<ol style=\"list-style-type: lower-alpha\"><li>", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_item_start_note
 | |
|     assert_equal "<dl class=\"rdoc-list note-list\"><dt>cat\n<dd>",
 | |
|                  @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_item_start_note_2
 | |
|     expected = <<-EXPECTED
 | |
| <dl class="rdoc-list note-list"><dt><code>teletype</code>
 | |
| <dd>
 | |
| <p>teletype description</p>
 | |
| </dd></dl>
 | |
|     EXPECTED
 | |
| 
 | |
|     assert_equal expected, @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_item_start_note_multi_description
 | |
|     expected = <<-EXPECTED
 | |
| <dl class="rdoc-list note-list"><dt>label
 | |
| <dd>
 | |
| <p>description one</p>
 | |
| </dd><dd>
 | |
| <p>description two</p>
 | |
| </dd></dl>
 | |
|     EXPECTED
 | |
| 
 | |
|     assert_equal expected, @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_item_start_note_multi_label
 | |
|     expected = <<-EXPECTED
 | |
| <dl class="rdoc-list note-list"><dt>one
 | |
| <dt>two
 | |
| <dd>
 | |
| <p>two headers</p>
 | |
| </dd></dl>
 | |
|     EXPECTED
 | |
| 
 | |
|     assert_equal expected, @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_item_start_number
 | |
|     assert_equal "<ol><li>", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_item_start_ualpha
 | |
|     assert_equal "<ol style=\"list-style-type: upper-alpha\"><li>", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_start_bullet
 | |
|     assert_equal [:BULLET], @to.list
 | |
|     assert_equal [false], @to.in_list_entry
 | |
| 
 | |
|     assert_equal "<ul>", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_start_label
 | |
|     assert_equal [:LABEL], @to.list
 | |
|     assert_equal [false], @to.in_list_entry
 | |
| 
 | |
|     assert_equal '<dl class="rdoc-list label-list">', @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_start_lalpha
 | |
|     assert_equal [:LALPHA], @to.list
 | |
|     assert_equal [false], @to.in_list_entry
 | |
| 
 | |
|     assert_equal "<ol style=\"list-style-type: lower-alpha\">", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_start_note
 | |
|     assert_equal [:NOTE], @to.list
 | |
|     assert_equal [false], @to.in_list_entry
 | |
| 
 | |
|     assert_equal "<dl class=\"rdoc-list note-list\">", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_start_number
 | |
|     assert_equal [:NUMBER], @to.list
 | |
|     assert_equal [false], @to.in_list_entry
 | |
| 
 | |
|     assert_equal "<ol>", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_list_start_ualpha
 | |
|     assert_equal [:UALPHA], @to.list
 | |
|     assert_equal [false], @to.in_list_entry
 | |
| 
 | |
|     assert_equal "<ol style=\"list-style-type: upper-alpha\">", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_paragraph
 | |
|     assert_equal "\n<p>hi</p>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_paragraph_b
 | |
|     assert_equal "\n<p>reg <strong>bold words</strong> reg</p>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_paragraph_br
 | |
|     assert_equal "\n<p>one<br>two</p>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_paragraph_break
 | |
|     assert_equal "\n<p>hello<br> world</p>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_paragraph_i
 | |
|     assert_equal "\n<p>reg <em>italic words</em> reg</p>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_paragraph_plus
 | |
|     assert_equal "\n<p>reg <code>teletype</code> reg</p>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_paragraph_star
 | |
|     assert_equal "\n<p>reg <strong>bold</strong> reg</p>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_paragraph_underscore
 | |
|     assert_equal "\n<p>reg <em>italic</em> reg</p>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_raw
 | |
|     raw = <<-RAW.rstrip
 | |
| <table>
 | |
| <tr><th>Name<th>Count
 | |
| <tr><td>a<td>1
 | |
| <tr><td>b<td>2
 | |
| </table>
 | |
|     RAW
 | |
| 
 | |
|     assert_equal raw, @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_rule
 | |
|     assert_equal "<hr>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def accept_verbatim
 | |
|     assert_equal "\n<pre class=\"ruby\"><span class=\"ruby-identifier\">hi</span>\n  <span class=\"ruby-identifier\">world</span>\n</pre>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def end_accepting
 | |
|     assert_equal 'hi', @to.end_accepting
 | |
|   end
 | |
| 
 | |
|   def start_accepting
 | |
|     assert_equal [], @to.res
 | |
|     assert_equal [], @to.in_list_entry
 | |
|     assert_equal [], @to.list
 | |
|   end
 | |
| 
 | |
|   def list_nested
 | |
|     expected = <<-EXPECTED
 | |
| <ul><li>
 | |
| <p>l1</p>
 | |
| <ul><li>
 | |
| <p>l1.1</p>
 | |
| </li></ul>
 | |
| </li><li>
 | |
| <p>l2</p>
 | |
| </li></ul>
 | |
|     EXPECTED
 | |
| 
 | |
|     assert_equal expected, @to.res.join
 | |
|   end
 | |
| 
 | |
|   def list_verbatim
 | |
|     expected = <<-EXPECTED
 | |
| <ul><li>
 | |
| <p>list stuff</p>
 | |
| 
 | |
| <pre>* list
 | |
|   with
 | |
| 
 | |
|   second
 | |
| 
 | |
|   1. indented
 | |
|   2. numbered
 | |
| 
 | |
|   third
 | |
| 
 | |
| * second</pre>
 | |
| </li></ul>
 | |
|     EXPECTED
 | |
| 
 | |
|     assert_equal expected, @to.end_accepting
 | |
|   end
 | |
| 
 | |
|   def test_accept_heading_7
 | |
|     @to.start_accepting
 | |
| 
 | |
|     @to.accept_heading @RM::Heading.new(7, 'Hello')
 | |
| 
 | |
|     links = '<span><a href="#label-Hello">¶</a> ' +
 | |
|             '<a href="#top">↑</a></span>'
 | |
| 
 | |
|     assert_equal "\n<h6 id=\"label-Hello\">Hello#{links}</h6>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def test_accept_heading_aref_class
 | |
|     @to.code_object = RDoc::NormalClass.new 'Foo'
 | |
|     @to.start_accepting
 | |
| 
 | |
|     @to.accept_heading head(1, 'Hello')
 | |
| 
 | |
|     links = '<span><a href="#class-Foo-label-Hello">¶</a> ' +
 | |
|             '<a href="#top">↑</a></span>'
 | |
| 
 | |
|     assert_equal "\n<h1 id=\"class-Foo-label-Hello\">Hello#{links}</h1>\n",
 | |
|                  @to.res.join
 | |
|   end
 | |
| 
 | |
|   def test_accept_heading_aref_method
 | |
|     @to.code_object = RDoc::AnyMethod.new nil, 'foo'
 | |
|     @to.start_accepting
 | |
| 
 | |
|     @to.accept_heading @RM::Heading.new(1, 'Hello')
 | |
| 
 | |
|     links = '<span><a href="#method-i-foo-label-Hello">¶</a> ' +
 | |
|             '<a href="#top">↑</a></span>'
 | |
| 
 | |
|     assert_equal "\n<h1 id=\"method-i-foo-label-Hello\">Hello#{links}</h1>\n",
 | |
|                  @to.res.join
 | |
|   end
 | |
| 
 | |
|   def test_accept_heading_pipe
 | |
|     @options.pipe = true
 | |
| 
 | |
|     @to.start_accepting
 | |
| 
 | |
|     @to.accept_heading @RM::Heading.new(1, 'Hello')
 | |
| 
 | |
|     assert_equal "\n<h1 id=\"label-Hello\">Hello</h1>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def test_accept_paragraph_newline
 | |
|     @to.start_accepting
 | |
| 
 | |
|     @to.accept_paragraph para("hello\n", "world\n")
 | |
| 
 | |
|     assert_equal "\n<p>hello world </p>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def test_accept_heading_output_decoration
 | |
|     @options.output_decoration = false
 | |
| 
 | |
|     @to.start_accepting
 | |
| 
 | |
|     @to.accept_heading @RM::Heading.new(1, 'Hello')
 | |
| 
 | |
|     assert_equal "\n<h1>Hello<span><a href=\"#label-Hello\">¶</a> <a href=\"#top\">↑</a></span></h1>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def test_accept_heading_output_decoration_with_pipe
 | |
|     @options.pipe = true
 | |
|     @options.output_decoration = false
 | |
| 
 | |
|     @to.start_accepting
 | |
| 
 | |
|     @to.accept_heading @RM::Heading.new(1, 'Hello')
 | |
| 
 | |
|     assert_equal "\n<h1>Hello</h1>\n", @to.res.join
 | |
|   end
 | |
| 
 | |
|   def test_accept_verbatim_parseable
 | |
|     verb = @RM::Verbatim.new("class C\n", "end\n")
 | |
| 
 | |
|     @to.start_accepting
 | |
|     @to.accept_verbatim verb
 | |
| 
 | |
|     expected = <<-EXPECTED
 | |
| 
 | |
| <pre class="ruby"><span class="ruby-keyword">class</span> <span class="ruby-constant">C</span>
 | |
| <span class="ruby-keyword">end</span>
 | |
| </pre>
 | |
|     EXPECTED
 | |
| 
 | |
|     assert_equal expected, @to.res.join
 | |
|   end
 | |
| 
 | |
|   def test_accept_verbatim_parseable_error
 | |
|     verb = @RM::Verbatim.new("a % 09 # => blah\n")
 | |
| 
 | |
|     @to.start_accepting
 | |
|     @to.accept_verbatim verb
 | |
| 
 | |
|     inner = CGI.escapeHTML "a % 09 # => blah"
 | |
| 
 | |
|     expected = <<-EXPECTED
 | |
| 
 | |
| <pre>#{inner}</pre>
 | |
|     EXPECTED
 | |
| 
 | |
|     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
 | |
| 
 | |
| <pre class="ruby"><span class="ruby-identifier">a</span> = <span class="ruby-value">1</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">first_flag_var</span> <span class="ruby-keyword">and</span> \\
 | |
|   <span class="ruby-identifier">this_is_flag_var</span>
 | |
| </pre>
 | |
|     EXPECTED
 | |
| 
 | |
|     assert_equal expected, @to.res.join
 | |
|   end
 | |
| 
 | |
|   def test_accept_verbatim_pipe
 | |
|     @options.pipe = true
 | |
| 
 | |
|     verb = @RM::Verbatim.new("1 + 1\n")
 | |
|     verb.format = :ruby
 | |
| 
 | |
|     @to.start_accepting
 | |
|     @to.accept_verbatim verb
 | |
| 
 | |
|     expected = <<-EXPECTED
 | |
| 
 | |
| <pre><code>1 + 1
 | |
| </code></pre>
 | |
|     EXPECTED
 | |
| 
 | |
|     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'
 | |
| 
 | |
| <pre class="ruby"><span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">foo</span>
 | |
|   [
 | |
|     <span class="ruby-string">'\\'</span>,
 | |
|     <span class="ruby-string">'\''</span>,
 | |
|     <span class="ruby-string">"'"</span>,
 | |
|     <span class="ruby-string">"\'\"\`"</span>,
 | |
|     <span class="ruby-string">"\#"</span>,
 | |
|     <span class="ruby-string">"\#{}"</span>,
 | |
|     <span class="ruby-string">"#"</span>,
 | |
|     <span class="ruby-node">"#{}"</span>,
 | |
|     <span class="ruby-regexp">/'"/</span>,
 | |
|     <span class="ruby-regexp">/\'\"/</span>,
 | |
|     <span class="ruby-regexp">/\//</span>,
 | |
|     <span class="ruby-regexp">/\\/</span>,
 | |
|     <span class="ruby-regexp">/\#/</span>,
 | |
|     <span class="ruby-regexp">/\#{}/</span>,
 | |
|     <span class="ruby-regexp">/#/</span>,
 | |
|     <span class="ruby-regexp">/#{}/</span>
 | |
|   ]
 | |
| <span class="ruby-keyword">end</span>
 | |
| <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">bar</span>
 | |
| <span class="ruby-keyword">end</span>
 | |
| </pre>
 | |
|     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'
 | |
| 
 | |
| <pre class="ruby"><span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">foo</span>
 | |
|   [
 | |
|     <span class="ruby-string">`\\`</span>,
 | |
|     <span class="ruby-string">`\'\"\``</span>,
 | |
|     <span class="ruby-string">`\#`</span>,
 | |
|     <span class="ruby-string">`\#{}`</span>,
 | |
|     <span class="ruby-string">`#`</span>,
 | |
|     <span class="ruby-node">`#{}`</span>
 | |
|   ]
 | |
| <span class="ruby-keyword">end</span>
 | |
| <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">bar</span>
 | |
| <span class="ruby-keyword">end</span>
 | |
| </pre>
 | |
|     EXPECTED
 | |
| 
 | |
|     assert_equal expected, @to.res.join
 | |
|   end
 | |
| 
 | |
|   def test_accept_verbatim_ruby
 | |
|     verb = @RM::Verbatim.new("1 + 1\n")
 | |
|     verb.format = :ruby
 | |
| 
 | |
|     @to.start_accepting
 | |
|     @to.accept_verbatim verb
 | |
| 
 | |
|     expected = <<-EXPECTED
 | |
| 
 | |
| <pre class="ruby"><span class="ruby-value">1</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>
 | |
| </pre>
 | |
|     EXPECTED
 | |
| 
 | |
|     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
 | |
| 
 | |
| <pre class="ruby">
 | |
|     EXPECTED
 | |
|     expected = expected.rstrip
 | |
| 
 | |
|     %w[| ^ & <=> == === =~ > >= < <= << >> + - * / % ** ~ +@ -@ [] []= ` !  != !~].each do |html_escaped_op|
 | |
|       expected += <<-EXPECTED
 | |
| <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">#{html_escaped_op}</span>
 | |
| <span class="ruby-keyword">end</span>
 | |
|       EXPECTED
 | |
|     end
 | |
| 
 | |
|     expected += <<-EXPECTED
 | |
| </pre>
 | |
| EXPECTED
 | |
| 
 | |
|     assert_equal expected, @to.res.join
 | |
|   end
 | |
| 
 | |
|   def test_convert_string
 | |
|     assert_equal '<>', @to.convert_string('<>')
 | |
|   end
 | |
| 
 | |
|   def test_convert_HYPERLINK_irc
 | |
|     result = @to.convert 'irc://irc.freenode.net/#ruby-lang'
 | |
| 
 | |
|     assert_equal "\n<p><a href=\"irc://irc.freenode.net/#ruby-lang\">irc.freenode.net/#ruby-lang</a></p>\n", result
 | |
|   end
 | |
| 
 | |
|   def test_convert_RDOCLINK_label_label
 | |
|     result = @to.convert 'rdoc-label:label-One'
 | |
| 
 | |
|     assert_equal "\n<p><a href=\"#label-One\">One</a></p>\n", result
 | |
|   end
 | |
| 
 | |
|   def test_convert_RDOCLINK_label_foottext
 | |
|     result = @to.convert 'rdoc-label:foottext-1'
 | |
| 
 | |
|     assert_equal "\n<p><a href=\"#foottext-1\">1</a></p>\n", result
 | |
|   end
 | |
| 
 | |
|   def test_convert_RDOCLINK_label_footmark
 | |
|     result = @to.convert 'rdoc-label:footmark-1'
 | |
| 
 | |
|     assert_equal "\n<p><a href=\"#footmark-1\">1</a></p>\n", result
 | |
|   end
 | |
| 
 | |
|   def test_convert_RDOCLINK_ref
 | |
|     result = @to.convert 'rdoc-ref:C'
 | |
| 
 | |
|     assert_equal "\n<p>C</p>\n", result
 | |
|   end
 | |
| 
 | |
|   def test_convert_RDOCLINK_escape_image
 | |
|     assert_escaped '<script>', 'rdoc-image:"><script>alert(`rdoc-image`)</script>"'
 | |
|   end
 | |
| 
 | |
|   def test_convert_RDOCLINK_escape_label_id
 | |
|     assert_escaped '<script>', 'rdoc-label::path::"><script>alert(`rdoc-label_id`)</script>"'
 | |
|   end
 | |
| 
 | |
|   def test_convert_RDOCLINK_escape_label_path
 | |
|     assert_escaped '<script>', 'rdoc-label::"><script>alert(`rdoc-label_path`)</script>"'
 | |
|   end
 | |
| 
 | |
|   def test_convert_RDOCLINK_escape_ref
 | |
|     assert_escaped '<script>', 'rdoc-ref:"><script>alert(`rdoc-ref`)</script>"'
 | |
|   end
 | |
| 
 | |
|   def test_convert_RDOCLINK_escape_xxx
 | |
|     assert_escaped '<script>', 'rdoc-xxx:"><script>alert(`rdoc-xxx`)</script>"'
 | |
|   end
 | |
| 
 | |
|   def test_convert_TIDYLINK_footnote
 | |
|     result = @to.convert 'text{*1}[rdoc-label:foottext-1:footmark-1]'
 | |
| 
 | |
|     assert_equal "\n<p>text<sup><a id=\"footmark-1\" href=\"#foottext-1\">1</a></sup></p>\n", result
 | |
|   end
 | |
| 
 | |
|   def test_convert_TIDYLINK_multiple
 | |
|     result = @to.convert '{a}[http://example] {b}[http://example]'
 | |
| 
 | |
|     expected = <<-EXPECTED
 | |
| 
 | |
| <p><a href=\"http://example\">a</a> <a href=\"http://example\">b</a></p>
 | |
|     EXPECTED
 | |
| 
 | |
|     assert_equal expected, result
 | |
|   end
 | |
| 
 | |
|   def test_convert_TIDYLINK_image
 | |
|     result =
 | |
|       @to.convert '{rdoc-image:path/to/image.jpg}[http://example.com]'
 | |
| 
 | |
|     expected =
 | |
|       "\n<p><a href=\"http://example.com\"><img src=\"path/to/image.jpg\"></a></p>\n"
 | |
| 
 | |
|     assert_equal expected, result
 | |
| 
 | |
|     result =
 | |
|       @to.convert '{rdoc-image:<script>alert`link text`</script>}[http://example.com]'
 | |
| 
 | |
|     assert_not_include result, "<script>"
 | |
|   end
 | |
| 
 | |
|   def test_convert_TIDYLINK_rdoc_label
 | |
|     result = @to.convert '{foo}[rdoc-label:foottext-1]'
 | |
| 
 | |
|     assert_equal "\n<p><a href=\"#foottext-1\">foo</a></p>\n", result
 | |
|   end
 | |
| 
 | |
|   def test_convert_TIDYLINK_irc
 | |
|     result = @to.convert '{ruby-lang}[irc://irc.freenode.net/#ruby-lang]'
 | |
| 
 | |
|     assert_equal "\n<p><a href=\"irc://irc.freenode.net/#ruby-lang\">ruby-lang</a></p>\n", result
 | |
|   end
 | |
| 
 | |
|   def test_convert_TIDYLINK_escape_text
 | |
|     assert_escaped '<script>', '{<script>alert`link text`</script>}[a]'
 | |
|     assert_escaped '<script>', 'x:/<script>alert(1);</script>[[]'
 | |
|   end
 | |
| 
 | |
|   def test_convert_TIDYLINK_escape_javascript
 | |
|     assert_not_include '{click}[javascript:alert`javascript_scheme`]', '<a href="javascript:'
 | |
|   end
 | |
| 
 | |
|   def test_convert_TIDYLINK_escape_onmouseover
 | |
|     assert_escaped '"/onmouseover="', '{onmouseover}[http://"/onmouseover="alert`on_mouse_link`"]'
 | |
|   end
 | |
| 
 | |
|   def test_convert_TIDYLINK_escape_onerror
 | |
|     assert_escaped '"onerror="', '{link_image}[http://"onerror="alert`link_image`".png]'
 | |
|   end
 | |
| 
 | |
|   def test_convert_with_exclude_tag
 | |
|     assert_equal "\n<p><code>aaa</code>[:symbol]</p>\n", @to.convert('+aaa+[:symbol]')
 | |
|     assert_equal "\n<p><code>aaa[:symbol]</code></p>\n", @to.convert('+aaa[:symbol]+')
 | |
|     assert_equal "\n<p><code>https:</code>-foobar</p>\n", @to.convert('<tt>https:</tt>-foobar')
 | |
|     assert_equal "\n<p><a href=\":symbol\">aaa</a></p>\n", @to.convert('aaa[:symbol]')
 | |
|   end
 | |
| 
 | |
|   def test_convert_underscore_adjacent_to_code
 | |
|     assert_equal "\n<p><code>aaa</code>_</p>\n", @to.convert(%q{+aaa+_})
 | |
|     assert_equal "\n<p>\u{2018}<code>i386-mswin32_</code><em>MSRTVERSION</em>\u{2019}</p>\n", @to.convert(%q{`+i386-mswin32_+_MSRTVERSION_'})
 | |
|   end
 | |
| 
 | |
|   def test_gen_url
 | |
|     assert_equal '<a href="example">example</a>',
 | |
|                  @to.gen_url('link:example', 'example')
 | |
|   end
 | |
| 
 | |
|   def test_gen_url_rdoc_label
 | |
|     assert_equal '<a href="#foottext-1">example</a>',
 | |
|                  @to.gen_url('rdoc-label:foottext-1', 'example')
 | |
|   end
 | |
| 
 | |
|   def test_gen_url_rdoc_label_id
 | |
|     assert_equal '<sup><a id="footmark-1" href="#foottext-1">example</a></sup>',
 | |
|                  @to.gen_url('rdoc-label:foottext-1:footmark-1', 'example')
 | |
|   end
 | |
| 
 | |
|   def test_gen_url_image_url
 | |
|     assert_equal '<img src="http://example.com/image.png" />', @to.gen_url('http://example.com/image.png', 'ignored')
 | |
|   end
 | |
| 
 | |
|   def test_gen_url_ssl_image_url
 | |
|     assert_equal '<img src="https://example.com/image.png" />', @to.gen_url('https://example.com/image.png', 'ignored')
 | |
|   end
 | |
| 
 | |
|   def test_gen_url_rdoc_file
 | |
|     assert_equal '<a href="example_rdoc.html">example</a>',
 | |
|                  @to.gen_url('example.rdoc', 'example')
 | |
|     assert_equal '<a href="doc/example_rdoc.html">example</a>',
 | |
|                  @to.gen_url('doc/example.rdoc', 'example')
 | |
|     assert_equal '<a href="../ex.doc/example_rdoc.html">example</a>',
 | |
|                  @to.gen_url('../ex.doc/example.rdoc', 'example')
 | |
|     assert_equal '<a href="doc/example_rdoc.html#label-one">example</a>',
 | |
|                  @to.gen_url('doc/example.rdoc#label-one', 'example')
 | |
|     assert_equal '<a href="../ex.doc/example_rdoc.html#label-two">example</a>',
 | |
|                  @to.gen_url('../ex.doc/example.rdoc#label-two', 'example')
 | |
|   end
 | |
| 
 | |
|   def test_gen_url_md_file
 | |
|     assert_equal '<a href="example_md.html">example</a>',
 | |
|                  @to.gen_url('example.md', 'example')
 | |
|     assert_equal '<a href="doc/example_md.html">example</a>',
 | |
|                  @to.gen_url('doc/example.md', 'example')
 | |
|     assert_equal '<a href="../ex.doc/example_md.html">example</a>',
 | |
|                  @to.gen_url('../ex.doc/example.md', 'example')
 | |
|     assert_equal '<a href="doc/example_md.html#label-one">example</a>',
 | |
|                  @to.gen_url('doc/example.md#label-one', 'example')
 | |
|     assert_equal '<a href="../ex.doc/example_md.html#label-two">example</a>',
 | |
|                  @to.gen_url('../ex.doc/example.md#label-two', 'example')
 | |
|   end
 | |
| 
 | |
|   def test_gen_url_rb_file
 | |
|     assert_equal '<a href="example_rb.html">example</a>',
 | |
|                  @to.gen_url('example.rb', 'example')
 | |
|     assert_equal '<a href="doc/example_rb.html">example</a>',
 | |
|                  @to.gen_url('doc/example.rb', 'example')
 | |
|     assert_equal '<a href="../ex.doc/example_rb.html">example</a>',
 | |
|                  @to.gen_url('../ex.doc/example.rb', 'example')
 | |
|     assert_equal '<a href="doc/example_rb.html#label-one">example</a>',
 | |
|                  @to.gen_url('doc/example.rb#label-one', 'example')
 | |
|     assert_equal '<a href="../ex.doc/example_rb.html#label-two">example</a>',
 | |
|                  @to.gen_url('../ex.doc/example.rb#label-two', 'example')
 | |
|   end
 | |
| 
 | |
|   def test_handle_regexp_HYPERLINK_link
 | |
|     target = RDoc::Markup::RegexpHandling.new 0, 'link:README.txt'
 | |
| 
 | |
|     link = @to.handle_regexp_HYPERLINK target
 | |
| 
 | |
|     assert_equal '<a href="README.txt">README.txt</a>', link
 | |
|   end
 | |
| 
 | |
|   def test_handle_regexp_HYPERLINK_irc
 | |
|     target = RDoc::Markup::RegexpHandling.new 0, 'irc://irc.freenode.net/#ruby-lang'
 | |
| 
 | |
|     link = @to.handle_regexp_HYPERLINK target
 | |
| 
 | |
|     assert_equal '<a href="irc://irc.freenode.net/#ruby-lang">irc.freenode.net/#ruby-lang</a>', link
 | |
|   end
 | |
| 
 | |
|   def test_handle_regexp_HYPERLINK_escape
 | |
|     code = 'irc://irc.freenode.net/"><script>alert(`irc`)</script><a"'
 | |
|     assert_escaped '<script>', code
 | |
|   end
 | |
| 
 | |
|   def test_list_verbatim_2
 | |
|     str = "* one\n    verb1\n    verb2\n* two\n"
 | |
| 
 | |
|     expected = <<-EXPECTED
 | |
| <ul><li>
 | |
| <p>one</p>
 | |
| 
 | |
| <pre class=\"ruby\"><span class=\"ruby-identifier\">verb1</span>
 | |
| <span class=\"ruby-identifier\">verb2</span>
 | |
| </pre>
 | |
| </li><li>
 | |
| <p>two</p>
 | |
| </li></ul>
 | |
|     EXPECTED
 | |
| 
 | |
|     assert_equal expected, @m.convert(str, @to)
 | |
|   end
 | |
| 
 | |
|   def test_block_quote_in_verbatim
 | |
|     str = "BlockQuote\n  >>>\n"
 | |
| 
 | |
|     expected = <<-EXPECTED
 | |
| <p>BlockQuote</p>
 | |
| <pre>>>></pre>
 | |
|     EXPECTED
 | |
| 
 | |
|     assert_equal expected, @m.convert(str, @to).gsub(/^\n/, "")
 | |
| 
 | |
|     str = "BlockQuote\n  >>>  word\n"
 | |
| 
 | |
|     expected = <<-EXPECTED
 | |
| <p>BlockQuote</p>
 | |
| <pre>>>>  word</pre>
 | |
|     EXPECTED
 | |
| 
 | |
|     assert_equal expected, @m.convert(str, @to).gsub(/^\n/, "")
 | |
|   end
 | |
| 
 | |
|   def test_parseable_eh
 | |
|     valid_syntax = [
 | |
|       'def x() end',
 | |
|       'def x; end',
 | |
|       'class C; end',
 | |
|       "module M end",
 | |
|       'a # => blah',
 | |
|       'x { |y| nil }',
 | |
|       'x do |y| nil end',
 | |
|       '# only a comment',
 | |
|       'require "foo"',
 | |
|       'cls="foo"'
 | |
|     ]
 | |
|     invalid_syntax = [
 | |
|       'def x end',
 | |
|       'class C < end',
 | |
|       'module M < C end',
 | |
|       'a=># blah',
 | |
|       'x { |y| ... }',
 | |
|       'x do |y| ... end',
 | |
|       '// only a comment',
 | |
|       '<% require "foo" %>',
 | |
|       'class="foo"'
 | |
|     ]
 | |
|     valid_syntax.each do |t|
 | |
|       assert @to.parseable?(t), "valid syntax considered invalid: #{t}"
 | |
|     end
 | |
|     invalid_syntax.each do |t|
 | |
|       refute @to.parseable?(t), "invalid syntax considered valid: #{t}"
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def test_to_html
 | |
|     assert_equal "\n<p><code>--</code></p>\n", util_format("<tt>--</tt>")
 | |
|   end
 | |
| 
 | |
|   def util_format text
 | |
|     paragraph = RDoc::Markup::Paragraph.new text
 | |
| 
 | |
|     @to.start_accepting
 | |
|     @to.accept_paragraph paragraph
 | |
|     @to.end_accepting
 | |
|   end
 | |
| 
 | |
|   def test_accept_table
 | |
|     header = %w[Col1 Col2 Col3]
 | |
|     body = [
 | |
|       %w[cell1_1 cell1_2 cell1_3],
 | |
|       %w[cell2_1 cell2_2 cell2_3],
 | |
|       ['<script>alert("foo");</script>',],
 | |
|       %w[+code+ _em_ **strong**],
 | |
|     ]
 | |
|     aligns = [:left, :right, nil]
 | |
|     @to.start_accepting
 | |
|     @to.accept_table(header, body, aligns)
 | |
|     res = @to.end_accepting
 | |
|     assert_include(res[%r<<th[^<>]*>Col1</th>>], 'align="left"')
 | |
|     assert_include(res[%r<<th[^<>]*>Col2</th>>], 'align="right"')
 | |
|     assert_not_include(res[%r<<th[^<>]*>Col3</th>>], 'align=')
 | |
|     assert_include(res[%r<<td[^<>]*>cell1_1</td>>], 'align="left"')
 | |
|     assert_include(res[%r<<td[^<>]*>cell1_2</td>>], 'align="right"')
 | |
|     assert_not_include(res[%r<<td[^<>]*>cell1_3</td>>], 'align=')
 | |
|     assert_include(res[%r<<td[^<>]*>cell2_1</td>>], 'align="left"')
 | |
|     assert_include(res[%r<<td[^<>]*>cell2_2</td>>], 'align="right"')
 | |
|     assert_not_include(res[%r<<td[^<>]*>cell2_3</td>>], 'align=')
 | |
|     assert_not_include(res, '<script>')
 | |
|     assert_include(res[%r<<td[^<>]*>.*script.*</td>>], '<script>')
 | |
|     assert_include(res[%r<<td[^<>]*>.*code.*</td>>], '<code>code</code>')
 | |
|     assert_include(res[%r<<td[^<>]*>.*em.*</td>>], '<em>em</em>')
 | |
|     assert_include(res[%r<<td[^<>]*>.*strong.*</td>>], '<strong>strong</strong>')
 | |
|   end
 | |
| 
 | |
|   def assert_escaped(unexpected, code)
 | |
|     result = @to.convert(code)
 | |
|     assert_not_include result, unexpected
 | |
|     assert_include result, CGI.escapeHTML(unexpected)
 | |
|   end
 | |
| end
 | |
| 
 | 
