| use cargo::core::{Dependency, dependency::DepKind}; |
| |
| use resolver_tests::{ |
| helpers::{ |
| ToDep, dep, dep_kind, dep_platform, dep_req, dep_req_kind, dep_req_platform, pkg, pkg_dep, |
| pkg_dep_with, registry, |
| }, |
| pkg, resolve, resolve_and_validated, |
| sat::SatResolver, |
| }; |
| |
| #[test] |
| fn off_by_one_bug() { |
| let input = vec![ |
| pkg!(("A-sys", "0.0.1")), |
| pkg!(("A-sys", "0.0.4")), |
| pkg!(("A-sys", "0.0.6")), |
| pkg!(("A-sys", "0.0.7")), |
| pkg!(("NA", "0.0.0") => [dep_req("A-sys", "<= 0.0.5"),]), |
| pkg!(("NA", "0.0.1") => [dep_req("A-sys", ">= 0.0.6, <= 0.0.8"),]), |
| pkg!(("a", "0.0.1")), |
| pkg!(("a", "0.0.2")), |
| pkg!(("aa", "0.0.0") => [dep_req("A-sys", ">= 0.0.4, <= 0.0.6"),dep_req("NA", "<= 0.0.0"),]), |
| pkg!(("f", "0.0.3") => [dep("NA"),dep_req("a", "<= 0.0.2"),dep("aa"),]), |
| ]; |
| |
| let reg = registry(input); |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(vec![dep("f")], ®, &mut sat_resolver).is_ok()); |
| } |
| |
| #[test] |
| fn conflict_store_bug() { |
| let input = vec![ |
| pkg!(("A", "0.0.3")), |
| pkg!(("A", "0.0.5")), |
| pkg!(("A", "0.0.9") => [dep("bad"),]), |
| pkg!(("A", "0.0.10") => [dep("bad"),]), |
| pkg!(("L-sys", "0.0.1") => [dep("bad"),]), |
| pkg!(("L-sys", "0.0.5")), |
| pkg!(("R", "0.0.4") => [ |
| dep_req("L-sys", "= 0.0.5"), |
| ]), |
| pkg!(("R", "0.0.6")), |
| pkg!(("a-sys", "0.0.5")), |
| pkg!(("a-sys", "0.0.11")), |
| pkg!(("c", "0.0.12") => [ |
| dep_req("R", ">= 0.0.3, <= 0.0.4"), |
| ]), |
| pkg!(("c", "0.0.13") => [ |
| dep_req("a-sys", ">= 0.0.8, <= 0.0.11"), |
| ]), |
| pkg!(("c0", "0.0.6") => [ |
| dep_req("L-sys", "<= 0.0.2"), |
| ]), |
| pkg!(("c0", "0.0.10") => [ |
| dep_req("A", ">= 0.0.9, <= 0.0.10"), |
| dep_req("a-sys", "= 0.0.5"), |
| ]), |
| pkg!("j" => [ |
| dep_req("A", ">= 0.0.3, <= 0.0.5"), |
| dep_req("R", ">=0.0.4, <= 0.0.6"), |
| dep_req("c", ">= 0.0.9"), |
| dep_req("c0", ">= 0.0.6"), |
| ]), |
| ]; |
| |
| let reg = registry(input); |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(vec![dep("j")], ®, &mut sat_resolver).is_err()); |
| } |
| |
| #[test] |
| fn conflict_store_more_then_one_match() { |
| let input = vec![ |
| pkg!(("A", "0.0.0")), |
| pkg!(("A", "0.0.1")), |
| pkg!(("A-sys", "0.0.0")), |
| pkg!(("A-sys", "0.0.1")), |
| pkg!(("A-sys", "0.0.2")), |
| pkg!(("A-sys", "0.0.3")), |
| pkg!(("A-sys", "0.0.12")), |
| pkg!(("A-sys", "0.0.16")), |
| pkg!(("B-sys", "0.0.0")), |
| pkg!(("B-sys", "0.0.1")), |
| pkg!(("B-sys", "0.0.2") => [dep_req("A-sys", "= 0.0.12"),]), |
| pkg!(("BA-sys", "0.0.0") => [dep_req("A-sys","= 0.0.16"),]), |
| pkg!(("BA-sys", "0.0.1") => [dep("bad"),]), |
| pkg!(("BA-sys", "0.0.2") => [dep("bad"),]), |
| pkg!("nA" => [ |
| dep("A"), |
| dep_req("A-sys", "<= 0.0.3"), |
| dep("B-sys"), |
| dep("BA-sys"), |
| ]), |
| ]; |
| let reg = registry(input); |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(vec![dep("nA")], ®, &mut sat_resolver).is_err()); |
| } |
| |
| #[test] |
| fn bad_lockfile_from_8249() { |
| let input = vec![ |
| pkg!(("a-sys", "0.2.0")), |
| pkg!(("a-sys", "0.1.0")), |
| pkg!(("b", "0.1.0") => [ |
| dep_req("a-sys", "0.1"), // should be optional: true, but not needed for now |
| ]), |
| pkg!(("c", "1.0.0") => [ |
| dep_req("b", "=0.1.0"), |
| ]), |
| pkg!("foo" => [ |
| dep_req("a-sys", "=0.2.0"), |
| { |
| let mut b = dep_req("b", "=0.1.0"); |
| b.set_features(vec!["a-sys"]); |
| b |
| }, |
| dep_req("c", "=1.0.0"), |
| ]), |
| ]; |
| let reg = registry(input); |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(vec![dep("foo")], ®, &mut sat_resolver).is_err()); |
| } |
| |
| #[test] |
| fn registry_with_features() { |
| let reg = registry(vec![ |
| pkg!("a"), |
| pkg!("b"), |
| pkg_dep_with( |
| "image", |
| vec!["a".opt(), "b".opt(), "jpg".to_dep()], |
| &[("default", &["a"]), ("b", &["dep:b"])], |
| ), |
| pkg!("jpg"), |
| pkg!("log"), |
| pkg!("man"), |
| pkg_dep_with("rgb", vec!["man".opt()], &[("man", &["dep:man"])]), |
| pkg_dep_with( |
| "dep", |
| vec!["image".with(&["b"]), "log".opt(), "rgb".opt()], |
| &[ |
| ("default", &["log", "image/default"]), |
| ("man", &["rgb?/man"]), |
| ], |
| ), |
| ]); |
| |
| for deps in [ |
| vec!["dep".with(&["default", "man", "log", "rgb"])], |
| vec!["dep".with(&["default"])], |
| vec!["dep".with(&[])], |
| vec!["dep".with(&["man"])], |
| vec!["dep".with(&["man", "rgb"])], |
| ] { |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_ok()); |
| } |
| } |
| |
| #[test] |
| fn missing_feature() { |
| let reg = registry(vec![pkg!("a")]); |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(vec!["a".with(&["f"])], ®, &mut sat_resolver).is_err()); |
| } |
| |
| #[test] |
| fn missing_dep_feature() { |
| let reg = registry(vec![ |
| pkg("a"), |
| pkg_dep_with("dep", vec![dep("a")], &[("f", &["a/a"])]), |
| ]); |
| |
| let deps = vec![dep("dep").with(&["f"])]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_err()); |
| } |
| |
| #[test] |
| fn missing_weak_dep_feature() { |
| let reg = registry(vec![ |
| pkg("a"), |
| pkg_dep_with("dep1", vec![dep("a")], &[("f", &["a/a"])]), |
| pkg_dep_with("dep2", vec!["a".opt()], &[("f", &["a/a"])]), |
| pkg_dep_with("dep3", vec!["a".opt()], &[("f", &["a?/a"])]), |
| pkg_dep_with("dep4", vec!["x".opt()], &[("f", &["x?/a"])]), |
| ]); |
| |
| let deps = vec![dep("dep1").with(&["f"])]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_err()); |
| |
| let deps = vec![dep("dep2").with(&["f"])]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_err()); |
| |
| let deps = vec![dep("dep2").with(&["a", "f"])]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_err()); |
| |
| // Weak dependencies are not supported yet in the dependency resolver |
| let deps = vec![dep("dep3").with(&["f"])]; |
| assert!(resolve(deps.clone(), ®).is_err()); |
| assert!(SatResolver::new(®).sat_resolve(&deps)); |
| |
| let deps = vec![dep("dep3").with(&["a", "f"])]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_err()); |
| |
| // Weak dependencies are not supported yet in the dependency resolver |
| let deps = vec![dep("dep4").with(&["f"])]; |
| assert!(resolve(deps.clone(), ®).is_err()); |
| assert!(SatResolver::new(®).sat_resolve(&deps)); |
| |
| let deps = vec![dep("dep4").with(&["x", "f"])]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_err()); |
| } |
| |
| #[test] |
| fn conflict_feature_and_sys() { |
| let reg = registry(vec![ |
| pkg(("a-sys", "1.0.0")), |
| pkg(("a-sys", "2.0.0")), |
| pkg_dep_with( |
| ("a", "1.0.0"), |
| vec![dep_req("a-sys", "1.0.0")], |
| &[("f", &[])], |
| ), |
| pkg_dep_with( |
| ("a", "2.0.0"), |
| vec![dep_req("a-sys", "2.0.0")], |
| &[("g", &[])], |
| ), |
| pkg_dep("dep", vec![dep_req("a", "2.0.0")]), |
| ]); |
| |
| let deps = vec![dep_req("a", "*").with(&["f"]), dep("dep")]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_err()); |
| } |
| |
| #[test] |
| fn conflict_weak_features() { |
| let reg = registry(vec![ |
| pkg(("a-sys", "1.0.0")), |
| pkg(("a-sys", "2.0.0")), |
| pkg_dep("a1", vec![dep_req("a-sys", "1.0.0").opt()]), |
| pkg_dep("a2", vec![dep_req("a-sys", "2.0.0").opt()]), |
| pkg_dep_with( |
| "dep", |
| vec!["a1".opt(), "a2".opt()], |
| &[("a1", &["a1?/a-sys"]), ("a2", &["a2?/a-sys"])], |
| ), |
| ]); |
| |
| let deps = vec![dep("dep").with(&["a1", "a2"])]; |
| |
| // Weak dependencies are not supported yet in the dependency resolver |
| assert!(resolve(deps.clone(), ®).is_err()); |
| assert!(SatResolver::new(®).sat_resolve(&deps)); |
| } |
| |
| #[test] |
| fn multiple_dep_kinds_and_targets() { |
| let reg = registry(vec![ |
| pkg(("a-sys", "1.0.0")), |
| pkg(("a-sys", "2.0.0")), |
| pkg_dep_with( |
| "dep1", |
| vec![ |
| dep_req_platform("a-sys", "1.0.0", "cfg(all())").opt(), |
| dep_req("a-sys", "1.0.0").opt(), |
| dep_req_kind("a-sys", "2.0.0", DepKind::Build).opt(), |
| ], |
| &[("default", &["dep:a-sys"])], |
| ), |
| pkg_dep_with( |
| "dep2", |
| vec![ |
| dep_req_platform("a-sys", "1.0.0", "cfg(all())").opt(), |
| dep_req("a-sys", "1.0.0").opt(), |
| dep_req_kind("a-sys", "2.0.0", DepKind::Development).rename("a-sys-dev"), |
| ], |
| &[("default", &["dep:a-sys", "a-sys-dev/bad"])], |
| ), |
| ]); |
| |
| let deps = vec![dep("dep1")]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_err()); |
| |
| let deps = vec![dep("dep2")]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_ok()); |
| |
| let deps = vec![ |
| dep_req("a-sys", "1.0.0"), |
| dep_req_kind("a-sys", "2.0.0", DepKind::Build).rename("a2"), |
| ]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_err()); |
| |
| let deps = vec![ |
| dep_req("a-sys", "1.0.0"), |
| dep_req_kind("a-sys", "2.0.0", DepKind::Development).rename("a2"), |
| ]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_err()); |
| } |
| |
| #[test] |
| fn multiple_dep_kinds_and_targets_with_different_packages() { |
| let reg = registry(vec![ |
| pkg_dep_with("a", vec![], &[("f", &[])]), |
| pkg_dep_with("b", vec![], &[("f", &[])]), |
| pkg_dep_with("c", vec![], &[("g", &[])]), |
| pkg_dep_with( |
| "dep1", |
| vec![ |
| "a".opt().rename("x").with(&["f"]), |
| dep_platform("a", "cfg(all())").opt().rename("x"), |
| dep_kind("b", DepKind::Build).opt().rename("x").with(&["f"]), |
| ], |
| &[("default", &["x"])], |
| ), |
| pkg_dep_with( |
| "dep2", |
| vec![ |
| "a".opt().rename("x").with(&["f"]), |
| dep_platform("a", "cfg(all())").opt().rename("x"), |
| dep_kind("c", DepKind::Build).opt().rename("x").with(&["f"]), |
| ], |
| &[("default", &["x"])], |
| ), |
| ]); |
| |
| let deps = vec!["dep1".with(&["default"])]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_ok()); |
| |
| let deps = vec!["dep2".with(&["default"])]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_err()); |
| } |
| |
| #[test] |
| fn dep_feature_with_shadowing_feature() { |
| let reg = registry(vec![ |
| pkg_dep_with("a", vec![], &[("b", &[])]), |
| pkg_dep_with( |
| "dep", |
| vec!["a".opt().rename("aa"), "c".opt()], |
| &[("default", &["aa/b"]), ("aa", &["c"])], |
| ), |
| ]); |
| |
| let deps = vec!["dep".with(&["default"])]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_err()); |
| } |
| |
| #[test] |
| fn dep_feature_not_optional_with_shadowing_feature() { |
| let reg = registry(vec![ |
| pkg_dep_with("a", vec![], &[("b", &[])]), |
| pkg_dep_with( |
| "dep", |
| vec!["a".rename("aa"), "c".opt()], |
| &[("default", &["aa/b"]), ("aa", &["c"])], |
| ), |
| ]); |
| |
| let deps = vec!["dep".with(&["default"])]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_ok()); |
| } |
| |
| #[test] |
| fn dep_feature_weak_with_shadowing_feature() { |
| let reg = registry(vec![ |
| pkg_dep_with("a", vec![], &[("b", &[])]), |
| pkg_dep_with( |
| "dep", |
| vec!["a".opt().rename("aa"), "c".opt()], |
| &[("default", &["aa?/b"]), ("aa", &["c"])], |
| ), |
| ]); |
| |
| let deps = vec!["dep".with(&["default"])]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_ok()); |
| } |
| |
| #[test] |
| fn dep_feature_duplicate_with_shadowing_feature() { |
| let reg = registry(vec![ |
| pkg_dep_with("a", vec![], &[("b", &[])]), |
| pkg_dep_with( |
| "dep", |
| vec![ |
| "a".opt().rename("aa"), |
| dep_kind("a", DepKind::Build).rename("aa"), |
| "c".opt(), |
| ], |
| &[("default", &["aa/b"]), ("aa", &["c"])], |
| ), |
| ]); |
| |
| let deps = vec!["dep".with(&["default"])]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_err()); |
| } |
| |
| #[test] |
| fn optional_dep_features() { |
| let reg = registry(vec![ |
| pkg_dep("a", vec!["bad".opt()]), |
| pkg_dep("b", vec!["a".opt().with(&["bad"])]), |
| pkg_dep("dep", vec![dep("a"), dep("b")]), |
| ]); |
| |
| let deps = vec![dep("dep")]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_ok()); |
| } |
| |
| #[test] |
| fn optional_dep_features_with_rename() { |
| let reg = registry(vec![ |
| pkg("x1"), |
| pkg_dep("a", vec!["x1".opt(), "x2".opt(), "x3".opt()]), |
| pkg_dep( |
| "dep1", |
| vec![ |
| "a".opt().with(&["x1"]), |
| dep_kind("a", DepKind::Build).opt().with(&["x2"]), |
| ], |
| ), |
| pkg_dep( |
| "dep2", |
| vec![ |
| "a".opt().with(&["x1"]), |
| "a".opt().rename("a2").with(&["x3"]), |
| ], |
| ), |
| ]); |
| |
| let deps = vec!["dep1".with(&["a"])]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_err()); |
| |
| let deps = vec!["dep2".with(&["a"])]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_ok()); |
| } |
| |
| #[test] |
| fn optional_weak_dep_features() { |
| let reg = registry(vec![ |
| pkg_dep("a", vec!["bad".opt()]), |
| pkg_dep("b", vec![dep("a")]), |
| pkg_dep_with("dep", vec!["a".opt(), dep("b")], &[("f", &["a?/bad"])]), |
| ]); |
| |
| let deps = vec!["dep".with(&["f"])]; |
| |
| // Weak dependencies are not supported yet in the dependency resolver |
| assert!(resolve(deps.clone(), ®).is_err()); |
| assert!(SatResolver::new(®).sat_resolve(&deps)); |
| } |
| |
| #[test] |
| fn default_feature_multiple_major_versions() { |
| let reg = registry(vec![ |
| pkg_dep_with(("a", "0.2.0"), vec![], &[("default", &[])]), |
| pkg(("a", "0.3.0")), |
| pkg_dep_with(("a", "0.4.0"), vec![], &[("default", &[])]), |
| pkg_dep( |
| "dep1", |
| vec![ |
| dep_req("a", ">=0.2, <0.4").with_default(), |
| dep_req("a", "0.2").rename("a2").with(&[]), |
| ], |
| ), |
| pkg_dep( |
| "dep2", |
| vec![ |
| dep_req("a", ">=0.2, <0.4").with_default(), |
| dep_req("a", "0.3").rename("a2").with(&[]), |
| ], |
| ), |
| pkg_dep( |
| "dep3", |
| vec![ |
| dep_req("a", ">=0.2, <0.4").with_default(), |
| dep_req("a", "0.2").rename("a1").with(&[]), |
| dep_req("a", "0.3").rename("a2").with(&[]), |
| ], |
| ), |
| pkg_dep("dep4", vec![dep_req("a", ">=0.2, <0.4").with_default()]), |
| pkg_dep("dep5", vec![dep_req("a", ">=0.3, <0.5").with_default()]), |
| ]); |
| |
| let deps = vec![dep("dep1")]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_ok()); |
| |
| let deps = vec![dep("dep2")]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_ok()); |
| |
| let deps = vec![dep("dep3")]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_ok()); |
| |
| let deps = vec![dep("dep4")]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_ok()); |
| |
| let deps = vec![dep("dep5")]; |
| let mut sat_resolver = SatResolver::new(®); |
| assert!(resolve_and_validated(deps, ®, &mut sat_resolver).is_ok()); |
| } |