use std::sync::atomic::{AtomicUsize, Ordering};
static COVERAGE_MATCH_ATTEMPTS: AtomicUsize = AtomicUsize::new(0);
static COVERAGE_MATCH_SUCCESS: AtomicUsize = AtomicUsize::new(0);
static COVERAGE_MATCH_ZERO: AtomicUsize = AtomicUsize::new(0);
pub fn print_coverage_statistics() {
let attempts = COVERAGE_MATCH_ATTEMPTS.load(Ordering::Relaxed);
if attempts == 0 {
return; }
let success = COVERAGE_MATCH_SUCCESS.load(Ordering::Relaxed);
let zero = COVERAGE_MATCH_ZERO.load(Ordering::Relaxed);
let success_rate = (success as f64 / attempts as f64) * 100.0;
let zero_rate = (zero as f64 / attempts as f64) * 100.0;
eprintln!();
eprintln!("[COVERAGE] ═══════════════════════════════════════════════════");
eprintln!("[COVERAGE] Match Statistics Summary");
eprintln!("[COVERAGE] ═══════════════════════════════════════════════════");
eprintln!("[COVERAGE] Total functions: {}", attempts);
eprintln!("[COVERAGE] Matched: {} ({:.1}%)", success, success_rate);
eprintln!("[COVERAGE] Unmatched (0%): {} ({:.1}%)", zero, zero_rate);
eprintln!("[COVERAGE] ═══════════════════════════════════════════════════");
}
pub fn track_match_attempt() {
COVERAGE_MATCH_ATTEMPTS.fetch_add(1, Ordering::Relaxed);
}
pub fn track_match_success() {
COVERAGE_MATCH_SUCCESS.fetch_add(1, Ordering::Relaxed);
}
pub fn track_match_zero() {
COVERAGE_MATCH_ZERO.fetch_add(1, Ordering::Relaxed);
}
#[cfg(test)]
pub fn reset_statistics() {
COVERAGE_MATCH_ATTEMPTS.store(0, Ordering::Relaxed);
COVERAGE_MATCH_SUCCESS.store(0, Ordering::Relaxed);
COVERAGE_MATCH_ZERO.store(0, Ordering::Relaxed);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_track_match_attempt() {
reset_statistics();
track_match_attempt();
track_match_attempt();
track_match_attempt();
let attempts = COVERAGE_MATCH_ATTEMPTS.load(Ordering::Relaxed);
assert_eq!(attempts, 3);
reset_statistics();
}
#[test]
fn test_track_match_success() {
reset_statistics();
track_match_success();
track_match_success();
let success = COVERAGE_MATCH_SUCCESS.load(Ordering::Relaxed);
assert_eq!(success, 2);
reset_statistics();
}
#[test]
fn test_track_match_zero() {
reset_statistics();
track_match_zero();
let zero = COVERAGE_MATCH_ZERO.load(Ordering::Relaxed);
assert_eq!(zero, 1);
reset_statistics();
}
#[test]
fn test_reset_statistics() {
track_match_attempt();
track_match_success();
track_match_zero();
reset_statistics();
assert_eq!(COVERAGE_MATCH_ATTEMPTS.load(Ordering::Relaxed), 0);
assert_eq!(COVERAGE_MATCH_SUCCESS.load(Ordering::Relaxed), 0);
assert_eq!(COVERAGE_MATCH_ZERO.load(Ordering::Relaxed), 0);
}
}