test expandOpts

This commit is contained in:
bth 2026-01-29 12:00:19 -08:00
commit db3f01e142
2 changed files with 32 additions and 3 deletions

View file

@ -145,16 +145,16 @@ func expandOpts(opts any) ([]Flag, error) {
for j := 0; j < v.NumField(); j++ { for j := 0; j < v.NumField(); j++ {
field := v.Field(j) field := v.Field(j)
if field.Kind() != reflect.Struct { if field.Kind() != reflect.Struct {
return nil, ParseError{fmt.Sprintf("needs a struct: %#v", field.Kind())} return nil, ParseError{fmt.Sprintf("field must be a struct: %#v", field.Kind())}
} }
if !field.CanAddr() { if !field.CanAddr() {
return nil, ParseError{fmt.Sprintf("needs an addressable type: %#v", field.Type())} return nil, ParseError{fmt.Sprintf("field must be addressable type: %#v", field.Type())}
} }
// NOTE: Addr() gets the underlying address: // NOTE: Addr() gets the underlying address:
if f, ok := field.Addr().Interface().(Flag); ok { if f, ok := field.Addr().Interface().(Flag); ok {
flags = append(flags, f) flags = append(flags, f)
} else { } else {
return nil, ParseError{fmt.Sprintf("needs a []Flag interface: %#v", field.Type())} return nil, ParseError{fmt.Sprintf("field must be a []Flag interface: %#v", field.Type())}
} }
} }
return flags, nil return flags, nil

View file

@ -57,6 +57,35 @@ func TestParseArgsHelp(t *testing.T) {
assert.True(t, opts.Help.Val) assert.True(t, opts.Help.Val)
} }
func TestExpandOpts(t *testing.T) {
opts := initOpts()
flags, err := expandOpts(&opts)
assert.NoError(t, err)
assert.Equal(t, &opts.Descriptor, flags[0])
assert.Equal(t, &opts.Tags, flags[1])
assert.Equal(t, &opts.Source, flags[2])
assert.Equal(t, &opts.Write, flags[3])
assert.Equal(t, &opts.Help, flags[4])
}
func TestExpandOptsNeedsPointer(t *testing.T) {
opts := initOpts()
_, err := expandOpts(opts)
assert.ErrorContains(t, err, "needs a pointer to a struct")
err = ParseArgs(helpErr, nil, opts)
assert.ErrorContains(t, err, "needs a pointer to a struct")
}
func TestExpandOptsNeedsStruct(t *testing.T) {
badOpts := struct {
bar string
foo bool
}{"bar", false}
_, err := expandOpts(&badOpts)
assert.ErrorContains(t, err, "field must be a struct")
}
func TestParseArgsString(t *testing.T) { func TestParseArgsString(t *testing.T) {
args := []string{"--source", "foo"} args := []string{"--source", "foo"}
opts := initOpts() opts := initOpts()