78 lines
2.2 KiB
Go
78 lines
2.2 KiB
Go
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)
|
|
}
|
|
})
|
|
}
|
|
}
|