# This test makes sure workspace mode's handling of the module graph
# is compatible with module pruning. The graph we load from either of
# the workspace modules should be the same, even if their graphs
# don't overlap.
#
# This is the module graph in the test:
#
#  example.com/a -> example.com/b v1.0.0 -> example.com/q v1.1.0
#  example.com/p -> example.com/q v1.0.0
#
# If we didn't load the whole graph and didn't load the dependencies of b
# when loading p, we would end up loading q v1.0.0, rather than v1.1.0,
# which is selected by MVS.

go list -m -f '{{.Version}}' example.com/q
stdout '^v1.1.0$'

-- go.work --
go 1.18

use (
	./a
	./p
)
-- a/go.mod --
module example.com/a

go 1.18

require example.com/b v1.0.0

replace example.com/b v1.0.0 => ../b
-- a/foo.go --
package main

import "example.com/b"

func main() {
	b.B()
}
-- b/go.mod --
module example.com/b

go 1.18

require example.com/q v1.1.0

replace example.com/q v1.0.0 => ../q1_0_0
replace example.com/q v1.1.0 => ../q1_1_0
-- b/b.go --
package b

func B() {
}
-- b/b_test.go --
package b

import "example.com/q"

func TestB() {
	q.PrintVersion()
}
-- p/go.mod --
module example.com/p

go 1.18

require example.com/q v1.0.0

replace example.com/q v1.0.0 => ../q1_0_0
replace example.com/q v1.1.0 => ../q1_1_0
-- p/main.go --
package main

import "example.com/q"

func main() {
	q.PrintVersion()
}
-- q1_0_0/go.mod --
module example.com/q

go 1.18
-- q1_0_0/q.go --
package q

import "fmt"

func PrintVersion() {
	fmt.Println("version 1.0.0")
}
-- q1_1_0/go.mod --
module example.com/q

go 1.18
-- q1_1_0/q.go --
package q

import "fmt"

func PrintVersion() {
	fmt.Println("version 1.1.0")
}
