rendering tests fixed

This commit is contained in:
Dmitry Sergeev
2026-09-16 23:58:45 +03:00
parent 6fa3dea391
commit eeb13c3bd4
6 changed files with 159 additions and 120 deletions
+76 -30
View File
@@ -1,8 +1,8 @@
package generator
import (
"encoding/binary"
"path/filepath"
"strings"
"testing"
"golang.org/x/image/font"
@@ -32,11 +32,8 @@ func TestNewTextOverlay(t *testing.T) {
if o.x%6 != 0 {
t.Fatalf("x=%d not a multiple of 6", o.x)
}
if center := o.x + o.w/2; center < frameW/2-3 || center > frameW/2+3 {
t.Fatalf("box center %d not near frame center %d", center, frameW/2)
}
if o.y != 48 {
t.Fatalf("y=%d, want 48", o.y)
if o.x != 0 || o.y != 0 {
t.Fatalf("position = (%d,%d), want (0,0)", o.x, o.y)
}
if o.blocks == nil || len(o.blocks) != o.h*(o.w/6)*16 {
t.Fatalf("pre-packed tile has wrong size")
@@ -87,6 +84,78 @@ func TestNewTextOverlay(t *testing.T) {
}
}
func TestNewTextOverlayPositioning(t *testing.T) {
const frameW, frameH = 1920, 1080
face := testFace(t, 48)
t.Run("explicit", func(t *testing.T) {
o, err := NewTextOverlay("AB", frameW, frameH, 120, 48, "", face)
if err != nil {
t.Fatalf("NewTextOverlay: %v", err)
}
if o.x != 120 || o.y != 48 {
t.Fatalf("position = (%d,%d), want (120,48)", o.x, o.y)
}
})
for _, tc := range []struct {
name string
pos string
want func(*TextOverlay) bool
}{
{name: "top center", pos: "tc", want: func(o *TextOverlay) bool {
return o.x%6 == 0 && absInt((o.x+o.w/2)-frameW/2) <= 3 && o.y == 0
}},
{name: "center", pos: "cc", want: func(o *TextOverlay) bool {
return o.x%6 == 0 && absInt((o.x+o.w/2)-frameW/2) <= 3 && o.y == (frameH-o.h)/2
}},
{name: "bottom right", pos: "br", want: func(o *TextOverlay) bool {
return o.x+o.w == frameW && o.y+o.h == frameH
}},
} {
t.Run(tc.name, func(t *testing.T) {
o, err := NewTextOverlay("AB", frameW, frameH, 0, 0, tc.pos, face)
if err != nil {
t.Fatalf("NewTextOverlay: %v", err)
}
if !tc.want(o) {
t.Fatalf("unexpected %s position: box=(%d,%d %dx%d)", tc.pos, o.x, o.y, o.w, o.h)
}
})
}
}
func TestNewTextOverlayRejectsInvalidPosition(t *testing.T) {
const frameW, frameH = 1920, 1080
face := testFace(t, 48)
tests := []struct {
name string
x, y int
wantErrSub string
}{
{name: "unaligned x", x: 7, y: 0, wantErrSub: "divisible by 6"},
{name: "negative x", x: -6, y: 0, wantErrSub: "must not be negative"},
{name: "right overflow", x: 1902, y: 0, wantErrSub: "does not fit"},
{name: "bottom overflow", x: 0, y: 1070, wantErrSub: "does not fit"},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
_, err := NewTextOverlay("AB", frameW, frameH, tc.x, tc.y, "", face)
if err == nil || !strings.Contains(err.Error(), tc.wantErrSub) {
t.Fatalf("error = %v, want substring %q", err, tc.wantErrSub)
}
})
}
}
func absInt(v int) int {
if v < 0 {
return -v
}
return v
}
func TestTextOverlayApplyV210(t *testing.T) {
const frameW, frameH = 1920, 1080
o, err := NewTextOverlay("MXL", frameW, frameH, 0, 0, "", testFace(t, 48))
@@ -102,34 +171,11 @@ func TestTextOverlayApplyV210(t *testing.T) {
t.Fatalf("ApplyV210: %v", err)
}
sample := func(x, y int) (yc, cb, cr uint32) {
p := y*frameW + x
off := (p / 6) * 16
w0 := binary.LittleEndian.Uint32(frame[off:])
w1 := binary.LittleEndian.Uint32(frame[off+4:])
w2 := binary.LittleEndian.Uint32(frame[off+8:])
w3 := binary.LittleEndian.Uint32(frame[off+12:])
switch p % 6 {
case 0:
return (w0 >> 10) & 0x3FF, w0 & 0x3FF, (w0 >> 20) & 0x3FF
case 1:
return w1 & 0x3FF, w0 & 0x3FF, (w0 >> 20) & 0x3FF
case 2:
return (w1 >> 20) & 0x3FF, (w1 >> 10) & 0x3FF, w2 & 0x3FF
case 3:
return (w2 >> 10) & 0x3FF, (w1 >> 10) & 0x3FF, w2 & 0x3FF
case 4:
return w3 & 0x3FF, (w2 >> 20) & 0x3FF, (w3 >> 10) & 0x3FF
default:
return (w3 >> 20) & 0x3FF, (w2 >> 20) & 0x3FF, (w3 >> 10) & 0x3FF
}
}
// Every box pixel: Y from coverage, neutral chroma at even columns.
for row := 0; row < o.h; row++ {
for col := 0; col < o.w; col++ {
wantY := uint32(64 + (int(o.cov[row*o.w+col])*876+127)/255)
yc, cb, cr := sample(o.x+col, o.y+row)
yc, cb, cr := sampleV210(frame, frameW, o.x+col, o.y+row)
if yc != wantY {
t.Fatalf("box pixel (%d,%d): Y=%d, want %d", o.x+col, o.y+row, yc, wantY)
}