Improve D&D validation reliability

This commit is contained in:
2026-08-29 01:24:45 +00:00
parent 4da9360d74
commit 917d150279
55 changed files with 1300 additions and 565 deletions

View File

@@ -2,6 +2,7 @@ package shape
import (
"context"
"strings"
"testing"
"gitea.maximumdirect.net/eric/notarius/internal/core/source"
@@ -54,6 +55,30 @@ func TestValidatorRejectsMissingRequiredSpellFields(t *testing.T) {
}
}
func TestValidatorReportsAllSpellDefectsWithContextualGuidance(t *testing.T) {
value := dnd.SpellList{SpellCasts: []dnd.SpellCast{
{Caster: "", Spell: "Fire Bolt", SourceRefs: refsAt(4)},
{Caster: "Aria", Spell: "", SourceRefs: nil},
}}
result, err := New(Options{}).Validate(context.Background(), requestWithValue(value))
if err != nil || result.Approved {
t.Fatalf("Validate() = %#v, %v; want rejection", result, err)
}
for _, want := range []string{"spell_casts[0].caster", "spell_casts[1].spell", "spell_casts[1].source_refs"} {
if !strings.Contains(result.Message, want) {
t.Fatalf("Message = %q, want %q", result.Message, want)
}
}
for _, want := range []string{"Fire Bolt", "source unit 4", "Aria", "complete replacement"} {
if !strings.Contains(result.CorrectionGuidance, want) {
t.Fatalf("CorrectionGuidance = %q, want %q", result.CorrectionGuidance, want)
}
}
if strings.Contains(result.CorrectionGuidance, "spell_casts[") {
t.Fatalf("CorrectionGuidance exposed operator path: %q", result.CorrectionGuidance)
}
}
func TestValidatorSpecCheckpointAndRegistration(t *testing.T) {
if got := New(Options{}).CheckpointFingerprints(); len(got) != 1 || got[0].Name != "policy" || got[0].Value != policy {
t.Fatalf("CheckpointFingerprints() = %#v, want local policy", got)
@@ -77,3 +102,7 @@ func requestWithValue(value dnd.SpellList) contracts.TypedValidationRequest[dnd.
func validSpellList() dnd.SpellList {
return dnd.SpellList{SpellCasts: []dnd.SpellCast{{Caster: "Aria", Spell: "Cure Wounds", SourceRefs: []source.SourceRef{{SourceID: "session", StartUnitID: 1, EndUnitID: 1}}}}}
}
func refsAt(unitID int) []source.SourceRef {
return []source.SourceRef{{SourceID: "session", StartUnitID: unitID, EndUnitID: unitID}}
}