Share flag consumption between parsing and completion
This commit is contained in:
@@ -79,3 +79,40 @@ func TestCompletionChoicesDoNotRestrictExecution(t *testing.T) {
|
||||
t.Fatalf("outcome=%#v input=%#v", outcome, received)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCompletionConsumesFlagGrammarAndKeepsPendingValues(t *testing.T) {
|
||||
flags := []commandmeta.Flag{{Name: "verbose", Short: "v", Boolean: true}, {Name: "choice", Short: "c", Completion: commandmeta.CompletionHint{Kind: commandmeta.CompletionChoices}}}
|
||||
lookup := commandmeta.NewFlagLookup(flags, []commandmeta.FlagAlias{{Source: "-x", Target: "--choice"}})
|
||||
for _, tc := range []struct {
|
||||
name string
|
||||
tokens []string
|
||||
pending, operand string
|
||||
invalid bool
|
||||
}{
|
||||
{name: "cluster attached empty", tokens: []string{"-vc="}, operand: ""},
|
||||
{name: "option-looking value", tokens: []string{"-vx", "--other"}, operand: ""},
|
||||
{name: "pending", tokens: []string{"-vx"}, pending: "choice"},
|
||||
{name: "unknown cluster", tokens: []string{"-vz"}, invalid: true},
|
||||
{name: "terminator", tokens: []string{"--", "--choice"}, operand: "--choice"},
|
||||
} {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
state := walkCompletionFlags(tc.tokens, lookup)
|
||||
if state.invalid != tc.invalid {
|
||||
t.Fatalf("state=%#v", state)
|
||||
}
|
||||
if tc.pending != "" && (state.pending == nil || state.pending.Name != tc.pending) {
|
||||
t.Fatalf("pending=%#v", state.pending)
|
||||
}
|
||||
if tc.pending == "" && state.pending != nil {
|
||||
t.Fatalf("unexpected pending=%#v", state.pending)
|
||||
}
|
||||
if tc.operand != "" && (len(state.operands) != 1 || state.operands[0] != tc.operand) {
|
||||
t.Fatalf("operands=%v", state.operands)
|
||||
}
|
||||
})
|
||||
}
|
||||
target := completionOptionTarget("-vc=", flags, lookup, nil)
|
||||
if target.kind != completionTargetValue || target.prefix != "-vc=" || target.valuePrefix != "" {
|
||||
t.Fatalf("partial target = %#v", target)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user