aboutsummaryrefslogtreecommitdiff
path: root/lib/opt/spec_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'lib/opt/spec_test.go')
-rw-r--r--lib/opt/spec_test.go87
1 files changed, 87 insertions, 0 deletions
diff --git a/lib/opt/spec_test.go b/lib/opt/spec_test.go
new file mode 100644
index 00000000..eec9db4f
--- /dev/null
+++ b/lib/opt/spec_test.go
@@ -0,0 +1,87 @@
+package opt
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+type OptionStruct struct {
+ Jobs int `opt:"-j,--jobs" required:"true"`
+ Delay float64 `opt:"--delay" default:"0.5"`
+ Zero bool `opt:"-z"`
+ Backoff bool `opt:"-B,--backoff"`
+ Name string `opt:"NAME"`
+}
+
+func TestArgsToStructErrors(t *testing.T) {
+ vectors := []struct {
+ cmdline string
+ err string
+ }{
+ {"foo", "-j is required"},
+ {"foo -j", "-j requires a value"},
+ {"foo --delay -B", "--delay requires a value"},
+ {"foo -j4", "NAME is required"},
+ {"foo -j f", `strconv.ParseInt: parsing "f": invalid syntax.`},
+ {"foo --delay=m", `strconv.ParseFloat: parsing "m": invalid syntax.`},
+ {"foo --jobs 8 bar baz", `unexpected argument "baz"`},
+ {"foo -u8", "unknown flag -u"},
+ {"foo --remove", "unknown flag --remove"},
+ }
+
+ for _, v := range vectors {
+ t.Run(v.cmdline, func(t *testing.T) {
+ args, err := SplitArgs(v.cmdline)
+ if err != nil {
+ t.Fatal(err)
+ }
+ err = ArgsToStruct(args, new(OptionStruct))
+ assert.ErrorContains(t, err, v.err)
+ })
+ }
+}
+
+func TestArgsToStruct(t *testing.T) {
+ vectors := []struct {
+ cmdline string
+ expected OptionStruct
+ }{
+ {
+ cmdline: "foo -j4 bar",
+ expected: OptionStruct{
+ Jobs: 4,
+ Delay: 0.5,
+ Name: "bar",
+ },
+ },
+ {
+ cmdline: "foo --delay 0.1 -zBj 8 bar",
+ expected: OptionStruct{
+ Jobs: 8,
+ Delay: 0.1,
+ Zero: true,
+ Backoff: true,
+ Name: "bar",
+ },
+ },
+ {
+ cmdline: "foo -Bz --delay=0.1 --jobs=8 bar",
+ expected: OptionStruct{
+ Jobs: 8,
+ Delay: 0.1,
+ Zero: true,
+ Backoff: true,
+ Name: "bar",
+ },
+ },
+ }
+
+ for _, v := range vectors {
+ t.Run(v.cmdline, func(t *testing.T) {
+ var s OptionStruct
+ assert.Nil(t, CmdlineToStruct(v.cmdline, &s))
+ assert.Equal(t, v.expected, s)
+ })
+ }
+}