use super::*;
#[test]
fn instant_underflow_saturates_instead_of_panicking() {
let origin = Instant::now();
let hold = NetworkMonitor::ACTIVE_HOLD;
let inactive = origin
.checked_sub(hold)
.and_then(|t| t.checked_sub(hold))
.unwrap_or(origin);
assert!(inactive <= origin);
}
#[test]
fn traffic_accumulation_saturates_on_overflow() {
let mut rx: u64 = u64::MAX - 1;
rx = rx.saturating_add(1_000_000);
assert_eq!(rx, u64::MAX);
}
#[test]
fn bytes_to_mbps_typical() {
assert!((bytes_to_mbps(1_000_000, Duration::from_secs(1)) - 8.0).abs() < 1e-6);
}
#[test]
fn bytes_to_mbps_zero_elapsed_safe() {
assert_eq!(bytes_to_mbps(1_000_000, Duration::from_secs(0)), 0.0);
}
#[test]
fn bytes_to_mbps_reports_true_value_for_gbe() {
let actual = bytes_to_mbps(1_250_000_000, Duration::from_secs(1));
assert!(
(actual - 10_000.0).abs() < 1.0,
"expected ~10_000 Mbps, got {actual}"
);
}
#[test]
fn new_monitor_reports_available_on_refresh() {
let monitor = NetworkMonitor::new();
let stats = monitor.get_stats();
assert!(stats.upload_mbps >= 0.0 && stats.download_mbps >= 0.0);
}
#[test]
fn selected_interface_round_trips() {
let monitor = NetworkMonitor::new();
assert_eq!(monitor.selected_interface(), None);
monitor.set_interface(Some("lo0".to_string()));
assert_eq!(monitor.selected_interface(), Some("lo0".to_string()));
monitor.set_interface(None);
assert_eq!(monitor.selected_interface(), None);
}