use super::*;
#[test]
fn counters_make_overflow_explicit() {
let mut counter = EvidenceCounter::new();
assert!(!counter.saturated());
counter.record(u64::MAX);
assert!(!counter.saturated());
assert!(counter.valid());
counter.record(1);
assert_eq!(counter.total(), u64::MAX);
assert!(counter.saturated());
assert!(!counter.valid());
counter.reset();
assert_eq!(counter, EvidenceCounter::new());
}
#[test]
fn counter_merges_preserve_totals_and_saturation() {
let mut left = EvidenceCounter::new();
left.record(2);
let mut right = EvidenceCounter::new();
right.record(3);
left.merge(right);
assert_eq!(left.total(), 5);
assert!(left.valid());
right.record(u64::MAX);
left.merge(right);
assert_eq!(left.total(), u64::MAX);
assert!(left.saturated());
let mut empty = EvidenceCounter::new();
empty.merge(right);
assert_eq!(empty.total(), u64::MAX);
assert!(empty.saturated());
assert!(!empty.valid());
}
#[test]
fn high_water_marks_only_retain_the_largest_observation() {
let mut high_water_mark = EvidenceHighWaterMark::new();
high_water_mark.observe(4);
high_water_mark.observe(2);
high_water_mark.observe(9);
assert_eq!(high_water_mark.maximum(), 9);
high_water_mark.reset();
assert_eq!(high_water_mark, EvidenceHighWaterMark::new());
}
#[test]
fn gauges_preserve_current_pressure_and_high_water() {
let mut gauge = EvidenceGauge::new(2);
assert!(!gauge.invalid());
assert_eq!(gauge.high_water().maximum(), 2);
gauge.increase(3);
gauge.decrease(1);
assert_eq!(gauge.current(), 4);
assert_eq!(gauge.high_water().maximum(), 5);
assert!(gauge.valid());
assert!(!gauge.invalid());
}
#[test]
fn gauges_invalidate_impossible_pressure_changes() {
let mut gauge = EvidenceGauge::new(0);
gauge.decrease(1);
assert_eq!(gauge.current(), 0);
assert!(gauge.invalid());
assert!(!gauge.valid());
}
#[test]
fn gauges_retain_overflow_evidence_after_pressure_falls() {
let mut gauge = EvidenceGauge::new(u64::MAX.saturating_sub(2));
gauge.increase(2);
assert_eq!(gauge.current(), u64::MAX);
assert!(gauge.valid());
gauge.increase(1);
assert_eq!(gauge.current(), u64::MAX);
assert_eq!(gauge.high_water().maximum(), u64::MAX);
assert!(gauge.invalid());
assert!(!gauge.valid());
gauge.decrease(7);
assert_eq!(gauge.current(), u64::MAX.saturating_sub(7));
assert_eq!(gauge.high_water().maximum(), u64::MAX);
assert!(gauge.invalid());
assert!(!gauge.valid());
}
#[test]
fn histograms_group_zero_and_successive_powers_of_two() {
let mut histogram = EvidencePowerOfTwoHistogram::<4>::default();
assert_eq!(histogram, EvidencePowerOfTwoHistogram::new());
for value in [0, 1, 2, 3, 4, 7] {
histogram.record(value);
}
assert_eq!(
histogram.buckets().map(EvidenceCounter::total),
[1, 1, 2, 2]
);
assert!(histogram.valid());
assert!(!histogram.out_of_range());
}
#[test]
fn histogram_range_exhaustion_invalidates_the_evidence() {
let mut histogram = EvidencePowerOfTwoHistogram::<2>::new();
histogram.record(2);
assert!(histogram.out_of_range());
assert!(!histogram.valid());
histogram.reset();
assert_eq!(histogram, EvidencePowerOfTwoHistogram::new());
}