diff --git a/internal/pipeline/decisions_test.go b/internal/pipeline/decisions_test.go index 168c9ad..bbdf7c0 100644 --- a/internal/pipeline/decisions_test.go +++ b/internal/pipeline/decisions_test.go @@ -77,3 +77,42 @@ func TestDecideSignalActionWindowAutoDecode(t *testing.T) { t.Fatalf("expected decode window match to be set") } } + +func TestDecideSignalActionOverlappingRecordDecodeWindows(t *testing.T) { + policy := Policy{ + MonitorWindows: finalizeMonitorWindows([]MonitorWindow{ + { + Label: "record-zone", + StartHz: 100, + EndHz: 200, + CenterHz: 150, + SpanHz: 100, + AutoRecord: true, + }, + { + Label: "decode-zone", + StartHz: 140, + EndHz: 260, + CenterHz: 200, + SpanHz: 120, + AutoDecode: true, + }, + }), + } + decision := DecideSignalAction(policy, Candidate{ID: 5, CenterHz: 150}, nil) + if !decision.ShouldRecord { + t.Fatalf("expected record decision from overlapping window") + } + if !decision.ShouldAutoDecode { + t.Fatalf("expected decode decision from overlapping window") + } + if decision.RecordWindow == nil || decision.RecordWindow.Label != "record-zone" { + t.Fatalf("expected record window match to be record-zone") + } + if decision.DecodeWindow == nil || decision.DecodeWindow.Label != "decode-zone" { + t.Fatalf("expected decode window match to be decode-zone") + } + if decision.MonitorDetail == nil || decision.MonitorDetail.Label != "record-zone" { + t.Fatalf("expected record-zone to be preferred monitor detail, got %+v", decision.MonitorDetail) + } +}