# This test checks more of the "go build -cover" functionality,
# specifically which packages get selected when building.

[short] skip

# Skip if new coverage is not enabled.
[!GOEXPERIMENT:coverageredesign] skip

#-------------------------------------------

# Build for coverage.
go build -mod=mod -o $WORK/modex.exe -cover mod.example/main

# Save off old GOCOVERDIR setting
env SAVEGOCOVERDIR=$GOCOVERDIR

# Execute.
mkdir $WORK/covdata
env GOCOVERDIR=$WORK/covdata
exec $WORK/modex.exe

# Restore previous GOCOVERDIR setting
env GOCOVERDIR=$SAVEGOCOVERDIR

# Examine the result.
go tool covdata percent -i=$WORK/covdata
stdout 'coverage: 100.0% of statements'

# By default we want to see packages resident in the module covered,
# but not dependencies.
go tool covdata textfmt -i=$WORK/covdata -o=$WORK/covdata/out.txt
grep 'mode: set' $WORK/covdata/out.txt
grep 'mod.example/main/main.go:' $WORK/covdata/out.txt
grep 'mod.example/sub/sub.go:' $WORK/covdata/out.txt
! grep 'rsc.io' $WORK/covdata/out.txt

rm $WORK/covdata
rm $WORK/modex.exe

#-------------------------------------------

# Repeat the build but with -coverpkg=all

go build -mod=mod -coverpkg=all -o $WORK/modex.exe -cover mod.example/main

# Execute.
mkdir $WORK/covdata
env GOCOVERDIR=$WORK/covdata
exec $WORK/modex.exe

# Restore previous GOCOVERDIR setting
env GOCOVERDIR=$SAVEGOCOVERDIR

# Examine the result.
go tool covdata percent -i=$WORK/covdata
stdout  'coverage:.*[1-9][0-9.]+%'

# The whole enchilada.
go tool covdata textfmt -i=$WORK/covdata -o=$WORK/covdata/out.txt
grep 'mode: set' $WORK/covdata/out.txt
grep 'mod.example/main/main.go:' $WORK/covdata/out.txt
grep 'mod.example/sub/sub.go:' $WORK/covdata/out.txt
grep 'rsc.io' $WORK/covdata/out.txt
grep 'bufio/bufio.go:' $WORK/covdata/out.txt

# Use the covdata tool to select a specific set of module paths
mkdir $WORK/covdata2
go tool covdata merge -pkg=rsc.io/quote -i=$WORK/covdata -o=$WORK/covdata2

# Examine the result.
go tool covdata percent -i=$WORK/covdata2
stdout  'coverage:.*[1-9][0-9.]+%'

# Check for expected packages + check that we don't see things from stdlib.
go tool covdata textfmt -i=$WORK/covdata2 -o=$WORK/covdata2/out.txt
grep 'mode: set' $WORK/covdata2/out.txt
! grep 'mod.example/main/main.go:' $WORK/covdata2/out.txt
! grep 'mod.example/sub/sub.go:' $WORK/covdata2/out.txt
grep 'rsc.io' $WORK/covdata2/out.txt
! grep 'bufio/bufio.go:' $WORK/covdata2/out.txt

#-------------------------------------------
# end of test cmds, start of harness and related files.

-- go.mod --
module mod.example

go 1.20

require rsc.io/quote/v3 v3.0.0

-- main/main.go --
package main

import (
	"fmt"
	"mod.example/sub"

	"rsc.io/quote"
)

func main() {
	fmt.Println(quote.Go(), sub.F())
}

-- sub/sub.go --

package sub

func F() int {
	return 42
}