#![allow(clippy::unwrap_used, clippy::expect_used)]
use mcp_conformance_core::requirement::Registry;
use mcp_trace_validator::reader::{Limits, parse_trace};
use mcp_trace_validator::{engine, report::Report};
fn readme() -> String {
let path = concat!(env!("CARGO_MANIFEST_DIR"), "/../../README.md");
std::fs::read_to_string(path).expect("root README exists")
}
fn fenced_block(text: &str, lang: &str, from: usize) -> String {
let open = format!("```{lang}\n");
let start = text[from..].find(&open).expect("opening fence") + from + open.len();
let end = text[start..].find("```").expect("closing fence") + start;
text[start..end].to_owned()
}
fn validate_text(trace: &str) -> Report {
let registry = Registry::builtin_2025_11_25().unwrap();
let events = parse_trace(trace, &Limits::default()).expect("README trace parses");
engine::validate(®istry, &events)
}
#[test]
fn the_inline_trace_example_produces_exactly_the_quoted_output() {
let readme = readme();
let trace = fenced_block(&readme, "jsonl", 0);
let trace_at = readme.find("```jsonl").unwrap();
let quoted = fenced_block(&readme, "text", trace_at);
let rendered = validate_text(&trace).render_human();
for line in quoted.lines().filter(|line| !line.trim().is_empty()) {
assert!(
rendered.contains(line),
"README quotes a line the validator does not produce:\n {line}\nactual output:\n{rendered}"
);
}
let report = validate_text(&trace);
assert_eq!(
report.totals.not_applicable, 6,
"the README prose explains six not-applicable rows"
);
}
#[test]
fn the_opening_example_totals_match_the_corpus_trace_it_depicts() {
let readme = readme();
let example_at = readme
.find("validate session.jsonl")
.expect("first example");
let open_at = readme[..example_at]
.rfind("```text")
.expect("opening fence before the marker");
let quoted = fenced_block(&readme, "text", open_at);
let trace_path = concat!(
env!("CARGO_MANIFEST_DIR"),
"/../../corpus/violations/life-001-first-message-not-initialize.jsonl"
);
let trace = std::fs::read_to_string(trace_path).unwrap();
let rendered = validate_text(&trace).render_human();
for line in quoted.lines().filter(|line| {
line.contains("seq 0:") || line.starts_with("totals:") || line.starts_with("verdict:")
}) {
assert!(
rendered.contains(line),
"README's opening example quotes a line the validator does not produce for \
the life-001 trace:\n {line}\nactual output:\n{rendered}"
);
}
}