Skip to content

Commit

Permalink
Writing tests around changes from #1186
Browse files Browse the repository at this point in the history
  • Loading branch information
meatballhat committed Apr 22, 2022
1 parent 7a231c5 commit c4c15e1
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 4 deletions.
14 changes: 10 additions & 4 deletions help.go
Expand Up @@ -163,20 +163,26 @@ func DefaultCompleteWithFlags(cmd *Command) func(c *Context) {
return func(c *Context) {
if len(os.Args) > 2 {
lastArg := os.Args[len(os.Args)-2]

if strings.HasPrefix(lastArg, "-") {
if cmd != nil {
printFlagSuggestions(lastArg, cmd.Flags, c.App.Writer)
} else {
printFlagSuggestions(lastArg, c.App.Flags, c.App.Writer)

return
}

printFlagSuggestions(lastArg, c.App.Flags, c.App.Writer)

return
}
}

if cmd != nil {
printCommandSuggestions(cmd.Subcommands, c.App.Writer)
} else {
printCommandSuggestions(c.App.Commands, c.App.Writer)
return
}

printCommandSuggestions(c.App.Commands, c.App.Writer)
}
}

Expand Down
83 changes: 83 additions & 0 deletions help_test.go
Expand Up @@ -6,6 +6,7 @@ import (
"fmt"
"io"
"io/ioutil"
"os"
"runtime"
"strings"
"testing"
Expand Down Expand Up @@ -1037,3 +1038,85 @@ func TestHideHelpCommand_WithSubcommands(t *testing.T) {
t.Errorf("Run returned unexpected error: %v", err)
}
}

func TestDefaultCompleteWithFlags(t *testing.T) {
origArgv := os.Args

t.Cleanup(func() {
os.Args = origArgv
})

for _, tc := range []struct {
name string
c *Context
cmd *Command
argv []string
expected string
}{
{
name: "empty",
c: &Context{App: &App{}},
cmd: &Command{},
argv: []string{"prog", "cmd"},
expected: "",
},
{
name: "typical-flag-suggestion",
c: &Context{App: &App{
Name: "cmd",
Flags: []Flag{
&BoolFlag{Name: "happiness"},
&Int64Flag{Name: "everybody-jump-on"},
},
Commands: []*Command{
{Name: "putz"},
},
}},
cmd: &Command{
Flags: []Flag{
&BoolFlag{Name: "excitement"},
&StringFlag{Name: "hat-shape"},
},
},
argv: []string{"cmd", "--e", "--generate-bash-completion"},
expected: "--excitement\n",
},
{
name: "typical-command-suggestion",
c: &Context{App: &App{
Name: "cmd",
Flags: []Flag{
&BoolFlag{Name: "happiness"},
&Int64Flag{Name: "everybody-jump-on"},
},
}},
cmd: &Command{
Name: "putz",
Subcommands: []*Command{
{Name: "futz"},
},
Flags: []Flag{
&BoolFlag{Name: "excitement"},
&StringFlag{Name: "hat-shape"},
},
},
argv: []string{"cmd", "--generate-bash-completion"},
expected: "futz\n",
},
} {
t.Run(tc.name, func(ct *testing.T) {
writer := &bytes.Buffer{}
tc.c.App.Writer = writer

os.Args = tc.argv
f := DefaultCompleteWithFlags(tc.cmd)
f(tc.c)

written := writer.String()

if written != tc.expected {
ct.Errorf("written help does not match expected %q != %q", written, tc.expected)
}
})
}
}

0 comments on commit c4c15e1

Please sign in to comment.