package domain import ( "strings" "testing" ) func TestValidateOutputContract(t *testing.T) { valid := OutputContract{ Format: FormatText, ValidationMode: ValidationNone, } tests := []struct { name string change func(*OutputContract) wantErr string }{ {name: "text format", change: func(c *OutputContract) { c.Format = FormatText }}, {name: "markdown format", change: func(c *OutputContract) { c.Format = FormatMarkdown }}, {name: "json format", change: func(c *OutputContract) { c.Format = FormatJSON }}, {name: "empty format", change: func(c *OutputContract) { c.Format = "" }, wantErr: "format"}, {name: "unsupported format", change: func(c *OutputContract) { c.Format = OutputFormat("binary") }, wantErr: "format"}, {name: "none validation", change: func(c *OutputContract) { c.ValidationMode = ValidationNone }}, {name: "basic validation", change: func(c *OutputContract) { c.ValidationMode = ValidationBasic }}, {name: "json validation", change: func(c *OutputContract) { c.ValidationMode = ValidationJSON }}, {name: "json schema validation", change: func(c *OutputContract) { c.ValidationMode = ValidationJSONSchema c.SchemaPath = "schema.json" }}, {name: "empty validation mode", change: func(c *OutputContract) { c.ValidationMode = "" }, wantErr: "validation mode"}, {name: "unsupported validation mode", change: func(c *OutputContract) { c.ValidationMode = ValidationMode("unknown") }, wantErr: "validation mode"}, {name: "negative repair attempts", change: func(c *OutputContract) { c.ValidationMode = ValidationBasic c.RepairAttempts = -1 }, wantErr: "repair_attempts"}, {name: "zero repair attempts", change: func(c *OutputContract) { c.RepairAttempts = 0 }}, {name: "one repair attempt", change: func(c *OutputContract) { c.ValidationMode = ValidationBasic c.RepairAttempts = 1 }}, {name: "maximum repair attempts", change: func(c *OutputContract) { c.ValidationMode = ValidationJSON c.RepairAttempts = 3 }}, {name: "too many repair attempts", change: func(c *OutputContract) { c.ValidationMode = ValidationJSONSchema c.SchemaPath = "schema.json" c.RepairAttempts = 4 }, wantErr: "repair_attempts"}, {name: "none validation with repair attempts", change: func(c *OutputContract) { c.ValidationMode = ValidationNone c.RepairAttempts = 1 }, wantErr: "repair_attempts"}, {name: "json schema empty path", change: func(c *OutputContract) { c.ValidationMode = ValidationJSONSchema c.SchemaPath = "" }, wantErr: "schema_path"}, {name: "json schema whitespace path", change: func(c *OutputContract) { c.ValidationMode = ValidationJSONSchema c.SchemaPath = " \t " }, wantErr: "schema_path"}, {name: "json schema nonblank path", change: func(c *OutputContract) { c.ValidationMode = ValidationJSONSchema c.SchemaPath = " schema.json " }}, {name: "non-schema empty path", change: func(c *OutputContract) { c.SchemaPath = "" }}, {name: "non-schema populated path", change: func(c *OutputContract) { c.SchemaPath = "ignored.json" }}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { contract := valid tt.change(&contract) err := ValidateOutputContract(contract) if tt.wantErr == "" { if err != nil { t.Fatalf("validate output contract: %v", err) } return } if err == nil || !strings.Contains(err.Error(), tt.wantErr) { t.Fatalf("error = %v, want diagnostic containing %q", err, tt.wantErr) } }) } }