#[cfg(test)]
mod basic_profiler_tests {
use std::collections::HashMap;
use std::thread;
use std::time::{Duration, Instant};
#[test]
fn test_basic_timing() {
let start = Instant::now();
thread::sleep(Duration::from_millis(10));
let elapsed = start.elapsed();
assert!(elapsed >= Duration::from_millis(10));
assert!(elapsed < Duration::from_millis(50)); }
#[test]
fn test_basic_metrics_collection() {
let mut metrics: HashMap<String, Vec<f64>> = HashMap::new();
for i in 1..=5 {
metrics
.entry("test_metric".to_string())
.or_default()
.push(i as f64 * 10.0);
}
let values = metrics.get("test_metric").unwrap();
assert_eq!(values.len(), 5);
assert_eq!(values[0], 10.0);
assert_eq!(values[4], 50.0);
let sum: f64 = values.iter().sum();
let mean = sum / values.len() as f64;
assert_eq!(mean, 30.0); }
#[test]
fn test_basic_benchmark() {
let iterations = 10;
let mut timings = Vec::new();
for _i in 0..iterations {
let start = Instant::now();
let mut sum = 0;
for j in 0..1000 {
sum += j;
}
let _ = sum;
let elapsed = start.elapsed();
timings.push(elapsed.as_nanos() as f64);
}
assert_eq!(timings.len(), iterations);
let sum: f64 = timings.iter().sum();
let mean = sum / timings.len() as f64;
let variance: f64 =
timings.iter().map(|x| (x - mean).powi(2)).sum::<f64>() / timings.len() as f64;
let std_dev = variance.sqrt();
assert!(mean > 0.0);
assert!(std_dev >= 0.0);
println!(
"Benchmark results: mean={:.2}ns, std_dev={:.2}ns",
mean, std_dev
);
}
#[test]
fn test_basic_performance_analysis() {
let data_points = [
(1.0, 100.0),
(2.0, 150.0),
(3.0, 200.0),
(4.0, 250.0),
(5.0, 300.0),
];
let n = data_points.len() as f64;
let sum_x: f64 = data_points.iter().map(|(x, _)| x).sum();
let sum_y: f64 = data_points.iter().map(|(_, y)| y).sum();
let sum_xy: f64 = data_points.iter().map(|(x, y)| x * y).sum();
let sum_x2: f64 = data_points.iter().map(|(x, _)| x * x).sum();
let slope = (n * sum_xy - sum_x * sum_y) / (n * sum_x2 - sum_x * sum_x);
let intercept = (sum_y - slope * sum_x) / n;
assert!(slope > 0.0);
assert!(slope > 40.0 && slope < 60.0); assert!(intercept > 40.0 && intercept < 60.0);
println!(
"Trend analysis: slope={:.2}, intercept={:.2}",
slope, intercept
);
}
#[test]
fn test_basic_system_monitoring() {
use std::sync::{Arc, Mutex};
let metrics = Arc::new(Mutex::new(Vec::new()));
let metrics_clone = Arc::clone(&metrics);
let handle = std::thread::spawn(move || {
for i in 1..=5 {
let cpu_usage = 20.0 + (i as f64 * 5.0); let memory_usage = 1024 * 1024 * (100 + i * 10);
metrics_clone
.lock()
.unwrap()
.push((cpu_usage, memory_usage));
thread::sleep(Duration::from_millis(1));
}
});
handle.join().unwrap();
let collected_metrics = metrics.lock().unwrap();
assert_eq!(collected_metrics.len(), 5);
let first_cpu = collected_metrics[0].0;
let last_cpu = collected_metrics[4].0;
assert!(last_cpu > first_cpu);
println!(
"System monitoring: collected {} data points",
collected_metrics.len()
);
}
#[test]
fn test_basic_alert_system() {
#[derive(Debug, Clone)]
struct Alert {
name: String,
threshold: f64,
current_value: f64,
triggered: bool,
}
let mut alerts = Vec::new();
alerts.push(Alert {
name: "CPU_USAGE".to_string(),
threshold: 80.0,
current_value: 0.0,
triggered: false,
});
alerts.push(Alert {
name: "MEMORY_USAGE".to_string(),
threshold: 85.0,
current_value: 0.0,
triggered: false,
});
let test_values = vec![
("CPU_USAGE", 75.0),
("MEMORY_USAGE", 70.0),
("CPU_USAGE", 85.0), ("MEMORY_USAGE", 90.0), ];
for (metric_name, value) in test_values {
for alert in &mut alerts {
if alert.name == metric_name {
alert.current_value = value;
alert.triggered = value > alert.threshold;
}
}
}
let cpu_alert = alerts.iter().find(|a| a.name == "CPU_USAGE").unwrap();
let memory_alert = alerts.iter().find(|a| a.name == "MEMORY_USAGE").unwrap();
assert!(cpu_alert.triggered);
assert!(memory_alert.triggered);
assert_eq!(cpu_alert.current_value, 85.0);
assert_eq!(memory_alert.current_value, 90.0);
println!(
"Alert system: {} alerts triggered",
alerts.iter().filter(|a| a.triggered).count()
);
}
}