1// Copyright 2009 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package pflag 6 7import ( 8 "fmt" 9 "testing" 10) 11 12func setUpSAFlagSet(sap *[]string) *FlagSet { 13 f := NewFlagSet("test", ContinueOnError) 14 f.StringArrayVar(sap, "sa", []string{}, "Command separated list!") 15 return f 16} 17 18func setUpSAFlagSetWithDefault(sap *[]string) *FlagSet { 19 f := NewFlagSet("test", ContinueOnError) 20 f.StringArrayVar(sap, "sa", []string{"default", "values"}, "Command separated list!") 21 return f 22} 23 24func TestEmptySA(t *testing.T) { 25 var sa []string 26 f := setUpSAFlagSet(&sa) 27 err := f.Parse([]string{}) 28 if err != nil { 29 t.Fatal("expected no error; got", err) 30 } 31 32 getSA, err := f.GetStringArray("sa") 33 if err != nil { 34 t.Fatal("got an error from GetStringArray():", err) 35 } 36 if len(getSA) != 0 { 37 t.Fatalf("got sa %v with len=%d but expected length=0", getSA, len(getSA)) 38 } 39} 40 41func TestEmptySAValue(t *testing.T) { 42 var sa []string 43 f := setUpSAFlagSet(&sa) 44 err := f.Parse([]string{"--sa="}) 45 if err != nil { 46 t.Fatal("expected no error; got", err) 47 } 48 49 getSA, err := f.GetStringArray("sa") 50 if err != nil { 51 t.Fatal("got an error from GetStringArray():", err) 52 } 53 if len(getSA) != 0 { 54 t.Fatalf("got sa %v with len=%d but expected length=0", getSA, len(getSA)) 55 } 56} 57 58func TestSADefault(t *testing.T) { 59 var sa []string 60 f := setUpSAFlagSetWithDefault(&sa) 61 62 vals := []string{"default", "values"} 63 64 err := f.Parse([]string{}) 65 if err != nil { 66 t.Fatal("expected no error; got", err) 67 } 68 for i, v := range sa { 69 if vals[i] != v { 70 t.Fatalf("expected sa[%d] to be %s but got: %s", i, vals[i], v) 71 } 72 } 73 74 getSA, err := f.GetStringArray("sa") 75 if err != nil { 76 t.Fatal("got an error from GetStringArray():", err) 77 } 78 for i, v := range getSA { 79 if vals[i] != v { 80 t.Fatalf("expected sa[%d] to be %s from GetStringArray but got: %s", i, vals[i], v) 81 } 82 } 83} 84 85func TestSAWithDefault(t *testing.T) { 86 var sa []string 87 f := setUpSAFlagSetWithDefault(&sa) 88 89 val := "one" 90 arg := fmt.Sprintf("--sa=%s", val) 91 err := f.Parse([]string{arg}) 92 if err != nil { 93 t.Fatal("expected no error; got", err) 94 } 95 96 if len(sa) != 1 { 97 t.Fatalf("expected number of values to be %d but %d", 1, len(sa)) 98 } 99 100 if sa[0] != val { 101 t.Fatalf("expected value to be %s but got: %s", sa[0], val) 102 } 103 104 getSA, err := f.GetStringArray("sa") 105 if err != nil { 106 t.Fatal("got an error from GetStringArray():", err) 107 } 108 109 if len(getSA) != 1 { 110 t.Fatalf("expected number of values to be %d but %d", 1, len(getSA)) 111 } 112 113 if getSA[0] != val { 114 t.Fatalf("expected value to be %s but got: %s", getSA[0], val) 115 } 116} 117 118func TestSACalledTwice(t *testing.T) { 119 var sa []string 120 f := setUpSAFlagSet(&sa) 121 122 in := []string{"one", "two"} 123 expected := []string{"one", "two"} 124 argfmt := "--sa=%s" 125 arg1 := fmt.Sprintf(argfmt, in[0]) 126 arg2 := fmt.Sprintf(argfmt, in[1]) 127 err := f.Parse([]string{arg1, arg2}) 128 if err != nil { 129 t.Fatal("expected no error; got", err) 130 } 131 132 if len(expected) != len(sa) { 133 t.Fatalf("expected number of sa to be %d but got: %d", len(expected), len(sa)) 134 } 135 for i, v := range sa { 136 if expected[i] != v { 137 t.Fatalf("expected sa[%d] to be %s but got: %s", i, expected[i], v) 138 } 139 } 140 141 values, err := f.GetStringArray("sa") 142 if err != nil { 143 t.Fatal("expected no error; got", err) 144 } 145 146 if len(expected) != len(values) { 147 t.Fatalf("expected number of values to be %d but got: %d", len(expected), len(sa)) 148 } 149 for i, v := range values { 150 if expected[i] != v { 151 t.Fatalf("expected got sa[%d] to be %s but got: %s", i, expected[i], v) 152 } 153 } 154} 155 156func TestSAWithSpecialChar(t *testing.T) { 157 var sa []string 158 f := setUpSAFlagSet(&sa) 159 160 in := []string{"one,two", `"three"`, `"four,five",six`, "seven eight"} 161 expected := []string{"one,two", `"three"`, `"four,five",six`, "seven eight"} 162 argfmt := "--sa=%s" 163 arg1 := fmt.Sprintf(argfmt, in[0]) 164 arg2 := fmt.Sprintf(argfmt, in[1]) 165 arg3 := fmt.Sprintf(argfmt, in[2]) 166 arg4 := fmt.Sprintf(argfmt, in[3]) 167 err := f.Parse([]string{arg1, arg2, arg3, arg4}) 168 if err != nil { 169 t.Fatal("expected no error; got", err) 170 } 171 172 if len(expected) != len(sa) { 173 t.Fatalf("expected number of sa to be %d but got: %d", len(expected), len(sa)) 174 } 175 for i, v := range sa { 176 if expected[i] != v { 177 t.Fatalf("expected sa[%d] to be %s but got: %s", i, expected[i], v) 178 } 179 } 180 181 values, err := f.GetStringArray("sa") 182 if err != nil { 183 t.Fatal("expected no error; got", err) 184 } 185 186 if len(expected) != len(values) { 187 t.Fatalf("expected number of values to be %d but got: %d", len(expected), len(values)) 188 } 189 for i, v := range values { 190 if expected[i] != v { 191 t.Fatalf("expected got sa[%d] to be %s but got: %s", i, expected[i], v) 192 } 193 } 194} 195 196func TestSAAsSliceValue(t *testing.T) { 197 var sa []string 198 f := setUpSAFlagSet(&sa) 199 200 in := []string{"1ns", "2ns"} 201 argfmt := "--sa=%s" 202 arg1 := fmt.Sprintf(argfmt, in[0]) 203 arg2 := fmt.Sprintf(argfmt, in[1]) 204 err := f.Parse([]string{arg1, arg2}) 205 if err != nil { 206 t.Fatal("expected no error; got", err) 207 } 208 209 f.VisitAll(func(f *Flag) { 210 if val, ok := f.Value.(SliceValue); ok { 211 _ = val.Replace([]string{"3ns"}) 212 } 213 }) 214 if len(sa) != 1 || sa[0] != "3ns" { 215 t.Fatalf("Expected ss to be overwritten with '3ns', but got: %v", sa) 216 } 217} 218 219func TestSAWithSquareBrackets(t *testing.T) { 220 var sa []string 221 f := setUpSAFlagSet(&sa) 222 223 in := []string{"][]-[", "[a-z]", "[a-z]+"} 224 expected := []string{"][]-[", "[a-z]", "[a-z]+"} 225 argfmt := "--sa=%s" 226 arg1 := fmt.Sprintf(argfmt, in[0]) 227 arg2 := fmt.Sprintf(argfmt, in[1]) 228 arg3 := fmt.Sprintf(argfmt, in[2]) 229 err := f.Parse([]string{arg1, arg2, arg3}) 230 if err != nil { 231 t.Fatal("expected no error; got", err) 232 } 233 234 if len(expected) != len(sa) { 235 t.Fatalf("expected number of sa to be %d but got: %d", len(expected), len(sa)) 236 } 237 for i, v := range sa { 238 if expected[i] != v { 239 t.Fatalf("expected sa[%d] to be %s but got: %s", i, expected[i], v) 240 } 241 } 242 243 values, err := f.GetStringArray("sa") 244 if err != nil { 245 t.Fatal("expected no error; got", err) 246 } 247 248 if len(expected) != len(values) { 249 t.Fatalf("expected number of values to be %d but got: %d", len(expected), len(values)) 250 } 251 for i, v := range values { 252 if expected[i] != v { 253 t.Fatalf("expected got sa[%d] to be %s but got: %s", i, expected[i], v) 254 } 255 } 256} 257