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  }