106 lines
3.0 KiB
Go
106 lines
3.0 KiB
Go
package argv
|
|
|
|
import (
|
|
"math"
|
|
"testing"
|
|
)
|
|
|
|
var (
|
|
parseText = ` a aa a'aa' a"aa"a
|
|
a$PATH a"$PATH" a'$PATH'
|
|
a"$*" a"$0" a"$\"
|
|
a| a|a
|
|
a"\A" a"\a\b\f\n\r\t\v\\\$" \t a'\A' a'\t'` +
|
|
" a`ls /` `ls ~`"
|
|
)
|
|
|
|
func TestScanner(t *testing.T) {
|
|
gots, err := Scan(
|
|
parseText,
|
|
)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
expects := []Token{
|
|
{Type: TokSpace},
|
|
{Type: TokString, Value: []rune("a")},
|
|
{Type: TokSpace},
|
|
{Type: TokString, Value: []rune("aa")},
|
|
{Type: TokSpace},
|
|
{Type: TokString, Value: []rune("a")},
|
|
{Type: TokStringSingleQuote, Value: []rune("aa")},
|
|
{Type: TokSpace},
|
|
{Type: TokString, Value: []rune("a")},
|
|
{Type: TokStringDoubleQuote, Value: []rune("aa")},
|
|
{Type: TokString, Value: []rune("a")},
|
|
{Type: TokSpace},
|
|
{Type: TokString, Value: []rune("a$PATH")},
|
|
{Type: TokSpace},
|
|
{Type: TokString, Value: []rune("a")},
|
|
{Type: TokStringDoubleQuote, Value: []rune("$PATH")},
|
|
{Type: TokSpace},
|
|
{Type: TokString, Value: []rune("a")},
|
|
{Type: TokStringSingleQuote, Value: []rune("$PATH")},
|
|
{Type: TokSpace},
|
|
{Type: TokString, Value: []rune("a")},
|
|
{Type: TokStringDoubleQuote, Value: []rune("$*")},
|
|
{Type: TokSpace},
|
|
{Type: TokString, Value: []rune("a")},
|
|
{Type: TokStringDoubleQuote, Value: []rune("$0")},
|
|
{Type: TokSpace},
|
|
{Type: TokString, Value: []rune("a")},
|
|
{Type: TokStringDoubleQuote, Value: []rune("$\\")},
|
|
{Type: TokSpace},
|
|
{Type: TokString, Value: []rune("a")},
|
|
{Type: TokPipe},
|
|
{Type: TokSpace},
|
|
{Type: TokString, Value: []rune("a")},
|
|
{Type: TokPipe},
|
|
{Type: TokString, Value: []rune("a")},
|
|
{Type: TokSpace},
|
|
{Type: TokString, Value: []rune("a")},
|
|
{Type: TokStringDoubleQuote, Value: []rune("\\A")},
|
|
{Type: TokSpace},
|
|
{Type: TokString, Value: []rune("a")},
|
|
{Type: TokStringDoubleQuote, Value: []rune("\a\b\f\n\r\t\v\\$")},
|
|
{Type: TokSpace},
|
|
{Type: TokString, Value: []rune("t")},
|
|
{Type: TokSpace},
|
|
{Type: TokString, Value: []rune("a")},
|
|
{Type: TokStringSingleQuote, Value: []rune("\\A")},
|
|
{Type: TokSpace},
|
|
{Type: TokString, Value: []rune("a")},
|
|
{Type: TokStringSingleQuote, Value: []rune("\t")},
|
|
{Type: TokSpace},
|
|
{Type: TokString, Value: []rune("a")},
|
|
{Type: TokBackQuote, Value: []rune("ls /")},
|
|
{Type: TokSpace},
|
|
{Type: TokBackQuote, Value: []rune("ls ~")},
|
|
{Type: TokEOF},
|
|
}
|
|
if len(gots) != len(expects) {
|
|
t.Errorf("token count is not equal: expect %d, got %d", len(expects), len(gots))
|
|
}
|
|
l := int(math.Min(float64(len(gots)), float64(len(expects))))
|
|
for i := 0; i < l; i++ {
|
|
got := gots[i]
|
|
expect := expects[i]
|
|
if got.Type != expect.Type {
|
|
t.Errorf("token type is not equal: %d: expect %d, got %d", i, expect.Type, got.Type)
|
|
}
|
|
|
|
if expect.Type != TokSpace && string(got.Value) != string(expect.Value) {
|
|
t.Errorf("token value is not equal: %d: expect %s, got %s", i, string(expect.Value), string(got.Value))
|
|
}
|
|
}
|
|
|
|
for _, text := range []string{
|
|
`a"`, `a'`, `a"\`, "`ls ~", `a\`,
|
|
} {
|
|
_, err := Scan(text)
|
|
if err != ErrInvalidSyntax {
|
|
t.Errorf("expect unexpected eof error, but got: %v", err)
|
|
}
|
|
}
|
|
}
|