http://example.com/blog/en/sitemap.xml",
		"http://example.com/blog/fr/sitemap.xml")
	b.AssertFileContent("public/en/sitemap.xml", "http://example.com/blog/en/sect/doc2/")
	b.AssertFileContent("public/fr/sitemap.xml", "http://example.com/blog/fr/sect/doc1/")
	// Check taxonomies
	enTags := enSite.Taxonomies()["tags"]
	frTags := frSite.Taxonomies()["plaques"]
	c.Assert(len(enTags), qt.Equals, 2, qt.Commentf("Tags in en: %v", enTags))
	c.Assert(len(frTags), qt.Equals, 2, qt.Commentf("Tags in fr: %v", frTags))
	c.Assert(enTags["tag1"], qt.Not(qt.IsNil))
	c.Assert(frTags["FRtag1"], qt.Not(qt.IsNil))
	b.AssertFileContent("public/fr/plaques/FRtag1/index.html", "FRtag1|Bonjour|http://example.com/blog/fr/plaques/FRtag1/")
	// Check Blackfriday config
	c.Assert(strings.Contains(content(doc1fr), "«"), qt.Equals, true)
	c.Assert(strings.Contains(content(doc1en), "«"), qt.Equals, false)
	c.Assert(strings.Contains(content(doc1en), "“"), qt.Equals, true)
	// en and nn have custom site menus
	c.Assert(len(frSite.Menus()), qt.Equals, 0)
	c.Assert(len(enSite.Menus()), qt.Equals, 1)
	c.Assert(len(nnSite.Menus()), qt.Equals, 1)
	c.Assert(enSite.Menus()["main"].ByName()[0].Name, qt.Equals, "Home")
	c.Assert(nnSite.Menus()["main"].ByName()[0].Name, qt.Equals, "Heim")
	// Issue #3108
	prevPage := enSite.RegularPages()[0].Prev()
	c.Assert(prevPage, qt.Not(qt.IsNil))
	c.Assert(prevPage.Kind(), qt.Equals, page.KindPage)
	for {
		if prevPage == nil {
			break
		}
		c.Assert(prevPage.Kind(), qt.Equals, page.KindPage)
		prevPage = prevPage.Prev()
	}
	// Check bundles
	b.AssertFileContent("public/fr/bundles/b1/index.html", "RelPermalink: /blog/fr/bundles/b1/|")
	bundleFr := frSite.getPage(page.KindPage, "bundles/b1/index.md")
	c.Assert(bundleFr, qt.Not(qt.IsNil))
	c.Assert(len(bundleFr.Resources()), qt.Equals, 1)
	logoFr := bundleFr.Resources().GetMatch("logo*")
	c.Assert(logoFr, qt.Not(qt.IsNil))
	b.AssertFileContent("public/fr/bundles/b1/index.html", "Resources: image/png: /blog/fr/bundles/b1/logo.png")
	b.AssertFileContent("public/fr/bundles/b1/logo.png", "PNG Data")
	bundleEn := enSite.getPage(page.KindPage, "bundles/b1/index.en.md")
	c.Assert(bundleEn, qt.Not(qt.IsNil))
	b.AssertFileContent("public/en/bundles/b1/index.html", "RelPermalink: /blog/en/bundles/b1/|")
	c.Assert(len(bundleEn.Resources()), qt.Equals, 1)
	logoEn := bundleEn.Resources().GetMatch("logo*")
	c.Assert(logoEn, qt.Not(qt.IsNil))
	b.AssertFileContent("public/en/bundles/b1/index.html", "Resources: image/png: /blog/en/bundles/b1/logo.png")
	b.AssertFileContent("public/en/bundles/b1/logo.png", "PNG Data")
}
func TestMultiSitesRebuild(t *testing.T) {
	// t.Parallel() not supported, see https://github.com/fortytw2/leaktest/issues/4
	// This leaktest seems to be a little bit shaky on Travis.
	if !htesting.IsCI() {
		defer leaktest.CheckTimeout(t, 10*time.Second)()
	}
	c := qt.New(t)
	b := newMultiSiteTestDefaultBuilder(t).Running().CreateSites().Build(BuildCfg{})
	sites := b.H.Sites
	fs := b.Fs
	b.AssertFileContent("public/en/sect/doc2/index.html", "Single: doc2|Hello|en|", "\n\ndoc2
\n\nsome content")
	enSite := sites[0]
	frSite := sites[1]
	c.Assert(len(enSite.RegularPages()), qt.Equals, 5)
	c.Assert(len(frSite.RegularPages()), qt.Equals, 4)
	// Verify translations
	b.AssertFileContent("public/en/sect/doc1-slug/index.html", "Hello")
	b.AssertFileContent("public/fr/sect/doc1/index.html", "Bonjour")
	// check single page content
	b.AssertFileContent("public/fr/sect/doc1/index.html", "Single", "Shortcode: Bonjour")
	b.AssertFileContent("public/en/sect/doc1-slug/index.html", "Single", "Shortcode: Hello")
	homeEn := enSite.getPage(page.KindHome)
	c.Assert(homeEn, qt.Not(qt.IsNil))
	c.Assert(len(homeEn.Translations()), qt.Equals, 3)
	contentFs := b.H.Fs.Source
	for i, this := range []struct {
		preFunc    func(t *testing.T)
		events     []fsnotify.Event
		assertFunc func(t *testing.T)
	}{
		// * Remove doc
		// * Add docs existing languages
		// (Add doc new language: TODO(bep) we should load config.toml as part of these so we can add languages).
		// * Rename file
		// * Change doc
		// * Change a template
		// * Change language file
		{
			func(t *testing.T) {
				fs.Source.Remove("content/sect/doc2.en.md")
			},
			[]fsnotify.Event{{Name: filepath.FromSlash("content/sect/doc2.en.md"), Op: fsnotify.Remove}},
			func(t *testing.T) {
				c.Assert(len(enSite.RegularPages()), qt.Equals, 4, qt.Commentf("1 en removed"))
			},
		},
		{
			func(t *testing.T) {
				writeNewContentFile(t, contentFs, "new_en_1", "2016-07-31", "content/new1.en.md", -5)
				writeNewContentFile(t, contentFs, "new_en_2", "1989-07-30", "content/new2.en.md", -10)
				writeNewContentFile(t, contentFs, "new_fr_1", "2016-07-30", "content/new1.fr.md", 10)
			},
			[]fsnotify.Event{
				{Name: filepath.FromSlash("content/new1.en.md"), Op: fsnotify.Create},
				{Name: filepath.FromSlash("content/new2.en.md"), Op: fsnotify.Create},
				{Name: filepath.FromSlash("content/new1.fr.md"), Op: fsnotify.Create},
			},
			func(t *testing.T) {
				c.Assert(len(enSite.RegularPages()), qt.Equals, 6)
				c.Assert(len(enSite.AllPages()), qt.Equals, 34)
				c.Assert(len(frSite.RegularPages()), qt.Equals, 5)
				c.Assert(frSite.RegularPages()[3].Title(), qt.Equals, "new_fr_1")
				c.Assert(enSite.RegularPages()[0].Title(), qt.Equals, "new_en_2")
				c.Assert(enSite.RegularPages()[1].Title(), qt.Equals, "new_en_1")
				rendered := readDestination(t, fs, "public/en/new1/index.html")
				c.Assert(strings.Contains(rendered, "new_en_1"), qt.Equals, true)
			},
		},
		{
			func(t *testing.T) {
				p := "content/sect/doc1.en.md"
				doc1 := readFileFromFs(t, contentFs, p)
				doc1 += "CHANGED"
				writeToFs(t, contentFs, p, doc1)
			},
			[]fsnotify.Event{{Name: filepath.FromSlash("content/sect/doc1.en.md"), Op: fsnotify.Write}},
			func(t *testing.T) {
				c.Assert(len(enSite.RegularPages()), qt.Equals, 6)
				doc1 := readDestination(t, fs, "public/en/sect/doc1-slug/index.html")
				c.Assert(strings.Contains(doc1, "CHANGED"), qt.Equals, true)
			},
		},
		// Rename a file
		{
			func(t *testing.T) {
				if err := contentFs.Rename("content/new1.en.md", "content/new1renamed.en.md"); err != nil {
					t.Fatalf("Rename failed: %s", err)
				}
			},
			[]fsnotify.Event{
				{Name: filepath.FromSlash("content/new1renamed.en.md"), Op: fsnotify.Rename},
				{Name: filepath.FromSlash("content/new1.en.md"), Op: fsnotify.Rename},
			},
			func(t *testing.T) {
				c.Assert(len(enSite.RegularPages()), qt.Equals, 6, qt.Commentf("Rename"))
				c.Assert(enSite.RegularPages()[1].Title(), qt.Equals, "new_en_1")
				rendered := readDestination(t, fs, "public/en/new1renamed/index.html")
				c.Assert(rendered, qt.Contains, "new_en_1")
			},
		},
		{
			// Change a template
			func(t *testing.T) {
				template := "layouts/_default/single.html"
				templateContent := readSource(t, fs, template)
				templateContent += "{{ print \"Template Changed\"}}"
				writeSource(t, fs, template, templateContent)
			},
			[]fsnotify.Event{{Name: filepath.FromSlash("layouts/_default/single.html"), Op: fsnotify.Write}},
			func(t *testing.T) {
				c.Assert(len(enSite.RegularPages()), qt.Equals, 6)
				c.Assert(len(enSite.AllPages()), qt.Equals, 34)
				c.Assert(len(frSite.RegularPages()), qt.Equals, 5)
				doc1 := readDestination(t, fs, "public/en/sect/doc1-slug/index.html")
				c.Assert(strings.Contains(doc1, "Template Changed"), qt.Equals, true)
			},
		},
		{
			// Change a language file
			func(t *testing.T) {
				languageFile := "i18n/fr.yaml"
				langContent := readSource(t, fs, languageFile)
				langContent = strings.Replace(langContent, "Bonjour", "Salut", 1)
				writeSource(t, fs, languageFile, langContent)
			},
			[]fsnotify.Event{{Name: filepath.FromSlash("i18n/fr.yaml"), Op: fsnotify.Write}},
			func(t *testing.T) {
				c.Assert(len(enSite.RegularPages()), qt.Equals, 6)
				c.Assert(len(enSite.AllPages()), qt.Equals, 34)
				c.Assert(len(frSite.RegularPages()), qt.Equals, 5)
				docEn := readDestination(t, fs, "public/en/sect/doc1-slug/index.html")
				c.Assert(strings.Contains(docEn, "Hello"), qt.Equals, true)
				docFr := readDestination(t, fs, "public/fr/sect/doc1/index.html")
				c.Assert(strings.Contains(docFr, "Salut"), qt.Equals, true)
				homeEn := enSite.getPage(page.KindHome)
				c.Assert(homeEn, qt.Not(qt.IsNil))
				c.Assert(len(homeEn.Translations()), qt.Equals, 3)
				c.Assert(homeEn.Translations()[0].Language().Lang, qt.Equals, "fr")
			},
		},
		// Change a shortcode
		{
			func(t *testing.T) {
				writeSource(t, fs, "layouts/shortcodes/shortcode.html", "Modified Shortcode: {{ i18n \"hello\" }}")
			},
			[]fsnotify.Event{
				{Name: filepath.FromSlash("layouts/shortcodes/shortcode.html"), Op: fsnotify.Write},
			},
			func(t *testing.T) {
				c.Assert(len(enSite.RegularPages()), qt.Equals, 6)
				c.Assert(len(enSite.AllPages()), qt.Equals, 34)
				c.Assert(len(frSite.RegularPages()), qt.Equals, 5)
				b.AssertFileContent("public/fr/sect/doc1/index.html", "Single", "Modified Shortcode: Salut")
				b.AssertFileContent("public/en/sect/doc1-slug/index.html", "Single", "Modified Shortcode: Hello")
			},
		},
	} {
		if this.preFunc != nil {
			this.preFunc(t)
		}
		err := b.H.Build(BuildCfg{}, this.events...)
		if err != nil {
			t.Fatalf("[%d] Failed to rebuild sites: %s", i, err)
		}
		this.assertFunc(t)
	}
}
// https://github.com/gohugoio/hugo/issues/4706
func TestContentStressTest(t *testing.T) {
	b := newTestSitesBuilder(t)
	numPages := 500
	contentTempl := `
---
%s
title: %q
weight: %d
multioutput: %t
---
# Header
CONTENT
The End.
`
	contentTempl = strings.Replace(contentTempl, "CONTENT", strings.Repeat(`
	
## Another header
Some text. Some more text.
`, 100), -1)
	var content []string
	defaultOutputs := `outputs: ["html", "json", "rss" ]`
	for i := 1; i <= numPages; i++ {
		outputs := defaultOutputs
		multioutput := true
		if i%3 == 0 {
			outputs = `outputs: ["json"]`
			multioutput = false
		}
		section := "s1"
		if i%10 == 0 {
			section = "s2"
		}
		content = append(content, []string{fmt.Sprintf("%s/page%d.md", section, i), fmt.Sprintf(contentTempl, outputs, fmt.Sprintf("Title %d", i), i, multioutput)}...)
	}
	content = append(content, []string{"_index.md", fmt.Sprintf(contentTempl, defaultOutputs, fmt.Sprintf("Home %d", 0), 0, true)}...)
	content = append(content, []string{"s1/_index.md", fmt.Sprintf(contentTempl, defaultOutputs, fmt.Sprintf("S %d", 1), 1, true)}...)
	content = append(content, []string{"s2/_index.md", fmt.Sprintf(contentTempl, defaultOutputs, fmt.Sprintf("S %d", 2), 2, true)}...)
	b.WithSimpleConfigFile()
	b.WithTemplates("layouts/_default/single.html", `Single: {{ .Content }}|RelPermalink: {{ .RelPermalink }}|Permalink: {{ .Permalink }}`)
	b.WithTemplates("layouts/_default/myview.html", `View: {{ len .Content }}`)
	b.WithTemplates("layouts/_default/single.json", `Single JSON: {{ .Content }}|RelPermalink: {{ .RelPermalink }}|Permalink: {{ .Permalink }}`)
	b.WithTemplates("layouts/_default/list.html", `
Page: {{ .Paginator.PageNumber }}
P: {{ with .File }}{{ path.Join .Path }}{{ end }}
List: {{ len .Paginator.Pages }}|List Content: {{ len .Content }}
{{ $shuffled :=  where .Site.RegularPages "Params.multioutput" true | shuffle }}
{{ $first5 := $shuffled | first 5 }}
L1: {{ len .Site.RegularPages }} L2: {{ len $first5 }}
{{ range $i, $e := $first5 }}
Render {{ $i }}: {{ .Render "myview" }}
{{ end }}
END
`)
	b.WithContent(content...)
	b.CreateSites().Build(BuildCfg{})
	contentMatchers := []string{"
", "", "The End.
"}
	for i := 1; i <= numPages; i++ {
		if i%3 != 0 {
			section := "s1"
			if i%10 == 0 {
				section = "s2"
			}
			checkContent(b, fmt.Sprintf("public/%s/page%d/index.html", section, i), contentMatchers...)
		}
	}
	for i := 1; i <= numPages; i++ {
		section := "s1"
		if i%10 == 0 {
			section = "s2"
		}
		checkContent(b, fmt.Sprintf("public/%s/page%d/index.json", section, i), contentMatchers...)
	}
	checkContent(b, "public/s1/index.html", "P: s1/_index.md\nList: 10|List Content: 8132\n\n\nL1: 500 L2: 5\n\nRender 0: View: 8132\n\nRender 1: View: 8132\n\nRender 2: View: 8132\n\nRender 3: View: 8132\n\nRender 4: View: 8132\n\nEND\n")
	checkContent(b, "public/s2/index.html", "P: s2/_index.md\nList: 10|List Content: 8132", "Render 4: View: 8132\n\nEND")
	checkContent(b, "public/index.html", "P: _index.md\nList: 10|List Content: 8132", "4: View: 8132\n\nEND")
	// Check paginated pages
	for i := 2; i <= 9; i++ {
		checkContent(b, fmt.Sprintf("public/page/%d/index.html", i), fmt.Sprintf("Page: %d", i), "Content: 8132\n\n\nL1: 500 L2: 5\n\nRender 0: View: 8132", "Render 4: View: 8132\n\nEND")
	}
}
func checkContent(s *sitesBuilder, filename string, matches ...string) {
	s.T.Helper()
	content := readDestination(s.T, s.Fs, filename)
	for _, match := range matches {
		if !strings.Contains(content, match) {
			s.Fatalf("No match for\n%q\nin content for %s\n%q\nDiff:\n%s", match, filename, content, htesting.DiffStrings(content, match))
		}
	}
}
func TestTranslationsFromContentToNonContent(t *testing.T) {
	b := newTestSitesBuilder(t)
	b.WithConfigFile("toml", `
baseURL = "http://example.com/"
defaultContentLanguage = "en"
[languages]
[languages.en]
weight = 10
contentDir = "content/en"
[languages.nn]
weight = 20
contentDir = "content/nn"
`)
	b.WithContent("en/mysection/_index.md", `
---
Title: My Section
---
`)
	b.WithContent("en/_index.md", `
---
Title: My Home
---
`)
	b.WithContent("en/categories/mycat/_index.md", `
---
Title: My MyCat
---
`)
	b.WithContent("en/categories/_index.md", `
---
Title: My categories
---
`)
	for _, lang := range []string{"en", "nn"} {
		b.WithContent(lang+"/mysection/page.md", `
---
Title: My Page
categories: ["mycat"]
---
`)
	}
	b.Build(BuildCfg{})
	for _, path := range []string{
		"/",
		"/mysection",
		"/categories",
		"/categories/mycat",
	} {
		t.Run(path, func(t *testing.T) {
			c := qt.New(t)
			s1, _ := b.H.Sites[0].getPageNew(nil, path)
			s2, _ := b.H.Sites[1].getPageNew(nil, path)
			c.Assert(s1, qt.Not(qt.IsNil))
			c.Assert(s2, qt.Not(qt.IsNil))
			c.Assert(len(s1.Translations()), qt.Equals, 1)
			c.Assert(len(s2.Translations()), qt.Equals, 1)
			c.Assert(s1.Translations()[0], qt.Equals, s2)
			c.Assert(s2.Translations()[0], qt.Equals, s1)
			m1 := s1.Translations().MergeByLanguage(s2.Translations())
			m2 := s2.Translations().MergeByLanguage(s1.Translations())
			c.Assert(len(m1), qt.Equals, 1)
			c.Assert(len(m2), qt.Equals, 1)
		})
	}
}
// https://github.com/gohugoio/hugo/issues/5777
func TestTableOfContentsInShortcodes(t *testing.T) {
	t.Parallel()
	b := newMultiSiteTestDefaultBuilder(t)
	b.WithTemplatesAdded("layouts/shortcodes/toc.html", tocShortcode)
	b.WithTemplatesAdded("layouts/shortcodes/wrapper.html", "{{ .Inner }}")
	b.WithContent("post/simple.en.md", tocPageSimple)
	b.WithContent("post/variants1.en.md", tocPageVariants1)
	b.WithContent("post/variants2.en.md", tocPageVariants2)
	b.WithContent("post/withSCInHeading.en.md", tocPageWithShortcodesInHeadings)
	b.CreateSites().Build(BuildCfg{})
	b.AssertFileContent("public/en/post/simple/index.html",
		tocPageSimpleExpected,
		// Make sure it is inserted twice
		`TOC1: