summaryrefslogtreecommitdiff
path: root/usage_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'usage_test.go')
-rw-r--r--usage_test.go334
1 files changed, 331 insertions, 3 deletions
diff --git a/usage_test.go b/usage_test.go
index 1a64ad4..a958abb 100644
--- a/usage_test.go
+++ b/usage_test.go
@@ -260,6 +260,233 @@ Options:
assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
}
+func TestUsageWithUserDefinedVersionFlag(t *testing.T) {
+ expectedUsage := "Usage: example [--version]"
+
+ expectedHelp := `
+Usage: example [--version]
+
+Options:
+ --version this is a user-defined version flag
+ --help, -h display this help and exit
+`
+
+ var args struct {
+ ShowVersion bool `arg:"--version" help:"this is a user-defined version flag"`
+ }
+
+ os.Args[0] = "example"
+ p, err := NewParser(Config{}, &args)
+ require.NoError(t, err)
+
+ var help bytes.Buffer
+ p.WriteHelp(&help)
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
+}
+
+func TestUsageWithVersionAndUserDefinedVersionFlag(t *testing.T) {
+ expectedUsage := "Usage: example [--version]"
+
+ expectedHelp := `
+Usage: example [--version]
+
+Options:
+ --version this is a user-defined version flag
+ --help, -h display this help and exit
+`
+
+ var args struct {
+ versioned
+ ShowVersion bool `arg:"--version" help:"this is a user-defined version flag"`
+ }
+
+ os.Args[0] = "example"
+ p, err := NewParser(Config{}, &args)
+ require.NoError(t, err)
+
+ var help bytes.Buffer
+ p.WriteHelp(&help)
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
+}
+
+type subcommand struct {
+ Number int `arg:"-n,--number" help:"compute something on the given number"`
+}
+
+func TestUsageWithVersionAndSubcommand(t *testing.T) {
+ expectedUsage := "example 3.2.1\nUsage: example <command> [<args>]"
+
+ expectedHelp := `
+example 3.2.1
+Usage: example <command> [<args>]
+
+Options:
+ --help, -h display this help and exit
+ --version display version and exit
+
+Commands:
+ cmd
+`
+
+ var args struct {
+ versioned
+ Cmd *subcommand `arg:"subcommand"`
+ }
+
+ os.Args[0] = "example"
+ p, err := NewParser(Config{}, &args)
+ require.NoError(t, err)
+
+ var help bytes.Buffer
+ p.WriteHelp(&help)
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
+
+ expectedUsage = "example 3.2.1\nUsage: example cmd [--number NUMBER]"
+
+ expectedHelp = `
+example 3.2.1
+Usage: example cmd [--number NUMBER]
+
+Options:
+ --number NUMBER, -n NUMBER
+ compute something on the given number
+ --help, -h display this help and exit
+ --version display version and exit
+`
+ _ = p.Parse([]string{"cmd"})
+
+ help = bytes.Buffer{}
+ p.WriteHelp(&help)
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ usage = bytes.Buffer{}
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
+}
+
+func TestUsageWithUserDefinedVersionFlagAndSubcommand(t *testing.T) {
+ expectedUsage := "Usage: example [--version] <command> [<args>]"
+
+ expectedHelp := `
+Usage: example [--version] <command> [<args>]
+
+Options:
+ --version this is a user-defined version flag
+ --help, -h display this help and exit
+
+Commands:
+ cmd
+`
+
+ var args struct {
+ Cmd *subcommand `arg:"subcommand"`
+ ShowVersion bool `arg:"--version" help:"this is a user-defined version flag"`
+ }
+
+ os.Args[0] = "example"
+ p, err := NewParser(Config{}, &args)
+ require.NoError(t, err)
+
+ var help bytes.Buffer
+ p.WriteHelp(&help)
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
+
+ expectedUsage = "Usage: example cmd [--number NUMBER]"
+
+ expectedHelp = `
+Usage: example cmd [--number NUMBER]
+
+Options:
+ --number NUMBER, -n NUMBER
+ compute something on the given number
+
+Global options:
+ --version this is a user-defined version flag
+ --help, -h display this help and exit
+`
+ _ = p.Parse([]string{"cmd"})
+
+ help = bytes.Buffer{}
+ p.WriteHelp(&help)
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ usage = bytes.Buffer{}
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
+}
+
+func TestUsageWithVersionAndUserDefinedVersionFlagAndSubcommand(t *testing.T) {
+ expectedUsage := "Usage: example [--version] <command> [<args>]"
+
+ expectedHelp := `
+Usage: example [--version] <command> [<args>]
+
+Options:
+ --version this is a user-defined version flag
+ --help, -h display this help and exit
+
+Commands:
+ cmd
+`
+
+ var args struct {
+ versioned
+ Cmd *subcommand `arg:"subcommand"`
+ ShowVersion bool `arg:"--version" help:"this is a user-defined version flag"`
+ }
+
+ os.Args[0] = "example"
+ p, err := NewParser(Config{}, &args)
+ require.NoError(t, err)
+
+ var help bytes.Buffer
+ p.WriteHelp(&help)
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
+
+ expectedUsage = "Usage: example cmd [--number NUMBER]"
+
+ expectedHelp = `
+Usage: example cmd [--number NUMBER]
+
+Options:
+ --number NUMBER, -n NUMBER
+ compute something on the given number
+
+Global options:
+ --version this is a user-defined version flag
+ --help, -h display this help and exit
+`
+ _ = p.Parse([]string{"cmd"})
+
+ help = bytes.Buffer{}
+ p.WriteHelp(&help)
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ usage = bytes.Buffer{}
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
+}
+
type described struct{}
// Described returns the description for this program
@@ -415,6 +642,50 @@ Options:
assert.Equal(t, expectedUsage, usage.String())
}
+func TestUsageWithSubcommands(t *testing.T) {
+ expectedUsage := "Usage: example child [--values VALUES]"
+
+ expectedHelp := `
+Usage: example child [--values VALUES]
+
+Options:
+ --values VALUES Values
+
+Global options:
+ --verbose, -v verbosity level
+ --help, -h display this help and exit
+`
+
+ var args struct {
+ Verbose bool `arg:"-v" help:"verbosity level"`
+ Child *struct {
+ Values []float64 `help:"Values"`
+ } `arg:"subcommand:child"`
+ }
+
+ os.Args[0] = "example"
+ p, err := NewParser(Config{}, &args)
+ require.NoError(t, err)
+
+ _ = p.Parse([]string{"child"})
+
+ var help bytes.Buffer
+ p.WriteHelp(&help)
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var help2 bytes.Buffer
+ p.WriteHelpForSubcommand(&help2, "child")
+ assert.Equal(t, expectedHelp[1:], help2.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
+
+ var usage2 bytes.Buffer
+ p.WriteUsageForSubcommand(&usage2, "child")
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage2.String()))
+}
+
func TestUsageWithNestedSubcommands(t *testing.T) {
expectedUsage := "Usage: example child nested [--enable] OUTPUT"
@@ -450,6 +721,8 @@ Global options:
_ = p.Parse([]string{"child", "nested", "value"})
+ assert.Equal(t, []string{"child", "nested"}, p.SubcommandNames())
+
var help bytes.Buffer
p.WriteHelp(&help)
assert.Equal(t, expectedHelp[1:], help.String())
@@ -471,7 +744,7 @@ func TestNonexistentSubcommand(t *testing.T) {
var args struct {
sub *struct{} `arg:"subcommand"`
}
- p, err := NewParser(Config{}, &args)
+ p, err := NewParser(Config{Exit: func(int) {}}, &args)
require.NoError(t, err)
var b bytes.Buffer
@@ -522,6 +795,35 @@ Options:
assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
}
+func TestUsageWithEmptyPlaceholder(t *testing.T) {
+ expectedUsage := "Usage: example [-a] [--b] [--c]"
+
+ expectedHelp := `
+Usage: example [-a] [--b] [--c]
+
+Options:
+ -a some help for a
+ --b some help for b
+ --c, -c some help for c
+ --help, -h display this help and exit
+`
+ var args struct {
+ ShortOnly string `arg:"-a,--" placeholder:"" help:"some help for a"`
+ LongOnly string `arg:"--b" placeholder:"" help:"some help for b"`
+ Both string `arg:"-c,--c" placeholder:"" help:"some help for c"`
+ }
+ p, err := NewParser(Config{Program: "example"}, &args)
+ require.NoError(t, err)
+
+ var help bytes.Buffer
+ p.WriteHelp(&help)
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
+}
+
func TestUsageWithShortFirst(t *testing.T) {
expectedUsage := "Usage: example [-c CAT] [--dog DOG]"
@@ -630,7 +932,7 @@ error: something went wrong
p.Fail("something went wrong")
assert.Equal(t, expectedStdout[1:], stdout.String())
- assert.Equal(t, -1, exitCode)
+ assert.Equal(t, 2, exitCode)
}
func TestFailSubcommand(t *testing.T) {
@@ -653,7 +955,7 @@ error: something went wrong
require.NoError(t, err)
assert.Equal(t, expectedStdout[1:], stdout.String())
- assert.Equal(t, -1, exitCode)
+ assert.Equal(t, 2, exitCode)
}
type lengthOf struct {
@@ -687,3 +989,29 @@ Options:
p.WriteHelp(&help)
assert.Equal(t, expectedHelp[1:], help.String())
}
+
+func TestHelpShowsSubcommandAliases(t *testing.T) {
+ expectedHelp := `
+Usage: example <command> [<args>]
+
+Options:
+ --help, -h display this help and exit
+
+Commands:
+ remove, rm, r remove something from somewhere
+ simple do something simple
+ halt, stop stop now
+`
+
+ var args struct {
+ Remove *struct{} `arg:"subcommand:remove|rm|r" help:"remove something from somewhere"`
+ Simple *struct{} `arg:"subcommand" help:"do something simple"`
+ Stop *struct{} `arg:"subcommand:halt|stop" help:"stop now"`
+ }
+ p, err := NewParser(Config{Program: "example"}, &args)
+ require.NoError(t, err)
+
+ var help bytes.Buffer
+ p.WriteHelp(&help)
+ assert.Equal(t, expectedHelp[1:], help.String())
+}