package world import ( "testing" "github.com/stretchr/testify/require" ) func TestRender_PanSmall_UsesCopyShiftAndRendersOnlyDirtyStrips(t *testing.T) { t.Parallel() w := NewWorld(10, 10) w.resetGrid(2 * SCALE) _, err := w.AddPoint(5, 5) require.NoError(t, err) _, err = w.AddCircle(2, 2, 1) require.NoError(t, err) _, err = w.AddLine(9, 5, 1, 5) require.NoError(t, err) for _, obj := range w.objects { w.indexObject(obj) } params := RenderParams{ ViewportWidthPx: 10, ViewportHeightPx: 10, MarginXPx: 4, // threshold=2 MarginYPx: 4, // threshold=2 CameraXWorldFp: 5 * SCALE, CameraYWorldFp: 5 * SCALE, CameraZoom: 1.0, } // First render initializes state (full redraw). d0 := &fakePrimitiveDrawer{} require.NoError(t, w.Render(d0, params)) // Pan right by 1 unit => dx=-1 => incremental shift expected. params2 := params params2.CameraXWorldFp += 1 * SCALE d := &fakePrimitiveDrawer{} err = w.Render(d, params2) require.NoError(t, err) // Must contain CopyShift for incremental path. require.NotEmpty(t, d.CommandsByName("CopyShift")) // All clip rects should be "small": width <= 1 for dx=-1 strip. clipCmds := d.CommandsByName("ClipRect") require.NotEmpty(t, clipCmds) for _, c := range clipCmds { wPx := int(c.Args[2]) hPx := int(c.Args[3]) require.LessOrEqual(t, wPx, 2) require.LessOrEqual(t, hPx, params2.CanvasHeightPx()) } require.NotEmpty(t, d.CommandsByName("AddPoint")) require.NotEmpty(t, d.CommandsByName("AddCircle")) require.NotEmpty(t, d.CommandsByName("AddLine")) } func TestRender_PanTooLarge_FallsBackToFullRedraw(t *testing.T) { t.Parallel() w := NewWorld(10, 10) w.resetGrid(2 * SCALE) _, err := w.AddPoint(5, 5) require.NoError(t, err) for _, obj := range w.objects { w.indexObject(obj) } params := RenderParams{ ViewportWidthPx: 10, ViewportHeightPx: 10, MarginXPx: 4, // threshold=2 MarginYPx: 4, CameraXWorldFp: 5 * SCALE, CameraYWorldFp: 5 * SCALE, CameraZoom: 1.0, } d0 := &fakePrimitiveDrawer{} require.NoError(t, w.Render(d0, params)) // Pan right by 3 units => abs(dx)=3 > threshold(2) => full redraw expected. params2 := params params2.CameraXWorldFp += 3 * SCALE d := &fakePrimitiveDrawer{} err = w.Render(d, params2) require.NoError(t, err) // Full redraw should NOT call CopyShift. require.Empty(t, d.CommandsByName("CopyShift")) // Full redraw should clear the entire canvas. require.NotEmpty(t, d.CommandsByName("ClearAllTo")) // And should draw something (at least the point). // Depending on your implementation, it might be AddPoint or AddCircle/AddLine as well. require.NotEmpty(t, d.CommandsByName("AddPoint")) }