summaryrefslogtreecommitdiff
path: root/usage_test.go
diff options
context:
space:
mode:
authorAlex Flint <[email protected]>2021-04-19 21:03:43 -0700
committerAlex Flint <[email protected]>2021-04-19 21:03:43 -0700
commitfe4a138ac8c39cb00bbee7279a0957897ab88fae (patch)
tree02b48894c636a05751125c495d8325dd2f92fe4f /usage_test.go
parent6a01a15f75472271568c732c1191e9d33a5fc54c (diff)
test coverage 100% !!
Diffstat (limited to 'usage_test.go')
-rw-r--r--usage_test.go187
1 files changed, 144 insertions, 43 deletions
diff --git a/usage_test.go b/usage_test.go
index 6dee402..1b6c475 100644
--- a/usage_test.go
+++ b/usage_test.go
@@ -33,9 +33,10 @@ func (n *NameDotName) MarshalText() (text []byte, err error) {
}
func TestWriteUsage(t *testing.T) {
- expectedUsage := "Usage: example [--name NAME] [--value VALUE] [--verbose] [--dataset DATASET] [--optimize OPTIMIZE] [--ids IDS] [--values VALUES] [--workers WORKERS] [--testenv TESTENV] [--file FILE] INPUT [OUTPUT [OUTPUT ...]]\n"
+ expectedUsage := "Usage: example [--name NAME] [--value VALUE] [--verbose] [--dataset DATASET] [--optimize OPTIMIZE] [--ids IDS] [--values VALUES] [--workers WORKERS] [--testenv TESTENV] [--file FILE] INPUT [OUTPUT [OUTPUT ...]]"
- expectedHelp := `Usage: example [--name NAME] [--value VALUE] [--verbose] [--dataset DATASET] [--optimize OPTIMIZE] [--ids IDS] [--values VALUES] [--workers WORKERS] [--testenv TESTENV] [--file FILE] INPUT [OUTPUT [OUTPUT ...]]
+ expectedHelp := `
+Usage: example [--name NAME] [--value VALUE] [--verbose] [--dataset DATASET] [--optimize OPTIMIZE] [--ids IDS] [--values VALUES] [--workers WORKERS] [--testenv TESTENV] [--file FILE] INPUT [OUTPUT [OUTPUT ...]]
Positional arguments:
INPUT
@@ -56,6 +57,7 @@ Options:
--file FILE, -f FILE File with mandatory extension [default: scratch.txt]
--help, -h display this help and exit
`
+
var args struct {
Input string `arg:"positional"`
Output []string `arg:"positional" help:"list of outputs"`
@@ -79,13 +81,13 @@ Options:
os.Args[0] = "example"
- var usage bytes.Buffer
- p.WriteUsage(&usage)
- assert.Equal(t, expectedUsage, usage.String())
-
var help bytes.Buffer
p.WriteHelp(&help)
- assert.Equal(t, expectedHelp, help.String())
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
}
type MyEnum int
@@ -99,7 +101,10 @@ func (n *MyEnum) MarshalText() ([]byte, error) {
}
func TestUsageWithDefaults(t *testing.T) {
- expectedHelp := `Usage: example [--label LABEL] [--content CONTENT]
+ expectedUsage := "Usage: example [--label LABEL] [--content CONTENT]"
+
+ expectedHelp := `
+Usage: example [--label LABEL] [--content CONTENT]
Options:
--label LABEL [default: cat]
@@ -118,7 +123,11 @@ Options:
var help bytes.Buffer
p.WriteHelp(&help)
- assert.Equal(t, expectedHelp, help.String())
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
}
func TestUsageCannotMarshalToString(t *testing.T) {
@@ -132,7 +141,10 @@ func TestUsageCannotMarshalToString(t *testing.T) {
}
func TestUsageLongPositionalWithHelp_legacyForm(t *testing.T) {
- expectedHelp := `Usage: example VERYLONGPOSITIONALWITHHELP
+ expectedUsage := "Usage: example VERYLONGPOSITIONALWITHHELP"
+
+ expectedHelp := `
+Usage: example VERYLONGPOSITIONALWITHHELP
Positional arguments:
VERYLONGPOSITIONALWITHHELP
@@ -145,17 +157,23 @@ Options:
VeryLongPositionalWithHelp string `arg:"positional,help:this positional argument is very long but cannot include commas"`
}
- p, err := NewParser(Config{}, &args)
+ p, err := NewParser(Config{Program: "example"}, &args)
require.NoError(t, err)
- os.Args[0] = "example"
var help bytes.Buffer
p.WriteHelp(&help)
- assert.Equal(t, expectedHelp, help.String())
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
}
func TestUsageLongPositionalWithHelp_newForm(t *testing.T) {
- expectedHelp := `Usage: example VERYLONGPOSITIONALWITHHELP
+ expectedUsage := "Usage: example VERYLONGPOSITIONALWITHHELP"
+
+ expectedHelp := `
+Usage: example VERYLONGPOSITIONALWITHHELP
Positional arguments:
VERYLONGPOSITIONALWITHHELP
@@ -168,17 +186,23 @@ Options:
VeryLongPositionalWithHelp string `arg:"positional" help:"this positional argument is very long, and includes: commas, colons etc"`
}
- p, err := NewParser(Config{}, &args)
+ p, err := NewParser(Config{Program: "example"}, &args)
require.NoError(t, err)
- os.Args[0] = "example"
var help bytes.Buffer
p.WriteHelp(&help)
- assert.Equal(t, expectedHelp, help.String())
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
}
func TestUsageWithProgramName(t *testing.T) {
- expectedHelp := `Usage: myprogram
+ expectedUsage := "Usage: myprogram"
+
+ expectedHelp := `
+Usage: myprogram
Options:
--help, -h display this help and exit
@@ -190,9 +214,14 @@ Options:
require.NoError(t, err)
os.Args[0] = "example"
+
var help bytes.Buffer
p.WriteHelp(&help)
- assert.Equal(t, expectedHelp, help.String())
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
}
type versioned struct{}
@@ -203,7 +232,10 @@ func (versioned) Version() string {
}
func TestUsageWithVersion(t *testing.T) {
- expectedHelp := `example 3.2.1
+ expectedUsage := "example 3.2.1\nUsage: example"
+
+ expectedHelp := `
+example 3.2.1
Usage: example
Options:
@@ -216,12 +248,11 @@ Options:
var help bytes.Buffer
p.WriteHelp(&help)
- actual := help.String()
- if expectedHelp != actual {
- t.Logf("Expected:\n%s", expectedHelp)
- t.Logf("Actual:\n%s", actual)
- t.Fail()
- }
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
}
type described struct{}
@@ -232,7 +263,10 @@ func (described) Description() string {
}
func TestUsageWithDescription(t *testing.T) {
- expectedHelp := `this program does this and that
+ expectedUsage := "Usage: example"
+
+ expectedHelp := `
+this program does this and that
Usage: example
Options:
@@ -244,16 +278,18 @@ Options:
var help bytes.Buffer
p.WriteHelp(&help)
- actual := help.String()
- if expectedHelp != actual {
- t.Logf("Expected:\n%s", expectedHelp)
- t.Logf("Actual:\n%s", actual)
- t.Fail()
- }
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
}
func TestRequiredMultiplePositionals(t *testing.T) {
- expectedHelp := `Usage: example REQUIREDMULTIPLE [REQUIREDMULTIPLE ...]
+ expectedUsage := "Usage: example REQUIREDMULTIPLE [REQUIREDMULTIPLE ...]"
+
+ expectedHelp := `
+Usage: example REQUIREDMULTIPLE [REQUIREDMULTIPLE ...]
Positional arguments:
REQUIREDMULTIPLE required multiple positional
@@ -270,11 +306,18 @@ Options:
var help bytes.Buffer
p.WriteHelp(&help)
- assert.Equal(t, expectedHelp, help.String())
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
}
func TestUsageWithNestedSubcommands(t *testing.T) {
- expectedHelp := `Usage: example child nested [--enable] OUTPUT
+ expectedUsage := "Usage: example child nested [--enable] OUTPUT"
+
+ expectedHelp := `
+Usage: example child nested [--enable] OUTPUT
Positional arguments:
OUTPUT
@@ -307,11 +350,18 @@ Global options:
var help bytes.Buffer
p.WriteHelp(&help)
- assert.Equal(t, expectedHelp, help.String())
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
}
func TestUsageWithoutLongNames(t *testing.T) {
- expectedHelp := `Usage: example [-a PLACEHOLDER] -b SHORTONLY2
+ expectedUsage := "Usage: example [-a PLACEHOLDER] -b SHORTONLY2"
+
+ expectedHelp := `
+Usage: example [-a PLACEHOLDER] -b SHORTONLY2
Options:
-a PLACEHOLDER some help [default: some val]
@@ -324,13 +374,21 @@ Options:
}
p, err := NewParser(Config{Program: "example"}, &args)
assert.NoError(t, err)
+
var help bytes.Buffer
p.WriteHelp(&help)
- assert.Equal(t, expectedHelp, help.String())
+ 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) {
- expectedHelp := `Usage: example [-c CAT] [--dog DOG]
+ expectedUsage := "Usage: example [-c CAT] [--dog DOG]"
+
+ expectedHelp := `
+Usage: example [-c CAT] [--dog DOG]
Options:
-c CAT
@@ -343,13 +401,21 @@ Options:
}
p, err := NewParser(Config{Program: "example"}, &args)
assert.NoError(t, err)
+
var help bytes.Buffer
p.WriteHelp(&help)
- assert.Equal(t, expectedHelp, help.String())
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
}
func TestUsageWithEnvOptions(t *testing.T) {
- expectedHelp := `Usage: example [-s SHORT]
+ expectedUsage := "Usage: example [-s SHORT]"
+
+ expectedHelp := `
+Usage: example [-s SHORT]
Options:
-s SHORT [env: SHORT]
@@ -363,7 +429,42 @@ Options:
p, err := NewParser(Config{Program: "example"}, &args)
assert.NoError(t, err)
+
var help bytes.Buffer
p.WriteHelp(&help)
- assert.Equal(t, expectedHelp, help.String())
+ assert.Equal(t, expectedHelp[1:], help.String())
+
+ var usage bytes.Buffer
+ p.WriteUsage(&usage)
+ assert.Equal(t, expectedUsage, strings.TrimSpace(usage.String()))
+}
+
+func TestFail(t *testing.T) {
+ originalStderr := stderr
+ originalExit := osExit
+ defer func() {
+ stderr = originalStderr
+ osExit = originalExit
+ }()
+
+ var b bytes.Buffer
+ stderr = &b
+
+ var exitCode int
+ osExit = func(code int) { exitCode = code }
+
+ expectedStdout := `
+Usage: example [--foo FOO]
+error: something went wrong
+`
+
+ var args struct {
+ Foo int
+ }
+ p, err := NewParser(Config{Program: "example"}, &args)
+ require.NoError(t, err)
+ p.Fail("something went wrong")
+
+ assert.Equal(t, expectedStdout[1:], b.String())
+ assert.Equal(t, -1, exitCode)
}