diff options
Diffstat (limited to 'lib/opt/spec_test.go')
-rw-r--r-- | lib/opt/spec_test.go | 87 |
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) + }) + } +} |