use crate::codegen::cfg::{DeclaredCfgGate, restrict_cfg_gate_to_declared};
use std::collections::HashSet;
fn declared<'a>(names: &'a [&'a str]) -> HashSet<&'a str> {
names.iter().copied().collect()
}
#[test]
fn gate_with_every_feature_declared_passes_through_unchanged() {
let gate = r#"any(feature = "url-ingestion", feature = "url-config-types")"#;
let declared = declared(&["url-ingestion", "url-config-types"]);
assert_eq!(
restrict_cfg_gate_to_declared(gate, &declared),
DeclaredCfgGate::Gate(gate.to_string())
);
}
#[test]
fn single_declared_feature_passes_through_unchanged() {
let gate = r#"feature = "url-config-types""#;
let declared = declared(&["url-config-types"]);
assert_eq!(
restrict_cfg_gate_to_declared(gate, &declared),
DeclaredCfgGate::Gate(gate.to_string())
);
}
#[test]
fn any_with_one_undeclared_feature_narrows_to_the_declared_term_alone() {
let gate = r#"any(feature = "url-ingestion", feature = "url-config-types")"#;
let declared = declared(&["url-config-types"]);
assert_eq!(
restrict_cfg_gate_to_declared(gate, &declared),
DeclaredCfgGate::Gate(r#"feature = "url-config-types""#.to_string())
);
}
#[test]
fn any_with_every_feature_undeclared_is_unreachable() {
let gate = r#"any(feature = "url-ingestion", feature = "crawl-enterprise")"#;
let declared = declared(&["url-config-types"]);
assert_eq!(
restrict_cfg_gate_to_declared(gate, &declared),
DeclaredCfgGate::Unreachable
);
}
#[test]
fn single_undeclared_feature_is_unreachable() {
let gate = r#"feature = "url-ingestion""#;
let declared = declared(&["url-config-types"]);
assert_eq!(
restrict_cfg_gate_to_declared(gate, &declared),
DeclaredCfgGate::Unreachable
);
}
#[test]
fn all_with_one_undeclared_feature_is_unreachable_even_though_the_other_is_declared() {
let gate = r#"all(feature = "url-config-types", feature = "url-ingestion")"#;
let declared = declared(&["url-config-types"]);
assert_eq!(
restrict_cfg_gate_to_declared(gate, &declared),
DeclaredCfgGate::Unreachable
);
}
#[test]
fn all_with_every_feature_declared_passes_through_unchanged() {
let gate = r#"all(feature = "a", feature = "b")"#;
let declared = declared(&["a", "b"]);
assert_eq!(
restrict_cfg_gate_to_declared(gate, &declared),
DeclaredCfgGate::Gate(gate.to_string())
);
}
#[test]
fn any_with_two_of_three_features_declared_narrows_to_a_two_term_any() {
let gate = r#"any(feature = "a", feature = "b", feature = "c")"#;
let declared = declared(&["a", "c"]);
assert_eq!(
restrict_cfg_gate_to_declared(gate, &declared),
DeclaredCfgGate::Gate(r#"any(feature = "a", feature = "c")"#.to_string())
);
}
#[test]
fn non_feature_predicate_passes_through_unchanged() {
let gate = r#"target_os = "macos""#;
let declared = declared(&[]);
assert_eq!(
restrict_cfg_gate_to_declared(gate, &declared),
DeclaredCfgGate::Gate(gate.to_string())
);
}