use super::*;
#[test]
fn test_config_parse_none() {
assert!(ReportConfig::from_env().is_none() || ReportConfig::from_env().is_some());
}
#[test]
fn test_config_parse_variants() {
let test_cases = vec![
("0", None),
(
"1",
Some((ReportFormat::Human, ReportDestination::Stderr, false)),
),
(
"words",
Some((ReportFormat::Human, ReportDestination::Stderr, true)),
),
(
"json",
Some((ReportFormat::Json, ReportDestination::Stderr, false)),
),
(
"json:/tmp/report.json",
Some((
ReportFormat::Json,
ReportDestination::File("/tmp/report.json".to_string()),
false,
)),
),
];
for (input, expected) in test_cases {
let result = match input {
"0" => None,
"1" => Some(ReportConfig {
format: ReportFormat::Human,
destination: ReportDestination::Stderr,
include_words: false,
}),
"words" => Some(ReportConfig {
format: ReportFormat::Human,
destination: ReportDestination::Stderr,
include_words: true,
}),
"json" => Some(ReportConfig {
format: ReportFormat::Json,
destination: ReportDestination::Stderr,
include_words: false,
}),
s if s.starts_with("json:") => Some(ReportConfig {
format: ReportFormat::Json,
destination: ReportDestination::File(s[5..].to_string()),
include_words: false,
}),
_ => None,
};
match (result, expected) {
(None, None) => {}
(Some(r), Some((fmt, dest, words))) => {
assert_eq!(r.format, fmt, "format mismatch for input '{}'", input);
assert_eq!(
r.destination, dest,
"destination mismatch for input '{}'",
input
);
assert_eq!(
r.include_words, words,
"include_words mismatch for input '{}'",
input
);
}
_ => panic!("Mismatch for input '{}'", input),
}
}
}
#[test]
fn test_collect_report_data() {
let data = collect_report_data(false);
assert!(data.wall_clock_ms < 1_000_000_000); assert!(data.peak_strands < 1_000_000);
assert!(data.word_counts.is_none());
}
#[test]
fn test_format_human() {
let data = ReportData {
wall_clock_ms: 42,
total_spawned: 10,
total_completed: 9,
peak_strands: 5,
active_threads: 2,
total_arena_bytes: 1024,
total_peak_arena_bytes: 2048,
messages_sent: 100,
messages_received: 99,
word_counts: None,
};
let output = format_human(&data);
assert!(output.contains("SEQ REPORT"));
assert!(output.contains("42 ms"));
assert!(output.contains("Strands spawned: 10"));
assert!(output.contains("Arena peak: 2048 bytes"));
}
#[test]
fn test_format_human_with_word_counts() {
let data = ReportData {
wall_clock_ms: 100,
total_spawned: 1,
total_completed: 1,
peak_strands: 1,
active_threads: 1,
total_arena_bytes: 0,
total_peak_arena_bytes: 0,
messages_sent: 0,
messages_received: 0,
word_counts: Some(vec![("main".to_string(), 1), ("helper".to_string(), 42)]),
};
let output = format_human(&data);
assert!(output.contains("Word Call Counts"));
assert!(output.contains("main"));
assert!(output.contains("helper"));
}
#[cfg(feature = "report-json")]
#[test]
fn test_format_json() {
let data = ReportData {
wall_clock_ms: 42,
total_spawned: 10,
total_completed: 9,
peak_strands: 5,
active_threads: 2,
total_arena_bytes: 1024,
total_peak_arena_bytes: 2048,
messages_sent: 100,
messages_received: 99,
word_counts: None,
};
let output = format_json(&data);
assert!(output.contains("\"wall_clock_ms\":42"));
assert!(output.contains("\"strands_spawned\":10"));
assert!(output.contains("\"arena_peak_bytes\":2048"));
}
#[test]
fn test_emit_report_noop_when_disabled() {
emit_report();
}