1 // Copyright 2020 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
18 func TestTestdata(t *testing.T) {
19 tmpl := template.Must(Template().Parse(testTmpl))
20 filesP, err := filepath.Glob("testdata/*.p")
24 filesMD, err := filepath.Glob("testdata/*.md")
28 files := append(filesP, filesMD...)
29 for _, file := range files {
31 name := filepath.Base(file)
35 t.Run(name, func(t *testing.T) {
36 data, err := ioutil.ReadFile(file)
38 t.Fatalf("%s: %v", file, err)
40 marker := []byte("\n---\n")
41 i := bytes.Index(data, marker)
43 t.Fatalf("%s: cannot find --- marker in input", file)
45 input, html := data[:i+1], data[i+len(marker):]
46 doc, err := Parse(bytes.NewReader(input), name, 0)
48 t.Fatalf("%s: %v", file, err)
51 if err := doc.Render(&buf, tmpl); err != nil {
52 t.Fatalf("%s: %v", file, err)
54 if !bytes.Equal(buf.Bytes(), html) {
55 diffText, err := diff("present-test-", "want", html, "have", buf.Bytes())
57 t.Fatalf("%s: diff: %v", file, err)
59 t.Errorf("%s: incorrect html:\n%s", file, diffText)
65 func diff(prefix string, name1 string, b1 []byte, name2 string, b2 []byte) ([]byte, error) {
66 f1, err := writeTempFile(prefix, b1)
72 f2, err := writeTempFile(prefix, b2)
79 if runtime.GOOS == "plan9" {
83 data, err := exec.Command(cmd, "-u", f1, f2).CombinedOutput()
85 // diff exits with a non-zero status when the files don't match.
86 // Ignore that failure as long as we get output.
90 data = bytes.Replace(data, []byte(f1), []byte(name1), -1)
91 data = bytes.Replace(data, []byte(f2), []byte(name2), -1)
96 func writeTempFile(prefix string, data []byte) (string, error) {
97 file, err := ioutil.TempFile("", prefix)
101 _, err = file.Write(data)
102 if err1 := file.Close(); err == nil {
106 os.Remove(file.Name())
109 return file.Name(), nil
115 {{with .Subtitle}}<h2>{{.}}</h2>
117 {{range .Authors}}<author>
118 {{range .Elem}}{{elem $.Template .}}{{end}}</author>
120 {{range .Sections}}<section>{{elem $.Template .}}</section>
124 {{define "newline"}}{{/* No automatic line break. Paragraphs are free-form. */}}
128 {{if .Title}}<h2 id="TOC_{{.FormattedNumber}}">{{.Title}}</h2>
130 {{range .Elem}}{{elem $.Template .}}{{end}}
143 <pre>{{range .Lines}}{{.}}{{end}}</pre>
145 <p>{{range $i, $l := .Lines}}{{if $i}}{{template "newline"}}{{end}}{{style $l}}{{end}}</p>
151 <div class="playground">{{.Text}}</div>
153 <div class="code">{{.Text}}</div>
158 <img src="{{.URL}}"{{with .Height}} height="{{.}}"{{end}}{{with .Width}} width="{{.}}"{{end}} alt="">
161 {{define "caption" -}}
162 <figcaption>{{style .Text}}</figcaption>
165 {{define "iframe" -}}
166 <iframe src="{{.URL}}"{{with .Height}} height="{{.}}"{{end}}{{with .Width}} width="{{.}}"{{end}}></iframe>
170 <p class="link"><a href="{{.URL}}">{{style .Label}}</a></p>
173 {{define "html" -}}{{.HTML}}{{end}}