// Copyright 2013 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 godoc import ( "go/ast" "go/parser" "go/token" "testing" ) func TestPkgLinkFunc(t *testing.T) { for _, tc := range []struct { path string want string }{ {"/src/fmt", "pkg/fmt"}, {"src/fmt", "pkg/fmt"}, {"/fmt", "pkg/fmt"}, {"fmt", "pkg/fmt"}, } { if got := pkgLinkFunc(tc.path); got != tc.want { t.Errorf("pkgLinkFunc(%v) = %v; want %v", tc.path, got, tc.want) } } } func TestSrcPosLinkFunc(t *testing.T) { for _, tc := range []struct { src string line int low int high int want string }{ {"/src/fmt/print.go", 42, 30, 50, "/src/fmt/print.go?s=30:50#L32"}, {"/src/fmt/print.go", 2, 1, 5, "/src/fmt/print.go?s=1:5#L1"}, {"/src/fmt/print.go", 2, 0, 0, "/src/fmt/print.go#L2"}, {"/src/fmt/print.go", 0, 0, 0, "/src/fmt/print.go"}, {"/src/fmt/print.go", 0, 1, 5, "/src/fmt/print.go?s=1:5#L1"}, {"fmt/print.go", 0, 0, 0, "/src/fmt/print.go"}, {"fmt/print.go", 0, 1, 5, "/src/fmt/print.go?s=1:5#L1"}, } { if got := srcPosLinkFunc(tc.src, tc.line, tc.low, tc.high); got != tc.want { t.Errorf("srcLinkFunc(%v, %v, %v, %v) = %v; want %v", tc.src, tc.line, tc.low, tc.high, got, tc.want) } } } func TestSrcLinkFunc(t *testing.T) { for _, tc := range []struct { src string want string }{ {"/src/fmt/print.go", "/src/fmt/print.go"}, {"src/fmt/print.go", "/src/fmt/print.go"}, {"/fmt/print.go", "/src/fmt/print.go"}, {"fmt/print.go", "/src/fmt/print.go"}, } { if got := srcLinkFunc(tc.src); got != tc.want { t.Errorf("srcLinkFunc(%v) = %v; want %v", tc.src, got, tc.want) } } } func TestQueryLinkFunc(t *testing.T) { for _, tc := range []struct { src string query string line int want string }{ {"/src/fmt/print.go", "Sprintf", 33, "/src/fmt/print.go?h=Sprintf#L33"}, {"/src/fmt/print.go", "Sprintf", 0, "/src/fmt/print.go?h=Sprintf"}, {"src/fmt/print.go", "EOF", 33, "/src/fmt/print.go?h=EOF#L33"}, {"src/fmt/print.go", "a%3f+%26b", 1, "/src/fmt/print.go?h=a%3f+%26b#L1"}, } { if got := queryLinkFunc(tc.src, tc.query, tc.line); got != tc.want { t.Errorf("queryLinkFunc(%v, %v, %v) = %v; want %v", tc.src, tc.query, tc.line, got, tc.want) } } } func TestDocLinkFunc(t *testing.T) { for _, tc := range []struct { src string ident string want string }{ {"fmt", "Sprintf", "/pkg/fmt/#Sprintf"}, {"fmt", "EOF", "/pkg/fmt/#EOF"}, } { if got := docLinkFunc(tc.src, tc.ident); got != tc.want { t.Errorf("docLinkFunc(%v, %v) = %v; want %v", tc.src, tc.ident, got, tc.want) } } } func TestSanitizeFunc(t *testing.T) { for _, tc := range []struct { src string want string }{ {}, {"foo", "foo"}, {"func f()", "func f()"}, {"func f(a int,)", "func f(a int)"}, {"func f(a int,\n)", "func f(a int)"}, {"func f(\n\ta int,\n\tb int,\n\tc int,\n)", "func f(a int, b int, c int)"}, {" ( a, b, c ) ", "(a, b, c)"}, {"( a, b, c int, foo bar , )", "(a, b, c int, foo bar)"}, {"{ a, b}", "{a, b}"}, {"[ a, b]", "[a, b]"}, } { if got := sanitizeFunc(tc.src); got != tc.want { t.Errorf("sanitizeFunc(%v) = %v; want %v", tc.src, got, tc.want) } } } // Test that we add elements // to the HTML of struct fields. func TestStructFieldsIDAttributes(t *testing.T) { p := &Presentation{ DeclLinks: true, } src := []byte(` package foo type T struct { NoDoc string // Doc has a comment. Doc string } `) fset := token.NewFileSet() af, err := parser.ParseFile(fset, "foo.go", src, parser.ParseComments) if err != nil { t.Fatal(err) } genDecl := af.Decls[0].(*ast.GenDecl) pi := &PageInfo{ FSet: fset, } got := p.node_htmlFunc(pi, genDecl, true) want := `type T struct { NoDoc string // Doc has a comment. Doc string }` if got != want { t.Errorf(" got: %q\nwant: %q\n", got, want) } }