| // Copyright 2026 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 api |
| |
| import ( |
| "context" |
| "fmt" |
| "go/parser" |
| "go/token" |
| "os" |
| "path/filepath" |
| "strings" |
| "testing" |
| |
| "github.com/google/go-cmp/cmp" |
| "golang.org/x/pkgsite/internal/godoc" |
| ) |
| |
| func TestRenderDoc(t *testing.T) { |
| t.Run("examples", func(t *testing.T) { |
| testRenderDoc(t, true) |
| }) |
| t.Run("no examples", func(t *testing.T) { |
| testRenderDoc(t, false) |
| }) |
| } |
| |
| func testRenderDoc(t *testing.T, examples bool) { |
| fset := token.NewFileSet() |
| docPkg := godoc.NewPackage(fset, nil) |
| for _, file := range []string{"pkg.go", "pkg_test.go"} { |
| pf, err := parser.ParseFile(fset, filepath.Join("testdata", file), nil, parser.ParseComments) |
| if err != nil { |
| t.Fatal(err) |
| } |
| docPkg.AddFile(pf, true) |
| } |
| gpkg, err := docPkg.Encode(context.Background()) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| decoded, err := godoc.DecodePackage(gpkg) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| dpkg, err := decoded.DocPackage("p", &godoc.ModuleInfo{ModulePath: "p", ResolvedVersion: "v1.0.0"}) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| var sb strings.Builder |
| check := func(t *testing.T, name string, r renderer) { |
| sb.Reset() |
| t.Run(name, func(t *testing.T) { |
| if err := renderDoc(dpkg, r, examples); err != nil { |
| t.Fatal(err) |
| } |
| got := strings.TrimSpace(sb.String()) |
| goldenName := name |
| if examples { |
| goldenName += "-examples" |
| } |
| goldenFile := filepath.Join("testdata", goldenName+".golden") |
| wantBytes, err := os.ReadFile(goldenFile) |
| if err != nil { |
| t.Fatal(err) |
| } |
| want := strings.TrimSpace(string(wantBytes)) |
| if diff := cmp.Diff(want, got); diff != "" { |
| t.Errorf("mismatch (-want +got):\n%s", diff) |
| fmt.Println(got) |
| } |
| }) |
| } |
| |
| check(t, "text", newTextRenderer(decoded.Fset, &sb)) |
| check(t, "markdown", newMarkdownRenderer(decoded.Fset, &sb)) |
| check(t, "html", newHTMLRenderer(decoded.Fset, &sb)) |
| } |