github.com/linchen2chris/hugo@v0.0.0-20230307053224-cec209389705/markup/tableofcontents/tableofcontents_test.go (about) 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 got := toc.ToHTML(1, -1, false) 49 c.Assert(got, qt.Equals, `<nav id="TableOfContents"> 50 <ul> 51 <li><a href="#h1-1">Heading 1</a> 52 <ul> 53 <li><a href="#1-h2-1">1-H2-1</a></li> 54 <li><a href="#1-h2-2">1-H2-2</a> 55 <ul> 56 <li><a href="#1-h2-2">1-H3-1</a></li> 57 </ul> 58 </li> 59 </ul> 60 </li> 61 <li><a href="#h1-2">Heading 2</a></li> 62 </ul> 63 </nav>`, qt.Commentf(got)) 64 65 got = toc.ToHTML(1, 1, false) 66 c.Assert(got, qt.Equals, `<nav id="TableOfContents"> 67 <ul> 68 <li><a href="#h1-1">Heading 1</a></li> 69 <li><a href="#h1-2">Heading 2</a></li> 70 </ul> 71 </nav>`, qt.Commentf(got)) 72 73 got = toc.ToHTML(1, 2, false) 74 c.Assert(got, qt.Equals, `<nav id="TableOfContents"> 75 <ul> 76 <li><a href="#h1-1">Heading 1</a> 77 <ul> 78 <li><a href="#1-h2-1">1-H2-1</a></li> 79 <li><a href="#1-h2-2">1-H2-2</a></li> 80 </ul> 81 </li> 82 <li><a href="#h1-2">Heading 2</a></li> 83 </ul> 84 </nav>`, qt.Commentf(got)) 85 86 got = toc.ToHTML(2, 2, false) 87 c.Assert(got, qt.Equals, `<nav id="TableOfContents"> 88 <ul> 89 <li><a href="#1-h2-1">1-H2-1</a></li> 90 <li><a href="#1-h2-2">1-H2-2</a></li> 91 </ul> 92 </nav>`, qt.Commentf(got)) 93 94 got = toc.ToHTML(1, -1, true) 95 c.Assert(got, qt.Equals, `<nav id="TableOfContents"> 96 <ol> 97 <li><a href="#h1-1">Heading 1</a> 98 <ol> 99 <li><a href="#1-h2-1">1-H2-1</a></li> 100 <li><a href="#1-h2-2">1-H2-2</a> 101 <ol> 102 <li><a href="#1-h2-2">1-H3-1</a></li> 103 </ol> 104 </li> 105 </ol> 106 </li> 107 <li><a href="#h1-2">Heading 2</a></li> 108 </ol> 109 </nav>`, qt.Commentf(got)) 110 } 111 112 func TestTocMissingParent(t *testing.T) { 113 c := qt.New(t) 114 115 toc := &Fragments{} 116 117 toc.addAt(&Heading{Title: "H2", ID: "h2"}, 0, 1) 118 toc.addAt(&Heading{Title: "H3", ID: "h3"}, 1, 2) 119 toc.addAt(&Heading{Title: "H3", ID: "h3"}, 1, 2) 120 121 got := toc.ToHTML(1, -1, false) 122 c.Assert(got, qt.Equals, `<nav id="TableOfContents"> 123 <ul> 124 <li> 125 <ul> 126 <li><a href="#h2">H2</a></li> 127 </ul> 128 </li> 129 <li> 130 <ul> 131 <li> 132 <ul> 133 <li><a href="#h3">H3</a></li> 134 <li><a href="#h3">H3</a></li> 135 </ul> 136 </li> 137 </ul> 138 </li> 139 </ul> 140 </nav>`, qt.Commentf(got)) 141 142 got = toc.ToHTML(3, 3, false) 143 c.Assert(got, qt.Equals, `<nav id="TableOfContents"> 144 <ul> 145 <li><a href="#h3">H3</a></li> 146 <li><a href="#h3">H3</a></li> 147 </ul> 148 </nav>`, qt.Commentf(got)) 149 150 got = toc.ToHTML(1, -1, true) 151 c.Assert(got, qt.Equals, `<nav id="TableOfContents"> 152 <ol> 153 <li> 154 <ol> 155 <li><a href="#h2">H2</a></li> 156 </ol> 157 </li> 158 <li> 159 <ol> 160 <li> 161 <ol> 162 <li><a href="#h3">H3</a></li> 163 <li><a href="#h3">H3</a></li> 164 </ol> 165 </li> 166 </ol> 167 </li> 168 </ol> 169 </nav>`, qt.Commentf(got)) 170 } 171 172 func TestTocMisc(t *testing.T) { 173 c := qt.New(t) 174 175 c.Run("Identifiers", func(c *qt.C) { 176 toc := newTestToc() 177 c.Assert(toc.Identifiers, qt.DeepEquals, collections.SortedStringSlice{"1-h2-1", "1-h2-2", "1-h2-2", "h1-1", "h1-2"}) 178 }) 179 180 c.Run("HeadingsMap", func(c *qt.C) { 181 toc := newTestToc() 182 m := toc.HeadingsMap 183 c.Assert(m["h1-1"].Title, qt.Equals, "Heading 1") 184 c.Assert(m["doesnot exist"], qt.IsNil) 185 }) 186 } 187 188 func BenchmarkToc(b *testing.B) { 189 190 newTocs := func(n int) []*Fragments { 191 var tocs []*Fragments 192 for i := 0; i < n; i++ { 193 tocs = append(tocs, newTestToc()) 194 } 195 return tocs 196 } 197 198 b.Run("Build", func(b *testing.B) { 199 var builders []Builder 200 for i := 0; i < b.N; i++ { 201 builders = append(builders, newTestTocBuilder()) 202 } 203 b.ResetTimer() 204 205 for i := 0; i < b.N; i++ { 206 b := builders[i] 207 b.Build() 208 } 209 }) 210 211 b.Run("ToHTML", func(b *testing.B) { 212 tocs := newTocs(b.N) 213 b.ResetTimer() 214 for i := 0; i < b.N; i++ { 215 toc := tocs[i] 216 toc.ToHTML(1, -1, false) 217 } 218 }) 219 220 }