use automapper_validation::eval::{
ConditionEvaluator, ConditionExprEvaluator, ConditionResult, EvaluationContext,
ExternalConditionProvider,
};
use mig_types::segment::OwnedSegment;
use std::collections::HashMap;
struct MockEvaluator {
results: HashMap<u32, ConditionResult>,
external_ids: Vec<u32>,
}
impl MockEvaluator {
fn new(results: Vec<(u32, ConditionResult)>) -> Self {
Self {
results: results.into_iter().collect(),
external_ids: Vec::new(),
}
}
}
impl ConditionEvaluator for MockEvaluator {
fn evaluate(&self, condition: u32, _ctx: &EvaluationContext) -> ConditionResult {
self.results
.get(&condition)
.copied()
.unwrap_or(ConditionResult::Unknown)
}
fn is_external(&self, condition: u32) -> bool {
self.external_ids.contains(&condition)
}
fn message_type(&self) -> &str {
"UTILMD"
}
fn format_version(&self) -> &str {
"FV2510"
}
}
struct NoExternal;
impl ExternalConditionProvider for NoExternal {
fn evaluate(&self, _: &str) -> ConditionResult {
ConditionResult::Unknown
}
}
fn eval_status(ahb_status: &str, conditions: Vec<(u32, ConditionResult)>) -> ConditionResult {
let mock = MockEvaluator::new(conditions);
let ext = NoExternal;
let segments: Vec<OwnedSegment> = Vec::new();
let ctx = EvaluationContext::new("11001", &ext, &segments);
let expr_eval = ConditionExprEvaluator::new(&mock);
expr_eval.evaluate_status(ahb_status, &ctx)
}
#[test]
fn test_orders_complex_expression_true() {
let result = eval_status(
"X (([939] [147]) ∨ ([940] [148])) ∧ [567]",
vec![
(939, ConditionResult::True),
(147, ConditionResult::True),
(940, ConditionResult::False),
(148, ConditionResult::False),
(567, ConditionResult::True),
],
);
assert_eq!(result, ConditionResult::True);
}
#[test]
fn test_orders_complex_expression_false() {
let result = eval_status(
"X (([939] [147]) ∨ ([940] [148])) ∧ [567]",
vec![
(939, ConditionResult::True),
(147, ConditionResult::True),
(940, ConditionResult::False),
(148, ConditionResult::False),
(567, ConditionResult::False),
],
);
assert_eq!(result, ConditionResult::False);
}
#[test]
fn test_utilmd_xor_expression_first_branch_true() {
let result = eval_status(
"Muss ([102] ∧ [2006]) ⊻ ([103] ∧ [2005])",
vec![
(102, ConditionResult::True),
(2006, ConditionResult::True),
(103, ConditionResult::False),
(2005, ConditionResult::False),
],
);
assert_eq!(result, ConditionResult::True);
}
#[test]
fn test_utilmd_xor_expression_both_true() {
let result = eval_status(
"Muss ([102] ∧ [2006]) ⊻ ([103] ∧ [2005])",
vec![
(102, ConditionResult::True),
(2006, ConditionResult::True),
(103, ConditionResult::True),
(2005, ConditionResult::True),
],
);
assert_eq!(result, ConditionResult::False);
}
#[test]
fn test_three_way_and_all_true() {
let result = eval_status(
"Kann [182] ∧ [6] ∧ [570]",
vec![
(182, ConditionResult::True),
(6, ConditionResult::True),
(570, ConditionResult::True),
],
);
assert_eq!(result, ConditionResult::True);
}
#[test]
fn test_three_way_and_one_false() {
let result = eval_status(
"Kann [182] ∧ [6] ∧ [570]",
vec![
(182, ConditionResult::True),
(6, ConditionResult::True),
(570, ConditionResult::False),
],
);
assert_eq!(result, ConditionResult::False);
}
#[test]
fn test_unknown_external_in_and_chain() {
let result = eval_status(
"Kann [182] ∧ [6] ∧ [570]",
vec![
(182, ConditionResult::True),
(570, ConditionResult::True),
],
);
assert_eq!(result, ConditionResult::Unknown);
}
#[test]
fn test_unknown_external_in_and_chain_with_false() {
let result = eval_status(
"Kann [182] ∧ [6] ∧ [570]",
vec![
(182, ConditionResult::True),
(570, ConditionResult::False),
],
);
assert_eq!(result, ConditionResult::False);
}
#[test]
fn test_bare_muss_is_unconditionally_true() {
let result = eval_status("Muss", vec![]);
assert_eq!(result, ConditionResult::True);
}
#[test]
fn test_bare_x_is_unconditionally_true() {
let result = eval_status("X", vec![]);
assert_eq!(result, ConditionResult::True);
}
#[test]
fn test_empty_is_unconditionally_true() {
let result = eval_status("", vec![]);
assert_eq!(result, ConditionResult::True);
}