| package flags |
| |
| import ( |
| "testing" |
| ) |
| |
| func TestPositional(t *testing.T) { |
| var opts = struct { |
| Value bool `short:"v"` |
| |
| Positional struct { |
| Command int |
| Filename string |
| Rest []string |
| } `positional-args:"yes" required:"yes"` |
| }{} |
| |
| p := NewParser(&opts, Default) |
| ret, err := p.ParseArgs([]string{"10", "arg_test.go", "a", "b"}) |
| |
| if err != nil { |
| t.Fatalf("Unexpected error: %v", err) |
| return |
| } |
| |
| if opts.Positional.Command != 10 { |
| t.Fatalf("Expected opts.Positional.Command to be 10, but got %v", opts.Positional.Command) |
| } |
| |
| if opts.Positional.Filename != "arg_test.go" { |
| t.Fatalf("Expected opts.Positional.Filename to be \"arg_test.go\", but got %v", opts.Positional.Filename) |
| } |
| |
| assertStringArray(t, opts.Positional.Rest, []string{"a", "b"}) |
| assertStringArray(t, ret, []string{}) |
| } |
| |
| func TestPositionalRequired(t *testing.T) { |
| var opts = struct { |
| Value bool `short:"v"` |
| |
| Positional struct { |
| Command int |
| Filename string |
| Rest []string |
| } `positional-args:"yes" required:"yes"` |
| }{} |
| |
| p := NewParser(&opts, None) |
| _, err := p.ParseArgs([]string{"10"}) |
| |
| assertError(t, err, ErrRequired, "the required argument `Filename` was not provided") |
| } |
| |
| func TestPositionalRequiredRest1Fail(t *testing.T) { |
| var opts = struct { |
| Value bool `short:"v"` |
| |
| Positional struct { |
| Rest []string `required:"yes"` |
| } `positional-args:"yes"` |
| }{} |
| |
| p := NewParser(&opts, None) |
| _, err := p.ParseArgs([]string{}) |
| |
| assertError(t, err, ErrRequired, "the required argument `Rest (at least 1 argument)` was not provided") |
| } |
| |
| func TestPositionalRequiredRest1Pass(t *testing.T) { |
| var opts = struct { |
| Value bool `short:"v"` |
| |
| Positional struct { |
| Rest []string `required:"yes"` |
| } `positional-args:"yes"` |
| }{} |
| |
| p := NewParser(&opts, None) |
| _, err := p.ParseArgs([]string{"rest1"}) |
| |
| if err != nil { |
| t.Fatalf("Unexpected error: %v", err) |
| return |
| } |
| |
| if len(opts.Positional.Rest) != 1 { |
| t.Fatalf("Expected 1 positional rest argument") |
| } |
| |
| assertString(t, opts.Positional.Rest[0], "rest1") |
| } |
| |
| func TestPositionalRequiredRest2Fail(t *testing.T) { |
| var opts = struct { |
| Value bool `short:"v"` |
| |
| Positional struct { |
| Rest []string `required:"2"` |
| } `positional-args:"yes"` |
| }{} |
| |
| p := NewParser(&opts, None) |
| _, err := p.ParseArgs([]string{"rest1"}) |
| |
| assertError(t, err, ErrRequired, "the required argument `Rest (at least 2 arguments, but got only 1)` was not provided") |
| } |
| |
| func TestPositionalRequiredRest2Pass(t *testing.T) { |
| var opts = struct { |
| Value bool `short:"v"` |
| |
| Positional struct { |
| Rest []string `required:"2"` |
| } `positional-args:"yes"` |
| }{} |
| |
| p := NewParser(&opts, None) |
| _, err := p.ParseArgs([]string{"rest1", "rest2", "rest3"}) |
| |
| if err != nil { |
| t.Fatalf("Unexpected error: %v", err) |
| return |
| } |
| |
| if len(opts.Positional.Rest) != 3 { |
| t.Fatalf("Expected 3 positional rest argument") |
| } |
| |
| assertString(t, opts.Positional.Rest[0], "rest1") |
| assertString(t, opts.Positional.Rest[1], "rest2") |
| assertString(t, opts.Positional.Rest[2], "rest3") |
| } |
| |
| func TestPositionalRequiredRestRangeFail(t *testing.T) { |
| var opts = struct { |
| Value bool `short:"v"` |
| |
| Positional struct { |
| Rest []string `required:"1-2"` |
| } `positional-args:"yes"` |
| }{} |
| |
| p := NewParser(&opts, None) |
| _, err := p.ParseArgs([]string{"rest1", "rest2", "rest3"}) |
| |
| assertError(t, err, ErrRequired, "the required argument `Rest (at most 2 arguments, but got 3)` was not provided") |
| } |
| |
| func TestPositionalRequiredRestRangeEmptyFail(t *testing.T) { |
| var opts = struct { |
| Value bool `short:"v"` |
| |
| Positional struct { |
| Rest []string `required:"0-0"` |
| } `positional-args:"yes"` |
| }{} |
| |
| p := NewParser(&opts, None) |
| _, err := p.ParseArgs([]string{"some", "thing"}) |
| |
| assertError(t, err, ErrRequired, "the required argument `Rest (zero arguments)` was not provided") |
| } |