1package pgs
2
3import (
4	"testing"
5	"time"
6
7	"github.com/stretchr/testify/assert"
8)
9
10func TestParameters_OutputPath(t *testing.T) {
11	t.Parallel()
12
13	p := Parameters{}
14	assert.Equal(t, ".", p.OutputPath())
15	p.SetOutputPath("foo")
16	assert.Equal(t, "foo", p.OutputPath())
17}
18
19func TestParseParameters(t *testing.T) {
20	t.Parallel()
21
22	tests := []struct {
23		in  string
24		out Parameters
25	}{
26		{
27			"foo=bar",
28			Parameters{"foo": "bar"},
29		},
30		{
31			"fizz",
32			Parameters{"fizz": ""},
33		},
34		{
35			"foo=bar,fizz=buzz",
36			Parameters{"foo": "bar", "fizz": "buzz"},
37		},
38		{
39			"foo=bar,foo",
40			Parameters{"foo": ""},
41		},
42	}
43
44	for _, test := range tests {
45		tc := test
46		t.Run(tc.in, func(t *testing.T) {
47			assert.Equal(t, tc.out, ParseParameters(tc.in))
48		})
49	}
50}
51
52func TestParameters_String(t *testing.T) {
53	t.Parallel()
54
55	tests := []struct {
56		in  Parameters
57		out string
58	}{
59		{
60			Parameters{"foo": "bar"},
61			"foo=bar",
62		},
63		{
64			Parameters{"fizz": ""},
65			"fizz",
66		},
67		{
68			Parameters{"foo": "bar", "fizz": ""},
69			"fizz,foo=bar",
70		},
71	}
72
73	for _, test := range tests {
74		tc := test
75		t.Run(tc.out, func(t *testing.T) {
76			assert.Equal(t, tc.out, tc.in.String())
77		})
78	}
79}
80
81func TestParameters_Str(t *testing.T) {
82	t.Parallel()
83
84	p := Parameters{"foo": "bar"}
85
86	assert.Equal(t, "bar", p.Str("foo"))
87	assert.Empty(t, p.Str("baz"))
88	assert.Equal(t, "fizz", p.StrDefault("baz", "fizz"))
89
90	p.SetStr("baz", "buzz")
91	assert.Equal(t, "buzz", p.Str("baz"))
92}
93
94func TestParameters_Int(t *testing.T) {
95	t.Parallel()
96
97	p := Parameters{"foo": "456", "fizz": "buzz"}
98
99	out, err := p.Int("foo")
100	assert.NoError(t, err)
101	assert.Equal(t, 456, out)
102
103	_, err = p.Int("fizz")
104	assert.Error(t, err)
105
106	out, err = p.Int("baz")
107	assert.NoError(t, err)
108	assert.Zero(t, out)
109
110	out, err = p.IntDefault("baz", 123)
111	assert.NoError(t, err)
112	assert.Equal(t, 123, out)
113
114	p.SetInt("baz", 789)
115	out, err = p.Int("baz")
116	assert.NoError(t, err)
117	assert.Equal(t, 789, out)
118}
119
120func TestParameters_Uint(t *testing.T) {
121	t.Parallel()
122
123	p := Parameters{"foo": "456", "fizz": "-789"}
124
125	out, err := p.Uint("foo")
126	assert.NoError(t, err)
127	assert.Equal(t, uint(456), out)
128
129	_, err = p.Uint("fizz")
130	assert.Error(t, err)
131
132	out, err = p.Uint("buzz")
133	assert.NoError(t, err)
134	assert.Zero(t, out)
135
136	out, err = p.UintDefault("baz", 123)
137	assert.NoError(t, err)
138	assert.Equal(t, uint(123), out)
139
140	p.SetUint("baz", 999)
141	out, err = p.Uint("baz")
142	assert.NoError(t, err)
143	assert.Equal(t, uint(999), out)
144}
145
146func TestParameters_Float(t *testing.T) {
147	t.Parallel()
148
149	p := Parameters{"foo": "1.23", "fizz": "buzz"}
150
151	out, err := p.Float("foo")
152	assert.NoError(t, err)
153	assert.Equal(t, 1.23, out)
154
155	_, err = p.Float("fizz")
156	assert.Error(t, err)
157
158	out, err = p.Float("baz")
159	assert.NoError(t, err)
160	assert.Zero(t, out)
161
162	out, err = p.FloatDefault("baz", 4.56)
163	assert.NoError(t, err)
164	assert.Equal(t, 4.56, out)
165
166	p.SetFloat("baz", -7.89)
167	out, err = p.Float("baz")
168	assert.NoError(t, err)
169	assert.Equal(t, -7.89, out)
170}
171
172func TestParameters_Bool(t *testing.T) {
173	t.Parallel()
174
175	p := Parameters{"foo": "true", "bar": "", "fizz": "buzz"}
176
177	out, err := p.Bool("foo")
178	assert.NoError(t, err)
179	assert.True(t, out)
180
181	out, err = p.Bool("bar")
182	assert.NoError(t, err)
183	assert.True(t, out)
184
185	_, err = p.Bool("fizz")
186	assert.Error(t, err)
187
188	out, err = p.Bool("baz")
189	assert.NoError(t, err)
190	assert.False(t, out)
191
192	out, err = p.BoolDefault("baz", true)
193	assert.NoError(t, err)
194	assert.True(t, out)
195
196	p.SetBool("baz", true)
197	out, err = p.Bool("baz")
198	assert.NoError(t, err)
199	assert.True(t, out)
200}
201
202func TestParameters_Duration(t *testing.T) {
203	t.Parallel()
204
205	p := Parameters{"foo": "123s", "fizz": "buzz"}
206
207	out, err := p.Duration("foo")
208	assert.NoError(t, err)
209	assert.Equal(t, 123*time.Second, out)
210
211	_, err = p.Duration("fizz")
212	assert.Error(t, err)
213
214	out, err = p.Duration("baz")
215	assert.NoError(t, err)
216	assert.Zero(t, out)
217
218	out, err = p.DurationDefault("baz", 456*time.Second)
219	assert.NoError(t, err)
220	assert.Equal(t, 456*time.Second, out)
221
222	p.SetDuration("baz", 789*time.Second)
223	out, err = p.Duration("baz")
224	assert.NoError(t, err)
225	assert.Equal(t, 789*time.Second, out)
226}
227
228func TestParameters_Clone(t *testing.T) {
229	t.Parallel()
230
231	orig := Parameters{"foo": "bar", "fizz": "buzz"}
232
233	clone := orig.Clone()
234	assert.Equal(t, orig, clone)
235
236	clone.SetStr("foo", "baz")
237	assert.NotEqual(t, orig, clone)
238}
239