use std::path::PathBuf;
use supercode::audit::{audit_dir, Corpus};
#[test]
fn fixtures_have_no_unknown_records() {
let fixtures = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures");
for (file, corpus) in [
("claude_code_session.jsonl", Corpus::ClaudeCode),
("codex_session.jsonl", Corpus::Codex),
] {
let tmp = std::env::temp_dir().join(format!(
"sc-cov-{}-{}",
std::process::id(),
file.replace('.', "_")
));
std::fs::create_dir_all(&tmp).unwrap();
std::fs::copy(fixtures.join(file), tmp.join(file)).unwrap();
let report = audit_dir(&tmp, corpus, None);
assert_eq!(report.parse_errors, 0, "{corpus:?}: typed parse errors");
let unknown: Vec<_> = report
.records
.keys()
.filter(|k| k.starts_with("<line>/"))
.collect();
assert!(
unknown.is_empty(),
"{corpus:?}: unknown record discriminants: {unknown:?}"
);
std::fs::remove_dir_all(&tmp).ok();
}
}
#[test]
#[ignore = "requires local session corpus; set SUPERCODE_CORPUS=1"]
fn corpus_subdiscriminants_are_all_known() {
if std::env::var("SUPERCODE_CORPUS").is_err() {
panic!(
"SUPERCODE_CORPUS not set — this corpus test asserts nothing without \
the maintainer's local session logs; set SUPERCODE_CORPUS=1 to run it."
);
}
let home = std::env::var("HOME").unwrap();
let known_prefixes = [
"response_item/",
"event_msg/",
"session_meta",
"turn_context",
"compacted",
"user",
"assistant",
"system/",
"attachment",
"file-history-snapshot",
"ai-title",
"permission-mode",
"mode",
"last-prompt",
"queue-operation",
"pr-link",
"agent-name",
"started",
"result",
"worktree-state",
];
let known = |k: &str| known_prefixes.iter().any(|p| k.starts_with(p));
for (sub, corpus) in [
(".claude/projects", Corpus::ClaudeCode),
(".codex/sessions", Corpus::Codex),
] {
let dir = PathBuf::from(&home).join(sub);
let report = audit_dir(&dir, corpus, Some(800));
let unknown: Vec<&String> = report
.records
.keys()
.filter(|k| !k.starts_with("<line>/") && !known(k))
.collect();
assert!(
unknown.is_empty(),
"{corpus:?}: unmodeled sub-discriminants (add handling or extend the known set): {unknown:?}"
);
}
}
#[test]
#[ignore = "requires local session corpus; set SUPERCODE_CORPUS=1"]
fn corpus_has_no_unknown_record_types() {
if std::env::var("SUPERCODE_CORPUS").is_err() {
panic!(
"SUPERCODE_CORPUS not set — this corpus test asserts nothing without \
the maintainer's local session logs; set SUPERCODE_CORPUS=1 to run it."
);
}
let home = std::env::var("HOME").unwrap();
for (sub, corpus) in [
(".claude/projects", Corpus::ClaudeCode),
(".codex/sessions", Corpus::Codex),
] {
let dir = PathBuf::from(&home).join(sub);
let report = audit_dir(&dir, corpus, Some(1500));
eprintln!(
"{corpus:?}: files={} lines={} parse_errors={}",
report.files, report.lines, report.parse_errors
);
assert_eq!(report.parse_errors, 0, "{corpus:?}: typed parse errors");
let unknown: Vec<_> = report
.records
.keys()
.filter(|k| k.starts_with("<line>/"))
.collect();
assert!(
unknown.is_empty(),
"{corpus:?}: unmodeled record discriminants found: {unknown:?}"
);
}
}