[short] skip # Install an echo command because Windows doesn't have it. env GOBIN=$WORK/tmp/bin go install echo.go env PATH=$GOBIN${:}$PATH # Test go generate for directory with no go files ! go generate ./nogo ! stdout 'Fail' stderr 'no Go files' # Test go generate for module which doesn't exist should fail ! go generate foo.bar/nothing stderr 'no required module provides package foo.bar/nothing' # Test go generate for package where all .go files are excluded by build # constraints go generate -v ./excluded ! stdout 'Fail' ! stderr 'go' # -v shouldn't list any files # Test go generate for "package" with no package clause in any file go generate ./nopkg stdout 'Success a' ! stdout 'Fail' # Test go generate for package with inconsistent package clauses # $GOPACKAGE should depend on each file's package clause go generate ./inconsistent stdout 'Success a' stdout 'Success b' stdout -count=2 'Success c' ! stdout 'Fail' # Test go generate for syntax errors before and after package clauses go generate ./syntax stdout 'Success a' stdout 'Success b' ! stdout 'Fail' # Test go generate for files importing non-existent packages go generate ./importerr stdout 'Success a' stdout 'Success b' stdout 'Success c' -- echo.go -- package main import ( "fmt" "os" "strings" ) func main() { fmt.Println(strings.Join(os.Args[1:], " ")) fmt.Println() } -- go.mod -- module m go 1.16 -- nogo/foo.txt -- Text file in a directory without go files. Go generate should ignore this directory. //go:generate echo Fail nogo -- excluded/a.go -- // Include a build tag that go generate should exclude. // Go generate should ignore this file. // +build a //go:generate echo Fail a package excluded -- excluded/b.go -- // Include a build tag that go generate should exclude. // Go generate should ignore this file. //go:generate echo Fail b // +build b package excluded -- nopkg/a.go -- // Go file with package clause after comment. // Go generate should process this file. /* Pre-comment */ package nopkg //go:generate echo Success a -- nopkg/b.go -- // Go file with commented package clause. // Go generate should ignore this file. //package nopkg //go:generate echo Fail b -- nopkg/c.go -- // Go file with package clause inside multiline comment. // Go generate should ignore this file. /* package nopkg */ //go:generate echo Fail c -- nopkg/d.go -- // Go file with package clause inside raw string literal. // Go generate should ignore this file. const foo = ` package nopkg ` //go:generate echo Fail d -- nopkg/e.go -- // Go file without package clause. // Go generate should ignore this file. //go:generate echo Fail e -- inconsistent/a.go -- // Valid go file with inconsistent package name. // Go generate should process this file with GOPACKAGE=a package a //go:generate echo Success $GOPACKAGE -- inconsistent/b.go -- // Valid go file with inconsistent package name. // Go generate should process this file with GOPACKAGE=b //go:generate echo Success $GOPACKAGE package b -- inconsistent/c.go -- // Go file with two package clauses. // Go generate should process this file with GOPACKAGE=c //go:generate echo Success $GOPACKAGE package c // Invalid package clause, should be ignored: package cinvalid //go:generate echo Success $GOPACKAGE -- inconsistent/d.go -- // Go file with invalid package name. // Go generate should ignore this file. package +d+ //go:generate echo Fail $GOPACKAGE -- syntax/a.go -- // Go file with syntax error after package clause. // Go generate should process this file. package syntax 123 //go:generate echo Success a -- syntax/b.go -- // Go file with syntax error after package clause. // Go generate should process this file. package syntax; 123 //go:generate echo Success b -- syntax/c.go -- // Go file with syntax error before package clause. // Go generate should ignore this file. foo package syntax //go:generate echo Fail c -- importerr/a.go -- // Go file which imports non-existing package. // Go generate should process this file. package importerr //go:generate echo Success a import "foo" -- importerr/b.go -- // Go file which imports non-existing package. // Go generate should process this file. //go:generate echo Success b package importerr import "bar" -- importerr/c.go -- // Go file which imports non-existing package. // Go generate should process this file. package importerr import "moo" //go:generate echo Success c