1package flags
2
3import (
4	"testing"
5)
6
7func TestPositional(t *testing.T) {
8	var opts = struct {
9		Value bool `short:"v"`
10
11		Positional struct {
12			Command  int
13			Filename string
14			Rest     []string
15		} `positional-args:"yes" required:"yes"`
16	}{}
17
18	p := NewParser(&opts, Default)
19	ret, err := p.ParseArgs([]string{"10", "arg_test.go", "a", "b"})
20
21	if err != nil {
22		t.Fatalf("Unexpected error: %v", err)
23		return
24	}
25
26	if opts.Positional.Command != 10 {
27		t.Fatalf("Expected opts.Positional.Command to be 10, but got %v", opts.Positional.Command)
28	}
29
30	if opts.Positional.Filename != "arg_test.go" {
31		t.Fatalf("Expected opts.Positional.Filename to be \"arg_test.go\", but got %v", opts.Positional.Filename)
32	}
33
34	assertStringArray(t, opts.Positional.Rest, []string{"a", "b"})
35	assertStringArray(t, ret, []string{})
36}
37
38func TestPositionalRequired(t *testing.T) {
39	var opts = struct {
40		Value bool `short:"v"`
41
42		Positional struct {
43			Command  int
44			Filename string
45			Rest     []string
46		} `positional-args:"yes" required:"yes"`
47	}{}
48
49	p := NewParser(&opts, None)
50	_, err := p.ParseArgs([]string{"10"})
51
52	assertError(t, err, ErrRequired, "the required argument `Filename` was not provided")
53}
54
55func TestPositionalRequiredRest1Fail(t *testing.T) {
56	var opts = struct {
57		Value bool `short:"v"`
58
59		Positional struct {
60			Rest []string `required:"yes"`
61		} `positional-args:"yes"`
62	}{}
63
64	p := NewParser(&opts, None)
65	_, err := p.ParseArgs([]string{})
66
67	assertError(t, err, ErrRequired, "the required argument `Rest (at least 1 argument)` was not provided")
68}
69
70func TestPositionalRequiredRest1Pass(t *testing.T) {
71	var opts = struct {
72		Value bool `short:"v"`
73
74		Positional struct {
75			Rest []string `required:"yes"`
76		} `positional-args:"yes"`
77	}{}
78
79	p := NewParser(&opts, None)
80	_, err := p.ParseArgs([]string{"rest1"})
81
82	if err != nil {
83		t.Fatalf("Unexpected error: %v", err)
84		return
85	}
86
87	if len(opts.Positional.Rest) != 1 {
88		t.Fatalf("Expected 1 positional rest argument")
89	}
90
91	assertString(t, opts.Positional.Rest[0], "rest1")
92}
93
94func TestPositionalRequiredRest2Fail(t *testing.T) {
95	var opts = struct {
96		Value bool `short:"v"`
97
98		Positional struct {
99			Rest []string `required:"2"`
100		} `positional-args:"yes"`
101	}{}
102
103	p := NewParser(&opts, None)
104	_, err := p.ParseArgs([]string{"rest1"})
105
106	assertError(t, err, ErrRequired, "the required argument `Rest (at least 2 arguments, but got only 1)` was not provided")
107}
108
109func TestPositionalRequiredRest2Pass(t *testing.T) {
110	var opts = struct {
111		Value bool `short:"v"`
112
113		Positional struct {
114			Rest []string `required:"2"`
115		} `positional-args:"yes"`
116	}{}
117
118	p := NewParser(&opts, None)
119	_, err := p.ParseArgs([]string{"rest1", "rest2", "rest3"})
120
121	if err != nil {
122		t.Fatalf("Unexpected error: %v", err)
123		return
124	}
125
126	if len(opts.Positional.Rest) != 3 {
127		t.Fatalf("Expected 3 positional rest argument")
128	}
129
130	assertString(t, opts.Positional.Rest[0], "rest1")
131	assertString(t, opts.Positional.Rest[1], "rest2")
132	assertString(t, opts.Positional.Rest[2], "rest3")
133}
134
135func TestPositionalRequiredRestRangeFail(t *testing.T) {
136	var opts = struct {
137		Value bool `short:"v"`
138
139		Positional struct {
140			Rest []string `required:"1-2"`
141		} `positional-args:"yes"`
142	}{}
143
144	p := NewParser(&opts, None)
145	_, err := p.ParseArgs([]string{"rest1", "rest2", "rest3"})
146
147	assertError(t, err, ErrRequired, "the required argument `Rest (at most 2 arguments, but got 3)` was not provided")
148}
149
150func TestPositionalRequiredRestRangeEmptyFail(t *testing.T) {
151	var opts = struct {
152		Value bool `short:"v"`
153
154		Positional struct {
155			Rest []string `required:"0-0"`
156		} `positional-args:"yes"`
157	}{}
158
159	p := NewParser(&opts, None)
160	_, err := p.ParseArgs([]string{"some", "thing"})
161
162	assertError(t, err, ErrRequired, "the required argument `Rest (zero arguments)` was not provided")
163}
164