1package tui
2
3import (
4 "bytes"
5 "strings"
6 "testing"
7)
8
9func TestHistoryPreservesMainScreen(t *testing.T) {
10 for _, program := range []string{"", "vscode"} {
11 t.Run(program, func(t *testing.T) {
12 t.Setenv("TERM_PROGRAM", program)
13 var out bytes.Buffer
14 r := NewRenderer(&out)
15 r.Resize(80, 24)
16 chat := []string{"original transcript", "live tail"}
17 bottom := []string{"editor"}
18 r.DrawLog(chat, bottom, 0, 2)
19 out.Reset()
20 r.DrawHistory([]string{"selected turn"}, bottom, 0, 2)
21 r.Clear()
22 r.DrawHistory([]string{"another turn"}, bottom, 0, 2)
23 if strings.Count(out.String(), SeqAltScreenOn) != 1 || strings.Contains(out.String(), SeqClearScrollback) {
24 t.Fatalf("history reset native scrollback or re-entered alternate screen: %q", out.String())
25 }
26 if !strings.Contains(out.String(), "selected turn") || !strings.Contains(out.String(), "another turn") {
27 t.Fatal("history content not rendered")
28 }
29 out.Reset()
30 r.DrawLog(chat, bottom, 0, 2)
31 if out.String() != SeqAltScreenOff {
32 t.Fatalf("unchanged main screen was replayed: %q", out.String())
33 }
34 out.Reset()
35 r.DrawHistory([]string{"history"}, bottom, 0, 2)
36 out.Reset()
37 r.DrawLog(append(chat, "new streamed output"), bottom, 0, 2)
38 if !strings.HasPrefix(out.String(), SeqAltScreenOff) || !strings.Contains(out.String(), "new streamed output") || strings.Contains(out.String(), "original transcript") {
39 t.Fatalf("return from history did not append new output: %q", out.String())
40 }
41 })
42 }
43}
44
45func TestHistoryResizeAndClose(t *testing.T) {
46 var out bytes.Buffer
47 r := NewRenderer(&out)
48 r.Resize(80, 24)
49 r.DrawLog([]string{"tail"}, []string{"editor"}, 0, 0)
50 r.DrawHistory([]string{"history"}, []string{"editor"}, 0, 0)
51 out.Reset()
52 r.Resize(40, 12)
53 r.DrawHistory([]string{"resized history"}, []string{"editor"}, 0, 0)
54 if r.history.cols != 40 || r.history.rows != 12 || !strings.Contains(out.String(), "resized history") || strings.Contains(out.String(), SeqClearScrollback) {
55 t.Fatalf("history resize failed: %q", out.String())
56 }
57 out.Reset()
58 r.CloseHistory()
59 r.CloseHistory()
60 if out.String() != SeqAltScreenOff {
61 t.Fatalf("shutdown must restore main screen exactly once: %q", out.String())
62 }
63}