replaced explicit masterfeats/feat base+lock path branches

This commit is contained in:
2026-05-13 20:14:27 +02:00
parent 4b55628ac8
commit 4fd0375608
3 changed files with 147 additions and 50 deletions
+35
View File
@@ -79,6 +79,41 @@ func TestValidateAndBuildDerivesFeatOutputWhenOmitted(t *testing.T) {
}
}
func TestValidateProjectRejectsInvalidFeatInvariantContract(t *testing.T) {
root := testProjectRoot(t)
mkdirAll(t, filepath.Join(root, "topdata", "data", "feat"))
writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n")
writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{
"output": "masterfeats.2da",
"columns": ["LABEL", "FEAT", "DESCRIPTION"],
"rows": [
{
"id": 0,
"key": "masterfeats:test",
"LABEL": "FEAT_TEST",
"FEAT": "100",
"DESCRIPTION": "200"
}
]
}`+"\n")
writeFile(t, filepath.Join(root, "topdata", "data", "feat", "lock.json"), `{"masterfeats:test":0}`+"\n")
report := ValidateProject(testProject(root))
if !report.HasErrors() {
t.Fatal("expected validation errors for invalid feat invariants")
}
text := diagnosticsText(report.Diagnostics)
for _, want := range []string{
"feat output must be feat.2da",
`feat row 0 key "masterfeats:test" must start with feat:`,
`feat lock key "masterfeats:test" must start with feat:`,
} {
if !strings.Contains(text, want) {
t.Fatalf("expected validation message %q, got:\n%s", want, text)
}
}
}
func TestValidateProjectRejectsDuplicateJSONKeys(t *testing.T) {
root := testProjectRoot(t)
mkdirAll(t, filepath.Join(root, "topdata", "data", "repadjust"))