Skip to content

Commit e62c271

Browse files
committed
test: add more test for pre-release matches semantic
1 parent 8f40fc5 commit e62c271

File tree

2 files changed

+77
-8
lines changed

2 files changed

+77
-8
lines changed

src/cargo/util/semver_ext.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,14 @@ mod matches_prerelease {
237237
(">=1.2.3-0, <1.2.3", "1.2.3-0", false), // upper bound semantic
238238
(">=1.2.3-0, <1.2.3", "1.2.3-1", false), // upper bound semantic
239239
(">=1.2.3-0, <1.2.3", "1.2.4-0", false),
240+
//
241+
("1.2.3", "2.0.0-0", false), // upper bound semantics
242+
("=1.2.3-0", "1.2.3", false),
243+
("=1.2.3-0", "1.2.3-0", false), // bug, must be true
244+
("=1.2.3-0", "1.2.4", false),
245+
(">=1.2.3-2, <1.2.3-4", "1.2.3-0", false),
246+
(">=1.2.3-2, <1.2.3-4", "1.2.3-3", false), // bug, must be true
247+
(">=1.2.3-2, <1.2.3-4", "1.2.3-5", false), // upper bound semantics
240248
];
241249
for (req, ver, expected) in cases {
242250
let version_req = req.parse().unwrap();

tests/testsuite/precise_pre_release.rs

Lines changed: 69 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,10 @@ fn update_pre_release() {
7676
}
7777

7878
#[cargo_test]
79-
fn update_pre_release_differ() {
79+
fn pre_release_should_unmatched() {
8080
cargo_test_support::registry::init();
8181

82-
for version in ["0.1.2", "0.1.2-pre.0", "0.1.2-pre.1"] {
83-
cargo_test_support::registry::Package::new("my-dependency", version).publish();
84-
}
85-
82+
cargo_test_support::registry::Package::new("my-dependency", "0.1.2").publish();
8683
let p = project()
8784
.file(
8885
"Cargo.toml",
@@ -95,7 +92,11 @@ fn update_pre_release_differ() {
9592
)
9693
.file("src/lib.rs", "")
9794
.build();
95+
p.cargo("generate-lockfile").run();
96+
let lockfile = p.read_lockfile();
97+
assert!(lockfile.contains("\nname = \"my-dependency\"\nversion = \"0.1.2\""));
9898

99+
cargo_test_support::registry::Package::new("my-dependency", "0.1.2-pre.0").publish();
99100
p.cargo("update -p my-dependency --precise 0.1.2-pre.0 -Zunstable-options")
100101
.masquerade_as_nightly_cargo(&["precise-pre-release"])
101102
.with_stderr_data(str![[r#"
@@ -105,15 +106,75 @@ fn update_pre_release_differ() {
105106
"#]])
106107
.run();
107108

108-
p.cargo("update -p my-dependency --precise 0.1.2-pre.1 -Zunstable-options")
109+
cargo_test_support::registry::Package::new("my-dependency", "0.2.0-0").publish();
110+
p.cargo("update -p my-dependency --precise 0.2.0-0 -Zunstable-options")
111+
.masquerade_as_nightly_cargo(&["precise-pre-release"])
112+
.with_status(101)
113+
.with_stderr_data(str![[r#"
114+
[UPDATING] `dummy-registry` index
115+
[ERROR] failed to select a version for the requirement `my-dependency = "^0.1.2"`
116+
candidate versions found which didn't match: 0.2.0-0
117+
location searched: `dummy-registry` index (which is replacing registry `crates-io`)
118+
required by package `package v0.0.0 ([ROOT]/foo)`
119+
if you are looking for the prerelease package it needs to be specified explicitly
120+
my-dependency = { version = "0.2.0-0" }
121+
perhaps a crate was updated and forgotten to be re-vendored?
122+
123+
"#]])
124+
.run();
125+
126+
let lockfile = p.read_lockfile();
127+
assert!(lockfile.contains("\nname = \"my-dependency\"\nversion = \"0.1.2-pre.0\""));
128+
}
129+
130+
#[cargo_test]
131+
fn pre_release_should_matched() {
132+
cargo_test_support::registry::init();
133+
134+
cargo_test_support::registry::Package::new("my-dependency", "0.1.2").publish();
135+
let p = project()
136+
.file(
137+
"Cargo.toml",
138+
r#"
139+
[package]
140+
name = "package"
141+
[dependencies]
142+
my-dependency = "0.1.2"
143+
"#,
144+
)
145+
.file("src/lib.rs", "")
146+
.build();
147+
p.cargo("generate-lockfile").run();
148+
let lockfile = p.read_lockfile();
149+
assert!(lockfile.contains("\nname = \"my-dependency\"\nversion = \"0.1.2\""));
150+
151+
// Test upgrade
152+
// 0.1.3 is in the range, so it match
153+
cargo_test_support::registry::Package::new("my-dependency", "0.1.3").publish();
154+
p.cargo("update -p my-dependency --precise 0.1.3 -Zunstable-options")
155+
.masquerade_as_nightly_cargo(&["precise-pre-release"])
156+
.with_stderr_data(str![[r#"
157+
[UPDATING] `dummy-registry` index
158+
[UPDATING] my-dependency v0.1.2 -> v0.1.3
159+
160+
"#]])
161+
.run();
162+
163+
let lockfile = p.read_lockfile();
164+
assert!(lockfile.contains("\nname = \"my-dependency\"\nversion = \"0.1.3\""));
165+
166+
// Test downgrade
167+
// v0.1.3-pre.1 is in the range, so it match
168+
cargo_test_support::registry::Package::new("my-dependency", "0.1.3-pre.1").publish();
169+
p.cargo("update -p my-dependency --precise 0.1.3-pre.1 -Zunstable-options")
109170
.masquerade_as_nightly_cargo(&["precise-pre-release"])
110171
.with_stderr_data(str![[r#"
111172
[UPDATING] `dummy-registry` index
112-
[UPDATING] my-dependency v0.1.2-pre.0 -> v0.1.2-pre.1
173+
[DOWNGRADING] my-dependency v0.1.3 -> v0.1.3-pre.1
113174
114175
"#]])
115176
.run();
116177

117178
let lockfile = p.read_lockfile();
118-
assert!(lockfile.contains("\nname = \"my-dependency\"\nversion = \"0.1.2-pre.1\""));
179+
assert!(lockfile.contains("\nname = \"my-dependency\"\nversion = \"0.1.3-pre.1\""));
119180
}

0 commit comments

Comments
 (0)