package flags import ( "testing" ) func TestPointerBool(t *testing.T) { var opts = struct { Value *bool `short:"v"` }{} ret := assertParseSuccess(t, &opts, "-v") assertStringArray(t, ret, []string{}) if !*opts.Value { t.Errorf("Expected Value to be true") } } func TestPointerString(t *testing.T) { var opts = struct { Value *string `short:"v"` }{} ret := assertParseSuccess(t, &opts, "-v", "value") assertStringArray(t, ret, []string{}) assertString(t, *opts.Value, "value") } func TestPointerSlice(t *testing.T) { var opts = struct { Value *[]string `short:"v"` }{} ret := assertParseSuccess(t, &opts, "-v", "value1", "-v", "value2") assertStringArray(t, ret, []string{}) assertStringArray(t, *opts.Value, []string{"value1", "value2"}) } func TestPointerMap(t *testing.T) { var opts = struct { Value *map[string]int `short:"v"` }{} ret := assertParseSuccess(t, &opts, "-v", "k1:2", "-v", "k2:-5") assertStringArray(t, ret, []string{}) if v, ok := (*opts.Value)["k1"]; !ok { t.Errorf("Expected key \"k1\" to exist") } else if v != 2 { t.Errorf("Expected \"k1\" to be 2, but got %#v", v) } if v, ok := (*opts.Value)["k2"]; !ok { t.Errorf("Expected key \"k2\" to exist") } else if v != -5 { t.Errorf("Expected \"k2\" to be -5, but got %#v", v) } } type marshalledString string func (m *marshalledString) UnmarshalFlag(value string) error { *m = marshalledString(value) return nil } func (m marshalledString) MarshalFlag() (string, error) { return string(m), nil } func TestPointerStringMarshalled(t *testing.T) { var opts = struct { Value *marshalledString `short:"v"` }{} ret := assertParseSuccess(t, &opts, "-v", "value") assertStringArray(t, ret, []string{}) if opts.Value == nil { t.Error("Expected value not to be nil") return } assertString(t, string(*opts.Value), "value") } type marshalledStruct struct { Value string } func (m *marshalledStruct) UnmarshalFlag(value string) error { m.Value = value return nil } func (m marshalledStruct) MarshalFlag() (string, error) { return m.Value, nil } func TestPointerStructMarshalled(t *testing.T) { var opts = struct { Value *marshalledStruct `short:"v"` }{} ret := assertParseSuccess(t, &opts, "-v", "value") assertStringArray(t, ret, []string{}) if opts.Value == nil { t.Error("Expected value not to be nil") return } assertString(t, opts.Value.Value, "value") } type PointerGroup struct { Value bool `short:"v"` } func TestPointerGroup(t *testing.T) { var opts = struct { Group *PointerGroup `group:"Group Options"` }{} ret := assertParseSuccess(t, &opts, "-v") assertStringArray(t, ret, []string{}) if !opts.Group.Value { t.Errorf("Expected Group.Value to be true") } } func TestDoNotChangeNonTaggedFields(t *testing.T) { var opts struct { A struct { Pointer *int } B *struct { Pointer *int } } ret := assertParseSuccess(t, &opts) assertStringArray(t, ret, []string{}) if opts.A.Pointer != nil { t.Error("Expected A.Pointer to be nil") } if opts.B != nil { t.Error("Expected B to be nil") } if opts.B != nil && opts.B.Pointer != nil { t.Error("Expected B.Pointer to be nil") } }