package video import ( "strings" "testing" "mxl-pattern-generator/internal/flowdef" ) const testVideoID = "b3bb5be7-9fe9-4324-a5bb-4c70e1084449" func testConfig(t *testing.T, overlay OverlayConfig) Config { t.Helper() definition, err := flowdef.NewV210Video( testVideoID, 1920, 1080, flowdef.Rational{Numerator: 50, Denominator: 1}, ) if err != nil { t.Fatalf("NewV210Video: %v", err) } return Config{Definition: definition, Pattern: "ebu75", Overlay: overlay} } func TestBuildTextOverlayDisabled(t *testing.T) { overlay, err := buildTextOverlay(testConfig(t, OverlayConfig{})) if err != nil { t.Fatalf("buildTextOverlay: %v", err) } if overlay != nil { t.Fatal("buildTextOverlay returned an overlay for empty text") } } func TestBuildTextOverlayPositioning(t *testing.T) { tests := []struct { name string overlay OverlayConfig }{ {name: "explicit", overlay: OverlayConfig{Text: "MXL", X: 120, Y: 48}}, {name: "preset", overlay: OverlayConfig{Text: "MXL", Position: "cc"}}, {name: "preset ignores explicit coordinates", overlay: OverlayConfig{Text: "MXL", X: -1, Y: -1, Position: "cc"}}, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { overlay, err := buildTextOverlay(testConfig(t, tc.overlay)) if err != nil { t.Fatalf("buildTextOverlay: %v", err) } if overlay == nil { t.Fatal("buildTextOverlay returned nil") } }) } } func TestBuildTextOverlayRejectsInvalidPosition(t *testing.T) { tests := []struct { name string overlay OverlayConfig wantErrSub string }{ {name: "negative", overlay: OverlayConfig{Text: "MXL", X: -6}, wantErrSub: "must not be negative"}, {name: "unaligned x", overlay: OverlayConfig{Text: "MXL", X: 7}, wantErrSub: "divisible by 6"}, {name: "right overflow", overlay: OverlayConfig{Text: "MXL", X: 1902}, wantErrSub: "does not fit"}, {name: "bottom overflow", overlay: OverlayConfig{Text: "MXL", Y: 1070}, wantErrSub: "does not fit"}, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { _, err := buildTextOverlay(testConfig(t, tc.overlay)) if err == nil || !strings.Contains(err.Error(), tc.wantErrSub) { t.Fatalf("error = %v, want substring %q", err, tc.wantErrSub) } }) } }