diff --git a/exec_test.go b/exec_test.go index c603c7ed8b..dc0b6faa97 100644 --- a/exec_test.go +++ b/exec_test.go @@ -14,6 +14,8 @@ type testExecModel struct { err error } +type testExecNoInputModel struct{ testExecModel } + func (m *testExecModel) Init() Cmd { c := exec.Command(m.cmd) //nolint:gosec return ExecProcess(c, func(err error) Msg { @@ -21,6 +23,12 @@ func (m *testExecModel) Init() Cmd { }) } +func (m *testExecNoInputModel) Init() Cmd { + return ExecProcess(successExecCommand(), func(err error) Msg { + return execFinishedMsg{err} + }) +} + func (m *testExecModel) Update(msg Msg) (Model, Cmd) { switch msg := msg.(type) { case execFinishedMsg: @@ -42,6 +50,13 @@ type spyRenderer struct { calledReset bool } +func successExecCommand() *exec.Cmd { + if runtime.GOOS == "windows" { + return exec.Command("cmd", "/c", "exit 0") + } + return exec.Command("true") +} + func TestTeaExec(t *testing.T) { type test struct { name string @@ -101,3 +116,20 @@ func TestTeaExec(t *testing.T) { }) } } + +func TestTeaExecWithNilInput(t *testing.T) { + var buf bytes.Buffer + + m := &testExecNoInputModel{} + p := NewProgram(m, + WithInput(nil), + WithOutput(&buf), + ) + + if _, err := p.Run(); err != nil { + t.Fatal(err) + } + if m.err != nil { + t.Fatalf("expected no error, got %v", m.err) + } +} diff --git a/tea.go b/tea.go index cd98092a53..e249d71bba 100644 --- a/tea.go +++ b/tea.go @@ -1347,8 +1347,10 @@ func (p *Program) RestoreTerminal() error { if err := p.initTerminal(); err != nil { return err } - if err := p.initInputReader(false); err != nil { - return err + if p.input != nil { + if err := p.initInputReader(false); err != nil { + return err + } } p.startRenderer()