package app import ( "strings" "testing" "github.com/harrybrwn/patterm/internal/vt" ) func TestRenderScreenSnapshotClipsRowsToViewport(t *testing.T) { layout := newTerminalLayout(20, 5) got := string(renderScreenSnapshot("abcdefghijklmnopqrstuvwxy\nsecond", vt.CursorState{}, layout)) if strings.Contains(got, "uvwxy") { t.Fatalf("line leaked past viewport width: %q", got) } if !strings.Contains(got, "\x1b[2;1Habcdefghijklmnopqrst") { t.Fatalf("first row not drawn at viewport top: %q", got) } if !strings.Contains(got, "\x1b[3;1Hsecond ") { t.Fatalf("second row not padded in viewport: %q", got) } if !strings.Contains(got, "\x1b[4;1H ") { t.Fatalf("blank viewport row not cleared: %q", got) } } func TestRenderScreenSnapshotPlacesCursorInsideViewport(t *testing.T) { layout := newTerminalLayout(20, 5) got := string(renderScreenSnapshot("abc", vt.CursorState{Col: 2, Row: 1, Visible: true}, layout)) if !strings.HasSuffix(got, "\x1b[?25h\x1b[3;3H") { t.Fatalf("cursor not placed inside viewport: %q", got) } }