tableofcontents_test.go - hugo - [fork] hugo port for 9front
(HTM) git clone https://git.drkhsh.at/hugo.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Submodules
(DIR) README
(DIR) LICENSE
---
tableofcontents_test.go (5588B)
---
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
14 package tableofcontents
15
16 import (
17 "testing"
18
19 qt "github.com/frankban/quicktest"
20 "github.com/gohugoio/hugo/common/collections"
21 )
22
23 var newTestTocBuilder = func() Builder {
24 var b Builder
25 b.AddAt(&Heading{Title: "Heading 1", ID: "h1-1"}, 0, 0)
26 b.AddAt(&Heading{Title: "1-H2-1", ID: "1-h2-1"}, 0, 1)
27 b.AddAt(&Heading{Title: "1-H2-2", ID: "1-h2-2"}, 0, 1)
28 b.AddAt(&Heading{Title: "1-H3-1", ID: "1-h2-2"}, 0, 2)
29 b.AddAt(&Heading{Title: "Heading 2", ID: "h1-2"}, 1, 0)
30 return b
31 }
32
33 var newTestToc = func() *Fragments {
34 return newTestTocBuilder().Build()
35 }
36
37 func TestToc(t *testing.T) {
38 c := qt.New(t)
39
40 toc := &Fragments{}
41
42 toc.addAt(&Heading{Title: "Heading 1", ID: "h1-1"}, 0, 0)
43 toc.addAt(&Heading{Title: "1-H2-1", ID: "1-h2-1"}, 0, 1)
44 toc.addAt(&Heading{Title: "1-H2-2", ID: "1-h2-2"}, 0, 1)
45 toc.addAt(&Heading{Title: "1-H3-1", ID: "1-h2-2"}, 0, 2)
46 toc.addAt(&Heading{Title: "Heading 2", ID: "h1-2"}, 1, 0)
47
48 tocHTML, _ := toc.ToHTML(1, -1, false)
49 got := string(tocHTML)
50 c.Assert(got, qt.Equals, `<nav id="TableOfContents">
51 <ul>
52 <li><a href="#h1-1">Heading 1</a>
53 <ul>
54 <li><a href="#1-h2-1">1-H2-1</a></li>
55 <li><a href="#1-h2-2">1-H2-2</a>
56 <ul>
57 <li><a href="#1-h2-2">1-H3-1</a></li>
58 </ul>
59 </li>
60 </ul>
61 </li>
62 <li><a href="#h1-2">Heading 2</a></li>
63 </ul>
64 </nav>`, qt.Commentf(got))
65
66 tocHTML, _ = toc.ToHTML(1, 1, false)
67 got = string(tocHTML)
68 c.Assert(got, qt.Equals, `<nav id="TableOfContents">
69 <ul>
70 <li><a href="#h1-1">Heading 1</a></li>
71 <li><a href="#h1-2">Heading 2</a></li>
72 </ul>
73 </nav>`, qt.Commentf(got))
74
75 tocHTML, _ = toc.ToHTML(1, 2, false)
76 got = string(tocHTML)
77 c.Assert(got, qt.Equals, `<nav id="TableOfContents">
78 <ul>
79 <li><a href="#h1-1">Heading 1</a>
80 <ul>
81 <li><a href="#1-h2-1">1-H2-1</a></li>
82 <li><a href="#1-h2-2">1-H2-2</a></li>
83 </ul>
84 </li>
85 <li><a href="#h1-2">Heading 2</a></li>
86 </ul>
87 </nav>`, qt.Commentf(got))
88
89 tocHTML, _ = toc.ToHTML(2, 2, false)
90 got = string(tocHTML)
91 c.Assert(got, qt.Equals, `<nav id="TableOfContents">
92 <ul>
93 <li><a href="#1-h2-1">1-H2-1</a></li>
94 <li><a href="#1-h2-2">1-H2-2</a></li>
95 </ul>
96 </nav>`, qt.Commentf(got))
97
98 tocHTML, _ = toc.ToHTML(1, -1, true)
99 got = string(tocHTML)
100 c.Assert(got, qt.Equals, `<nav id="TableOfContents">
101 <ol>
102 <li><a href="#h1-1">Heading 1</a>
103 <ol>
104 <li><a href="#1-h2-1">1-H2-1</a></li>
105 <li><a href="#1-h2-2">1-H2-2</a>
106 <ol>
107 <li><a href="#1-h2-2">1-H3-1</a></li>
108 </ol>
109 </li>
110 </ol>
111 </li>
112 <li><a href="#h1-2">Heading 2</a></li>
113 </ol>
114 </nav>`, qt.Commentf(got))
115 }
116
117 func TestTocMissingParent(t *testing.T) {
118 c := qt.New(t)
119
120 toc := &Fragments{}
121
122 toc.addAt(&Heading{Title: "H2", ID: "h2"}, 0, 1)
123 toc.addAt(&Heading{Title: "H3", ID: "h3"}, 1, 2)
124 toc.addAt(&Heading{Title: "H3", ID: "h3"}, 1, 2)
125
126 tocHTML, _ := toc.ToHTML(1, -1, false)
127 got := string(tocHTML)
128 c.Assert(got, qt.Equals, `<nav id="TableOfContents">
129 <ul>
130 <li>
131 <ul>
132 <li><a href="#h2">H2</a></li>
133 </ul>
134 </li>
135 <li>
136 <ul>
137 <li>
138 <ul>
139 <li><a href="#h3">H3</a></li>
140 <li><a href="#h3">H3</a></li>
141 </ul>
142 </li>
143 </ul>
144 </li>
145 </ul>
146 </nav>`, qt.Commentf(got))
147
148 tocHTML, _ = toc.ToHTML(3, 3, false)
149 got = string(tocHTML)
150 c.Assert(got, qt.Equals, `<nav id="TableOfContents">
151 <ul>
152 <li><a href="#h3">H3</a></li>
153 <li><a href="#h3">H3</a></li>
154 </ul>
155 </nav>`, qt.Commentf(got))
156
157 tocHTML, _ = toc.ToHTML(1, -1, true)
158 got = string(tocHTML)
159 c.Assert(got, qt.Equals, `<nav id="TableOfContents">
160 <ol>
161 <li>
162 <ol>
163 <li><a href="#h2">H2</a></li>
164 </ol>
165 </li>
166 <li>
167 <ol>
168 <li>
169 <ol>
170 <li><a href="#h3">H3</a></li>
171 <li><a href="#h3">H3</a></li>
172 </ol>
173 </li>
174 </ol>
175 </li>
176 </ol>
177 </nav>`, qt.Commentf(got))
178 }
179
180 func TestTocMisc(t *testing.T) {
181 c := qt.New(t)
182
183 c.Run("Identifiers", func(c *qt.C) {
184 toc := newTestToc()
185 c.Assert(toc.Identifiers, qt.DeepEquals, collections.SortedStringSlice{"1-h2-1", "1-h2-2", "1-h2-2", "h1-1", "h1-2"})
186 })
187
188 c.Run("HeadingsMap", func(c *qt.C) {
189 toc := newTestToc()
190 m := toc.HeadingsMap
191 c.Assert(m["h1-1"].Title, qt.Equals, "Heading 1")
192 c.Assert(m["doesnot exist"], qt.IsNil)
193 })
194 }
195
196 func BenchmarkToc(b *testing.B) {
197 newTocs := func(n int) []*Fragments {
198 var tocs []*Fragments
199 for range n {
200 tocs = append(tocs, newTestToc())
201 }
202 return tocs
203 }
204
205 b.Run("Build", func(b *testing.B) {
206 var builders []Builder
207 for i := 0; i < b.N; i++ {
208 builders = append(builders, newTestTocBuilder())
209 }
210 b.ResetTimer()
211
212 for i := 0; i < b.N; i++ {
213 b := builders[i]
214 b.Build()
215 }
216 })
217
218 b.Run("ToHTML", func(b *testing.B) {
219 tocs := newTocs(b.N)
220 b.ResetTimer()
221 for i := 0; i < b.N; i++ {
222 toc := tocs[i]
223 toc.ToHTML(1, -1, false)
224 }
225 })
226 }