package shell import ( "bufio" "bytes" "io" "strings" "testing" "git.snorba.art/hugo/nssh/commands/shell/builtins" "github.com/stretchr/testify/suite" ) type StatementTest struct { suite.Suite } func (t *StatementTest) TestParse() { parser := &BaseParser{&StatementParameters{}} reader := bufio.NewReader(strings.NewReader("echo hello world!")) iterator, err := NewCharIterator(reader) t.NoError(err) statement, err := parser.Parse(iterator, &CharCollection{}) t.ErrorIs(err, io.EOF) t.IsType(&Word{}, statement.Tokens()[0]) t.IsType(&Whitespace{}, statement.Tokens()[1]) t.IsType(&Word{}, statement.Tokens()[2]) t.IsType(&Whitespace{}, statement.Tokens()[3]) t.IsType(&Word{}, statement.Tokens()[4]) t.Equal(5, len(statement.Tokens())) t.Equal("echo", statement.Tokens()[0].String()) t.Equal(" ", statement.Tokens()[1].String()) t.Equal("hello", statement.Tokens()[2].String()) t.Equal(" ", statement.Tokens()[3].String()) t.Equal("world!", statement.Tokens()[4].String()) } func (t *StatementTest) TestEval() { parser := &BaseParser{&StatementParameters{}} reader := bufio.NewReader(strings.NewReader("echo hello world!")) iterator, err := NewCharIterator(reader) t.NoError(err) statement, err := parser.Parse(iterator, &CharCollection{}) t.ErrorIs(err, io.EOF) out := []byte{} outBuf := bytes.NewBuffer(out) state := NewShellState() echo := &builtins.Echo{} state.SetCommand(echo.Name(), echo) state.Eval(statement.(Evalable), nil, outBuf, nil) t.Equal("hello world!", string(outBuf.Bytes())) } func (t *StatementTest) TestEvalWithSubshell() { parser := &BaseParser{&StatementParameters{}} reader := bufio.NewReader(strings.NewReader("echo \"$(echo hello world!)\"")) iterator, err := NewCharIterator(reader) t.NoError(err) statement, err := parser.Parse(iterator, &CharCollection{}) t.ErrorIs(err, io.EOF) out := []byte{} outBuf := bytes.NewBuffer(out) state := NewShellState() echo := &builtins.Echo{} state.SetCommand(echo.Name(), echo) state.Eval(statement.(Evalable), nil, outBuf, nil) t.Equal("hello world!", string(outBuf.Bytes())) } func TestStatementTest(t *testing.T) { suite.Run(t, new(StatementTest)) }