diff options
| -rw-r--r-- | flag.go | 4 | ||||
| -rw-r--r-- | flag_test.go | 40 |
2 files changed, 42 insertions, 2 deletions
@@ -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") |
