.gitignore added
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.1.0 / present / parse_test.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.1.0/present/parse_test.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.1.0/present/parse_test.go
new file mode 100644 (file)
index 0000000..18d1a35
--- /dev/null
@@ -0,0 +1,174 @@
+// Copyright 2020 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package present
+
+import (
+       "bytes"
+       "html/template"
+       "io/ioutil"
+       "os"
+       "os/exec"
+       "path/filepath"
+       "runtime"
+       "testing"
+)
+
+func TestTestdata(t *testing.T) {
+       tmpl := template.Must(Template().Parse(testTmpl))
+       filesP, err := filepath.Glob("testdata/*.p")
+       if err != nil {
+               t.Fatal(err)
+       }
+       filesMD, err := filepath.Glob("testdata/*.md")
+       if err != nil {
+               t.Fatal(err)
+       }
+       files := append(filesP, filesMD...)
+       for _, file := range files {
+               file := file
+               name := filepath.Base(file)
+               if name == "README" {
+                       continue
+               }
+               t.Run(name, func(t *testing.T) {
+                       data, err := ioutil.ReadFile(file)
+                       if err != nil {
+                               t.Fatalf("%s: %v", file, err)
+                       }
+                       marker := []byte("\n---\n")
+                       i := bytes.Index(data, marker)
+                       if i < 0 {
+                               t.Fatalf("%s: cannot find --- marker in input", file)
+                       }
+                       input, html := data[:i+1], data[i+len(marker):]
+                       doc, err := Parse(bytes.NewReader(input), name, 0)
+                       if err != nil {
+                               t.Fatalf("%s: %v", file, err)
+                       }
+                       var buf bytes.Buffer
+                       if err := doc.Render(&buf, tmpl); err != nil {
+                               t.Fatalf("%s: %v", file, err)
+                       }
+                       if !bytes.Equal(buf.Bytes(), html) {
+                               diffText, err := diff("present-test-", "want", html, "have", buf.Bytes())
+                               if err != nil {
+                                       t.Fatalf("%s: diff: %v", file, err)
+                               }
+                               t.Errorf("%s: incorrect html:\n%s", file, diffText)
+                       }
+               })
+       }
+}
+
+func diff(prefix string, name1 string, b1 []byte, name2 string, b2 []byte) ([]byte, error) {
+       f1, err := writeTempFile(prefix, b1)
+       if err != nil {
+               return nil, err
+       }
+       defer os.Remove(f1)
+
+       f2, err := writeTempFile(prefix, b2)
+       if err != nil {
+               return nil, err
+       }
+       defer os.Remove(f2)
+
+       cmd := "diff"
+       if runtime.GOOS == "plan9" {
+               cmd = "/bin/ape/diff"
+       }
+
+       data, err := exec.Command(cmd, "-u", f1, f2).CombinedOutput()
+       if len(data) > 0 {
+               // diff exits with a non-zero status when the files don't match.
+               // Ignore that failure as long as we get output.
+               err = nil
+       }
+
+       data = bytes.Replace(data, []byte(f1), []byte(name1), -1)
+       data = bytes.Replace(data, []byte(f2), []byte(name2), -1)
+
+       return data, err
+}
+
+func writeTempFile(prefix string, data []byte) (string, error) {
+       file, err := ioutil.TempFile("", prefix)
+       if err != nil {
+               return "", err
+       }
+       _, err = file.Write(data)
+       if err1 := file.Close(); err == nil {
+               err = err1
+       }
+       if err != nil {
+               os.Remove(file.Name())
+               return "", err
+       }
+       return file.Name(), nil
+}
+
+var testTmpl = `
+{{define "root" -}}
+<h1>{{.Title}}</h1>
+{{with .Subtitle}}<h2>{{.}}</h2>
+{{end -}}
+{{range .Authors}}<author>
+{{range .Elem}}{{elem $.Template .}}{{end}}</author>
+{{end -}}
+{{range .Sections}}<section>{{elem $.Template .}}</section>
+{{end -}}
+{{end}}
+
+{{define "newline"}}{{/* No automatic line break. Paragraphs are free-form. */}}
+{{end}}
+
+{{define "section"}}
+{{if .Title}}<h2 id="TOC_{{.FormattedNumber}}">{{.Title}}</h2>
+{{end -}}
+{{range .Elem}}{{elem $.Template .}}{{end}}
+{{- end}}
+
+{{define "list" -}}
+<ul>
+{{range .Bullet -}}
+<li>{{style .}}</li>
+{{end -}}
+</ul>
+{{end}}
+
+{{define "text" -}}
+{{if .Pre -}}
+<pre>{{range .Lines}}{{.}}{{end}}</pre>
+{{else -}}
+<p>{{range $i, $l := .Lines}}{{if $i}}{{template "newline"}}{{end}}{{style $l}}{{end}}</p>
+{{end -}}
+{{end}}
+
+{{define "code" -}}
+{{if .Play -}}
+<div class="playground">{{.Text}}</div>
+{{else -}}
+<div class="code">{{.Text}}</div>
+{{end -}}
+{{end}}
+
+{{define "image" -}}
+<img src="{{.URL}}"{{with .Height}} height="{{.}}"{{end}}{{with .Width}} width="{{.}}"{{end}} alt="">
+{{end}}
+
+{{define "caption" -}}
+<figcaption>{{style .Text}}</figcaption>
+{{end}}
+
+{{define "iframe" -}}
+<iframe src="{{.URL}}"{{with .Height}} height="{{.}}"{{end}}{{with .Width}} width="{{.}}"{{end}}></iframe>
+{{end}}
+
+{{define "link" -}}
+<p class="link"><a href="{{.URL}}">{{style .Label}}</a></p>
+{{end}}
+
+{{define "html" -}}{{.HTML}}{{end}}
+`