package commands
import (
"testing"
)
var parserTests = []struct {
name string
cmd string
wantType completionType
wantFlag string
wantArg string
wantOptind int
}{
{
name: "empty command",
cmd: "",
wantType: COMMAND,
wantFlag: "",
wantArg: "",
wantOptind: 0,
},
{
name: "command only",
cmd: "cmd",
wantType: COMMAND,
wantFlag: "",
wantArg: "",
wantOptind: 1,
},
{
name: "with space",
cmd: "cmd ",
wantType: OPERAND,
wantFlag: "",
wantArg: "",
wantOptind: 1,
},
{
name: "with two spaces",
cmd: "cmd ",
wantType: OPERAND,
wantFlag: "",
wantArg: "",
wantOptind: 1,
},
{
name: "with single option flag",
cmd: "cmd -",
wantType: SHORT_OPTION,
wantFlag: "",
wantArg: "",
wantOptind: 2,
},
{
name: "with single option flag two spaces",
cmd: "cmd -",
wantType: SHORT_OPTION,
wantFlag: "",
wantArg: "",
wantOptind: 2,
},
{
name: "with single option flag completed",
cmd: "cmd -a",
wantType: SHORT_OPTION,
wantFlag: "a",
wantArg: "",
wantOptind: 2,
},
{
name: "with single option flag completed and space",
cmd: "cmd -a ",
wantType: OPERAND,
wantFlag: "a",
wantArg: "",
wantOptind: 2,
},
{
name: "with single option flag completed and two spaces",
cmd: "cmd -a ",
wantType: OPERAND,
wantFlag: "a",
wantArg: "",
wantOptind: 2,
},
{
name: "with two single option flag completed",
cmd: "cmd -b -a",
wantType: SHORT_OPTION,
wantFlag: "a",
wantArg: "",
wantOptind: 3,
},
{
name: "with two single option flag combined",
cmd: "cmd -ab",
wantType: SHORT_OPTION,
wantFlag: "ab",
wantArg: "",
wantOptind: 2,
},
{
name: "with two single option flag and space",
cmd: "cmd -ab ",
wantType: OPERAND,
wantFlag: "ab",
wantArg: "",
wantOptind: 2,
},
{
name: "with mandatory option flag",
cmd: "cmd -f",
wantType: OPTION_ARGUMENT,
wantFlag: "f",
wantArg: "",
wantOptind: 2,
},
{
name: "with mandatory option flag and space",
cmd: "cmd -f ",
wantType: OPTION_ARGUMENT,
wantFlag: "f",
wantArg: "",
wantOptind: 2,
},
{
name: "with mandatory option flag and two spaces",
cmd: "cmd -f ",
wantType: OPTION_ARGUMENT,
wantFlag: "f",
wantArg: "",
wantOptind: 2,
},
{
name: "with mandatory option flag and completed",
cmd: "cmd -f a",
wantType: OPTION_ARGUMENT,
wantFlag: "f",
wantArg: "a",
wantOptind: 3,
},
{
name: "with mandatory option flag and completed quote",
cmd: "cmd -f 'a b'",
wantType: OPTION_ARGUMENT,
wantFlag: "f",
wantArg: "a b",
wantOptind: 3,
},
{
name: "with mandatory option flag and operand",
cmd: "cmd -f 'a b' hello",
wantType: OPERAND,
wantFlag: "f",
wantArg: "a b",
wantOptind: 3,
},
{
name: "with mandatory option flag and two spaces between",
cmd: "cmd -f a",
wantType: OPTION_ARGUMENT,
wantFlag: "f",
wantArg: "a",
wantOptind: 3,
},
{
name: "with mandatory option flag and more spaces",
cmd: "cmd -f a ",
wantType: OPERAND,
wantFlag: "f",
wantArg: "a",
wantOptind: 3,
},
{
name: "with template data",
cmd: "cmd -a {{if .Size}} hello {{else}} {{end}}",
wantType: OPERAND,
wantFlag: "a",
wantArg: "",
wantOptind: 2,
},
{
name: "with operand",
cmd: "cmd -ab /tmp/aerc-",
wantType: OPERAND,
wantFlag: "ab",
wantArg: "",
wantOptind: 2,
},
{
name: "with operand indicator",
cmd: "cmd -ab -- /tmp/aerc-",
wantType: OPERAND,
wantFlag: "ab",
wantArg: "",
wantOptind: 3,
},
{
name: "hyphen connected command",
cmd: "cmd-dmc",
wantType: COMMAND,
wantFlag: "",
wantArg: "",
wantOptind: 1,
},
{
name: "incomplete hyphen connected command",
cmd: "cmd-",
wantType: COMMAND,
wantFlag: "",
wantArg: "",
wantOptind: 1,
},
{
name: "hyphen connected command with option",
cmd: "cmd-dmc -a",
wantType: SHORT_OPTION,
wantFlag: "a",
wantArg: "",
wantOptind: 2,
},
}
func TestCommands_Parser(t *testing.T) {
for i, test := range parserTests {
n := len(test.cmd)
spaceTerminated := n > 0 && test.cmd[n-1] == ' '
parser, err := newParser(test.cmd, "abf:", spaceTerminated)
if err != nil {
t.Errorf("parser error: %v", err)
}
if test.wantType != parser.kind {
t.Errorf("test %d '%s': completion type does not match: "+
"want %d, but got %d", i, test.cmd, test.wantType,
parser.kind)
}
if test.wantFlag != parser.flag {
t.Errorf("test %d '%s': flag does not match: "+
"want %s, but got %s", i, test.cmd, test.wantFlag,
parser.flag)
}
if test.wantArg != parser.arg {
t.Errorf("test %d '%s': arg does not match: "+
"want %s, but got %s", i, test.cmd, test.wantArg,
parser.arg)
}
if test.wantOptind != parser.optind {
t.Errorf("test %d '%s': optind does not match: "+
"want %d, but got %d", i, test.cmd, test.wantOptind,
parser.optind)
}
}
}