2018-03-15 04:37:30 -04:00
// Copyright 2018 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package hugolib
import (
"fmt"
"testing"
2018-04-19 03:02:18 -04:00
"github.com/gohugoio/hugo/resource"
2018-03-15 04:37:30 -04:00
"github.com/stretchr/testify/require"
)
func TestMergeLanguages ( t * testing . T ) {
t . Parallel ( )
assert := require . New ( t )
b := newTestSiteForLanguageMerge ( t , 30 )
b . CreateSites ( )
b . Build ( BuildCfg { SkipRender : true } )
h := b . H
enSite := h . Sites [ 0 ]
frSite := h . Sites [ 1 ]
nnSite := h . Sites [ 2 ]
2018-04-19 03:02:18 -04:00
assert . Equal ( 31 , len ( enSite . RegularPages ) )
2018-03-15 04:37:30 -04:00
assert . Equal ( 6 , len ( frSite . RegularPages ) )
2018-04-19 03:02:18 -04:00
assert . Equal ( 12 , len ( nnSite . RegularPages ) )
2018-03-15 04:37:30 -04:00
for i := 0 ; i < 2 ; i ++ {
mergedNN := nnSite . RegularPages . MergeByLanguage ( enSite . RegularPages )
2018-04-19 03:02:18 -04:00
assert . Equal ( 31 , len ( mergedNN ) )
for i := 1 ; i <= 31 ; i ++ {
2018-03-15 04:37:30 -04:00
expectedLang := "en"
2018-04-19 03:02:18 -04:00
if i == 2 || i % 3 == 0 || i == 31 {
2018-03-15 04:37:30 -04:00
expectedLang = "nn"
}
p := mergedNN [ i - 1 ]
assert . Equal ( expectedLang , p . Lang ( ) , fmt . Sprintf ( "Test %d" , i ) )
}
}
mergedFR := frSite . RegularPages . MergeByLanguage ( enSite . RegularPages )
2018-04-19 03:02:18 -04:00
assert . Equal ( 31 , len ( mergedFR ) )
for i := 1 ; i <= 31 ; i ++ {
2018-03-15 04:37:30 -04:00
expectedLang := "en"
if i % 5 == 0 {
expectedLang = "fr"
}
p := mergedFR [ i - 1 ]
assert . Equal ( expectedLang , p . Lang ( ) , fmt . Sprintf ( "Test %d" , i ) )
}
firstNN := nnSite . RegularPages [ 0 ]
assert . Equal ( 4 , len ( firstNN . Sites ( ) ) )
2018-11-26 04:11:22 -05:00
assert . Equal ( "en" , firstNN . Sites ( ) . First ( ) . Language ( ) . Lang )
2018-03-15 04:37:30 -04:00
2018-07-17 05:18:29 -04:00
nnBundle := nnSite . getPage ( "page" , "bundle" )
enBundle := enSite . getPage ( "page" , "bundle" )
2018-04-19 03:02:18 -04:00
assert . Equal ( 6 , len ( enBundle . Resources ) )
assert . Equal ( 2 , len ( nnBundle . Resources ) )
var ri interface { } = nnBundle . Resources
// This looks less ugly in the templates ...
mergedNNResources := ri . ( resource . ResourcesLanguageMerger ) . MergeByLanguage ( enBundle . Resources )
assert . Equal ( 6 , len ( mergedNNResources ) )
2018-07-21 05:41:23 -04:00
unchanged , err := nnSite . RegularPages . MergeByLanguageInterface ( nil )
assert . NoError ( err )
assert . Equal ( nnSite . RegularPages , unchanged )
2018-03-15 04:37:30 -04:00
}
func TestMergeLanguagesTemplate ( t * testing . T ) {
t . Parallel ( )
b := newTestSiteForLanguageMerge ( t , 15 )
b . WithTemplates ( "home.html" , `
{ { $ pages := . Site . RegularPages } }
{ { . Scratch . Set "pages" $ pages } }
{ { if eq . Lang "nn" } } :
{ { $ enSite := index . Sites 0 } }
{ { $ frSite := index . Sites 1 } }
2018-04-19 03:02:18 -04:00
{ { $ nnBundle := . Site . GetPage "page" "bundle" } }
{ { $ enBundle := $ enSite . GetPage "page" "bundle" } }
2018-03-15 04:37:30 -04:00
{ { . Scratch . Set "pages" ( $ pages | lang . Merge $ frSite . RegularPages | lang . Merge $ enSite . RegularPages ) } }
2018-04-19 03:02:18 -04:00
{ { . Scratch . Set "pages2" ( sort ( $ nnBundle . Resources | lang . Merge $ enBundle . Resources ) "Title" ) } }
2018-03-15 04:37:30 -04:00
{ { end } }
{ { $ pages := . Scratch . Get "pages" } }
2018-04-19 03:02:18 -04:00
{ { $ pages2 := . Scratch . Get "pages2" } }
Pages1 : { { range $ i , $ p := $ pages } } { { add $ i 1 } } : { { . Path } } { { . Lang } } | { { end } }
Pages2 : { { range $ i , $ p := $ pages2 } } { { add $ i 1 } } : { { . Title } } { { . Lang } } | { { end } }
2018-03-15 04:37:30 -04:00
` ,
"shortcodes/shortcode.html" , "MyShort" ,
"shortcodes/lingo.html" , "MyLingo" ,
)
b . CreateSites ( )
b . Build ( BuildCfg { } )
2018-04-19 03:02:18 -04:00
b . AssertFileContent ( "public/nn/index.html" , "Pages1: 1: p1.md en | 2: p2.nn.md nn | 3: p3.nn.md nn | 4: p4.md en | 5: p5.fr.md fr | 6: p6.nn.md nn | 7: p7.md en | 8: p8.md en | 9: p9.nn.md nn | 10: p10.fr.md fr | 11: p11.md en | 12: p12.nn.md nn | 13: p13.md en | 14: p14.md en | 15: p15.nn.md nn" )
b . AssertFileContent ( "public/nn/index.html" , "Pages2: 1: doc100 en | 2: doc101 nn | 3: doc102 nn | 4: doc103 en | 5: doc104 en | 6: doc105 en" )
2018-03-15 04:37:30 -04:00
}
func newTestSiteForLanguageMerge ( t testing . TB , count int ) * sitesBuilder {
contentTemplate := ` -- -
title : doc % d
weight : % d
date : "2018-02-28"
-- -
# doc
* some "content" *
{ { < shortcode > } }
{ { < lingo > } }
`
builder := newTestSitesBuilder ( t ) . WithDefaultMultiSiteConfig ( )
// We need some content with some missing translations.
// "en" is the main language, so add some English content + some Norwegian (nn, nynorsk) content.
var contentPairs [ ] string
for i := 1 ; i <= count ; i ++ {
content := fmt . Sprintf ( contentTemplate , i , i )
contentPairs = append ( contentPairs , [ ] string { fmt . Sprintf ( "p%d.md" , i ) , content } ... )
if i == 2 || i % 3 == 0 {
// Add page 2,3, 6, 9 ... to both languages
contentPairs = append ( contentPairs , [ ] string { fmt . Sprintf ( "p%d.nn.md" , i ) , content } ... )
}
if i % 5 == 0 {
// Add some French content, too.
contentPairs = append ( contentPairs , [ ] string { fmt . Sprintf ( "p%d.fr.md" , i ) , content } ... )
}
}
2018-04-19 03:02:18 -04:00
// See https://github.com/gohugoio/hugo/issues/4644
// Add a bundles
j := 100
contentPairs = append ( contentPairs , [ ] string { "bundle/index.md" , fmt . Sprintf ( contentTemplate , j , j ) } ... )
for i := 0 ; i < 6 ; i ++ {
contentPairs = append ( contentPairs , [ ] string { fmt . Sprintf ( "bundle/pb%d.md" , i ) , fmt . Sprintf ( contentTemplate , i + j , i + j ) } ... )
}
contentPairs = append ( contentPairs , [ ] string { "bundle/index.nn.md" , fmt . Sprintf ( contentTemplate , j , j ) } ... )
for i := 1 ; i < 3 ; i ++ {
contentPairs = append ( contentPairs , [ ] string { fmt . Sprintf ( "bundle/pb%d.nn.md" , i ) , fmt . Sprintf ( contentTemplate , i + j , i + j ) } ... )
}
2018-03-15 04:37:30 -04:00
builder . WithContent ( contentPairs ... )
return builder
}
func BenchmarkMergeByLanguage ( b * testing . B ) {
const count = 100
builder := newTestSiteForLanguageMerge ( b , count )
builder . CreateSites ( )
builder . Build ( BuildCfg { SkipRender : true } )
h := builder . H
enSite := h . Sites [ 0 ]
nnSite := h . Sites [ 2 ]
for i := 0 ; i < b . N ; i ++ {
merged := nnSite . RegularPages . MergeByLanguage ( enSite . RegularPages )
if len ( merged ) != count {
b . Fatal ( "Count mismatch" )
}
}
}