mod binary;
mod create_once_seeds;
mod npmrc_marker;
mod ownership_record;
use super::*;
use crate::core::backend::GeneratedFile;
use crate::core::hash::content_has_alef_marker;
fn managed(relative: &str, content: &str, generated_header: bool, base: &Path) -> Vec<ManagedOutput> {
managed_outputs(
&[GeneratedFile {
path: PathBuf::from(relative),
content: content.to_owned(),
generated_header,
}],
base,
)
}
fn seed(base: &Path, relative: &str, content: &str) -> PathBuf {
let full = base.join(relative);
std::fs::create_dir_all(full.parent().expect("parent")).expect("mkdir");
std::fs::write(&full, content).expect("seed");
full
}
fn options(base: &Path, target: &str, write: bool) -> AdoptOptions {
AdoptOptions {
target: target.to_owned(),
base_dir: base.to_path_buf(),
write,
converged_only: false,
clobber_create_once_seeds: false,
}
}
fn converged_only(base: &Path, target: &str) -> AdoptOptions {
AdoptOptions {
converged_only: true,
..options(base, target, true)
}
}
fn clobbering_seeds(base: &Path, target: &str) -> AdoptOptions {
AdoptOptions {
clobber_create_once_seeds: true,
..options(base, target, true)
}
}
fn previewing_seeds(base: &Path, target: &str) -> AdoptOptions {
AdoptOptions {
write: false,
..clobbering_seeds(base, target)
}
}
fn mixed_rail_fixture(base: &Path) -> (PathBuf, PathBuf, Vec<ManagedOutput>) {
let gemspec = seed(
base,
"packages/ruby/liter_llm.gemspec",
"Gem::Specification.new do |spec|\n spec.version = \"0.1.0\"\nend\n",
);
let suite = seed(base, "packages/zig/test/liter_llm_test.zig", HAND_GROWN_ZIG_SUITE);
let outputs = managed_outputs(
&[
GeneratedFile {
path: PathBuf::from("packages/ruby/liter_llm.gemspec"),
content: "Gem::Specification.new do |spec|\n spec.version = \"0.2.0\"\nend\n".to_owned(),
generated_header: true,
},
GeneratedFile {
path: PathBuf::from("packages/zig/test/liter_llm_test.zig"),
content: PLACEHOLDER_ZIG_SEED.to_owned(),
generated_header: false,
},
],
base,
);
(gemspec, suite, outputs)
}
const PLACEHOLDER_ZIG_SEED: &str =
"const std = @import(\"std\");\ntest \"smoke\" {\n try std.testing.expect(true);\n}\n";
const HAND_GROWN_ZIG_SUITE: &str = "const std = @import(\"std\");\nconst api = @import(\"liter_llm.zig\");\n\ntest \"chat completion round trip\" {\n try std.testing.expect(api.chat() != null);\n}\n\ntest \"list models\" {\n try std.testing.expect(api.models().len > 0);\n}\n";
fn snippet_with_marker(body: &str) -> String {
crate::docs::with_html_header(
format!("---\ntitle: \"Example\"\nid: fixture_python_example\n---\n\n{body}\n"),
"alef e2e generate",
)
}
fn snippet_without_marker(body: &str) -> String {
format!("---\ntitle: \"Example\"\nid: fixture_python_example\n---\n\n{body}\n")
}
#[test]
fn drifted_manifest_that_never_carried_a_marker_is_adopted_under_write() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
let on_disk = "[package]\nname = \"crawlberg-ffi\"\n\n[dependencies]\nlibc = \"0.2\"\n";
let target = seed(base, "crates/crawlberg-ffi/Cargo.toml", on_disk);
let generated = "[package]\nname = \"crawlberg-ffi\"\n\n[dependencies]\nlibc = \"0.2\"\nserde = \"1\"\n";
let outputs = managed("crates/crawlberg-ffi/Cargo.toml", generated, true, base);
let report = run(&options(base, "crates/crawlberg-ffi/Cargo.toml", true), &outputs).expect("adopt");
let after = std::fs::read_to_string(&target).expect("read after");
assert!(
content_has_alef_marker(&after),
"adoption must leave a marker the guard will recognise, got:\n{after}"
);
assert_eq!(report.adopted, vec![PathBuf::from("crates/crawlberg-ffi/Cargo.toml")]);
assert_eq!(report.diffs.len(), 1);
assert_eq!(report.diffs[0].state, AdoptionState::Drifted);
}
#[test]
fn adopting_a_drifted_file_stamps_it_without_replacing_a_single_body_line() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
let on_disk = "[package]\nname = \"hand-tuned\"\n\n[dependencies]\nlibc = \"0.2\"\n";
let target = seed(base, "crates/sample-ffi/Cargo.toml", on_disk);
let generated = "[package]\nname = \"regenerated\"\n\n[dependencies]\nserde = \"1\"\n";
let outputs = managed("crates/sample-ffi/Cargo.toml", generated, true, base);
run(&options(base, "crates/sample-ffi/Cargo.toml", true), &outputs).expect("adopt");
let after = std::fs::read_to_string(&target).expect("read after");
assert_eq!(
after,
crate::cli::pipeline::ensure_generated_header(&target, on_disk),
"adoption must be exactly the on-disk bytes plus a header -- nothing else may change"
);
assert!(
after.contains("hand-tuned") && !after.contains("regenerated"),
"adopt must never write generated content -- that is the clobber this guard exists to prevent, got:\n{after}"
);
}
#[test]
fn a_divergent_file_produces_a_full_diff_showing_both_sides() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
seed(
base,
"crates/sample-ffi/Cargo.toml",
"[package]\nname = \"hand-tuned\"\n",
);
let outputs = managed(
"crates/sample-ffi/Cargo.toml",
"[package]\nname = \"regenerated\"\n",
true,
base,
);
let report = run(&options(base, "crates/sample-ffi/Cargo.toml", false), &outputs).expect("adopt preview");
assert_eq!(report.diffs.len(), 1, "a divergent file must produce a diff");
let body = &report.diffs[0].body;
assert!(
body.contains("-name = \"hand-tuned\""),
"the diff must show the line adoption puts at risk, got:\n{body}"
);
assert!(
body.contains("+name = \"regenerated\""),
"the diff must show the line that would replace it, got:\n{body}"
);
assert_eq!(report.drifted().count(), 1, "divergence must be reported as drift");
}
#[test]
fn preview_run_prints_a_diff_and_leaves_the_file_completely_untouched() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
let on_disk = "[package]\nname = \"hand-tuned\"\n";
let target = seed(base, "crates/sample-ffi/Cargo.toml", on_disk);
let outputs = managed(
"crates/sample-ffi/Cargo.toml",
"[package]\nname = \"regenerated\"\n",
true,
base,
);
let report = run(&options(base, "crates/sample-ffi/Cargo.toml", false), &outputs).expect("adopt preview");
assert_eq!(
std::fs::read_to_string(&target).expect("read after"),
on_disk,
"a preview must leave the file byte-for-byte untouched"
);
assert!(report.preview);
assert!(report.adopted.is_empty(), "a preview must adopt nothing");
assert!(!report.diffs.is_empty(), "a preview must still produce the diff");
}
#[test]
fn converged_file_is_summarised_without_a_diff_and_still_requires_write() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
let body = "[package]\nname = \"sample-ffi\"\n";
let target = seed(base, "crates/sample-ffi/Cargo.toml", body);
let outputs = managed("crates/sample-ffi/Cargo.toml", body, true, base);
let preview = run(&options(base, "crates/sample-ffi/Cargo.toml", false), &outputs).expect("preview");
assert_eq!(preview.converged, vec![PathBuf::from("crates/sample-ffi/Cargo.toml")]);
assert!(
preview.diffs.is_empty(),
"a converged file must not require a per-file diff read, got {} diff(s)",
preview.diffs.len()
);
assert_eq!(
std::fs::read_to_string(&target).expect("read after preview"),
body,
"even a converged file is not stamped without --write"
);
let applied = run(&options(base, "crates/sample-ffi/Cargo.toml", true), &outputs).expect("apply");
assert_eq!(applied.adopted.len(), 1);
assert!(content_has_alef_marker(
&std::fs::read_to_string(&target).expect("read after write")
));
}
#[test]
fn frozen_e2e_snippet_is_converged_and_adopted_by_stamping_not_by_a_record_entry() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
let relative = "docs/snippets/python/api/example.md";
let target = seed(base, relative, &snippet_without_marker("example()"));
let outputs = managed(relative, &snippet_with_marker("example()"), false, base);
let report = run(&options(base, relative, true), &outputs).expect("adopt");
assert_eq!(report.converged, vec![PathBuf::from(relative)]);
assert!(report.diffs.is_empty(), "a marker-only difference is not drift");
let after = std::fs::read_to_string(&target).expect("read after");
assert!(
content_has_alef_marker(&after),
"the guard proves ownership from the marker in the file, got:\n{after}"
);
assert!(
after.starts_with("---\n"),
"the marker must land after the YAML front matter, not before it, got:\n{after}"
);
assert!(
report.recorded_unstampable.is_empty(),
"a stampable snippet must not consume an entry in the committed ownership record"
);
assert!(
!base.join(".alef-ownership.toml").exists(),
"12k snippet adoptions must not each take a line in a committed manifest"
);
}
#[test]
fn a_self_marked_non_markdown_file_with_an_unchanged_body_converges_not_drifts() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
let body = "struct Foo {\n let x: Int\n}\n";
let marker = "// Generated by alef. Do not edit by hand.\n";
let target = seed(base, "Sources/Foo.swift", body);
let outputs = managed("Sources/Foo.swift", &format!("{marker}{body}"), false, base);
let report = run(&options(base, "Sources/Foo.swift", false), &outputs).expect("adopt preview");
assert!(
report.diffs.is_empty(),
"a header-only difference is not drift -- the printed diff would show no changed body \
line, which is exactly the phantom this test closes: {:?}",
report.diffs
);
assert_eq!(report.converged, vec![PathBuf::from("Sources/Foo.swift")]);
let applied = run(&options(base, "Sources/Foo.swift", true), &outputs).expect("adopt");
assert_eq!(applied.adopted, vec![PathBuf::from("Sources/Foo.swift")]);
let after = std::fs::read_to_string(&target).expect("read after");
assert_eq!(
after, outputs[0].content,
"adoption must stamp the backend's own marker, not a generic default header that a \
subsequent `alef generate` would immediately overwrite again"
);
}
#[test]
fn a_self_marked_non_markdown_file_with_a_changed_body_still_drifts() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
let marker = "// Generated by alef. Do not edit by hand.\n";
seed(base, "Sources/Foo.swift", "struct Foo {\n let x: Int\n}\n");
let outputs = managed(
"Sources/Foo.swift",
&format!("{marker}struct Foo {{\n let x: Int\n let y: Int\n}}\n"),
false,
base,
);
let report = run(&options(base, "Sources/Foo.swift", false), &outputs).expect("adopt preview");
assert_eq!(
report.diffs.len(),
1,
"a real body change must still be reported as drift"
);
assert_eq!(report.diffs[0].state, AdoptionState::Drifted);
assert!(
report.diffs[0].body.contains("+ let y: Int"),
"the diff must show the real added line, got:\n{}",
report.diffs[0].body
);
}
#[test]
fn stamped_snippet_is_byte_identical_to_generated_output() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
let relative = "docs/snippets/python/api/example.md";
let generated = snippet_with_marker("example()");
let target = seed(base, relative, &snippet_without_marker("example()"));
let outputs = managed(relative, &generated, false, base);
run(&options(base, relative, true), &outputs).expect("adopt");
assert_eq!(
std::fs::read_to_string(&target).expect("read after"),
outputs[0].content,
"adoption must land the exact bytes the next generate writes, or the file is still not converged"
);
}
#[test]
fn an_adopted_snippet_is_regenerable_on_a_checkout_with_no_alef_cache_at_all() {
let relative = PathBuf::from("docs/snippets/python/api/example.md");
let generated = snippet_with_marker("example()");
let updated = snippet_with_marker("updated_example()");
let regenerate_over = |existing: &str, adopt_first: bool| {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
let target = seed(base, "docs/snippets/python/api/example.md", existing);
if adopt_first {
let outputs = managed("docs/snippets/python/api/example.md", &generated, false, base);
run(&options(base, "docs/snippets/python/api/example.md", true), &outputs).expect("adopt");
}
assert!(
!base.join(".alef").exists(),
"no cache may exist for this to mean anything"
);
assert!(
!base.join(".alef-ownership.toml").exists(),
"the marker, not the record, must be what proves ownership here"
);
let report = crate::cli::pipeline::write_scaffold_files_report(
&[GeneratedFile {
path: relative.clone(),
content: updated.clone(),
generated_header: false,
}],
base,
true,
)
.expect("write report");
(
report.changed_paths.contains(&target),
report.refused_paths.contains(&target),
std::fs::read_to_string(&target).expect("still readable"),
)
};
let (written, refused, content) = regenerate_over(&snippet_without_marker("example()"), true);
assert!(written, "an adopted snippet must be regenerable");
assert!(!refused);
assert!(content.contains("updated_example()"));
let (control_written, control_refused, control_content) =
regenerate_over(&snippet_without_marker("example()"), false);
assert!(!control_written, "without the adoption the guard must still refuse");
assert!(control_refused);
assert!(
control_content.contains("example()") && !control_content.contains("updated_example()"),
"a refused write must leave the file untouched"
);
}
#[test]
fn converged_only_adopts_the_converged_set_and_refuses_to_sweep_a_drifted_file() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
let clean = seed(base, "docs/snippets/python/api/a.md", &snippet_without_marker("a()"));
let hand_edited = snippet_without_marker("hand_written_by_a_person()");
let edited = seed(base, "docs/snippets/python/api/b.md", &hand_edited);
let outputs = managed_outputs(
&[
GeneratedFile {
path: PathBuf::from("docs/snippets/python/api/a.md"),
content: snippet_with_marker("a()"),
generated_header: false,
},
GeneratedFile {
path: PathBuf::from("docs/snippets/python/api/b.md"),
content: snippet_with_marker("b()"),
generated_header: false,
},
],
base,
);
let report = run(&converged_only(base, "docs/snippets/**/*.md"), &outputs).expect("adopt");
assert_eq!(report.converged, vec![PathBuf::from("docs/snippets/python/api/a.md")]);
assert_eq!(
report.adopted,
vec![PathBuf::from("docs/snippets/python/api/a.md")],
"only the converged file may be adopted"
);
assert_eq!(
report.skipped_drifted,
vec![PathBuf::from("docs/snippets/python/api/b.md")]
);
assert!(content_has_alef_marker(
&std::fs::read_to_string(&clean).expect("read converged")
));
assert_eq!(
std::fs::read_to_string(&edited).expect("read drifted"),
hand_edited,
"a drifted file must survive --converged-only untouched -- it may be a deliberate hand-edit"
);
assert_eq!(report.diffs.len(), 1, "the drifted file still gets its full diff");
assert!(
report.diffs[0].body.contains("-hand_written_by_a_person()"),
"the skipped file's diff must still show what adoption would put at risk, got:\n{}",
report.diffs[0].body
);
}
#[test]
fn bulk_write_over_a_mixed_glob_never_adopts_a_drifted_file_without_producing_its_diff() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
seed(base, "docs/snippets/python/api/a.md", &snippet_without_marker("a()"));
seed(
base,
"docs/snippets/python/api/b.md",
&snippet_without_marker("hand_written()"),
);
let outputs = managed_outputs(
&[
GeneratedFile {
path: PathBuf::from("docs/snippets/python/api/a.md"),
content: snippet_with_marker("a()"),
generated_header: false,
},
GeneratedFile {
path: PathBuf::from("docs/snippets/python/api/b.md"),
content: snippet_with_marker("b()"),
generated_header: false,
},
],
base,
);
let report = run(&options(base, "docs/snippets/**/*.md", true), &outputs).expect("adopt");
assert_eq!(report.adopted.len(), 2);
assert!(report.skipped_drifted.is_empty());
let drifted: Vec<PathBuf> = report.drifted().map(|diff| diff.relative.clone()).collect();
assert_eq!(
drifted,
vec![PathBuf::from("docs/snippets/python/api/b.md")],
"every drifted adoption must be accompanied by its own rendered diff"
);
}
#[test]
fn a_mixed_glob_adopts_the_marker_rail_and_excludes_the_create_once_seed_by_name() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
let (gemspec, suite, outputs) = mixed_rail_fixture(base);
let report = run(&options(base, "packages/**", true), &outputs).expect("adopt");
assert_eq!(
report.skipped_create_once,
vec![PathBuf::from("packages/zig/test/liter_llm_test.zig")],
"the create-once seed must be excluded and reported by path, not as a count"
);
assert_eq!(
report.adopted,
vec![PathBuf::from("packages/ruby/liter_llm.gemspec")],
"the marker-rail file must still be adopted; excluding it would break the command"
);
assert_eq!(
std::fs::read_to_string(&suite).expect("read suite"),
HAND_GROWN_ZIG_SUITE,
"an excluded seed must be left byte-identical"
);
assert!(
!std::fs::read_to_string(&suite).expect("read suite").contains("alef"),
"an excluded seed must not be stamped, or the next generate replaces it"
);
assert!(
std::fs::read_to_string(&gemspec)
.expect("read gemspec")
.contains("alef"),
"the adopted gemspec must carry its marker"
);
}
#[test]
fn clobber_create_once_seeds_adopts_the_seed_it_otherwise_refuses() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
let (_gemspec, suite, outputs) = mixed_rail_fixture(base);
let report = run(&clobbering_seeds(base, "packages/**"), &outputs).expect("adopt");
assert!(
report.skipped_create_once.is_empty(),
"nothing may be excluded once the operator has opted in: {:?}",
report.skipped_create_once
);
assert_eq!(
report.adopted,
vec![
PathBuf::from("packages/ruby/liter_llm.gemspec"),
PathBuf::from("packages/zig/test/liter_llm_test.zig"),
],
"both rails must be adopted under --clobber-create-once-seeds"
);
let after = std::fs::read_to_string(&suite).expect("read suite");
assert!(
after.contains("chat completion round trip"),
"adoption stamps and preserves content; it must not replace the suite here: {after}"
);
}
#[test]
fn a_path_alef_does_not_generate_is_refused() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
seed(base, "src/main.rs", "fn main() {}\n");
let outputs = managed("crates/sample-ffi/Cargo.toml", "[package]\n", true, base);
let error = run(&options(base, "src/main.rs", true), &outputs).expect_err("must refuse");
assert!(
error.to_string().contains("no alef-managed output matches"),
"unexpected error: {error}"
);
assert_eq!(
std::fs::read_to_string(base.join("src/main.rs")).expect("read after"),
"fn main() {}\n",
"a refused target must be left untouched"
);
}
#[test]
fn already_marked_file_is_reported_as_owned_and_produces_no_diff() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
let marked = format!(
"{}[package]\nname = \"sample-ffi\"\n",
crate::core::hash::header(crate::core::hash::CommentStyle::Hash)
);
seed(base, "crates/sample-ffi/Cargo.toml", &marked);
let outputs = managed(
"crates/sample-ffi/Cargo.toml",
"[package]\nname = \"other\"\n",
true,
base,
);
let report = run(&options(base, "crates/sample-ffi/Cargo.toml", true), &outputs).expect("adopt");
assert_eq!(
report.already_owned,
vec![PathBuf::from("crates/sample-ffi/Cargo.toml")]
);
assert!(report.diffs.is_empty());
assert!(report.adopted.is_empty());
}
#[test]
fn unstampable_format_is_adopted_through_the_durable_record_instead() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
let on_disk = "{\n \"name\": \"sample\"\n}\n";
let target = seed(base, "packages/node/package.json", on_disk);
assert!(!crate::cli::cache::is_scaffold_owned_path(base, &target));
let outputs = managed(
"packages/node/package.json",
"{\n \"name\": \"sample\",\n \"version\": \"2\"\n}\n",
true,
base,
);
let report = run(&options(base, "packages/node/package.json", true), &outputs).expect("adopt");
assert_eq!(
std::fs::read_to_string(&target).expect("read after"),
on_disk,
"an unstampable file's bytes must not change: the record carries the ownership proof"
);
assert!(crate::cli::cache::is_scaffold_owned_path(base, &target));
assert_eq!(
report.recorded_unstampable,
vec![PathBuf::from("packages/node/package.json")]
);
std::fs::remove_dir_all(base.join(".alef")).ok();
assert!(
base.join(".alef-ownership.toml").exists(),
"adoption must leave its proof in a file the operator can commit"
);
assert!(
crate::cli::cache::is_scaffold_owned_path(base, &target),
"an adoption must survive into a checkout that never had the adopting machine's cache"
);
}
#[test]
fn glob_target_diffs_every_match_before_adopting_any_of_them() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
seed(base, "crates/a-ffi/Cargo.toml", "[package]\nname = \"a\"\n");
seed(base, "crates/b-ffi/Cargo.toml", "[package]\nname = \"b\"\n");
let outputs = managed_outputs(
&[
GeneratedFile {
path: PathBuf::from("crates/a-ffi/Cargo.toml"),
content: "[package]\nname = \"a\"\nedition = \"2024\"\n".to_owned(),
generated_header: true,
},
GeneratedFile {
path: PathBuf::from("crates/b-ffi/Cargo.toml"),
content: "[package]\nname = \"b\"\nedition = \"2024\"\n".to_owned(),
generated_header: true,
},
],
base,
);
let report = run(&options(base, "crates/*-ffi/Cargo.toml", true), &outputs).expect("adopt");
assert_eq!(report.diffs.len(), 2, "every match must be diffed");
assert_eq!(report.adopted.len(), 2);
for diff in &report.diffs {
assert!(
diff.body.contains("+edition = \"2024\""),
"each match needs its own real diff, got:\n{}",
diff.body
);
}
}
#[test]
fn target_matching_only_absent_output_is_refused_with_generate_guidance() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
let outputs = managed("crates/sample-ffi/Cargo.toml", "[package]\n", true, base);
let error = run(&options(base, "crates/sample-ffi/Cargo.toml", true), &outputs).expect_err("must refuse");
assert!(
error.to_string().contains("nothing exists on disk yet"),
"unexpected error: {error}"
);
assert!(!base.join("crates/sample-ffi/Cargo.toml").exists());
}
#[test]
fn the_snippet_coverage_ledger_is_not_a_create_once_seed() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
let relative = Path::new("docs/snippets").join(crate::e2e::snippets::COVERAGE_MANIFEST);
let outputs = managed_outputs(
&[GeneratedFile {
path: relative,
content: "{\n \"format_version\": 2,\n \"generated_paths\": []\n}\n".to_owned(),
generated_header: false,
}],
base,
);
assert_eq!(outputs.len(), 1);
assert!(
!outputs[0].create_once,
"the coverage ledger is pure derived output alef owns outright, not a human-grown seed"
);
}
#[test]
fn an_unmarkable_hand_editable_seed_stays_a_create_once_seed() {
let dir = tempfile::tempdir().expect("tempdir");
let outputs = managed(
"packages/php/composer.json",
"{\n \"name\": \"vendor/generated\"\n}\n",
false,
dir.path(),
);
assert!(
outputs[0].create_once,
"an unmarkable file outside alef's derived-output registry is still a seed: widening the \
property to every unmarkable path is a licence to clobber hand-written manifests"
);
}
#[test]
fn adopt_still_refuses_an_unmarkable_hand_editable_seed_under_a_plain_write() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
let hand_written = "{\n \"name\": \"vendor/hand-written\",\n \"require\": {\"ext-json\": \"*\"}\n}\n";
let target = seed(base, "packages/php/composer.json", hand_written);
let outputs = managed(
"packages/php/composer.json",
"{\n \"name\": \"vendor/generated\"\n}\n",
false,
base,
);
let error = run(&options(base, "packages/php/composer.json", true), &outputs).expect_err("must refuse");
assert!(
error.to_string().contains("--clobber-create-once-seeds"),
"the refusal must point at the deliberate opt-in, got: {error}"
);
assert_eq!(
std::fs::read_to_string(&target).expect("read after"),
hand_written,
"a refused seed's bytes must be untouched"
);
assert!(
!crate::cli::cache::is_scaffold_owned_path(base, &target),
"and no ownership claim may be recorded for it either"
);
}
#[test]
fn a_genuine_create_once_seed_is_still_classified_as_create_once() {
let dir = tempfile::tempdir().expect("tempdir");
let outputs = managed(
"packages/zig/test/liter_llm_test.zig",
PLACEHOLDER_ZIG_SEED,
false,
dir.path(),
);
assert!(
outputs[0].create_once,
"a genuine human-grown seed must remain create-once, or --clobber-create-once-seeds \
stops protecting anything"
);
}
#[test]
fn adopt_does_not_refuse_the_snippet_coverage_ledger() {
let dir = tempfile::tempdir().expect("tempdir");
let base = dir.path();
let relative = Path::new("docs/snippets").join(crate::e2e::snippets::COVERAGE_MANIFEST);
let on_disk = "{\n \"format_version\": 2,\n \"generated_paths\": [\"a\"]\n}\n";
seed(base, relative.to_str().expect("utf8 path"), on_disk);
let generated = "{\n \"format_version\": 2,\n \"generated_paths\": [\"a\", \"b\"]\n}\n";
let outputs = managed_outputs(
&[GeneratedFile {
path: relative.clone(),
content: generated.to_owned(),
generated_header: false,
}],
base,
);
let report = run(&options(base, relative.to_str().expect("utf8 path"), true), &outputs).expect("adopt");
assert!(
report.skipped_create_once.is_empty(),
"the ledger must never be excluded as a create-once seed: {:?}",
report.skipped_create_once
);
assert_eq!(
report.already_owned,
vec![relative],
"the write guard already accepts this path unconditionally by name, so adopt must \
report it already owned rather than offering it as a pending adoption decision"
);
assert!(
report.adopted.is_empty(),
"a file with nothing to adopt must never appear in the adopted list: {:?}",
report.adopted
);
}
#[test]
fn a_self_marked_file_whose_body_was_truncated_is_drifted_not_converged() {
let dir = tempfile::tempdir().unwrap();
let full = dir.path().join("Probe.swift");
let generated = "// Code generated by alef. DO NOT EDIT.\nfunc a() {}\nfunc b() {}\n";
let existing = "func b() {}\n";
let candidate = super::classify(dir.path(), &full, Path::new("Probe.swift"), generated, existing, false);
assert_eq!(
candidate.state,
super::AdoptionState::Drifted,
"half the body is missing, so the suffix match must not be read as convergence"
);
}
#[test]
fn an_emptied_self_marked_file_is_drifted_not_converged() {
let dir = tempfile::tempdir().unwrap();
let full = dir.path().join("Probe2.swift");
let generated = "// Code generated by alef. DO NOT EDIT.\nfunc a() {}\n";
let candidate = super::classify(dir.path(), &full, Path::new("Probe2.swift"), generated, "", false);
assert_eq!(
candidate.state,
super::AdoptionState::Drifted,
"every string ends with the empty string; an emptied file has not converged"
);
}