55use cargo_test_support:: project;
66use cargo_test_support:: registry:: Package ;
77
8- // Ensure that the "-Z minimal-versions" CLI option works and the minimal
9- // version of a dependency ends up in the lock file.
108#[ cargo_test]
11- fn minimal_version_cli ( ) {
9+ fn simple ( ) {
1210 Package :: new ( "dep" , "1.0.0" ) . publish ( ) ;
1311 Package :: new ( "dep" , "1.1.0" ) . publish ( ) ;
1412
@@ -34,5 +32,217 @@ fn minimal_version_cli() {
3432
3533 let lock = p. read_lockfile ( ) ;
3634
37- assert ! ( !lock. contains( "1.1.0" ) ) ;
35+ assert ! (
36+ lock. contains( "1.0.0" ) ,
37+ "dep minimal version must be present"
38+ ) ;
39+ assert ! (
40+ !lock. contains( "1.1.0" ) ,
41+ "dep maximimal version cannot be present"
42+ ) ;
43+ }
44+
45+ #[ cargo_test]
46+ fn mixed_dependencies ( ) {
47+ Package :: new ( "dep" , "1.0.0" ) . publish ( ) ;
48+ Package :: new ( "dep" , "1.1.0" ) . publish ( ) ;
49+ Package :: new ( "dep" , "1.2.0" ) . publish ( ) ;
50+
51+ let p = project ( )
52+ . file (
53+ "Cargo.toml" ,
54+ r#"
55+ [package]
56+ name = "foo"
57+ authors = []
58+ version = "0.0.1"
59+
60+ [dependencies]
61+ dep = "1.0"
62+
63+ [dev-dependencies]
64+ dep = "1.1"
65+ "# ,
66+ )
67+ . file ( "src/main.rs" , "fn main() {}" )
68+ . build ( ) ;
69+
70+ p. cargo ( "generate-lockfile -Zminimal-versions" )
71+ . masquerade_as_nightly_cargo ( & [ "minimal-versions" ] )
72+ . run ( ) ;
73+
74+ let lock = p. read_lockfile ( ) ;
75+
76+ assert ! (
77+ !lock. contains( "1.0.0" ) ,
78+ "dep incompatible version cannot be present"
79+ ) ;
80+ assert ! (
81+ lock. contains( "1.1.0" ) ,
82+ "dep minimal version must be present"
83+ ) ;
84+ assert ! (
85+ !lock. contains( "1.2.0" ) ,
86+ "dep maximimal version cannot be present"
87+ ) ;
88+ }
89+
90+ #[ cargo_test]
91+ fn yanked ( ) {
92+ Package :: new ( "dep" , "1.0.0" ) . yanked ( true ) . publish ( ) ;
93+ Package :: new ( "dep" , "1.1.0" ) . publish ( ) ;
94+ Package :: new ( "dep" , "1.2.0" ) . publish ( ) ;
95+
96+ let p = project ( )
97+ . file (
98+ "Cargo.toml" ,
99+ r#"
100+ [package]
101+ name = "foo"
102+ authors = []
103+ version = "0.0.1"
104+
105+ [dependencies]
106+ dep = "1.0"
107+ "# ,
108+ )
109+ . file ( "src/main.rs" , "fn main() {}" )
110+ . build ( ) ;
111+
112+ p. cargo ( "generate-lockfile -Zminimal-versions" )
113+ . masquerade_as_nightly_cargo ( & [ "minimal-versions" ] )
114+ . run ( ) ;
115+
116+ let lock = p. read_lockfile ( ) ;
117+
118+ assert ! (
119+ lock. contains( "1.1.0" ) ,
120+ "dep minimal version must be present"
121+ ) ;
122+ assert ! (
123+ !lock. contains( "1.0.0" ) ,
124+ "yanked minimal version must be skipped"
125+ ) ;
126+ assert ! (
127+ !lock. contains( "1.2.0" ) ,
128+ "dep maximimal version cannot be present"
129+ ) ;
130+ }
131+
132+ #[ cargo_test]
133+ fn indirect ( ) {
134+ Package :: new ( "indirect" , "2.0.0" ) . publish ( ) ;
135+ Package :: new ( "indirect" , "2.1.0" ) . publish ( ) ;
136+ Package :: new ( "indirect" , "2.2.0" ) . publish ( ) ;
137+ Package :: new ( "direct" , "1.0.0" )
138+ . dep ( "indirect" , "2.1" )
139+ . publish ( ) ;
140+ Package :: new ( "direct" , "1.1.0" )
141+ . dep ( "indirect" , "2.1" )
142+ . publish ( ) ;
143+
144+ let p = project ( )
145+ . file (
146+ "Cargo.toml" ,
147+ r#"
148+ [package]
149+ name = "foo"
150+ authors = []
151+ version = "0.0.1"
152+
153+ [dependencies]
154+ direct = "1.0"
155+ "# ,
156+ )
157+ . file ( "src/main.rs" , "fn main() {}" )
158+ . build ( ) ;
159+
160+ p. cargo ( "generate-lockfile -Zminimal-versions" )
161+ . masquerade_as_nightly_cargo ( & [ "minimal-versions" ] )
162+ . run ( ) ;
163+
164+ let lock = p. read_lockfile ( ) ;
165+
166+ assert ! (
167+ lock. contains( "1.0.0" ) ,
168+ "direct minimal version must be present"
169+ ) ;
170+ assert ! (
171+ !lock. contains( "1.1.0" ) ,
172+ "direct maximimal version cannot be present"
173+ ) ;
174+ assert ! (
175+ !lock. contains( "2.0.0" ) ,
176+ "indirect unmatched version cannot be present"
177+ ) ;
178+ assert ! (
179+ lock. contains( "2.1.0" ) ,
180+ "indirect minimal version must be present"
181+ ) ;
182+ assert ! (
183+ !lock. contains( "2.2.0" ) ,
184+ "indirect maximimal version cannot be present"
185+ ) ;
186+ }
187+
188+ #[ cargo_test]
189+ fn indirect_conflict ( ) {
190+ Package :: new ( "indirect" , "2.0.0" ) . publish ( ) ;
191+ Package :: new ( "indirect" , "2.1.0" ) . publish ( ) ;
192+ Package :: new ( "indirect" , "2.2.0" ) . publish ( ) ;
193+ Package :: new ( "direct" , "1.0.0" )
194+ . dep ( "indirect" , "2.1" )
195+ . publish ( ) ;
196+ Package :: new ( "direct" , "1.1.0" )
197+ . dep ( "indirect" , "2.1" )
198+ . publish ( ) ;
199+
200+ let p = project ( )
201+ . file (
202+ "Cargo.toml" ,
203+ r#"
204+ [package]
205+ name = "foo"
206+ authors = []
207+ version = "0.0.1"
208+
209+ [dependencies]
210+ direct = "1.0"
211+ indirect = "2.0"
212+ "# ,
213+ )
214+ . file ( "src/main.rs" , "fn main() {}" )
215+ . build ( ) ;
216+
217+ p. cargo ( "generate-lockfile -Zminimal-versions" )
218+ . masquerade_as_nightly_cargo ( & [ "minimal-versions" ] )
219+ . with_stderr (
220+ "\
221+ [UPDATING] [..]
222+ " ,
223+ )
224+ . run ( ) ;
225+
226+ let lock = p. read_lockfile ( ) ;
227+
228+ assert ! (
229+ lock. contains( "1.0.0" ) ,
230+ "direct minimal version must be present"
231+ ) ;
232+ assert ! (
233+ !lock. contains( "1.1.0" ) ,
234+ "direct maximimal version cannot be present"
235+ ) ;
236+ assert ! (
237+ !lock. contains( "2.0.0" ) ,
238+ "indirect unmatched version cannot be present"
239+ ) ;
240+ assert ! (
241+ lock. contains( "2.1.0" ) ,
242+ "indirect minimal version must be present"
243+ ) ;
244+ assert ! (
245+ !lock. contains( "2.2.0" ) ,
246+ "indirect maximimal version cannot be present"
247+ ) ;
38248}
0 commit comments