Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/edda

crates/nornir-build-thing/tests/cargo_features.rs

//! The operator's cargo feature choice reaches cargo exactly as given.

use nornir_build_thing::suite_cli::parse;
use nornir_build_thing::{BuildVariant, BuildVariantSet, CargoFeatures};

#[test]
fn the_build_verb_parses_features_and_both_flags() {
    let a = parse(&["--variant", "app", "--features", "a, b", "--features=c,a", "--no-default-features", "--all-features"]).unwrap();
    assert_eq!(a.cargo.features, ["a", "b", "c"], "comma lists split, repeats dropped, order kept");
    assert!(a.cargo.no_default_features && a.cargo.all_features);
    assert!(parse(&["--features"]).is_err(), "a bare --features is refused");
    assert!(parse(&["--variant", "app"]).unwrap().cargo.is_empty());
}

#[test]
fn a_choice_lands_on_top_of_the_declared_variant_and_in_the_cargo_argv() {
    let v = BuildVariant { name: "app".into(), package: Some("app".into()), features: vec!["declared".into()], ..Default::default() };
    let mut cf = CargoFeatures::default();
    cf.add_features(["extra", "declared"]);
    cf.no_default_features = true;
    cf.all_features = true;
    let built = v.with_cargo_features(&cf);
    let args = built.cargo_args();
    let at = args.iter().position(|a| a == "--features").expect("--features");
    assert_eq!(args[at + 1], "declared,extra");
    assert!(args.iter().any(|a| a == "--no-default-features") && args.iter().any(|a| a == "--all-features"), "{args:?}");
    assert_eq!(cf.argv(), ["--features", "extra,declared", "--no-default-features", "--all-features"]);
    // a picked OPEN feature is decided: no longer a switch (the set validates)
    let open = BuildVariant { name: "app".into(), open: ["extra".to_string()].into(), ..Default::default() };
    let picked = open.with_cargo_features(&cf);
    assert!(picked.open.is_empty() && picked.features.contains(&"extra".to_string()));
    // an empty choice is the variant as declared
    assert_eq!(v.with_cargo_features(&CargoFeatures::default()).cargo_args(), v.cargo_args());
}

#[test]
fn a_choice_for_no_cargo_variant_is_refused_by_name() {
    let set = BuildVariantSet { variants: vec![BuildVariant { name: "app".into(), ..Default::default() }], ..Default::default() };
    let mut cf = CargoFeatures::default();
    cf.add_features(["extra"]);
    let s = set.with_cargo_features("app", &cf).unwrap();
    assert_eq!(s.get("app").unwrap().features, ["extra"]);
    let e = set.with_cargo_features("nope", &cf).unwrap_err().to_string();
    assert!(e.contains("'nope'") && e.contains("--features extra"), "{e}");
    assert!(set.with_cargo_features("nope", &CargoFeatures::default()).is_ok(), "nothing chosen: nothing to refuse");
}