A flags_test.go

This commit is contained in:
bth 2026-01-28 21:41:22 -08:00
commit 8e7daebb18

85
flags/flags_test.go Normal file
View file

@ -0,0 +1,85 @@
package flags
import (
"testing"
"github.com/stretchr/testify/assert"
)
const (
CMD = "TEST"
SUMMARY = "SUMMARY"
)
type options struct {
Descriptor Arg
Tags Arg
Source String
Write Bool
Help Bool
}
func initOpts() options {
return options{
Arg{"", "midfix file descriptor"},
Arg{"", "tags to add to new file"},
String{"--source", "-s", "", "path to source list. reads from stdin if omitted."},
Bool{"--write", "-w", false, "write sorted list back to --key file"},
Bool{"--help", "-h", false, "show help"},
}
}
func TestParseArgsInternal(t *testing.T) {
flags := []Flag{
&Arg{"", "midfix file descriptor"},
&Arg{"", "tags to add to new file"},
&String{"--source", "-s", "", "path to source list. reads from stdin if omitted."},
&Bool{"--write", "-w", false, "write sorted list back to --key file"},
&Bool{"--help", "-h", false, "show help"},
}
args := []string{"--source", "foo"}
parseArgsInternal(CMD, SUMMARY, args, initOpts(), flags)
assert.False(t, flags[0].IsSet())
assert.False(t, flags[0].IsHelp())
assert.True(t, flags[2].IsSet())
assert.True(t, flags[4].IsHelp())
}
// TODO: return errors from Help routines and print at top level, so I can test those cases
func TestParseArgsString(t *testing.T) {
args := []string{"--source", "foo"}
opts := initOpts()
ParseArgs(CMD, SUMMARY, args, &opts)
assert.Equal(t, opts.Source.Val, "foo")
}
func TestParseArgs(t *testing.T) {
opts := initOpts()
cases := []struct {
name string
args []string
stringVal *string
stringWant string
boolVal *bool
boolWant bool
}{
{"arg", []string{"bar"}, &opts.Descriptor.Val, "bar", nil, false},
{"arg arg", []string{"bar", "foo"}, &opts.Tags.Val, "foo", nil, false},
{"--bool", []string{"--write"}, nil, "", &opts.Write.Val, true},
{"arg --bool", []string{"foo", "--write"}, &opts.Descriptor.Val, "foo", &opts.Write.Val, true},
{"--flag val", []string{"--source", "foo"}, &opts.Source.Val, "foo", nil, false},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
ParseArgs(CMD, SUMMARY, tc.args, &opts)
if tc.boolVal != nil {
assert.True(t, *tc.boolVal)
}
if tc.stringVal != nil {
assert.Equal(t, *tc.stringVal, tc.stringWant)
}
})
}
}