blob: 7da8f036eb5f82109b73f5b7f648fa0dbd079f04 [file]
# go doc should find module documentation
env GO111MODULE=on
env GOFLAGS=-mod=mod
[short] skip
# Check when module x is inside GOPATH/src.
go doc y
stdout 'Package y is.*alphabet'
stdout 'import "x/y"'
go doc -short y.Yell
stdout '^func Yell\(\) string$'
! stdout 'Yell returns the final letter'
go doc -short y.Letter
stdout '^const Letter = "z"$'
go doc -short y.Alphabet
stdout '^type Alphabet struct\{\}$'
go doc x/y
stdout 'Package y is.*alphabet'
! go doc quote.Hello
stderr 'doc: symbol quote is not a type' # because quote is not in local cache
go list rsc.io/quote # now it is
go doc quote.Hello
stdout 'Hello returns a greeting'
go doc quote
stdout 'Package quote collects pithy sayings.'
# Double-check when module x is outside GOPATH/src.
env GOPATH=$WORK/emptygopath
go doc x/y
stdout 'Package y is.*alphabet'
go doc y
stdout 'Package y is.*alphabet'
# Triple-check when module x is outside GOPATH/src,
# but other packages with same import paths are in GOPATH/src.
# Since go doc is running in module mode here, packages in active module
# should be preferred over packages in GOPATH. See golang.org/issue/28992.
env GOPATH=$WORK/gopath2
go doc x/y
! stdout 'Package y is.*GOPATH'
stdout 'Package y is.*alphabet'
go doc rsc.io/quote
! stdout 'Package quote is located in a GOPATH workspace.'
stdout 'Package quote collects pithy sayings.'
# Check that a sensible error message is printed when a package is not found.
! go doc example.com/hello
stderr 'doc: no required module provides package example.com/hello; to add it:\n\s+go get example.com/hello'
# When in a module with a vendor directory, doc should use the vendored copies
# of the packages. 'std' and 'cmd' are convenient examples of such modules.
#
# When in those modules, the "// import" comment should refer to the same import
# path used in source code, not to the absolute path relative to GOROOT.
cd $GOROOT/src
env GOFLAGS=
env GOWORK=off
go doc cryptobyte
stdout '// import "golang.org/x/crypto/cryptobyte"'
cd $GOROOT/src/cmd/go
go doc modfile
stdout '// import "golang.org/x/mod/modfile"'
# When outside of the 'std' module, its vendored packages
# remain accessible using the 'vendor/' prefix, but report
# the correct "// import" comment as used within std.
cd $GOPATH
go doc vendor/golang.org/x/crypto/cryptobyte
stdout '// import "vendor/golang.org/x/crypto/cryptobyte"'
go doc cmd/vendor/golang.org/x/mod/modfile
stdout '// import "cmd/vendor/golang.org/x/mod/modfile"'
# Not in a module and not in GOPATH
cd $WORK
go env GOMOD
stdout '(/dev/null|NUL)'
go doc encoding/json
stdout '// import "encoding/json"'
go doc json
stdout '// import "encoding/json"'
-- go.mod --
module x
require rsc.io/quote v1.5.2
-- y/y.go --
// Package y is the next to last package of the alphabet.
package y
// Yell returns the final letter of the alphabet.
func Yell() string { return "z" }
const Letter = "z"
type Alphabet struct{}
-- x.go --
package x
-- $WORK/gopath2/src/x/y/y.go --
// Package y is located in a GOPATH workspace.
package y
-- $WORK/gopath2/src/rsc.io/quote/quote.go --
// Package quote is located in a GOPATH workspace.
package quote
// Hello is located in a GOPATH workspace.
func Hello() string { return "" }