[!fuzz] skip
[short] skip
env GOCACHE=$WORK/cache

# Tests which verify the behavior and command line output when
# running a fuzz target as a unit test.

# Tests without -run.

! go test
stdout FAIL
stdout 'error here'

! go test -v
stdout FAIL
stdout 'error here'
stdout '=== RUN   FuzzFoo/thisfails'
stdout '--- FAIL: FuzzFoo/thisfails'
stdout '=== RUN   FuzzFoo/thispasses'
stdout '--- PASS: FuzzFoo/thispasses'

# Tests where -run matches all seed corpora.

! go test -run FuzzFoo/this
stdout FAIL
stdout 'error here'
! stdout 'no tests to run'

! go test -run /this
stdout FAIL
stdout 'error here'
! stdout 'no tests to run'

! go test -v -run FuzzFoo/this
stdout FAIL
stdout 'error here'
stdout '=== RUN   FuzzFoo/thisfails'
stdout '--- FAIL: FuzzFoo/thisfails'
stdout '=== RUN   FuzzFoo/thispasses'
stdout '--- PASS: FuzzFoo/thispasses'
! stdout 'no tests to run'

! go test -v -run /this
stdout FAIL
stdout 'error here'
stdout '=== RUN   FuzzFoo/thisfails'
stdout '--- FAIL: FuzzFoo/thisfails'
stdout '=== RUN   FuzzFoo/thispasses'
stdout '--- PASS: FuzzFoo/thispasses'
! stdout 'no tests to run'

# Tests where -run only matches one seed corpus which passes.

go test -run FuzzFoo/thispasses
stdout ok
! stdout 'no tests to run'

go test -run /thispasses
stdout ok
! stdout 'no tests to run'

# Same tests in verbose mode
go test -v -run FuzzFoo/thispasses
stdout '=== RUN   FuzzFoo/thispasses'
stdout '--- PASS: FuzzFoo/thispasses'
! stdout '=== RUN   FuzzFoo/thisfails'
! stdout 'no tests to run'

go test -v -run /thispasses
stdout '=== RUN   FuzzFoo/thispasses'
stdout '--- PASS: FuzzFoo/thispasses'
! stdout '=== RUN   FuzzFoo/thisfails'
! stdout 'no tests to run'

# Tests where -run only matches one seed corpus which fails.

! go test -run FuzzFoo/thisfails
stdout FAIL
stdout 'error here'
! stdout 'no tests to run'

! go test -run /thisfails
stdout FAIL
stdout 'error here'
! stdout 'no tests to run'

! go test -v -run FuzzFoo/thisfails
stdout 'error here'
stdout '=== RUN   FuzzFoo/thisfails'
stdout '--- FAIL: FuzzFoo/thisfails'
! stdout '=== RUN   FuzzFoo/thispasses'
! stdout 'no tests to run'

! go test -v -run /thisfails
stdout 'error here'
stdout '=== RUN   FuzzFoo/thisfails'
stdout '--- FAIL: FuzzFoo/thisfails'
! stdout '=== RUN   FuzzFoo/thispasses'
! stdout 'no tests to run'

# Tests where -run doesn't match any seed corpora.

go test -run FuzzFoo/nomatch
stdout ok

go test -run /nomatch
stdout ok

go test -v -run FuzzFoo/nomatch
stdout '=== RUN   FuzzFoo'
stdout '--- PASS: FuzzFoo'
stdout ok
! stdout 'no tests to run'

go test -v -run /nomatch
stdout '=== RUN   FuzzFoo'
stdout '--- PASS: FuzzFoo'
stdout ok
! stdout 'no tests to run'

-- go.mod --
module example.com/x

go 1.16
-- x_test.go --
package x

import "testing"

func FuzzFoo(f *testing.F) {
    f.Add("this is fine")
    f.Fuzz(func(t *testing.T, s string) {
        if s == "fails" {
            t.Error("error here")
        }
    })
}
-- testdata/fuzz/FuzzFoo/thisfails --
go test fuzz v1
string("fails")
-- testdata/fuzz/FuzzFoo/thispasses --
go test fuzz v1
string("passes")
