tests(resolver): Add test for minimum dependency versions
authorKlaus Purer <klaus.purer@gmail.com>
Tue, 20 Mar 2018 21:33:10 +0000 (22:33 +0100)
committerKlaus Purer <klaus.purer@gmail.com>
Tue, 20 Mar 2018 21:33:10 +0000 (22:33 +0100)
tests/testsuite/resolve.rs

index 53d06a0e9a7f10f2aa8583f6630b280d388337fa..0e73bf6da88864e858c828b583c03e9bbb83a890 100644 (file)
@@ -5,7 +5,7 @@ use hamcrest::{assert_that, contains, is_not};
 use cargo::core::source::{GitReference, SourceId};
 use cargo::core::dependency::Kind::{self, Development};
 use cargo::core::{Dependency, PackageId, Registry, Summary};
-use cargo::util::{CargoResult, ToUrl};
+use cargo::util::{CargoResult, Config, ToUrl};
 use cargo::core::resolver::{self, Method};
 
 fn resolve(
@@ -45,6 +45,44 @@ fn resolve(
     Ok(res)
 }
 
+fn resolve_with_config(
+    pkg: &PackageId,
+    deps: Vec<Dependency>,
+    registry: &[Summary],
+    config: &Config,
+) -> CargoResult<Vec<PackageId>> {
+    struct MyRegistry<'a>(&'a [Summary]);
+    impl<'a> Registry for MyRegistry<'a> {
+        fn query(&mut self, dep: &Dependency, f: &mut FnMut(Summary)) -> CargoResult<()> {
+            for summary in self.0.iter() {
+                if dep.matches(summary) {
+                    f(summary.clone());
+                }
+            }
+            Ok(())
+        }
+        fn supports_checksums(&self) -> bool {
+            false
+        }
+        fn requires_precise(&self) -> bool {
+            false
+        }
+    }
+    let mut registry = MyRegistry(registry);
+    let summary = Summary::new(pkg.clone(), deps, BTreeMap::new(), None).unwrap();
+    let method = Method::Everything;
+    let resolve = resolver::resolve(
+        &[(summary, method)],
+        &[],
+        &mut registry,
+        &HashSet::new(),
+        Some(config),
+        false,
+    )?;
+    let res = resolve.iter().cloned().collect();
+    Ok(res)
+}
+
 trait ToDep {
     fn to_dep(self) -> Dependency;
 }
@@ -320,6 +358,48 @@ fn test_resolving_maximum_version_with_transitive_deps() {
     assert_that(&res, is_not(contains(names(&[("util", "1.1.1")]))));
 }
 
+#[test]
+fn test_resolving_minimum_version_with_transitive_deps() {
+    let reg = registry(vec![
+        pkg!(("util", "1.2.2")),
+        pkg!(("util", "1.0.0")),
+        pkg!(("util", "1.1.1")),
+        pkg!("foo" => [dep_req("util", "1.0.0")]),
+        pkg!("bar" => [dep_req("util", ">=1.0.1")]),
+    ]);
+
+    let mut config = Config::default().unwrap();
+    config
+        .configure(
+            1,
+            None,
+            &None,
+            false,
+            false,
+            &["minimal-versions".to_string()],
+        )
+        .unwrap();
+
+    let res = resolve_with_config(
+        &pkg_id("root"),
+        vec![dep_req("foo", "1.0.0"), dep_req("bar", "1.0.0")],
+        &reg,
+        &config,
+    ).unwrap();
+
+    assert_that(
+        &res,
+        contains(names(&[
+            ("root", "1.0.0"),
+            ("foo", "1.0.0"),
+            ("bar", "1.0.0"),
+            ("util", "1.1.1"),
+        ])),
+    );
+    assert_that(&res, is_not(contains(names(&[("util", "1.2.2")]))));
+    assert_that(&res, is_not(contains(names(&[("util", "1.0.0")]))));
+}
+
 #[test]
 fn resolving_incompat_versions() {
     let reg = registry(vec![