use std::path::PathBuf;
use std::time::{SystemTime, UNIX_EPOCH};
use supercode_interchange::ChatMessage;
use supercode_reduce::{invert_messages, project_messages, ReductionLog, ReductionPolicy};
fn unique_temp_file(label: &str) -> PathBuf {
let nonce = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_nanos();
std::env::temp_dir().join(format!(
"supercode-reduce-{label}-{}-{nonce}.json",
std::process::id()
))
}
#[test]
fn reduction_log_and_canonical_sidecar_invert_after_disk_reload() {
let original = vec![ChatMessage::tool_result(
"call-1",
"shell",
"byte-exact-output\n".repeat(2_000),
)];
let policy = ReductionPolicy {
tool_output_trigger_bytes: 128,
tool_output_keep_bytes: 32,
protect_last_n_tool_results: 0,
..ReductionPolicy::default()
};
let (reduced, log) = project_messages(&original, &policy, &ReductionLog::default());
assert!(!log.reductions.is_empty());
assert!(
reduced[0].content.as_ref().unwrap().len() < original[0].content.as_ref().unwrap().len()
);
let sidecar_path = unique_temp_file("sidecar");
let log_path = unique_temp_file("log");
std::fs::write(&sidecar_path, serde_json::to_vec(&original).unwrap()).unwrap();
std::fs::write(&log_path, serde_json::to_vec(&log).unwrap()).unwrap();
let reloaded_sidecar: Vec<ChatMessage> =
serde_json::from_slice(&std::fs::read(&sidecar_path).unwrap()).unwrap();
let reloaded_log: ReductionLog =
serde_json::from_slice(&std::fs::read(&log_path).unwrap()).unwrap();
let restored = invert_messages(&reduced, &reloaded_log, &reloaded_sidecar).unwrap();
assert_eq!(restored, original);
std::fs::remove_file(sidecar_path).unwrap();
std::fs::remove_file(log_path).unwrap();
}