use std::collections::{HashMap, HashSet};
use super::{Digest, Fingerprint};
use crate::replication::{
classification::{IntervalIdx, SubIntervalIdx},
digest::DigestDiff,
};
#[test]
fn test_diff() {
let digest = Digest {
configuration_fingerprint: Fingerprint(15),
cold_era_fingerprint: Fingerprint(10),
warm_era_fingerprints: HashMap::from([
(IntervalIdx(1), Fingerprint(1)),
(IntervalIdx(2), Fingerprint(2)),
(IntervalIdx(4), Fingerprint(4)),
]),
hot_era_fingerprints: HashMap::from([
(
IntervalIdx(1),
HashMap::from([(SubIntervalIdx(1), Fingerprint(1))]),
),
(
IntervalIdx(2),
HashMap::from([
(SubIntervalIdx(1), Fingerprint(1)),
(SubIntervalIdx(3), Fingerprint(3)),
]),
),
(
IntervalIdx(4),
HashMap::from([
(SubIntervalIdx(1), Fingerprint(1)),
(SubIntervalIdx(2), Fingerprint(2)),
]),
),
]),
};
let mut other_digest = digest.clone();
other_digest.configuration_fingerprint = Fingerprint(5);
assert!(digest.diff(other_digest).is_none());
assert!(digest.diff(digest.clone()).is_none());
let mut other_digest = digest.clone();
other_digest.cold_era_fingerprint = Fingerprint(15); let expected_diff = Some(DigestDiff {
cold_eras_differ: true,
warm_eras_differences: HashSet::default(),
hot_eras_differences: HashMap::default(),
});
assert_eq!(expected_diff, digest.diff(other_digest));
let mut other_digest = digest.clone();
other_digest.warm_era_fingerprints = HashMap::from([
(IntervalIdx(1), Fingerprint(1)),
(IntervalIdx(2), Fingerprint(2)),
]);
assert!(digest.diff(other_digest).is_none());
let mut other_digest = digest.clone();
other_digest.warm_era_fingerprints = HashMap::from([
(IntervalIdx(1), Fingerprint(1)),
(IntervalIdx(2), Fingerprint(20)), (IntervalIdx(3), Fingerprint(3)),
]);
let expected_diff = Some(DigestDiff {
cold_eras_differ: false,
warm_eras_differences: HashSet::from([IntervalIdx(2), IntervalIdx(3)]),
hot_eras_differences: HashMap::default(),
});
assert_eq!(expected_diff, digest.diff(other_digest));
let mut other_digest = digest.clone();
other_digest.hot_era_fingerprints = HashMap::from([
(
IntervalIdx(2),
HashMap::from([
(SubIntervalIdx(1), Fingerprint(1)),
(SubIntervalIdx(3), Fingerprint(3)),
]),
),
(
IntervalIdx(4),
HashMap::from([
(SubIntervalIdx(1), Fingerprint(1)),
]),
),
]);
assert!(digest.diff(other_digest).is_none());
let mut other_digest = digest.clone();
other_digest.hot_era_fingerprints = HashMap::from([
(
IntervalIdx(2),
HashMap::from([
(SubIntervalIdx(1), Fingerprint(1)),
(SubIntervalIdx(2), Fingerprint(2)), (SubIntervalIdx(3), Fingerprint(30)), ]),
),
(
IntervalIdx(3),
HashMap::from([
(SubIntervalIdx(1), Fingerprint(1)),
(SubIntervalIdx(2), Fingerprint(2)),
]),
),
(
IntervalIdx(4),
HashMap::from([
(SubIntervalIdx(1), Fingerprint(1)),
]),
),
]);
let expected_diff = Some(DigestDiff {
cold_eras_differ: false,
hot_eras_differences: HashMap::from([
(
IntervalIdx(2),
HashSet::from([SubIntervalIdx(2), SubIntervalIdx(3)]),
),
(
IntervalIdx(3),
HashSet::from([SubIntervalIdx(1), SubIntervalIdx(2)]),
),
]),
warm_eras_differences: HashSet::default(),
});
assert_eq!(expected_diff, digest.diff(other_digest));
}