#![allow(clippy::disallowed_names)]
use pint_pkg::manifest::PackageKind;
use util::{edit_manifest, insert_dep, new_pkg, with_temp_dir};
mod util;
#[test]
fn one_pkg() {
with_temp_dir(|dir| {
let name = "foo";
let manifest = new_pkg(&dir.join(name), PackageKind::Contract);
let members = [(name.to_string(), manifest)].into_iter().collect();
let plan = pint_pkg::plan::from_members(&members).unwrap();
assert_eq!(plan.graph().node_count(), 1);
let pinned = plan.graph().node_weights().next().unwrap();
assert_eq!(pinned.name, name);
});
}
#[test]
fn two_pkgs() {
with_temp_dir(|dir| {
let mut foo = new_pkg(&dir.join("foo"), PackageKind::Library);
let bar = new_pkg(&dir.join("bar"), PackageKind::Library);
edit_manifest(&mut foo, |m| insert_dep(m, &bar));
let members = [
(foo.pkg.name.to_string(), foo.clone()),
(bar.pkg.name.to_string(), bar),
]
.into_iter()
.collect();
let plan = pint_pkg::plan::from_members(&members).unwrap();
let graph = plan.graph();
let order = plan.compilation_order();
assert_eq!(graph[order[0]].name, "bar");
assert_eq!(graph[order[1]].name, "foo");
let members = [(foo.pkg.name.to_string(), foo)].into_iter().collect();
let _plan = pint_pkg::plan::from_members(&members).unwrap();
});
}
#[test]
fn three_pkgs() {
with_temp_dir(|dir| {
let mut foo = new_pkg(&dir.join("foo"), PackageKind::Library);
let mut bar = new_pkg(&dir.join("bar"), PackageKind::Library);
let baz = new_pkg(&dir.join("baz"), PackageKind::Library);
edit_manifest(&mut bar, |m| insert_dep(m, &baz));
edit_manifest(&mut foo, |m| insert_dep(m, &bar));
let members = [
(foo.pkg.name.to_string(), foo.clone()),
(bar.pkg.name.to_string(), bar),
(baz.pkg.name.to_string(), baz),
]
.into_iter()
.collect();
let plan = pint_pkg::plan::from_members(&members).unwrap();
let graph = plan.graph();
let order = plan.compilation_order();
assert_eq!(graph[order[0]].name, "baz");
assert_eq!(graph[order[1]].name, "bar");
assert_eq!(graph[order[2]].name, "foo");
let members = [(foo.pkg.name.to_string(), foo)].into_iter().collect();
let _plan = pint_pkg::plan::from_members(&members).unwrap();
});
}
#[test]
fn diamond_pkgs() {
with_temp_dir(|dir| {
let mut foo = new_pkg(&dir.join("foo"), PackageKind::Library);
let mut bar = new_pkg(&dir.join("bar"), PackageKind::Library);
let mut baz = new_pkg(&dir.join("baz"), PackageKind::Library);
let qux = new_pkg(&dir.join("qux"), PackageKind::Library);
edit_manifest(&mut bar, |m| insert_dep(m, &qux));
edit_manifest(&mut baz, |m| insert_dep(m, &qux));
edit_manifest(&mut foo, |m| {
insert_dep(m, &bar);
insert_dep(m, &baz);
});
let members = [
(foo.pkg.name.to_string(), foo.clone()),
(bar.pkg.name.to_string(), bar),
(baz.pkg.name.to_string(), baz),
(qux.pkg.name.to_string(), qux),
]
.into_iter()
.collect();
let plan = pint_pkg::plan::from_members(&members).unwrap();
let graph = plan.graph();
let order = plan.compilation_order();
assert_eq!(graph[order[0]].name, "qux");
assert!(matches!(&graph[order[1]].name[..], "bar" | "baz"));
assert!(matches!(&graph[order[2]].name[..], "bar" | "baz"));
assert_eq!(graph[order[3]].name, "foo");
let members = [(foo.pkg.name.to_string(), foo)].into_iter().collect();
let _plan = pint_pkg::plan::from_members(&members).unwrap();
});
}
#[test]
#[should_panic]
fn cycle() {
with_temp_dir(|dir| {
let mut foo = new_pkg(&dir.join("foo"), PackageKind::Library);
let mut bar = new_pkg(&dir.join("bar"), PackageKind::Library);
edit_manifest(&mut foo, |m| insert_dep(m, &bar));
edit_manifest(&mut bar, |m| insert_dep(m, &foo));
let members = [
(foo.pkg.name.to_string(), foo.clone()),
(bar.pkg.name.to_string(), bar),
]
.into_iter()
.collect();
let _plan = pint_pkg::plan::from_members(&members).unwrap();
});
}