Merge pull request #48 from dadgar/b-shared-prefix

Fix a subcommand matching
This commit is contained in:
Eyal Posener 2017-08-24 23:05:41 +03:00 committed by GitHub
commit 5075f6d6e6
2 changed files with 79 additions and 0 deletions

View File

@ -73,6 +73,10 @@ func (c *Command) predict(a Args) (options []string, only bool) {
if only {
return
}
// We matched so stop searching. Continuing to search can accidentally
// match a subcommand with current set of commands, see issue #46.
break
}
}

View File

@ -184,6 +184,81 @@ func TestCompleter_Complete(t *testing.T) {
}
}
func TestCompleter_Complete_SharedPrefix(t *testing.T) {
t.Parallel()
initTests()
c := Command{
Sub: Commands{
"status": {
Flags: Flags{
"-f3": PredictNothing,
},
},
"job": {
Sub: Commands{
"status": {
Flags: Flags{
"-f4": PredictNothing,
},
},
},
},
},
Flags: Flags{
"-o": PredictFiles("*.txt"),
},
GlobalFlags: Flags{
"-h": PredictNothing,
"-global1": PredictAnything,
},
}
tests := []struct {
args string
want []string
}{
{
args: "",
want: []string{"status", "job", "-h", "-global1", "-o"},
},
{
args: "-",
want: []string{"-h", "-global1", "-o"},
},
{
args: "j",
want: []string{"job"},
},
{
args: "job ",
want: []string{"-h", "-global1", "status"},
},
{
args: "job status ",
want: []string{"-f4", "-h", "-global1"},
},
}
for _, tt := range tests {
t.Run(tt.args, func(t *testing.T) {
tt.args = "cmd " + tt.args
os.Setenv(envComplete, tt.args)
line, _ := getLine()
got := c.Predict(newArgs(line))
sort.Strings(tt.want)
sort.Strings(got)
if !equalSlices(got, tt.want) {
t.Errorf("failed '%s'\ngot = %s\nwant: %s", t.Name(), got, tt.want)
}
})
}
}
func equalSlices(a, b []string) bool {
if len(a) != len(b) {
return false