package app import ( "testing" cfgpkg "github.com/jan/fm-rds-tx/internal/config" "github.com/jan/fm-rds-tx/internal/output" "github.com/jan/fm-rds-tx/internal/platform" ) func TestFaultSeverityString(t *testing.T) { cases := []struct { severity FaultSeverity want string }{ {FaultSeverityWarn, "warn"}, {FaultSeverityDegraded, "degraded"}, {FaultSeverityMuted, "muted"}, {FaultSeverityFaulted, "faulted"}, {FaultSeverity(99), "unknown"}, } for _, tc := range cases { t.Run(tc.want, func(t *testing.T) { if got := tc.severity.String(); got != tc.want { t.Fatalf("expected %s, got %s", tc.want, got) } if txt, _ := tc.severity.MarshalText(); string(txt) != tc.want { t.Fatalf("MarshalText mismatch: want %s, got %s", tc.want, txt) } }) } } func TestEngineRecordsQueueCriticalFault(t *testing.T) { e := NewEngine(cfgpkg.Default(), platform.NewSimulatedDriver(nil)) e.setRuntimeState(RuntimeStateRunning) queue := output.QueueStats{Depth: 3, Health: output.QueueHealthCritical} for i := 0; i < queueCriticalStreakThreshold; i++ { e.evaluateRuntimeState(queue, false) } last := e.LastFault() if last == nil { t.Fatal("expected fault recorded, got nil") } if last.Reason != FaultReasonQueueCritical { t.Fatalf("expected queue critical reason, got %s", last.Reason) } if last.Severity != FaultSeverityDegraded { t.Fatalf("expected degraded severity, got %s", last.Severity) } } func TestEngineRecordsLateBufferFault(t *testing.T) { e := NewEngine(cfgpkg.Default(), platform.NewSimulatedDriver(nil)) e.setRuntimeState(RuntimeStateRunning) queue := output.QueueStats{Depth: 5, Health: output.QueueHealthNormal} e.evaluateRuntimeState(queue, true) last := e.LastFault() if last == nil { t.Fatal("expected fault recorded for late buffers") } if last.Reason != FaultReasonLateBuffers { t.Fatalf("expected late buffer reason, got %s", last.Reason) } if last.Severity != FaultSeverityWarn { t.Fatalf("expected warn severity, got %s", last.Severity) } }