blob: 7a89102547adb208d0af87b6fd4a96cde2bc526a [file] [log] [blame]
# 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
}