use super::*;
fn gen_file(rel: &str, content: &str) -> crate::core::backend::GeneratedFile {
crate::core::backend::GeneratedFile {
path: std::path::PathBuf::from(rel),
content: content.to_string(),
generated_header: true,
}
}
fn gen_file_unheadered(rel: &str, content: &str) -> crate::core::backend::GeneratedFile {
crate::core::backend::GeneratedFile {
path: std::path::PathBuf::from(rel),
content: content.to_string(),
generated_header: false,
}
}
#[test]
fn drifted_marked_paths_reports_a_marked_file_whose_body_no_longer_matches() {
let dir = tempfile::tempdir().expect("tempdir");
let old_file = gen_file("lib.rs", "pub fn greet() -> &'static str { \"old\" }\n");
let old_rendered = crate::cli::commands::adopt::managed_outputs(std::slice::from_ref(&old_file), dir.path());
std::fs::write(dir.path().join("lib.rs"), &old_rendered[0].content).unwrap();
let files = vec![gen_file("lib.rs", "pub fn greet() -> &'static str { \"new\" }\n")];
let drifted = drifted_marked_paths(&files, dir.path());
assert_eq!(
drifted,
vec![dir.path().join("lib.rs").display().to_string()],
"a marked file whose source changed since it was last written must be reported drifted"
);
}
#[test]
fn drifted_marked_paths_is_silent_once_the_marked_file_matches_the_fresh_render() {
let dir = tempfile::tempdir().expect("tempdir");
let file = gen_file("lib.rs", "pub fn greet() -> &'static str { \"new\" }\n");
let rendered = crate::cli::commands::adopt::managed_outputs(std::slice::from_ref(&file), dir.path());
std::fs::write(dir.path().join("lib.rs"), &rendered[0].content).unwrap();
let files = vec![file];
assert!(drifted_marked_paths(&files, dir.path()).is_empty());
}
#[test]
fn drifted_marked_paths_ignores_a_file_that_carries_no_marker_at_all() {
let dir = tempfile::tempdir().expect("tempdir");
std::fs::write(dir.path().join("lib.rs"), "pub fn greet() {}\n").unwrap();
let files = vec![gen_file("lib.rs", "pub fn greet() { /* changed */ }\n")];
assert!(drifted_marked_paths(&files, dir.path()).is_empty());
}
#[test]
fn drifted_marked_paths_does_not_check_an_extension_poly_fmt_can_still_reformat() {
let dir = tempfile::tempdir().expect("tempdir");
let header = crate::core::hash::header(crate::core::hash::CommentStyle::Hash);
std::fs::write(
dir.path().join("pyproject.toml"),
format!("{header}\n[project]\nname=\"old\"\n"),
)
.unwrap();
let files = vec![gen_file("pyproject.toml", "[project]\nname=\"new\"\n")];
assert!(
drifted_marked_paths(&files, dir.path()).is_empty(),
"TOML (and every other extension `normalize_content` does not fully normalize) is out of \
scope for this check until it can predict poly fmt's final bytes"
);
}
#[test]
fn drifted_marked_paths_reports_a_self_marking_file_whose_body_no_longer_matches() {
let dir = tempfile::tempdir().expect("tempdir");
let header = crate::core::hash::header(crate::core::hash::CommentStyle::DoubleSlash);
std::fs::write(
dir.path().join("reference.md"),
format!("{header}Describes `greet`, which says hi.\n"),
)
.unwrap();
let files = vec![gen_file_unheadered(
"reference.md",
&format!("{header}Describes `greet`, which says hi warmly.\n"),
)];
let drifted = drifted_marked_paths(&files, dir.path());
assert_eq!(
drifted,
vec![dir.path().join("reference.md").display().to_string()],
"a self-marking file (marker baked into content, generated_header: false) whose body \
changed must still be reported drifted"
);
}
#[test]
fn drifted_marked_paths_is_silent_once_a_self_marking_file_matches() {
let dir = tempfile::tempdir().expect("tempdir");
let header = crate::core::hash::header(crate::core::hash::CommentStyle::DoubleSlash);
let content = format!("{header}Describes `greet`, which says hi warmly.\n");
std::fs::write(dir.path().join("reference.md"), &content).unwrap();
let files = vec![gen_file_unheadered("reference.md", &content)];
assert!(drifted_marked_paths(&files, dir.path()).is_empty());
}