use std::fs::{File, OpenOptions};
use std::io::{BufRead, BufReader, Seek, SeekFrom, Write};
use std::path::Path;
use std::thread;
use std::time::Duration;
const TRACE_SINK: &str = "affi_trace_sink.log";
const TARGET_TEST: &str = "tests/autogen_tdd_witness.rs";
fn main() -> anyhow::Result<()> {
println!("1000X TDD SYNTHESIZER: Starting watcher...");
println!("Sink: {}", TRACE_SINK);
println!("Target: {}", TARGET_TEST);
let _ = File::create(TRACE_SINK)?;
ensure_test_header()?;
let file = File::open(TRACE_SINK)?;
let mut reader = BufReader::new(file);
let mut pos = 0;
loop {
let mut line = String::new();
let len = reader.read_line(&mut line)?;
if len > 0 {
if let Some((op, target)) = parse_span(&line) {
println!("Captured span: {} -> {}", op, target);
synthesize_test(op, target)?;
}
pos += len as u64;
reader.get_mut().seek(SeekFrom::Start(pos))?;
} else {
thread::sleep(Duration::from_millis(500));
}
}
}
fn parse_span(line: &str) -> Option<(&str, &str)> {
let parts: Vec<&str> = line.trim().split('|').collect();
if parts.len() == 2 {
Some((parts[0], parts[1]))
} else {
None
}
}
fn ensure_test_header() -> anyhow::Result<()> {
if !Path::new(TARGET_TEST).exists() {
let header = r#"// AUTOGENERATED by Zero-Config TDD Synthesizer
// Matching exact execution paths captured from OTel traces.
use crate::admission::admit;
use crate::cli::show;
use chicago_tdd_tools::{assert_ok, assert_in_range};
"#;
std::fs::write(TARGET_TEST, header)?;
}
Ok(())
}
fn synthesize_test(operation: &str, target: &str) -> anyhow::Result<()> {
let test_name = format!("autogen_test_{}_{}",
operation,
target.replace('.', "_").replace('/', "_").replace('-', "_")
);
let test_case = match operation {
"verify" => format!(
r#"
#[test]
fn {}() {{
// Captured execution path: verify({})
let receipt_path = "{}";
let receipt = show(receipt_path).expect("load receipt for test");
// Assert: admission law holds for this captured path
let result = admit(receipt);
assert_ok!(result, "captured path must be admissible");
}}
"#,
test_name, target, target
),
"emit" => format!(
r#"
#[test]
fn {}() {{
// Captured execution path: emit({})
// Witness that an event of this type was emitted.
assert_in_range!(1, 1, 1, "emission path witnessed");
}}
"#,
test_name, target
),
_ => format!(
r#"
#[test]
fn {}() {{
// Generic captured span: {} -> {}
assert_ok!(Ok::<(), &str>(()), "span witnessed");
}}
"#,
test_name, operation, target
),
};
let mut file = OpenOptions::new()
.append(true)
.open(TARGET_TEST)?;
file.write_all(test_case.as_bytes())?;
Ok(())
}