diff --git a/command_test.go b/command_test.go index dc04b66..80d56be 100644 --- a/command_test.go +++ b/command_test.go @@ -580,3 +580,71 @@ func TestSubCommandFindOptionByShortFlag(t *testing.T) { t.Errorf("Expected 'o', but got %v", opt.ShortName) } } + +type fooCmd struct { + Flag bool `short:"f"` + args []string +} + +func (foo *fooCmd) Execute(s []string) error { + foo.args = s + return nil +} + +func TestCommandPassAfterNonOption(t *testing.T) { + var opts = struct { + Value bool `short:"v"` + Foo fooCmd `command:"foo"` + }{} + p := NewParser(&opts, PassAfterNonOption) + ret, err := p.ParseArgs([]string{"-v", "foo", "-f", "bar", "-v", "-g"}) + + if err != nil { + t.Fatalf("Unexpected error: %v", err) + return + } + + if !opts.Value { + t.Errorf("Expected Value to be true") + } + + if !opts.Foo.Flag { + t.Errorf("Expected Foo.Flag to be true") + } + + assertStringArray(t, ret, []string{"bar", "-v", "-g"}) + assertStringArray(t, opts.Foo.args, []string{"bar", "-v", "-g"}) +} + +type barCmd struct { + fooCmd + Positional struct { + Args []string + } `positional-args:"yes"` +} + +func TestCommandPassAfterNonOptionWithPositional(t *testing.T) { + var opts = struct { + Value bool `short:"v"` + Bar barCmd `command:"bar"` + }{} + p := NewParser(&opts, PassAfterNonOption) + ret, err := p.ParseArgs([]string{"-v", "bar", "-f", "baz", "-v", "-g"}) + + if err != nil { + t.Fatalf("Unexpected error: %v", err) + return + } + + if !opts.Value { + t.Errorf("Expected Value to be true") + } + + if !opts.Bar.Flag { + t.Errorf("Expected Bar.Flag to be true") + } + + assertStringArray(t, ret, []string{}) + assertStringArray(t, opts.Bar.args, []string{}) + assertStringArray(t, opts.Bar.Positional.Args, []string{"baz", "-v", "-g"}) +} diff --git a/parser.go b/parser.go index d75a17c..54816a6 100644 --- a/parser.go +++ b/parser.go @@ -252,7 +252,7 @@ func (p *Parser) ParseArgs(args []string) ([]string, error) { } if !argumentIsOption(arg) { - if (p.Options & PassAfterNonOption) != None { + if (p.Options&PassAfterNonOption) != None && s.lookup.commands[arg] == nil { // If PassAfterNonOption is set then all remaining arguments // are considered positional if err = s.addArgs(s.arg); err != nil {