diff --git a/hugolib/page.go b/hugolib/page.go index c726394a2a5..f3e87be7de7 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -18,6 +18,7 @@ import ( "context" "errors" "fmt" + "math/rand" "reflect" "github.com/gohugoio/hugo/common/maps" @@ -517,6 +518,14 @@ func (ps Pages) String() string { return fmt.Sprintf("Pages(%d)", len(ps)) } +// Used in tests. +func (ps Pages) shuffle() { + for i := range ps { + j := rand.Intn(i + 1) + ps[i], ps[j] = ps[j], ps[i] + } +} + func (ps Pages) findPagePosByFilename(filename string) int { for i, x := range ps { if x.Filename() == filename { diff --git a/hugolib/pageSort.go b/hugolib/pageSort.go index 055519b044f..c7766e2a69c 100644 --- a/hugolib/pageSort.go +++ b/hugolib/pageSort.go @@ -155,7 +155,7 @@ func (p Pages) ByLinkTitle() Pages { const key = "pageSort.ByLinkTitle" linkTitle := func(p1, p2 *Page) bool { - return p1.linkTitle < p2.linkTitle + return p1.LinkTitle() < p2.LinkTitle() } pages, _ := spc.get(key, pageBy(linkTitle).Sort, p) diff --git a/hugolib/pageSort_test.go b/hugolib/pageSort_test.go index bc4be1cb0f0..695045ff125 100644 --- a/hugolib/pageSort_test.go +++ b/hugolib/pageSort_test.go @@ -20,6 +20,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestDefaultSort(t *testing.T) { @@ -58,6 +59,37 @@ func TestDefaultSort(t *testing.T) { assert.Equal(t, "cl", p[2].LinkTitle()) } +// https://github.com/gohugoio/hugo/issues/4953 +func TestSortByLinkTitle(t *testing.T) { + t.Parallel() + assert := require.New(t) + s := newTestSite(t) + pages := createSortTestPages(s, 6) + + for i, p := range pages { + if i < 5 { + p.title = fmt.Sprintf("title%d", i) + } + + if i > 2 { + p.linkTitle = fmt.Sprintf("linkTitle%d", i) + } + } + + pages.shuffle() + + bylt := pages.ByLinkTitle() + + for i, p := range bylt { + msg := fmt.Sprintf("test: %d", i) + if i < 3 { + assert.Equal(fmt.Sprintf("linkTitle%d", i+3), p.LinkTitle(), msg) + } else { + assert.Equal(fmt.Sprintf("title%d", i-3), p.LinkTitle(), msg) + } + } +} + func TestSortByN(t *testing.T) { t.Parallel() s := newTestSite(t)