Skip to content

Commit 3ce4a5c

Browse files
committed
Add tests for major wildcard coercion
1 parent 19141bd commit 3ce4a5c

File tree

1 file changed

+215
-1
lines changed

1 file changed

+215
-1
lines changed

crates/resolver-tests/tests/resolve.rs

Lines changed: 215 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ use cargo_util::is_ci;
88
use resolver_tests::{
99
assert_contains, assert_same, dep, dep_kind, dep_loc, dep_req, loc_names, names, pkg, pkg_id,
1010
pkg_loc, registry, registry_strategy, remove_dep, resolve, resolve_and_validated,
11-
resolve_with_global_context, PrettyPrintRegistry, SatResolve, ToDep, ToPkgId,
11+
resolve_with_global_context, resolve_with_global_context_raw, PrettyPrintRegistry, SatResolve,
12+
ToDep, ToPkgId,
1213
};
1314

1415
use proptest::prelude::*;
@@ -425,6 +426,190 @@ fn test_resolving_maximum_version_with_transitive_deps() {
425426
assert!(!res.contains(&("util", "1.1.1").to_pkgid()));
426427
}
427428

429+
#[test]
430+
fn test_wildcard_minor() {
431+
let reg = registry(vec![
432+
pkg!(("util", "0.1.0")),
433+
pkg!(("util", "0.1.1")),
434+
pkg!("foo" => [dep_req("util", "0.1.*")]),
435+
]);
436+
437+
let res = resolve_and_validated(
438+
vec![dep_req("util", "=0.1.0"), dep_req("foo", "1.0.0")],
439+
&reg,
440+
None,
441+
)
442+
.unwrap();
443+
444+
assert_same(
445+
&res,
446+
&names(&[("root", "1.0.0"), ("foo", "1.0.0"), ("util", "0.1.0")]),
447+
);
448+
}
449+
450+
#[test]
451+
fn test_wildcard_major() {
452+
let reg = registry(vec![
453+
pkg!("foo" => [dep_req("util", "0.*")]),
454+
pkg!(("util", "0.1.0")),
455+
pkg!(("util", "0.2.0")),
456+
]);
457+
458+
let res = resolve_and_validated(
459+
vec![dep_req("foo", "1.0.0"), dep_req("util", "=0.1.0")],
460+
&reg,
461+
None,
462+
)
463+
.unwrap();
464+
465+
assert_same(
466+
&res,
467+
&names(&[
468+
("root", "1.0.0"),
469+
("foo", "1.0.0"),
470+
("util", "0.1.0"),
471+
("util", "0.2.0"),
472+
]),
473+
);
474+
}
475+
476+
#[test]
477+
fn test_range_major() {
478+
let reg = registry(vec![
479+
pkg!("foo" => [dep_req("util", ">=0.1,<0.3")]),
480+
pkg!(("util", "0.1.0")),
481+
pkg!(("util", "0.2.0")),
482+
]);
483+
484+
let res = resolve_and_validated(
485+
vec![dep_req("foo", "1.0.0"), dep_req("util", "0.1.0")],
486+
&reg,
487+
None,
488+
)
489+
.unwrap();
490+
491+
assert_same(
492+
&res,
493+
&names(&[
494+
("root", "1.0.0"),
495+
("foo", "1.0.0"),
496+
("util", "0.1.0"),
497+
("util", "0.2.0"),
498+
]),
499+
);
500+
}
501+
502+
#[test]
503+
fn test_wildcard_major_duplicate_selection() {
504+
let reg = registry(vec![
505+
pkg!("foo" => [dep_req("util", "0.*")]),
506+
pkg!("bar" => [dep_req("util", "0.2")]),
507+
pkg!("car" => [dep_req("util", "0.1")]),
508+
pkg!(("util", "0.1.0")),
509+
pkg!(("util", "0.2.0")),
510+
]);
511+
512+
let res = resolve_with_global_context_raw(
513+
vec![
514+
dep_req("foo", "1.0.0"),
515+
dep_req("bar", "1.0.0"),
516+
dep_req("car", "1.0.0"),
517+
],
518+
&reg,
519+
&GlobalContext::default().unwrap(),
520+
)
521+
.unwrap();
522+
523+
// In this case, both 0.1.0 and 0.2.0 satisfy foo. It should pick the highest
524+
// version.
525+
assert_eq!(
526+
res.deps(pkg_id("foo")).next().unwrap().0,
527+
("util", "0.2.0").to_pkgid()
528+
);
529+
530+
let res = res.sort();
531+
532+
assert_same(
533+
&res,
534+
&names(&[
535+
("root", "1.0.0"),
536+
("foo", "1.0.0"),
537+
("bar", "1.0.0"),
538+
("car", "1.0.0"),
539+
("util", "0.1.0"),
540+
("util", "0.2.0"),
541+
]),
542+
);
543+
}
544+
545+
#[test]
546+
fn test_wildcard_major_coerced_by_subdependency() {
547+
let reg = registry(vec![
548+
pkg!("foo" => [dep_req("util", "0.1")]),
549+
pkg!(("util", "0.1.0")),
550+
pkg!(("util", "0.2.0")),
551+
]);
552+
553+
let res = resolve(vec![dep_req("foo", "1.0.0"), dep_req("util", "0.*")], &reg).unwrap();
554+
555+
// In this case, both 0.1.0 and 0.2.0 satisfy root, but it's being coerced
556+
// by the subdependency of foo.
557+
assert_same(
558+
&res,
559+
&names(&[
560+
("root", "1.0.0"),
561+
("foo", "1.0.0"),
562+
("util", "0.1.0"),
563+
("util", "0.2.0"),
564+
]),
565+
);
566+
}
567+
568+
#[test]
569+
fn test_wildcard_major_coerced_by_indirect_subdependency() {
570+
let reg = registry(vec![
571+
pkg!("foo" => [dep_req("util", "0.1")]),
572+
pkg!("bar" => [dep_req("car", "1.0.0")]),
573+
pkg!("car" => [dep_req("util", "0.2")]),
574+
pkg!(("util", "0.1.0")),
575+
pkg!(("util", "0.2.0")),
576+
pkg!(("util", "0.3.0")),
577+
]);
578+
579+
let res = resolve_with_global_context_raw(
580+
vec![
581+
dep_req("foo", "1.0.0"),
582+
dep_req("bar", "1.0.0"),
583+
dep_req("util", "0.*"),
584+
],
585+
&reg,
586+
&GlobalContext::default().unwrap(),
587+
)
588+
.unwrap();
589+
590+
// In this case, 0.1.0, 0.2.0 and 0.3.0 satisfy root. It should pick the highest
591+
// version that exists in the dependency tree.
592+
assert_eq!(
593+
res.deps(pkg_id("root")).skip(2).next().unwrap().0,
594+
("util", "0.3.0").to_pkgid()
595+
);
596+
597+
let res = res.sort();
598+
599+
assert_same(
600+
&res,
601+
&names(&[
602+
("root", "1.0.0"),
603+
("foo", "1.0.0"),
604+
("bar", "1.0.0"),
605+
("car", "1.0.0"),
606+
("util", "0.1.0"),
607+
("util", "0.2.0"),
608+
("util", "0.3.0"),
609+
]),
610+
);
611+
}
612+
428613
#[test]
429614
fn test_resolving_minimum_version_with_transitive_deps() {
430615
let reg = registry(vec![
@@ -605,6 +790,35 @@ fn resolving_with_deep_backtracking() {
605790
);
606791
}
607792

793+
#[test]
794+
fn resolving_with_sys_crates_duplicates() {
795+
// This is based on issues/4902
796+
// With `l` a normal library we get 2copies so everyone gets the newest compatible.
797+
// But `l-sys` a library with a links attribute we make sure there is only one.
798+
let reg = registry(vec![
799+
pkg!(("l-sys", "0.9.1")),
800+
pkg!(("l-sys", "0.10.0")),
801+
pkg!(("l", "0.9.1") => [dep_req("l-sys", ">=0.8.0, <=0.10.0")]),
802+
pkg!(("l", "0.10.0") => [dep_req("l-sys", "0.9")]),
803+
pkg!(("d", "1.0.0") => [dep_req("l", "0.10")]),
804+
pkg!(("r", "1.0.0") => [dep_req("l", "0.9")]),
805+
]);
806+
807+
let res = resolve(vec![dep_req("d", "1"), dep_req("r", "1")], &reg).unwrap();
808+
809+
assert_same(
810+
&res,
811+
&names(&[
812+
("root", "1.0.0"),
813+
("d", "1.0.0"),
814+
("r", "1.0.0"),
815+
("l-sys", "0.9.1"),
816+
("l", "0.9.1"),
817+
("l", "0.10.0"),
818+
]),
819+
);
820+
}
821+
608822
#[test]
609823
fn resolving_with_sys_crates() {
610824
// This is based on issues/4902

0 commit comments

Comments
 (0)