# Testcase inspired by issue #58770, intended to verify that we're # doing the right thing when running "go test -coverpkg=./... ./..." # on a collection of packages where some have init functions and some # do not, some have tests and some do not. [short] skip [!GOEXPERIMENT:coverageredesign] skip # Verify correct statements percentages. We have a total of 10 # statements in the packages matched by "./..."; package "a" (for # example) has two statements so we expect 20.0% stmts covered. Go # 1.19 would print 50% here (due to force importing of all ./... # packages); prior to the fix for #58770 Go 1.20 would show 100% # coverage. For packages "x" and "f" (which have no tests), check for # 0% stmts covered (as opposed to "no test files"). go test -count=1 -coverprofile=cov.dat -coverpkg=./... ./... stdout '^\s*\?\s+M/n\s+\[no test files\]' stdout '^\s*M/x\s+coverage: 0.0% of statements' stdout '^\s*M/f\s+coverage: 0.0% of statements' stdout '^ok\s+M/a\s+\S+\s+coverage: 30.0% of statements in ./...' stdout '^ok\s+M/b\s+\S+\s+coverage: 20.0% of statements in ./...' stdout '^ok\s+M/main\s+\S+\s+coverage: 80.0% of statements in ./...' # Check for selected elements in the collected coverprofile as well. go tool cover -func=cov.dat stdout '^M/x/x.go:3:\s+XFunc\s+0.0%' stdout '^M/b/b.go:7:\s+BFunc\s+100.0%' stdout '^total:\s+\(statements\)\s+80.0%' -- go.mod -- module M go 1.21 -- a/a.go -- package a import "M/f" func init() { println("package 'a' init: launch the missiles!") } func AFunc() int { return f.Id() } -- a/a_test.go -- package a import "testing" func TestA(t *testing.T) { if AFunc() != 42 { t.Fatalf("bad!") } } -- b/b.go -- package b func init() { println("package 'b' init: release the kraken") } func BFunc() int { return -42 } -- b/b_test.go -- package b import "testing" func TestB(t *testing.T) { if BFunc() != -42 { t.Fatalf("bad!") } } -- f/f.go -- package f func Id() int { return 42 } -- main/main.go -- package main import ( "M/a" "M/b" ) func MFunc() string { return "42" } func M2Func() int { return a.AFunc() + b.BFunc() } func init() { println("package 'main' init") } func main() { println(a.AFunc() + b.BFunc()) } -- main/main_test.go -- package main import "testing" func TestMain(t *testing.T) { if MFunc() != "42" { t.Fatalf("bad!") } if M2Func() != 0 { t.Fatalf("also bad!") } } -- n/n.go -- package n type N int -- x/x.go -- package x func XFunc() int { return 2 * 2 }