...
1
2
3
4 package term
5
6 import (
7 "os"
8 "reflect"
9 "testing"
10
11 cpty "github.com/creack/pty"
12 )
13
14 func newTTYForTest(t *testing.T) *os.File {
15 t.Helper()
16 pty, tty, err := cpty.Open()
17 if err != nil {
18 t.Fatalf("error creating pty: %v", err)
19 } else {
20 t.Cleanup(func() {
21 _ = pty.Close()
22 _ = tty.Close()
23 })
24 }
25
26 return pty
27 }
28
29 func newTempFile(t *testing.T) *os.File {
30 t.Helper()
31 tmpFile, err := os.CreateTemp(t.TempDir(), "temp")
32 if err != nil {
33 t.Fatalf("error creating tempfile: %v", err)
34 } else {
35 t.Cleanup(func() { _ = tmpFile.Close() })
36 }
37 return tmpFile
38 }
39
40 func TestGetWinsize(t *testing.T) {
41 tty := newTTYForTest(t)
42 winSize, err := GetWinsize(tty.Fd())
43 if err != nil {
44 t.Error(err)
45 }
46 if winSize == nil {
47 t.Fatal("winSize is nil")
48 }
49
50 newSize := Winsize{Width: 200, Height: 200, x: winSize.x, y: winSize.y}
51 err = SetWinsize(tty.Fd(), &newSize)
52 if err != nil {
53 t.Fatal(err)
54 }
55 winSize, err = GetWinsize(tty.Fd())
56 if err != nil {
57 t.Fatal(err)
58 }
59 if !reflect.DeepEqual(*winSize, newSize) {
60 t.Fatalf("expected: %+v, got: %+v", newSize, *winSize)
61 }
62 }
63
64 func TestSetWinsize(t *testing.T) {
65 tty := newTTYForTest(t)
66 winSize, err := GetWinsize(tty.Fd())
67 if err != nil {
68 t.Fatal(err)
69 }
70 if winSize == nil {
71 t.Fatal("winSize is nil")
72 }
73 newSize := Winsize{Width: 200, Height: 200, x: winSize.x, y: winSize.y}
74 err = SetWinsize(tty.Fd(), &newSize)
75 if err != nil {
76 t.Fatal(err)
77 }
78 winSize, err = GetWinsize(tty.Fd())
79 if err != nil {
80 t.Fatal(err)
81 }
82 if !reflect.DeepEqual(*winSize, newSize) {
83 t.Fatalf("expected: %+v, got: %+v", newSize, *winSize)
84 }
85 }
86
87 func TestGetFdInfo(t *testing.T) {
88 tty := newTTYForTest(t)
89 inFd, isTerminal := GetFdInfo(tty)
90 if inFd != tty.Fd() {
91 t.Errorf("expected: %d, got: %d", tty.Fd(), inFd)
92 }
93 if !isTerminal {
94 t.Error("expected isTerminal to be true")
95 }
96 tmpFile := newTempFile(t)
97 inFd, isTerminal = GetFdInfo(tmpFile)
98 if inFd != tmpFile.Fd() {
99 t.Errorf("expected: %d, got: %d", tty.Fd(), inFd)
100 }
101 if isTerminal {
102 t.Error("expected isTerminal to be false")
103 }
104 }
105
106 func TestIsTerminal(t *testing.T) {
107 tty := newTTYForTest(t)
108 isTerminal := IsTerminal(tty.Fd())
109 if !isTerminal {
110 t.Fatalf("expected isTerminal to be true")
111 }
112 tmpFile := newTempFile(t)
113 isTerminal = IsTerminal(tmpFile.Fd())
114 if isTerminal {
115 t.Fatalf("expected isTerminal to be false")
116 }
117 }
118
119 func TestSaveState(t *testing.T) {
120 tty := newTTYForTest(t)
121 state, err := SaveState(tty.Fd())
122 if err != nil {
123 t.Error(err)
124 }
125 if state == nil {
126 t.Fatal("state is nil")
127 }
128 tty = newTTYForTest(t)
129 err = RestoreTerminal(tty.Fd(), state)
130 if err != nil {
131 t.Fatal(err)
132 }
133 }
134
135 func TestDisableEcho(t *testing.T) {
136 tty := newTTYForTest(t)
137 state, err := SetRawTerminal(tty.Fd())
138 defer RestoreTerminal(tty.Fd(), state)
139 if err != nil {
140 t.Error(err)
141 }
142 if state == nil {
143 t.Fatal("state is nil")
144 }
145 err = DisableEcho(tty.Fd(), state)
146 if err != nil {
147 t.Fatal(err)
148 }
149 }
150
View as plain text