capability_grower_configuration_comparison/
compare_aggregator_preference.rs

1// ---------------- [ File: capability-grower-configuration-comparison/src/compare_aggregator_preference.rs ]
2crate::ix!();
3
4pub trait CompareAggregatorPreference {
5    fn compare_aggregator_preference(&self, other: &GrowerTreeConfiguration) -> CompareOutcome;
6}
7
8impl CompareAggregatorPreference for GrowerTreeConfiguration {
9    fn compare_aggregator_preference(&self, other: &GrowerTreeConfiguration) -> CompareOutcome {
10        let diff = (self.aggregator_preference() - other.aggregator_preference()).abs();
11        if diff < 0.01 {
12            CompareOutcome::Exact
13        } else if diff < 0.2 {
14            CompareOutcome::Partial(1.0 - diff)
15        } else {
16            CompareOutcome::Incompatible
17        }
18    }
19}
20
21#[cfg(test)]
22mod compare_aggregator_preference_tests {
23    use super::*;
24
25    #[traced_test]
26    fn exact_match() {
27        let a = GrowerTreeConfiguration::default()
28            .to_builder().aggregator_preference(0.5).build().unwrap();
29        let b = a.clone();
30        assert_eq!(a.compare_aggregator_preference(&b), CompareOutcome::Exact);
31    }
32
33    #[traced_test]
34    fn partial() {
35        let a = GrowerTreeConfiguration::default()
36            .to_builder().aggregator_preference(0.3).build().unwrap();
37        let b = a.to_builder().aggregator_preference(0.4).build().unwrap();
38        match a.compare_aggregator_preference(&b) {
39            CompareOutcome::Partial(_) => {}
40            other => panic!("Expected partial, got {:?}", other),
41        }
42    }
43
44    #[traced_test]
45    fn incompatible() {
46        let a = GrowerTreeConfiguration::default()
47            .to_builder().aggregator_preference(0.0).build().unwrap();
48        let b = a.to_builder().aggregator_preference(1.0).build().unwrap();
49        assert_eq!(a.compare_aggregator_preference(&b), CompareOutcome::Incompatible);
50    }
51}