//go:build !windows
// +build !windows
package term
import (
"os"
"reflect"
"testing"
cpty "github.com/creack/pty"
)
func newTTYForTest(t *testing.T) *os.File {
t.Helper()
pty, tty, err := cpty.Open()
if err != nil {
t.Fatalf("error creating pty: %v", err)
} else {
t.Cleanup(func() {
_ = pty.Close()
_ = tty.Close()
})
}
return pty
}
func newTempFile(t *testing.T) *os.File {
t.Helper()
tmpFile, err := os.CreateTemp(t.TempDir(), "temp")
if err != nil {
t.Fatalf("error creating tempfile: %v", err)
} else {
t.Cleanup(func() { _ = tmpFile.Close() })
}
return tmpFile
}
func TestGetWinsize(t *testing.T) {
tty := newTTYForTest(t)
winSize, err := GetWinsize(tty.Fd())
if err != nil {
t.Error(err)
}
if winSize == nil {
t.Fatal("winSize is nil")
}
newSize := Winsize{Width: 200, Height: 200, x: winSize.x, y: winSize.y}
err = SetWinsize(tty.Fd(), &newSize)
if err != nil {
t.Fatal(err)
}
winSize, err = GetWinsize(tty.Fd())
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(*winSize, newSize) {
t.Fatalf("expected: %+v, got: %+v", newSize, *winSize)
}
}
func TestSetWinsize(t *testing.T) {
tty := newTTYForTest(t)
winSize, err := GetWinsize(tty.Fd())
if err != nil {
t.Fatal(err)
}
if winSize == nil {
t.Fatal("winSize is nil")
}
newSize := Winsize{Width: 200, Height: 200, x: winSize.x, y: winSize.y}
err = SetWinsize(tty.Fd(), &newSize)
if err != nil {
t.Fatal(err)
}
winSize, err = GetWinsize(tty.Fd())
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(*winSize, newSize) {
t.Fatalf("expected: %+v, got: %+v", newSize, *winSize)
}
}
func TestGetFdInfo(t *testing.T) {
tty := newTTYForTest(t)
inFd, isTerminal := GetFdInfo(tty)
if inFd != tty.Fd() {
t.Errorf("expected: %d, got: %d", tty.Fd(), inFd)
}
if !isTerminal {
t.Error("expected isTerminal to be true")
}
tmpFile := newTempFile(t)
inFd, isTerminal = GetFdInfo(tmpFile)
if inFd != tmpFile.Fd() {
t.Errorf("expected: %d, got: %d", tty.Fd(), inFd)
}
if isTerminal {
t.Error("expected isTerminal to be false")
}
}
func TestIsTerminal(t *testing.T) {
tty := newTTYForTest(t)
isTerminal := IsTerminal(tty.Fd())
if !isTerminal {
t.Fatalf("expected isTerminal to be true")
}
tmpFile := newTempFile(t)
isTerminal = IsTerminal(tmpFile.Fd())
if isTerminal {
t.Fatalf("expected isTerminal to be false")
}
}
func TestSaveState(t *testing.T) {
tty := newTTYForTest(t)
state, err := SaveState(tty.Fd())
if err != nil {
t.Error(err)
}
if state == nil {
t.Fatal("state is nil")
}
tty = newTTYForTest(t)
err = RestoreTerminal(tty.Fd(), state)
if err != nil {
t.Fatal(err)
}
}
func TestDisableEcho(t *testing.T) {
tty := newTTYForTest(t)
state, err := SetRawTerminal(tty.Fd())
defer RestoreTerminal(tty.Fd(), state)
if err != nil {
t.Error(err)
}
if state == nil {
t.Fatal("state is nil")
}
err = DisableEcho(tty.Fd(), state)
if err != nil {
t.Fatal(err)
}
}