# This test demonstrates go commands that combine the 'all' pattern
# with packages outside of 'all'.

# With -deps, 'all' should include test dependencies of packages in the main
# module, but not should not include test dependencies of packages imported only
# by other root patterns.

env GOFLAGS=-mod=mod
cp go.mod go.mod.orig

go list -deps all x/otherroot

stdout '^x/inall$'
stdout '^x/inall/fromtest$'
stdout '^x/inall/fromtestinall$'
stdout '^x/otherroot$'
stdout '^x/otherdep$'

! stdout '^x/fromotherroottest$'
! stdout '^y/fromotherdeptest$'

cmp go.mod go.mod.orig

# With -deps -test, test dependencies of other roots should be included,
# but test dependencies of non-roots should not.

go list -deps -test all x/otherroot
stdout '^x/inall$'
stdout '^x/inall/fromtest$'
stdout '^x/inall/fromtestinall$'
stdout '^x/otherroot$'
stdout '^x/otherdep$'

stdout '^x/fromotherroottest$'
! stdout '^y/fromotherdeptest$'

cmp go.mod go.mod.orig

-- m.go --
package m

import _ "x/inall"
-- m_test.go --
package m_test

import _ "x/inall/fromtest"
-- go.mod --
module m

go 1.15

require x v0.1.0

replace (
	x v0.1.0 => ./x
	y v0.1.0 => ./y
)
-- x/go.mod --
module x

go 1.15
-- x/inall/inall.go --
package inall
-- x/inall/inall_test.go --
package inall_test

import _ "x/inall/fromtestinall"
-- x/inall/fromtest/fromtest.go --
package fromtest
-- x/inall/fromtestinall/fromtestinall.go --
package fromtestinall
-- x/otherroot/otherroot.go --
package otherroot

import _ "x/otherdep"
-- x/otherroot/otherroot_test.go --
package otherroot_test

import _ "x/fromotherroottest"
-- x/fromotherroottest/fromotherroottest.go --
package fromotherroottest
-- x/otherdep/otherdep.go --
package otherdep
-- x/otherdep/otherdep_test.go --
package otherdep_test

import _ "y/fromotherdeptest"
-- x/otherroot/testonly/testonly.go --
package testonly
-- y/go.mod --
module y

go 1.15
-- y/fromotherdeptest/fromotherdeptest.go --
// Package fromotherdeptest is a test dependency of x/otherdep that is
// not declared in x/go.mod. If the loader resolves this package,
// it will add this module to the main module's go.mod file,
// and we can detect the mistake.
package fromotherdeptest
