diff --git a/commands/cli/parse_test.go b/commands/cli/parse_test.go index 8fe5b35105657390df6743977320fdb4dc4ebaab..d7d949de316479c07bc1072c1729a78d13210323 100644 --- a/commands/cli/parse_test.go +++ b/commands/cli/parse_test.go @@ -49,3 +49,108 @@ func TestOptionParsing(t *testing.T) { t.Errorf("Returned command was different than expected") } } + +func TestArgumentParsing(t *testing.T) { + rootCmd := &commands.Command{ + Subcommands: map[string]*commands.Command{ + "noarg": &commands.Command{}, + "onearg": &commands.Command{ + Arguments: []commands.Argument{ + commands.StringArg("a", true, false, "some arg"), + }, + }, + "twoargs": &commands.Command{ + Arguments: []commands.Argument{ + commands.StringArg("a", true, false, "some arg"), + commands.StringArg("b", true, false, "another arg"), + }, + }, + "variadic": &commands.Command{ + Arguments: []commands.Argument{ + commands.StringArg("a", true, true, "some arg"), + }, + }, + "optional": &commands.Command{ + Arguments: []commands.Argument{ + commands.StringArg("b", false, true, "another arg"), + }, + }, + "reversedoptional": &commands.Command{ + Arguments: []commands.Argument{ + commands.StringArg("a", false, false, "some arg"), + commands.StringArg("b", true, false, "another arg"), + }, + }, + }, + } + + _, _, _, err := Parse([]string{"noarg"}, nil, rootCmd) + if err != nil { + t.Error("Should have passed") + } + _, _, _, err = Parse([]string{"noarg", "value!"}, nil, rootCmd) + if err == nil { + t.Error("Should have failed (provided an arg, but command didn't define any)") + } + + _, _, _, err = Parse([]string{"onearg", "value!"}, nil, rootCmd) + if err != nil { + t.Error("Should have passed") + } + _, _, _, err = Parse([]string{"onearg"}, nil, rootCmd) + if err == nil { + t.Error("Should have failed (didn't provide any args, arg is required)") + } + + _, _, _, err = Parse([]string{"twoargs", "value1", "value2"}, nil, rootCmd) + if err != nil { + t.Error("Should have passed") + } + _, _, _, err = Parse([]string{"twoargs", "value!"}, nil, rootCmd) + if err == nil { + t.Error("Should have failed (only provided 1 arg, needs 2)") + } + _, _, _, err = Parse([]string{"twoargs"}, nil, rootCmd) + if err == nil { + t.Error("Should have failed (didn't provide any args, 2 required)") + } + + _, _, _, err = Parse([]string{"variadic", "value!"}, nil, rootCmd) + if err != nil { + t.Error("Should have passed") + } + _, _, _, err = Parse([]string{"variadic", "value1", "value2", "value3"}, nil, rootCmd) + if err != nil { + t.Error("Should have passed") + } + _, _, _, err = Parse([]string{"variadic"}, nil, rootCmd) + if err == nil { + t.Error("Should have failed (didn't provide any args, 1 required)") + } + + _, _, _, err = Parse([]string{"optional", "value!"}, nil, rootCmd) + if err != nil { + t.Error("Should have passed") + } + _, _, _, err = Parse([]string{"optional"}, nil, rootCmd) + if err != nil { + t.Error("Should have passed") + } + + _, _, _, err = Parse([]string{"reversedoptional", "value1", "value2"}, nil, rootCmd) + if err != nil { + t.Error("Should have passed") + } + _, _, _, err = Parse([]string{"reversedoptional", "value!"}, nil, rootCmd) + if err != nil { + t.Error("Should have passed") + } + _, _, _, err = Parse([]string{"reversedoptional"}, nil, rootCmd) + if err == nil { + t.Error("Should have failed (didn't provide any args, 1 required)") + } + _, _, _, err = Parse([]string{"reversedoptional", "value1", "value2", "value3"}, nil, rootCmd) + if err == nil { + t.Error("Should have failed (provided too many args, only takes 1)") + } +}