1// Copyright 2019 The Hugo Authors. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6// http://www.apache.org/licenses/LICENSE-2.0
7//
8// Unless required by applicable law or agreed to in writing, software
9// distributed under the License is distributed on an "AS IS" BASIS,
10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11// See the License for the specific language governing permissions and
12// limitations under the License.
13
14package tableofcontents
15
16import (
17	"testing"
18
19	qt "github.com/frankban/quicktest"
20)
21
22func TestToc(t *testing.T) {
23	c := qt.New(t)
24
25	toc := &Root{}
26
27	toc.AddAt(Heading{Text: "Heading 1", ID: "h1-1"}, 0, 0)
28	toc.AddAt(Heading{Text: "1-H2-1", ID: "1-h2-1"}, 0, 1)
29	toc.AddAt(Heading{Text: "1-H2-2", ID: "1-h2-2"}, 0, 1)
30	toc.AddAt(Heading{Text: "1-H3-1", ID: "1-h2-2"}, 0, 2)
31	toc.AddAt(Heading{Text: "Heading 2", ID: "h1-2"}, 1, 0)
32
33	got := toc.ToHTML(1, -1, false)
34	c.Assert(got, qt.Equals, `<nav id="TableOfContents">
35  <ul>
36    <li><a href="#h1-1">Heading 1</a>
37      <ul>
38        <li><a href="#1-h2-1">1-H2-1</a></li>
39        <li><a href="#1-h2-2">1-H2-2</a>
40          <ul>
41            <li><a href="#1-h2-2">1-H3-1</a></li>
42          </ul>
43        </li>
44      </ul>
45    </li>
46    <li><a href="#h1-2">Heading 2</a></li>
47  </ul>
48</nav>`, qt.Commentf(got))
49
50	got = toc.ToHTML(1, 1, false)
51	c.Assert(got, qt.Equals, `<nav id="TableOfContents">
52  <ul>
53    <li><a href="#h1-1">Heading 1</a></li>
54    <li><a href="#h1-2">Heading 2</a></li>
55  </ul>
56</nav>`, qt.Commentf(got))
57
58	got = toc.ToHTML(1, 2, false)
59	c.Assert(got, qt.Equals, `<nav id="TableOfContents">
60  <ul>
61    <li><a href="#h1-1">Heading 1</a>
62      <ul>
63        <li><a href="#1-h2-1">1-H2-1</a></li>
64        <li><a href="#1-h2-2">1-H2-2</a></li>
65      </ul>
66    </li>
67    <li><a href="#h1-2">Heading 2</a></li>
68  </ul>
69</nav>`, qt.Commentf(got))
70
71	got = toc.ToHTML(2, 2, false)
72	c.Assert(got, qt.Equals, `<nav id="TableOfContents">
73  <ul>
74    <li><a href="#1-h2-1">1-H2-1</a></li>
75    <li><a href="#1-h2-2">1-H2-2</a></li>
76  </ul>
77</nav>`, qt.Commentf(got))
78
79	got = toc.ToHTML(1, -1, true)
80	c.Assert(got, qt.Equals, `<nav id="TableOfContents">
81  <ol>
82    <li><a href="#h1-1">Heading 1</a>
83      <ol>
84        <li><a href="#1-h2-1">1-H2-1</a></li>
85        <li><a href="#1-h2-2">1-H2-2</a>
86          <ol>
87            <li><a href="#1-h2-2">1-H3-1</a></li>
88          </ol>
89        </li>
90      </ol>
91    </li>
92    <li><a href="#h1-2">Heading 2</a></li>
93  </ol>
94</nav>`, qt.Commentf(got))
95}
96
97func TestTocMissingParent(t *testing.T) {
98	c := qt.New(t)
99
100	toc := &Root{}
101
102	toc.AddAt(Heading{Text: "H2", ID: "h2"}, 0, 1)
103	toc.AddAt(Heading{Text: "H3", ID: "h3"}, 1, 2)
104	toc.AddAt(Heading{Text: "H3", ID: "h3"}, 1, 2)
105
106	got := toc.ToHTML(1, -1, false)
107	c.Assert(got, qt.Equals, `<nav id="TableOfContents">
108  <ul>
109    <li>
110      <ul>
111        <li><a href="#h2">H2</a></li>
112      </ul>
113    </li>
114    <li>
115      <ul>
116        <li>
117          <ul>
118            <li><a href="#h3">H3</a></li>
119            <li><a href="#h3">H3</a></li>
120          </ul>
121        </li>
122      </ul>
123    </li>
124  </ul>
125</nav>`, qt.Commentf(got))
126
127	got = toc.ToHTML(3, 3, false)
128	c.Assert(got, qt.Equals, `<nav id="TableOfContents">
129  <ul>
130    <li><a href="#h3">H3</a></li>
131    <li><a href="#h3">H3</a></li>
132  </ul>
133</nav>`, qt.Commentf(got))
134
135	got = toc.ToHTML(1, -1, true)
136	c.Assert(got, qt.Equals, `<nav id="TableOfContents">
137  <ol>
138    <li>
139      <ol>
140        <li><a href="#h2">H2</a></li>
141      </ol>
142    </li>
143    <li>
144      <ol>
145        <li>
146          <ol>
147            <li><a href="#h3">H3</a></li>
148            <li><a href="#h3">H3</a></li>
149          </ol>
150        </li>
151      </ol>
152    </li>
153  </ol>
154</nav>`, qt.Commentf(got))
155}
156