pages_test.go (3472B)
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 }