use std::path::Path;
use super::backend::ProofBackend;
use super::report::{ProofError, ProofReport};
pub struct FrameTextBackend;
impl ProofBackend for FrameTextBackend {
fn render(&self, report: &ProofReport, output: &Path) -> Result<(), ProofError> {
let text = report.to_annotated_text();
std::fs::write(output, text)?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::frame::TerminalFrame;
#[test]
fn frame_text_backend_produces_same_output_as_to_annotated_text() {
let frame = TerminalFrame::new(40, 5, b"Hello proof");
let mut report = ProofReport::new("consistency_check");
report.add_capture("init", "Initial state", &frame);
report.add_capture("done", "Final state", &frame);
let expected = report.to_annotated_text();
let temp_dir = tempfile::tempdir().expect("failed to create temp dir");
let output_path = temp_dir.path().join("proof.txt");
let backend = FrameTextBackend;
backend
.render(&report, &output_path)
.expect("render should succeed");
let written = std::fs::read_to_string(&output_path).expect("failed to read output");
assert_eq!(written, expected);
}
#[test]
fn frame_text_backend_writes_valid_file() {
let frame = TerminalFrame::new(80, 24, b"Test content");
let mut report = ProofReport::new("file_test");
report.add_capture("snap", "Snapshot", &frame);
report.add_assertion("snap", true, "content visible");
let temp_dir = tempfile::tempdir().expect("failed to create temp dir");
let output_path = temp_dir.path().join("proof_output.txt");
let backend = FrameTextBackend;
backend
.render(&report, &output_path)
.expect("render should succeed");
let content = std::fs::read_to_string(&output_path).expect("failed to read");
assert!(content.contains("Proof Report: file_test"));
assert!(content.contains("[PASS] content visible"));
assert!(content.contains("Test content"));
}
#[test]
fn save_dispatches_through_backend_trait() {
let frame = TerminalFrame::new(40, 5, b"dispatch test");
let mut report = ProofReport::new("dispatch");
report.add_capture("step", "Dispatch step", &frame);
let temp_dir = tempfile::tempdir().expect("failed to create temp dir");
let output_path = temp_dir.path().join("dispatched.txt");
let backend = FrameTextBackend;
report
.save(&backend, &output_path)
.expect("save should succeed");
let content = std::fs::read_to_string(&output_path).expect("failed to read");
assert!(content.contains("dispatch test"));
}
}