aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--flag.go4
-rw-r--r--flag_test.go40
2 files changed, 42 insertions, 2 deletions
diff --git a/flag.go b/flag.go
index 330bb64..dbb3907 100644
--- a/flag.go
+++ b/flag.go
@@ -1157,12 +1157,12 @@ func (f *FlagSet) Parse(arguments []string) error {
}
f.parsed = true
+ f.args = make([]string, 0, len(arguments))
+
if len(arguments) == 0 {
return nil
}
- f.args = make([]string, 0, len(arguments))
-
set := func(flag *Flag, value string) error {
return f.Set(flag.Name, value)
}
diff --git a/flag_test.go b/flag_test.go
index 2df3ea2..31491c8 100644
--- a/flag_test.go
+++ b/flag_test.go
@@ -656,6 +656,46 @@ func TestFlagSetParse(t *testing.T) {
testParse(NewFlagSet("test", ContinueOnError), t)
}
+func TestParseRepeated(t *testing.T) {
+ fs := NewFlagSet("test repeated", ContinueOnError)
+
+ t.Run("first parse", func(t *testing.T) {
+ err := fs.Parse([]string{"foo", "bar"})
+ if err != nil {
+ t.Fatal("expected no error, got ", err)
+ }
+
+ argsAfterFirst := fs.Args()
+ if !reflect.DeepEqual(argsAfterFirst, []string{"foo", "bar"}) {
+ t.Fatalf("expected args [foo bar], got %v", argsAfterFirst)
+ }
+ })
+
+ t.Run("re-parse with fewer args", func(t *testing.T) {
+ err := fs.Parse([]string{"baz"})
+ if err != nil {
+ t.Fatal("expected no error, got ", err)
+ }
+
+ argsAfterSecond := fs.Args()
+ if !reflect.DeepEqual(argsAfterSecond, []string{"baz"}) {
+ t.Fatalf("expected args [baz], got %v", argsAfterSecond)
+ }
+ })
+
+ t.Run("re-parse with no args", func(t *testing.T) {
+ err := fs.Parse([]string{})
+ if err != nil {
+ t.Fatal("expected no error, got ", err)
+ }
+
+ argsAfterThird := fs.Args()
+ if !reflect.DeepEqual(argsAfterThird, []string{}) {
+ t.Fatalf("expected args [], got %v", argsAfterThird)
+ }
+ })
+}
+
func TestChangedHelper(t *testing.T) {
f := NewFlagSet("changedtest", ContinueOnError)
f.Bool("changed", false, "changed bool")