@@ -17,6 +17,7 @@ limitations under the License.
1717package codetags
1818
1919import (
20+ "reflect"
2021 "testing"
2122)
2223
@@ -197,3 +198,134 @@ func TestTypedTagString(t *testing.T) {
197198 })
198199 }
199200}
201+
202+ func TestTagArgAccessors (t * testing.T ) {
203+ strPtr := func (s string ) * string { return & s }
204+
205+ tests := []struct {
206+ name string
207+ tag Tag
208+ argName * string
209+ wantPositional * Arg
210+ wantNamed * Arg
211+ found bool
212+ }{
213+ {
214+ name : "found positional arg" ,
215+ tag : Tag {
216+ Name : "tag" ,
217+ Args : []Arg {
218+ {Value : "value1" , Type : ArgTypeInt },
219+ },
220+ },
221+ wantPositional : & Arg {Value : "value1" , Type : ArgTypeInt },
222+ found : true ,
223+ },
224+ {
225+ name : "not found positional arg, no args" ,
226+ tag : Tag {
227+ Name : "tag" ,
228+ Args : []Arg {},
229+ },
230+ found : false ,
231+ },
232+ {
233+ name : "not found positional arg, only named args" ,
234+ tag : Tag {
235+ Name : "tag" ,
236+ Args : []Arg {
237+ {Name : "arg1" , Value : "value1" , Type : ArgTypeInt },
238+ {Name : "arg1" , Value : "value2" , Type : ArgTypeString },
239+ },
240+ },
241+ found : false ,
242+ },
243+
244+ {
245+ name : "found named arg, first" ,
246+ tag : Tag {
247+ Name : "tag" ,
248+ Args : []Arg {
249+ {Name : "arg1" , Value : "value1" , Type : ArgTypeString },
250+ {Name : "arg2" , Value : "value2" , Type : ArgTypeString },
251+ {Name : "arg3" , Value : "value3" , Type : ArgTypeString },
252+ },
253+ },
254+ argName : strPtr ("arg1" ),
255+ wantNamed : & Arg {Name : "arg1" , Value : "value1" , Type : ArgTypeString },
256+ found : true ,
257+ },
258+ {
259+ name : "found named arg, second" ,
260+ tag : Tag {
261+ Name : "tag" ,
262+ Args : []Arg {
263+ {Name : "arg1" , Value : "value1" , Type : ArgTypeString },
264+ {Name : "arg2" , Value : "value2" , Type : ArgTypeString },
265+ {Name : "arg3" , Value : "value3" , Type : ArgTypeString },
266+ },
267+ },
268+ argName : strPtr ("arg3" ),
269+ wantNamed : & Arg {Name : "arg3" , Value : "value3" , Type : ArgTypeString },
270+ found : true ,
271+ },
272+ {
273+ name : "not found named arg, no args" ,
274+ tag : Tag {
275+ Name : "tag" ,
276+ Args : []Arg {},
277+ },
278+ argName : strPtr ("arg1" ),
279+ found : false ,
280+ },
281+ {
282+ name : "not found named arg, not in args" ,
283+ tag : Tag {
284+ Name : "tag" ,
285+ Args : []Arg {
286+ {Name : "arg1" , Value : "value1" , Type : ArgTypeString },
287+ {Name : "arg2" , Value : "value2" , Type : ArgTypeString },
288+ {Name : "arg3" , Value : "value3" , Type : ArgTypeString },
289+ },
290+ },
291+ argName : strPtr ("arg4" ),
292+ found : false ,
293+ },
294+ {
295+ name : "not found named arg, only positional args" ,
296+ tag : Tag {
297+ Name : "tag" ,
298+ Args : []Arg {
299+ {Value : "value1" , Type : ArgTypeString },
300+ },
301+ },
302+ argName : strPtr ("" ),
303+ found : false ,
304+ },
305+ }
306+
307+ for _ , tt := range tests {
308+ t .Run (tt .name , func (t * testing.T ) {
309+ if tt .wantPositional != nil {
310+ got , ok := tt .tag .PositionalArg ()
311+ if ok != tt .found {
312+ t .Fatalf ("got: %v, want: %v" , ok , tt .found )
313+ }
314+ if ! reflect .DeepEqual (got , * tt .wantPositional ) {
315+ t .Fatalf ("got: %v, want: %v" , got , tt .wantPositional )
316+ }
317+ }
318+ if tt .argName != nil {
319+ got , ok := tt .tag .NamedArg (* tt .argName )
320+ if ok != tt .found {
321+ t .Fatalf ("got: %v, want: %v" , ok , tt .found )
322+ }
323+ if tt .wantNamed != nil {
324+ if ! reflect .DeepEqual (got , * tt .wantNamed ) {
325+ t .Fatalf ("got: %v, want: %v" , got , tt .wantNamed )
326+ }
327+ }
328+ }
329+ })
330+ }
331+ }
0 commit comments