github.com/graemephi/kahugo@v0.62.3-0.20211121071557-d78c0423784d/hugolib/pages_test.go (about)

     1  package hugolib
     2  
     3  import (
     4  	"fmt"
     5  	"math/rand"
     6  	"testing"
     7  
     8  	"github.com/gohugoio/hugo/resources/page"
     9  
    10  	qt "github.com/frankban/quicktest"
    11  )
    12  
    13  func newPagesPrevNextTestSite(t testing.TB, numPages int) *sitesBuilder {
    14  	categories := []string{"blue", "green", "red", "orange", "indigo", "amber", "lime"}
    15  	cat1, cat2 := categories[rand.Intn(len(categories))], categories[rand.Intn(len(categories))]
    16  	categoriesSlice := fmt.Sprintf("[%q,%q]", cat1, cat2)
    17  	pageTemplate := `
    18  ---
    19  title: "Page %d"
    20  weight: %d
    21  categories: %s
    22  ---
    23  
    24  `
    25  	b := newTestSitesBuilder(t)
    26  
    27  	for i := 1; i <= numPages; i++ {
    28  		b.WithContent(fmt.Sprintf("page%d.md", i), fmt.Sprintf(pageTemplate, i, rand.Intn(numPages), categoriesSlice))
    29  	}
    30  
    31  	return b
    32  }
    33  
    34  func TestPagesPrevNext(t *testing.T) {
    35  	b := newPagesPrevNextTestSite(t, 100)
    36  	b.Build(BuildCfg{SkipRender: true})
    37  
    38  	pages := b.H.Sites[0].RegularPages()
    39  
    40  	b.Assert(pages, qt.HasLen, 100)
    41  
    42  	for _, p := range pages {
    43  		msg := qt.Commentf("w=%d", p.Weight())
    44  		b.Assert(pages.Next(p), qt.Equals, p.Next(), msg)
    45  		b.Assert(pages.Prev(p), qt.Equals, p.Prev(), msg)
    46  	}
    47  }
    48  
    49  func BenchmarkPagesPrevNext(b *testing.B) {
    50  	type Variant struct {
    51  		name         string
    52  		preparePages func(pages page.Pages) page.Pages
    53  		run          func(p page.Page, pages page.Pages)
    54  	}
    55  
    56  	shufflePages := func(pages page.Pages) page.Pages {
    57  		rand.Shuffle(len(pages), func(i, j int) { pages[i], pages[j] = pages[j], pages[i] })
    58  		return pages
    59  	}
    60  
    61  	for _, variant := range []Variant{
    62  		{".Next", nil, func(p page.Page, pages page.Pages) { p.Next() }},
    63  		{".Prev", nil, func(p page.Page, pages page.Pages) { p.Prev() }},
    64  		{"Pages.Next", nil, func(p page.Page, pages page.Pages) { pages.Next(p) }},
    65  		{"Pages.Prev", nil, func(p page.Page, pages page.Pages) { pages.Prev(p) }},
    66  		{"Pages.Shuffled.Next", shufflePages, func(p page.Page, pages page.Pages) { pages.Next(p) }},
    67  		{"Pages.Shuffled.Prev", shufflePages, func(p page.Page, pages page.Pages) { pages.Prev(p) }},
    68  		{"Pages.ByTitle.Next", func(pages page.Pages) page.Pages { return pages.ByTitle() }, func(p page.Page, pages page.Pages) { pages.Next(p) }},
    69  	} {
    70  		for _, numPages := range []int{300, 5000} {
    71  			b.Run(fmt.Sprintf("%s-pages-%d", variant.name, numPages), func(b *testing.B) {
    72  				b.StopTimer()
    73  				builder := newPagesPrevNextTestSite(b, numPages)
    74  				builder.Build(BuildCfg{SkipRender: true})
    75  				pages := builder.H.Sites[0].RegularPages()
    76  				if variant.preparePages != nil {
    77  					pages = variant.preparePages(pages)
    78  				}
    79  				b.StartTimer()
    80  				for i := 0; i < b.N; i++ {
    81  					p := pages[rand.Intn(len(pages))]
    82  					variant.run(p, pages)
    83  				}
    84  			})
    85  		}
    86  	}
    87  }
    88  
    89  func BenchmarkPagePageCollections(b *testing.B) {
    90  	type Variant struct {
    91  		name string
    92  		run  func(p page.Page)
    93  	}
    94  
    95  	for _, variant := range []Variant{
    96  		{".Pages", func(p page.Page) { p.Pages() }},
    97  		{".RegularPages", func(p page.Page) { p.RegularPages() }},
    98  		{".RegularPagesRecursive", func(p page.Page) { p.RegularPagesRecursive() }},
    99  	} {
   100  		for _, numPages := range []int{300, 5000} {
   101  			b.Run(fmt.Sprintf("%s-%d", variant.name, numPages), func(b *testing.B) {
   102  				b.StopTimer()
   103  				builder := newPagesPrevNextTestSite(b, numPages)
   104  				builder.Build(BuildCfg{SkipRender: true})
   105  				var pages page.Pages
   106  				for _, p := range builder.H.Sites[0].Pages() {
   107  					if !p.IsPage() {
   108  						pages = append(pages, p)
   109  					}
   110  				}
   111  				b.StartTimer()
   112  				for i := 0; i < b.N; i++ {
   113  					p := pages[rand.Intn(len(pages))]
   114  					variant.run(p)
   115  				}
   116  			})
   117  		}
   118  	}
   119  }