require "test_helper"

MarkdownFilter = HTML::Pipeline::MarkdownFilter

class HTML::Pipeline::MarkdownFilterTest < Minitest::Test
  def setup
    @haiku =
      "Pointing at the moon\n" +
      "Reminded of simple things\n" +
      "Moments matter most"
    @links =
      "See http://example.org/ for more info"
    @code =
      "```\n" +
      "def hello()" +
      "  'world'" +
      "end" +
      "```"
  end

  def test_fails_when_given_a_documentfragment
    body = "<p>heyo</p>"
    doc  = HTML::Pipeline.parse(body)
    assert_raises(TypeError) { MarkdownFilter.call(doc, {}) }
  end

  def test_gfm_enabled_by_default
    doc = MarkdownFilter.to_document(@haiku, {})
    assert doc.kind_of?(HTML::Pipeline::DocumentFragment)
    assert_equal 2, doc.search('br').size
  end

  def test_disabling_gfm
    doc = MarkdownFilter.to_document(@haiku, :gfm => false)
    assert doc.kind_of?(HTML::Pipeline::DocumentFragment)
    assert_equal 0, doc.search('br').size
  end

  def test_fenced_code_blocks
    doc = MarkdownFilter.to_document(@code)
    assert doc.kind_of?(HTML::Pipeline::DocumentFragment)
    assert_equal 1, doc.search('pre').size
  end

  def test_fenced_code_blocks_with_language
    doc = MarkdownFilter.to_document(@code.sub("```", "``` ruby"))
    assert doc.kind_of?(HTML::Pipeline::DocumentFragment)
    assert_equal 1, doc.search('pre').size
    assert_equal 'ruby', doc.search('pre').first['lang']
  end
end

class GFMTest < Minitest::Test
  def gfm(text)
    MarkdownFilter.call(text, :gfm => true)
  end

  def test_not_touch_single_underscores_inside_words
    assert_equal "<p>foo_bar</p>",
                 gfm("foo_bar")
  end

  def test_not_touch_underscores_in_code_blocks
    assert_equal "<pre><code>foo_bar_baz\n</code></pre>",
                 gfm("    foo_bar_baz")
  end

  def test_not_touch_underscores_in_pre_blocks
    assert_equal "<pre>\nfoo_bar_baz\n</pre>",
                 gfm("<pre>\nfoo_bar_baz\n</pre>")
  end

  def test_not_touch_two_or_more_underscores_inside_words
    assert_equal "<p>foo_bar_baz</p>",
                 gfm("foo_bar_baz")
  end

  def test_turn_newlines_into_br_tags_in_simple_cases
    assert_equal "<p>foo<br>\nbar</p>",
                 gfm("foo\nbar")
  end

  def test_convert_newlines_in_all_groups
    assert_equal "<p>apple<br>\npear<br>\norange</p>\n\n" +
                 "<p>ruby<br>\npython<br>\nerlang</p>",
                 gfm("apple\npear\norange\n\nruby\npython\nerlang")
  end

  def test_convert_newlines_in_even_long_groups
    assert_equal "<p>apple<br>\npear<br>\norange<br>\nbanana</p>\n\n" +
                 "<p>ruby<br>\npython<br>\nerlang</p>",
                 gfm("apple\npear\norange\nbanana\n\nruby\npython\nerlang")
  end

  def test_not_convert_newlines_in_lists
    assert_equal "<h1>foo</h1>\n\n<h1>bar</h1>",
                 gfm("# foo\n# bar")
    assert_equal "<ul>\n<li>foo</li>\n<li>bar</li>\n</ul>",
                 gfm("* foo\n* bar")
  end
end