#[cfg(test)]
mod diff_tests {
use super::*;
#[test]
fn test_REPL_011_003_format_single_difference() {
let differences = vec![OutputDifference {
line: 1,
run1: "Random: 12345".to_string(),
run2: "Random: 67890".to_string(),
}];
let formatted = format_replay_diff(&differences);
assert!(formatted.contains("Line 1:"));
assert!(formatted.contains("Run 1: Random: 12345"));
assert!(formatted.contains("Run 2: Random: 67890"));
}
#[test]
fn test_REPL_011_003_format_multiple_differences() {
let differences = vec![
OutputDifference {
line: 1,
run1: "First: abc".to_string(),
run2: "First: xyz".to_string(),
},
OutputDifference {
line: 3,
run1: "Third: 123".to_string(),
run2: "Third: 456".to_string(),
},
];
let formatted = format_replay_diff(&differences);
assert!(formatted.contains("Line 1:"));
assert!(formatted.contains("Line 3:"));
assert!(formatted.contains("2 difference"));
}
#[test]
fn test_REPL_011_003_format_no_differences() {
let differences = vec![];
let formatted = format_replay_diff(&differences);
assert!(formatted.contains("deterministic"));
}
#[test]
fn test_REPL_011_003_format_empty_lines() {
let differences = vec![OutputDifference {
line: 5,
run1: "".to_string(),
run2: "Something appeared".to_string(),
}];
let formatted = format_replay_diff(&differences);
assert!(formatted.contains("Line 5:"));
assert!(formatted.contains("Something appeared"));
}
#[test]
fn test_REPL_011_003_replay_result_format() {
let result = ReplayResult {
is_deterministic: false,
runs: vec![
RunOutput {
run_number: 1,
stdout: "Random: 12345\n".to_string(),
stderr: String::new(),
exit_code: 0,
},
RunOutput {
run_number: 2,
stdout: "Random: 67890\n".to_string(),
stderr: String::new(),
exit_code: 0,
},
],
differences: vec![OutputDifference {
line: 1,
run1: "Random: 12345".to_string(),
run2: "Random: 67890".to_string(),
}],
};
let formatted = result.format_result();
assert!(formatted.contains("Runs: 2"));
assert!(formatted.contains("Exit codes:"));
assert!(formatted.contains("Line 1:"));
}
#[test]
fn test_REPL_011_003_deterministic_result_format() {
let result = ReplayResult {
is_deterministic: true,
runs: vec![
RunOutput {
run_number: 1,
stdout: "Constant output\n".to_string(),
stderr: String::new(),
exit_code: 0,
},
RunOutput {
run_number: 2,
stdout: "Constant output\n".to_string(),
stderr: String::new(),
exit_code: 0,
},
],
differences: vec![],
};
let formatted = result.format_result();
assert!(formatted.contains("deterministic"));
}
}
#[cfg(test)]
mod diff_property_tests {
use super::*;
use proptest::prelude::*;
proptest! {
#[test]
fn prop_REPL_011_003_format_never_panics(
num_diffs in 0usize..10,
line in 1usize..100,
) {
let differences: Vec<OutputDifference> = (0..num_diffs)
.map(|i| OutputDifference {
line: line + i,
run1: format!("run1_{}", i),
run2: format!("run2_{}", i),
})
.collect();
let _ = format_replay_diff(&differences);
}
#[test]
fn prop_REPL_011_003_format_preserves_line_numbers(
line_num in 1usize..1000,
) {
let differences = vec![OutputDifference {
line: line_num,
run1: "a".to_string(),
run2: "b".to_string(),
}];
let formatted = format_replay_diff(&differences);
prop_assert!(
formatted.contains(&format!("Line {}:", line_num)),
"Should contain line number {}: {}",
line_num,
formatted
);
}
#[test]
fn prop_REPL_011_003_empty_always_deterministic(
_any in 0..100,
) {
let formatted = format_replay_diff(&[]);
prop_assert!(
formatted.contains("deterministic"),
"Empty diff should show deterministic: {}",
formatted
);
}
}
}