1package flags
2
3import (
4	"testing"
5)
6
7func TestPointerBool(t *testing.T) {
8	var opts = struct {
9		Value *bool `short:"v"`
10	}{}
11
12	ret := assertParseSuccess(t, &opts, "-v")
13
14	assertStringArray(t, ret, []string{})
15
16	if !*opts.Value {
17		t.Errorf("Expected Value to be true")
18	}
19}
20
21func TestPointerString(t *testing.T) {
22	var opts = struct {
23		Value *string `short:"v"`
24	}{}
25
26	ret := assertParseSuccess(t, &opts, "-v", "value")
27
28	assertStringArray(t, ret, []string{})
29	assertString(t, *opts.Value, "value")
30}
31
32func TestPointerSlice(t *testing.T) {
33	var opts = struct {
34		Value *[]string `short:"v"`
35	}{}
36
37	ret := assertParseSuccess(t, &opts, "-v", "value1", "-v", "value2")
38
39	assertStringArray(t, ret, []string{})
40	assertStringArray(t, *opts.Value, []string{"value1", "value2"})
41}
42
43func TestPointerMap(t *testing.T) {
44	var opts = struct {
45		Value *map[string]int `short:"v"`
46	}{}
47
48	ret := assertParseSuccess(t, &opts, "-v", "k1:2", "-v", "k2:-5")
49
50	assertStringArray(t, ret, []string{})
51
52	if v, ok := (*opts.Value)["k1"]; !ok {
53		t.Errorf("Expected key \"k1\" to exist")
54	} else if v != 2 {
55		t.Errorf("Expected \"k1\" to be 2, but got %#v", v)
56	}
57
58	if v, ok := (*opts.Value)["k2"]; !ok {
59		t.Errorf("Expected key \"k2\" to exist")
60	} else if v != -5 {
61		t.Errorf("Expected \"k2\" to be -5, but got %#v", v)
62	}
63}
64
65type marshalledString string
66
67func (m *marshalledString) UnmarshalFlag(value string) error {
68	*m = marshalledString(value)
69	return nil
70}
71
72func (m marshalledString) MarshalFlag() (string, error) {
73	return string(m), nil
74}
75
76func TestPointerStringMarshalled(t *testing.T) {
77	var opts = struct {
78		Value *marshalledString `short:"v"`
79	}{}
80
81	ret := assertParseSuccess(t, &opts, "-v", "value")
82
83	assertStringArray(t, ret, []string{})
84
85	if opts.Value == nil {
86		t.Error("Expected value not to be nil")
87		return
88	}
89
90	assertString(t, string(*opts.Value), "value")
91}
92
93type marshalledStruct struct {
94	Value string
95}
96
97func (m *marshalledStruct) UnmarshalFlag(value string) error {
98	m.Value = value
99	return nil
100}
101
102func (m marshalledStruct) MarshalFlag() (string, error) {
103	return m.Value, nil
104}
105
106func TestPointerStructMarshalled(t *testing.T) {
107	var opts = struct {
108		Value *marshalledStruct `short:"v"`
109	}{}
110
111	ret := assertParseSuccess(t, &opts, "-v", "value")
112
113	assertStringArray(t, ret, []string{})
114
115	if opts.Value == nil {
116		t.Error("Expected value not to be nil")
117		return
118	}
119
120	assertString(t, opts.Value.Value, "value")
121}
122
123type PointerGroup struct {
124	Value bool `short:"v"`
125}
126
127func TestPointerGroup(t *testing.T) {
128	var opts = struct {
129		Group *PointerGroup `group:"Group Options"`
130	}{}
131
132	ret := assertParseSuccess(t, &opts, "-v")
133
134	assertStringArray(t, ret, []string{})
135
136	if !opts.Group.Value {
137		t.Errorf("Expected Group.Value to be true")
138	}
139}
140
141func TestDoNotChangeNonTaggedFields(t *testing.T) {
142	var opts struct {
143		A struct {
144			Pointer *int
145		}
146		B *struct {
147			Pointer *int
148		}
149	}
150
151	ret := assertParseSuccess(t, &opts)
152
153	assertStringArray(t, ret, []string{})
154
155	if opts.A.Pointer != nil {
156		t.Error("Expected A.Pointer to be nil")
157	}
158	if opts.B != nil {
159		t.Error("Expected B to be nil")
160	}
161	if opts.B != nil && opts.B.Pointer != nil {
162		t.Error("Expected B.Pointer to be nil")
163	}
164}
165