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