1# This file demonstrates the effect of lazy loading on the selected
2# versions of test dependencies.
3
4# The package import graph used in this test looks like:
5#
6# m ---- a
7#  \     |
8#   \    a_test ---- b
9#    \               |
10#     x              b_test
11#     |                    \
12#     x_test -------------- c
13#
14# And the module dependency graph looks like:
15#
16# m -- a.1 -- b.1 -- c.2
17#  \
18#   x.1 ------------ c.1
19
20# Control case: in Go 1.15, the version of c imported by 'go test x' is the
21# version required by module b, even though b_test is not relevant to the main
22# module. (The main module imports a, and a_test imports b, but all of the
23# packages and tests in the main module can be built without b.)
24
25go list -m c
26stdout '^c v0.2.0 '
27
28[!short] go test -v x
29[!short] stdout ' c v0.2.0$'
30
31# With lazy loading, the go.mod requirements are the same,
32# but the irrelevant dependency on c v0.2.0 should be pruned out,
33# leaving only the relevant dependency on c v0.1.0.
34
35go mod edit -go=1.17
36go list -m c
37stdout '^c v0.1.0'
38
39[!short] go test -v x
40[!short] stdout ' c v0.1.0$'
41
42-- m.go --
43package m
44
45import (
46	_ "a"
47	_ "x"
48)
49-- go.mod --
50module m
51
52go 1.15
53
54require (
55	a v0.1.0
56	x v0.1.0
57)
58
59replace (
60	a v0.1.0 => ./a1
61	b v0.1.0 => ./b1
62	c v0.1.0 => ./c1
63	c v0.2.0 => ./c2
64	x v0.1.0 => ./x1
65)
66-- a1/go.mod --
67module a
68
69go 1.17
70
71require b v0.1.0
72-- a1/a.go --
73package a
74-- a1/a_test.go --
75package a_test
76
77import _ "b"
78-- b1/go.mod --
79module b
80
81go 1.17
82
83require c v0.2.0
84-- b1/b.go --
85package b
86-- b1/b_test.go --
87package b_test
88
89import (
90	"c"
91	"testing"
92)
93
94func TestCVersion(t *testing.T) {
95	t.Log(c.Version)
96}
97-- c1/go.mod --
98module c
99
100go 1.17
101-- c1/c.go --
102package c
103
104const Version = "v0.1.0"
105-- c2/go.mod --
106module c
107
108go 1.17
109-- c2/c.go --
110package c
111
112const Version = "v0.2.0"
113-- x1/go.mod --
114module x
115
116go 1.17
117
118require c v0.1.0
119-- x1/x.go --
120package x
121-- x1/x_test.go --
122package x_test
123
124import (
125	"c"
126	"testing"
127)
128
129func TestCVersion(t *testing.T) {
130	t.Log("c", c.Version)
131}
132