Fix deliberate deletion reuse

This commit is contained in:
2026-05-14 12:54:09 +02:00
parent 393e9a4e59
commit c9e2b9fdc4
2 changed files with 239 additions and 0 deletions
+92
View File
@@ -8335,6 +8335,98 @@ func TestBuildGeneratedSkillFocusUsesOverriddenCanonicalSkillKey(t *testing.T) {
}
}
func TestFeatGeneratedContextIgnoresExplicitlyRetiredFeatKeys(t *testing.T) {
root := testProjectRoot(t)
writeFeatGeneratedHarness(t, root, map[string]string{
"skill_focus.json": `{
"family": "skill_focus",
"family_key": "skill_focus",
"template": "masterfeats:skillfocus",
"name_prefix": "Skill Focus",
"label_prefix": "FEAT_SKILL_FOCUS",
"constant_prefix": "FEAT_SKILL_FOCUS",
"default_fields": {
"CRValue": "0.5",
"ReqSkillMinRanks": "1",
"ALLCLASSESCANUSE": "1",
"TOOLSCATEGORIES": "6",
"PreReqEpic": "0",
"ReqAction": "1"
},
"apply_after_modules": true,
"child_ref_field": "REQSKILL",
"child_source": {
"dataset": "skills",
"predicate": "accessible"
}
}` + "\n",
}, map[string]int{
"feat:skill_focus_intimidate": 916,
"feat:epic_skill_focus_intimidate": 918,
})
writeFile(t, filepath.Join(root, "topdata", "data", "skills", "base.json"), `{
"output": "skills.2da",
"columns": ["Label", "Name", "Description", "Icon", "Untrained", "KeyAbility", "ArmorCheckPenalty", "AllClassesCanUse", "Category", "MaxCR", "Constant", "HostileSkill", "HideFromLevelUp"],
"rows": [
{"id": 18, "key": "skills:intimidate", "Label": "Intimidate", "Name": "8756", "Description": "8786", "Icon": "isk_x2inti", "Untrained": "1", "KeyAbility": "CHA", "ArmorCheckPenalty": "0", "AllClassesCanUse": "1", "Category": "****", "MaxCR": "****", "Constant": "SKILL_INTIMIDATE", "HostileSkill": "0", "HideFromLevelUp": "0"}
]
}`+"\n")
writeFile(t, filepath.Join(root, "topdata", "data", "skills", "lock.json"), `{"skills:intimidate":18}`+"\n")
writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{
"output": "feat.2da",
"compare_reference": false,
"columns": [
"LABEL","FEAT","DESCRIPTION","ICON","MINATTACKBONUS","MINSTR","MINDEX","MININT","MINWIS","MINCON","MINCHA",
"MINSPELLLVL","PREREQFEAT1","PREREQFEAT2","GAINMULTIPLE","EFFECTSSTACK","ALLCLASSESCANUSE","CATEGORY","MAXCR",
"SPELLID","SUCCESSOR","CRValue","USESPERDAY","MASTERFEAT","TARGETSELF","OrReqFeat0","OrReqFeat1","OrReqFeat2",
"OrReqFeat3","OrReqFeat4","REQSKILL","ReqSkillMinRanks","REQSKILL2","ReqSkillMinRanks2","Constant","TOOLSCATEGORIES",
"HostileFeat","MinLevel","MinLevelClass","MaxLevel","MinFortSave","PreReqEpic","ReqAction"
],
"rows": [
{"id": 916, "key": "feat:skill_focus_intimidate", "LABEL": "FEAT_SKILL_FOCUS_INTIMIDATE", "REQSKILL": 24, "MASTERFEAT": 4, "Constant": "FEAT_SKILL_FOCUS_INTIMIDATE"},
{"id": 918, "key": "feat:epic_skill_focus_intimidate", "LABEL": "FEAT_EPIC_SKILL_FOCUS_INTIMIDATE", "REQSKILL": 24, "MASTERFEAT": 15, "Constant": "FEAT_EPIC_SKILL_FOCUS_INTIMIDATE"}
]
}`+"\n")
mkdirAll(t, filepath.Join(root, "topdata", "data", "feat", "modules", "removedandhidden"))
writeFile(t, filepath.Join(root, "topdata", "data", "feat", "modules", "removedandhidden", "rmv_feat_intimidate.json"), `{
"overrides": [
{"id": 916, "null": true, "key": null},
{"id": 918, "null": true, "key": null}
]
}`+"\n")
datasets, err := discoverNativeDatasets(filepath.Join(root, "topdata", "data"))
if err != nil {
t.Fatalf("discoverNativeDatasets failed: %v", err)
}
var featDataset nativeDataset
found := false
for _, dataset := range datasets {
if dataset.Name == "feat" {
featDataset = dataset
found = true
break
}
}
if !found {
t.Fatal("expected feat dataset to be discovered")
}
lockData, err := loadLockfile(featDataset.LockPath)
if err != nil {
t.Fatalf("load feat lock failed: %v", err)
}
ctx, err := newFeatGeneratedContext(featDataset, lockData)
if err != nil {
t.Fatalf("newFeatGeneratedContext failed: %v", err)
}
if ctx.featKeyExists("feat:skill_focus_intimidate") {
t.Fatal("expected explicitly retired feat key to be absent from existing feat set")
}
if _, ok := ctx.lockData["feat:skill_focus_intimidate"]; ok {
t.Fatalf("expected explicitly retired feat key to be absent from generated lock view, got %#v", ctx.lockData)
}
}
func TestOverrideRequestsNullRowUsesExplicitNullFlag(t *testing.T) {
if overrideRequestsNullRow(map[string]any{"key": nil}) {
t.Fatal("key: null should not blank a row")