# frozen_string_literal: true
require 'test_helper'
class TestVariousTocHtml < Minitest::Test
# ref. https://github.com/toshimaru/jekyll-toc/issues/45
ANGLE_BRACKET_HTML = <<~HTML
h1
<base href>
& < >
HTML
NO_TOC_HTML = <<~HTML
h1
no_toc h1
h2
no_toc h2
h3
no_toc h3
h4
no_toc h4
HTML
JAPANESE_HEADINGS_HTML = <<~HTML
あ
い
う
HTML
TAGS_INSIDE_HEADINGS_HTML = <<~HTML
h2
h2
HTML
TEST_HTML_1 = <<~HTML
h1
h3
h6
HTML
TEST_HTML_2 = <<~HTML
h1
h3
h2
h6
HTML
TEST_HTML_3 = <<~HTML
h6
h5
h4
h3
h2
h1
HTML
TEST_HTML_4 = <<~HTML
h1
h3
h2
h4
h5
HTML
def test_nested_toc
parser = Jekyll::TableOfContents::Parser.new(TEST_HTML_1)
doc = Nokogiri::HTML(parser.toc)
expected = <<~HTML
HTML
actual = doc.css('ul.section-nav').to_s
assert_equal(expected, actual)
end
def test_nested_toc_with_min_and_max
parser = Jekyll::TableOfContents::Parser.new(TEST_HTML_1, 'min_level' => 2, 'max_level' => 5)
doc = Nokogiri::HTML(parser.toc)
expected = <<~HTML
HTML
actual = doc.css('ul.section-nav').to_s
assert_equal(expected, actual)
end
def test_complex_nested_toc
parser = Jekyll::TableOfContents::Parser.new(TEST_HTML_2)
doc = Nokogiri::HTML(parser.toc)
expected = <<~HTML
HTML
actual = doc.css('ul.section-nav').to_s
assert_equal(expected, actual)
end
def test_decremental_headings1
parser = Jekyll::TableOfContents::Parser.new(TEST_HTML_3)
doc = Nokogiri::HTML(parser.toc)
expected = <<~HTML
HTML
actual = doc.css('ul.section-nav').to_s
assert_equal(expected, actual)
end
def test_decremental_headings2
parser = Jekyll::TableOfContents::Parser.new(TEST_HTML_4)
doc = Nokogiri::HTML(parser.toc)
expected = <<~HTML
HTML
assert_equal(expected, doc.css('ul.section-nav').to_s)
end
def test_no_toc
parser = Jekyll::TableOfContents::Parser.new(NO_TOC_HTML)
doc = Nokogiri::HTML(parser.toc)
expected = <<~HTML
HTML
actual = doc.css('ul.section-nav').to_s
assert_equal(expected, actual)
end
def test_japanese_toc
parser = Jekyll::TableOfContents::Parser.new(JAPANESE_HEADINGS_HTML)
doc = Nokogiri::HTML(parser.toc)
expected = <<~HTML
HTML
actual = doc.css('ul.section-nav').to_s
assert_equal(expected, actual)
end
def test_angle_bracket
parser = Jekyll::TableOfContents::Parser.new(ANGLE_BRACKET_HTML)
doc = Nokogiri::HTML(parser.toc)
expected = <<~HTML
HTML
actual = doc.css('ul.section-nav').to_s
assert_equal(expected, actual)
end
def test_tags_inside_heading
parser = Jekyll::TableOfContents::Parser.new(TAGS_INSIDE_HEADINGS_HTML)
doc = Nokogiri::HTML(parser.toc)
expected = <<~HTML
HTML
actual = doc.css('ul.section-nav').to_s
assert_equal(expected, actual)
end
TEST_HTML_IGNORE = <<~HTML
h1
h2
h3
h6
HTML
def test_nested_toc_with_no_toc_section_class
parser = Jekyll::TableOfContents::Parser.new(TEST_HTML_IGNORE)
doc = Nokogiri::HTML(parser.toc)
expected = <<~HTML
HTML
actual = doc.css('ul.section-nav').to_s
assert_equal(expected, actual)
html = parser.inject_anchors_into_html
assert_match(%r{.+
}m, html)
assert_match(%r{.+
}m, html)
assert_match(%r{.+
}m, html)
assert_includes(html, 'h2
')
end
TEST_HTML_IGNORE_2 = <<~HTML
h1
h2
h3
h4
h5
h6
HTML
def test_nested_toc_with_no_toc_section_class_option
parser = Jekyll::TableOfContents::Parser.new(TEST_HTML_IGNORE_2, 'no_toc_section_class' => 'exclude')
doc = Nokogiri::HTML(parser.toc)
expected = <<~HTML
HTML
actual = doc.css('ul.section-nav').to_s
assert_equal(expected, actual)
html = parser.inject_anchors_into_html
assert_match(%r{.+
}m, html)
assert_match(%r{.+
}m, html)
assert_match(%r{.+
}m, html)
assert_includes(html, 'h2
')
assert_includes(html, 'h4
')
assert_includes(html, 'h5
')
end
TEST_HTML_IGNORE_3 = <<~HTML
h1
h2
h3
h4
h5
h6
HTML
def test_multiple_no_toc_section_classes
parser = Jekyll::TableOfContents::Parser.new(TEST_HTML_IGNORE_3, 'no_toc_section_class' => ['no_toc_section', 'exclude'])
doc = Nokogiri::HTML(parser.toc)
expected = <<~HTML
HTML
actual = doc.css('ul.section-nav').to_s
assert_equal(expected, actual)
html = parser.inject_anchors_into_html
assert_match(%r{.+
}m, html)
assert_match(%r{.+
}m, html)
assert_match(%r{.+
}m, html)
assert_includes(html, 'h2
')
assert_includes(html, 'h4
')
assert_includes(html, 'h5
')
end
TEST_EXPLICIT_ID = <<~HTML
h1
h2
h3
HTML
def test_toc_with_explicit_id
parser = Jekyll::TableOfContents::Parser.new(TEST_EXPLICIT_ID)
doc = Nokogiri::HTML(parser.toc)
expected = <<~HTML
HTML
actual = doc.css('ul.section-nav').to_s
assert_equal(expected, actual)
html = parser.inject_anchors_into_html
assert_includes(html, %())
assert_includes(html, %())
assert_includes(html, %())
end
TEST_UNIQ_ID = <<~HTML
h1
h1
h1
HTML
def test_anchor_is_uniq
parser = Jekyll::TableOfContents::Parser.new(TEST_UNIQ_ID)
doc = Nokogiri::HTML(parser.toc)
expected = <<~HTML
HTML
actual = doc.css('ul.section-nav').to_s
assert_equal(expected, actual)
end
def test_custom_css_classes
parser = Jekyll::TableOfContents::Parser.new(
TEST_HTML_1,
'item_class' => 'custom-item', 'list_class' => 'custom-list', 'sublist_class' => 'custom-sublist', 'item_prefix' => 'custom-prefix-'
)
doc = Nokogiri::HTML(parser.toc)
expected = <<~HTML
HTML
assert_equal(expected, doc.css('ul.custom-list').to_s)
end
end