Harden diagnostic handling and warning presentation

This commit is contained in:
2026-08-27 18:41:59 +00:00
parent 1025001f20
commit 079d5af337
67 changed files with 518 additions and 318 deletions

View File

@@ -16,7 +16,7 @@ import (
func TestValidatorApprovesNormalizedCombatTurns(t *testing.T) {
result, err := New(Options{}).Validate(context.Background(), contracts.TypedValidationRequest[dnd.CombatTurnList]{Source: invariantDocument(), Value: normalizedList()})
if err != nil || !result.Approved {
t.Fatalf("Validate() = %#v, %v; want approval without warnings", result, err)
t.Fatalf("Validate() = %#v, %v; want approval without diagnostics", result, err)
}
}

View File

@@ -15,7 +15,7 @@ import (
func TestValidatorApprovesWellFormedCombatTurnList(t *testing.T) {
result, err := New(Options{}).Validate(context.Background(), contracts.TypedValidationRequest[dnd.CombatTurnList]{Value: validCombatTurnList()})
if err != nil || !result.Approved {
t.Fatalf("Validate() = %#v, %v; want approval without warnings", result, err)
t.Fatalf("Validate() = %#v, %v; want approval without diagnostics", result, err)
}
}

View File

@@ -86,7 +86,7 @@ func TestValidatorDefersMalformedShape(t *testing.T) {
value := dnd.CombatTurnList{CombatTurns: []dnd.CombatTurn{{Actor: "Aria"}}}
result, err := New(Options{}).Validate(context.Background(), contracts.TypedValidationRequest[dnd.CombatTurnList]{Source: validDocument(), Value: value})
if err != nil || !result.Approved {
t.Fatalf("shape deferral = %#v, %v; want approval without source warning", result, err)
t.Fatalf("shape deferral = %#v, %v; want approval without diagnostics", result, err)
}
}

View File

@@ -50,13 +50,13 @@ func (v *Validator) Validate(_ context.Context, req contracts.TypedValidationReq
}
citedTexts[turnIndex] = citedText
}
warnings := make([]diagnostics.Finding, 0)
findings := make([]diagnostics.Finding, 0)
for turnIndex, turn := range req.Value.CombatTurns {
citedText := citedTexts[turnIndex]
if actorAppearsInCitedText(citedText, turn.Actor) {
continue
}
warnings = append(warnings, diagnostics.Finding{
findings = append(findings, diagnostics.Finding{
Scope: fmt.Sprintf("combat_turns[%d]", turnIndex),
ReasonCode: ReasonCode,
Message: diagnostics.Aggregate("combat turn not near source", []string{
@@ -64,7 +64,7 @@ func (v *Validator) Validate(_ context.Context, req contracts.TypedValidationReq
}),
})
}
return diagnostics.DataQualityResult(warnings)
return diagnostics.DataQualityResult(findings)
}
func actorAppearsInCitedText(citedText string, actor string) bool {
return shared.ContainsTokenSequence(citedText, actor)

View File

@@ -46,7 +46,7 @@ func TestValidatorWarnsOncePerTurnForUnrelatedActor(t *testing.T) {
}
}
func TestValidatorLimitsUnrelatedActorWarnings(t *testing.T) {
func TestValidatorLimitsUnrelatedActorAdvisories(t *testing.T) {
turns := make([]dnd.CombatTurn, contracts.MaxDiagnosticSamples+2)
for index := range turns {
turns[index] = dnd.CombatTurn{