use super::VerifyCoverage;
use crate::bin_cli::verify_scan::ScanCoverage;
use std::collections::HashSet;
use std::path::PathBuf;
fn paths(directory: &std::path::Path, names: &[&str]) -> HashSet<PathBuf> {
names.iter().map(|name| directory.join(name)).collect()
}
#[test]
fn managed_paths_split_into_verified_present_and_absent() {
let directory = tempfile::tempdir().expect("temporary project");
std::fs::write(directory.path().join("stamped.toml"), "x\n").expect("seed");
std::fs::write(directory.path().join("unmarked.json"), "{}\n").expect("seed");
let managed = paths(directory.path(), &["stamped.toml", "unmarked.json", "never_written.rs"]);
let marked = paths(directory.path(), &["stamped.toml"]);
let coverage = VerifyCoverage::measure(&managed, &marked, ScanCoverage::default(), 0, 0);
assert_eq!(coverage.managed_total, 3);
assert_eq!(coverage.managed_content_verified, 1);
assert_eq!(coverage.managed_present_only, 1);
assert_eq!(coverage.managed_absent, 1);
assert_eq!(
coverage.managed_content_verified + coverage.managed_present_only + coverage.managed_absent,
coverage.managed_total,
"the three buckets must partition the managed surface, or the report understates its own gap"
);
}
#[test]
fn marked_files_outside_the_surface_are_counted_separately() {
let directory = tempfile::tempdir().expect("temporary project");
let managed = paths(directory.path(), &["a.rs"]);
let marked = paths(directory.path(), &["a.rs", "legacy_visitor.py"]);
let coverage = VerifyCoverage::measure(&managed, &marked, ScanCoverage::default(), 0, 0);
assert_eq!(coverage.marked_outside_surface, 1);
assert_eq!(coverage.managed_total, 1);
}
#[test]
fn report_states_that_presence_only_paths_are_not_content_checked() {
let coverage = VerifyCoverage {
managed_total: 10,
managed_content_verified: 4,
managed_present_only: 5,
managed_absent: 1,
marked_outside_surface: 2,
files_opened: 40,
files_unexamined: 900,
create_once_unmarked: 0,
ephemeral_excluded: 0,
};
let report = coverage.report_lines().join("\n");
assert!(report.contains("content-verified"), "{report}");
assert!(
report.contains("present-but-wrong file passes"),
"the report must say what a presence-only check fails to catch: {report}"
);
assert!(
report.contains("never examined"),
"the report must account for files the walk never opened: {report}"
);
for number in ["10", "4", "5", "40", "900", "2"] {
assert!(
report.contains(number),
"every measured count must reach the report, missing {number}: {report}"
);
}
}
#[test]
fn report_is_emitted_even_when_nothing_is_outside_the_surface() {
let coverage = VerifyCoverage {
managed_total: 3,
managed_content_verified: 3,
..VerifyCoverage::default()
};
let lines = coverage.report_lines();
assert_eq!(lines.len(), 6, "no orphan or seed line when neither applies: {lines:?}");
assert!(lines[0].contains("Verify coverage"));
}
#[test]
fn report_states_create_once_seeds_as_coverage_not_as_drift() {
let coverage = VerifyCoverage {
managed_total: 100,
managed_present_only: 72,
create_once_unmarked: 72,
..VerifyCoverage::default()
};
let report = coverage.report_lines().join("\n");
assert!(
report.contains("72 are create-once seeds"),
"the seed count must survive the removal of the frozen heading: {report}"
);
assert!(
report.contains("not drift"),
"a user-owned seed must not be described as drift: {report}"
);
assert!(
!report.contains("clobber"),
"verify must not point a user at --clobber-create-once-seeds for a file it never rewrites: {report}"
);
}
#[test]
fn report_omits_the_seed_line_when_there_are_no_seeds() {
let report = VerifyCoverage::default().report_lines().join("\n");
assert!(!report.contains("create-once seeds with no marker"), "{report}");
}