AlecAivazis/survey: Difference between revisions
Jump to navigation
Jump to search
Line 25: | Line 25: | ||
) | ) | ||
func NewTestFileReader(input string) * | // NewTestTerminalStudio is a terminal.Studio constructor that builds terminal.Studio instances used in testing. | ||
func NewTestTerminalStudio(input string) terminal.Stdio { | |||
return terminal.Stdio{ | |||
In: NewTestFileReader(input), | |||
Out: os.Stdout, | |||
Err: os.Stderr, | |||
} | |||
} | |||
// newTestFileReader is a testFileReader constructor that preconfigures the FileReader with | |||
// expected terminal sequences, and then appends arbitrary "input" to test with. | |||
func newTestFileReader(input string) *testFileReader { | |||
return &TestFileReader{ | return &TestFileReader{ | ||
sequences: []string{ | sequences: []string{ | ||
Line 34: | Line 45: | ||
} | } | ||
type | // testFileReader is a test FileReader that returns pre-programed "sequences" of characters. | ||
type testFileReader struct { | |||
sequences []string | sequences []string | ||
} | } | ||
// Read is part of the FileReader implementation. | |||
func (fr *TestFileReader) Read(p []byte) (n int, err error) { | func (fr *TestFileReader) Read(p []byte) (n int, err error) { | ||
if len(fr.sequences) != 0 { | if len(fr.sequences) != 0 { | ||
Line 48: | Line 61: | ||
} | } | ||
// Fd is part of the FileReader implementation. | |||
func (fr *TestFileReader) Fd() uintptr { | func (fr *TestFileReader) Fd() uintptr { | ||
return 0 | return 0 | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Latest revision as of 20:20, 6 November 2024
External
Internal
go.mod
go get github.com/AlecAivazis/survey/v2@v2.3.7
Concepts
Unit Testing
Create a test FileReader
and a test terminal.Studio
:
import (
"fmt"
"io"
"os"
"github.com/AlecAivazis/survey/v2"
"github.com/AlecAivazis/survey/v2/terminal"
)
// NewTestTerminalStudio is a terminal.Studio constructor that builds terminal.Studio instances used in testing.
func NewTestTerminalStudio(input string) terminal.Stdio {
return terminal.Stdio{
In: NewTestFileReader(input),
Out: os.Stdout,
Err: os.Stderr,
}
}
// newTestFileReader is a testFileReader constructor that preconfigures the FileReader with
// expected terminal sequences, and then appends arbitrary "input" to test with.
func newTestFileReader(input string) *testFileReader {
return &TestFileReader{
sequences: []string{
"\x1b[1;1R",
"\x1b[0;0R",
input},
}
}
// testFileReader is a test FileReader that returns pre-programed "sequences" of characters.
type testFileReader struct {
sequences []string
}
// Read is part of the FileReader implementation.
func (fr *TestFileReader) Read(p []byte) (n int, err error) {
if len(fr.sequences) != 0 {
seq := fr.sequences[0]
fr.sequences = fr.sequences[1:]
n = copy(p, seq)
return n, nil
}
return 0, io.EOF
}
// Fd is part of the FileReader implementation.
func (fr *TestFileReader) Fd() uintptr {
return 0
}
Then configure the survey.AskOne
with the Stdio
that returns "Y\n" or "N\n":
prompt := &survey.Confirm{
Message: "Something",
Default: false,
}
var accepted bool
err := survey.AskOne(prompt, &accepted, func(options *survey.AskOptions) error {
options.Stdio = NewTestTerminalStudio("Y\n")
return nil
})
if err != nil {
panic(err)
}
fmt.Println(accepted)