#![cfg(feature = "ptop")]
use presentar_terminal::ptop::{app::MetricsSnapshot, App};
use presentar_terminal::Snapshot;
#[test]
fn test_metrics_snapshot_includes_per_core_freq() {
let snapshot = MetricsSnapshot::empty();
let _freq: &Vec<u64> = &snapshot.per_core_freq;
assert!(
snapshot.per_core_freq.is_empty() || snapshot.per_core_freq.iter().all(|&f| f == 0),
"Empty snapshot should have empty or zero frequency data"
);
}
#[test]
fn test_metrics_snapshot_includes_per_core_temp() {
let snapshot = MetricsSnapshot::empty();
let _temp: &Vec<f32> = &snapshot.per_core_temp;
assert!(
snapshot.per_core_temp.is_empty() || snapshot.per_core_temp.iter().all(|&t| t == 0.0),
"Empty snapshot should have empty or zero temperature data"
);
}
#[test]
fn test_app_has_per_core_freq_field() {
let app = App::with_config(true, Default::default());
let freq: &Vec<u64> = &app.per_core_freq;
assert_eq!(freq.len(), 48, "Deterministic mode should have 48 cores");
}
#[test]
fn test_app_has_per_core_temp_field() {
let app = App::with_config(true, Default::default());
let temp: &Vec<f32> = &app.per_core_temp;
assert_eq!(temp.len(), 48, "Deterministic mode should have 48 cores");
}
#[test]
fn test_apply_snapshot_updates_freq_temp() {
let mut app = App::with_config(true, Default::default());
let mut snapshot = MetricsSnapshot::empty();
snapshot.per_core_freq = vec![4500; 48]; snapshot.per_core_temp = vec![65.0; 48];
app.apply_snapshot(snapshot);
assert_eq!(
app.per_core_freq[0], 4500,
"apply_snapshot must transfer frequency data"
);
assert!(
(app.per_core_temp[0] - 65.0).abs() < 0.1,
"apply_snapshot must transfer temperature data"
);
}
#[test]
fn test_freq_temp_changes_with_async_updates() {
let mut app = App::with_config(true, Default::default());
let mut snapshot1 = MetricsSnapshot::empty();
snapshot1.per_core_freq = vec![4500; 48];
snapshot1.per_core_temp = vec![65.0; 48];
app.apply_snapshot(snapshot1);
let freq1 = app.per_core_freq[0];
let temp1 = app.per_core_temp[0];
let mut snapshot2 = MetricsSnapshot::empty();
snapshot2.per_core_freq = vec![4800; 48]; snapshot2.per_core_temp = vec![72.0; 48]; app.apply_snapshot(snapshot2);
let freq2 = app.per_core_freq[0];
let temp2 = app.per_core_temp[0];
assert_ne!(freq1, freq2, "Frequency must update with new snapshot");
assert!(
(temp1 - temp2).abs() > 0.1,
"Temperature must update with new snapshot"
);
}
#[test]
fn test_collector_produces_frequency_data() {
use presentar_terminal::ptop::app::MetricsCollector;
use presentar_terminal::AsyncCollector;
let mut collector = MetricsCollector::new(false);
let snapshot = collector.collect();
if !snapshot.per_core_freq.is_empty() {
let has_freq = snapshot.per_core_freq.iter().any(|&f| f > 0);
assert!(
has_freq,
"Collector should produce non-zero frequency data. Got: {:?}",
&snapshot.per_core_freq[..snapshot.per_core_freq.len().min(4)]
);
}
}
#[test]
fn test_render_uses_async_updated_data() {
use presentar_terminal::direct::CellBuffer;
use presentar_terminal::ptop::ui;
let mut app = App::with_config(true, Default::default());
app.exploded_panel = Some(presentar_terminal::ptop::PanelType::Cpu);
let mut snapshot = MetricsSnapshot::empty();
snapshot.per_core_freq = vec![4765; 48]; snapshot.per_core_temp = vec![71.5; 48];
snapshot.per_core_percent = vec![45.0; 48];
snapshot.cpu_avg = 0.45;
app.apply_snapshot(snapshot);
let mut buffer = CellBuffer::new(140, 45);
ui::draw(&app, &mut buffer);
let mut output = String::new();
for y in 0..45 {
for x in 0..140 {
if let Some(cell) = buffer.get(x, y) {
output.push(cell.symbol.chars().next().unwrap_or(' '));
}
}
output.push('\n');
}
let has_freq = output.contains("4.76") || output.contains("4.77") || output.contains("4765");
assert!(
has_freq,
"Rendered output must contain async-updated frequency (4.76G/4.77G/4765)\n\
This means draw_cpu_exploded is NOT using app.per_core_freq\n\
First 20 lines of output:\n{}",
output.lines().take(20).collect::<Vec<_>>().join("\n")
);
}