Bound D&D normalization diagnostics

This commit is contained in:
2026-08-09 02:22:23 +00:00
parent a705ba74a1
commit 2a75f40871
8 changed files with 218 additions and 30 deletions

View File

@@ -15,6 +15,7 @@ import (
"gitea.maximumdirect.net/eric/notarius/internal/modules/dnd"
npccodec "gitea.maximumdirect.net/eric/notarius/internal/modules/dnd/codec/npcregistry"
"gitea.maximumdirect.net/eric/notarius/internal/modules/dnd/npcs/identity"
"gitea.maximumdirect.net/eric/notarius/internal/modules/dnd/shared/diagnostics"
)
func TestNormalizeCanonicalizesFieldsAndRegistryIdentities(t *testing.T) {
@@ -59,6 +60,40 @@ func TestNormalizeCanonicalizesFieldsAndRegistryIdentities(t *testing.T) {
}
}
func TestNormalizeLimitsWarningsWithoutChangingCombatTurnValues(t *testing.T) {
units := make([]source.SourceUnit, diagnostics.MaxWarnings+1)
turns := make([]dnd.CombatTurn, len(units))
for index := range units {
unitID := index + 1
units[index] = source.SourceUnit{ID: unitID}
turns[index] = validTurn(" Aria ", source.SourceRef{SourceID: "session", StartUnitID: unitID, EndUnitID: unitID})
}
normalizer, err := New(Options{})
if err != nil {
t.Fatal(err)
}
result, err := normalizer.Normalize(context.Background(), contracts.TypedNormalizeRequest[dnd.CombatTurnList]{
Source: &source.SourceDocument{ID: "session", Units: units},
MergeOutput: contracts.MergeArtifact[dnd.CombatTurnList]{Value: dnd.CombatTurnList{CombatTurns: turns}},
})
if err != nil {
t.Fatalf("Normalize() error = %v", err)
}
if len(result.Value.CombatTurns) != len(turns) || result.Value.CombatTurns[0].Actor != "Aria" {
t.Fatalf("normalized turns = %#v, want canonicalized values", result.Value.CombatTurns)
}
if len(result.Warnings) != diagnostics.MaxWarnings {
t.Fatalf("warning count = %d, want %d", len(result.Warnings), diagnostics.MaxWarnings)
}
if first := result.Warnings[0]; first.Scope != "combat_turns[0]" || first.ReasonCode != ReasonCodeActorCanonicalized {
t.Fatalf("first warning = %#v, want first input warning", first)
}
summary := result.Warnings[len(result.Warnings)-1]
if summary.Scope != "combat_turns" || summary.ReasonCode != ReasonCodeWarningsOmitted || summary.Message != "2 additional warning(s) omitted" {
t.Fatalf("warning summary = %#v", summary)
}
}
func TestNormalizeResolvesOperationNPCOverrideWithoutSingletonMetadata(t *testing.T) {
doc := testDocument()
normalizer, err := New(Options{})