#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct EvolveStats {
n_read: u64,
n_converted: u64,
}
impl EvolveStats {
pub fn new() -> Self {
Self { n_read: 0, n_converted: 0 }
}
pub fn add(&mut self, n_read: u64, n_converted: u64) {
self.n_read += n_read;
self.n_converted += n_converted;
}
pub fn n_read(&self) -> u64 {
self.n_read
}
pub fn n_converted(&self) -> u64 {
self.n_converted
}
}
impl std::fmt::Display for EvolveStats {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"EvolveStats {{ n_read: {}, n_converted: {} }}",
self.n_read, self.n_converted
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new_zeros() {
let s = EvolveStats::new();
assert_eq!(s.n_read(), 0);
assert_eq!(s.n_converted(), 0);
}
#[test]
fn test_add_accumulates() {
let mut s = EvolveStats::new();
s.add(10, 7);
s.add(5, 3);
assert_eq!(s.n_read(), 15);
assert_eq!(s.n_converted(), 10);
}
#[test]
fn test_add_zero() {
let mut s = EvolveStats::new();
s.add(0, 0);
assert_eq!(s.n_read(), 0);
assert_eq!(s.n_converted(), 0);
}
#[test]
fn test_equality() {
let mut a = EvolveStats::new();
a.add(5, 3);
let mut b = EvolveStats::new();
b.add(5, 3);
assert_eq!(a, b);
}
#[test]
fn test_inequality() {
let mut a = EvolveStats::new();
a.add(5, 3);
let mut b = EvolveStats::new();
b.add(5, 4);
assert_ne!(a, b);
}
#[test]
fn test_clone() {
let mut s = EvolveStats::new();
s.add(100, 50);
let cloned = s.clone();
assert_eq!(s, cloned);
}
#[test]
fn test_display() {
let mut s = EvolveStats::new();
s.add(42, 21);
let d = s.to_string();
assert!(d.contains("42"));
assert!(d.contains("21"));
}
}