123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582 |
- package flags
-
- import (
- "fmt"
- "testing"
- )
-
- func TestCommandInline(t *testing.T) {
- var opts = struct {
- Value bool `short:"v"`
-
- Command struct {
- G bool `short:"g"`
- } `command:"cmd"`
- }{}
-
- p, ret := assertParserSuccess(t, &opts, "-v", "cmd", "-g")
-
- assertStringArray(t, ret, []string{})
-
- if p.Active == nil {
- t.Errorf("Expected active command")
- }
-
- if !opts.Value {
- t.Errorf("Expected Value to be true")
- }
-
- if !opts.Command.G {
- t.Errorf("Expected Command.G to be true")
- }
-
- if p.Command.Find("cmd") != p.Active {
- t.Errorf("Expected to find command `cmd' to be active")
- }
- }
-
- func TestCommandInlineMulti(t *testing.T) {
- var opts = struct {
- Value bool `short:"v"`
-
- C1 struct {
- } `command:"c1"`
-
- C2 struct {
- G bool `short:"g"`
- } `command:"c2"`
- }{}
-
- p, ret := assertParserSuccess(t, &opts, "-v", "c2", "-g")
-
- assertStringArray(t, ret, []string{})
-
- if p.Active == nil {
- t.Errorf("Expected active command")
- }
-
- if !opts.Value {
- t.Errorf("Expected Value to be true")
- }
-
- if !opts.C2.G {
- t.Errorf("Expected C2.G to be true")
- }
-
- if p.Command.Find("c1") == nil {
- t.Errorf("Expected to find command `c1'")
- }
-
- if c2 := p.Command.Find("c2"); c2 == nil {
- t.Errorf("Expected to find command `c2'")
- } else if c2 != p.Active {
- t.Errorf("Expected to find command `c2' to be active")
- }
- }
-
- func TestCommandFlagOrder1(t *testing.T) {
- var opts = struct {
- Value bool `short:"v"`
-
- Command struct {
- G bool `short:"g"`
- } `command:"cmd"`
- }{}
-
- assertParseFail(t, ErrUnknownFlag, "unknown flag `g'", &opts, "-v", "-g", "cmd")
- }
-
- func TestCommandFlagOrder2(t *testing.T) {
- var opts = struct {
- Value bool `short:"v"`
-
- Command struct {
- G bool `short:"g"`
- } `command:"cmd"`
- }{}
-
- assertParseSuccess(t, &opts, "cmd", "-v", "-g")
-
- if !opts.Value {
- t.Errorf("Expected Value to be true")
- }
-
- if !opts.Command.G {
- t.Errorf("Expected Command.G to be true")
- }
- }
-
- func TestCommandFlagOrderSub(t *testing.T) {
- var opts = struct {
- Value bool `short:"v"`
-
- Command struct {
- G bool `short:"g"`
-
- SubCommand struct {
- B bool `short:"b"`
- } `command:"sub"`
- } `command:"cmd"`
- }{}
-
- assertParseSuccess(t, &opts, "cmd", "sub", "-v", "-g", "-b")
-
- if !opts.Value {
- t.Errorf("Expected Value to be true")
- }
-
- if !opts.Command.G {
- t.Errorf("Expected Command.G to be true")
- }
-
- if !opts.Command.SubCommand.B {
- t.Errorf("Expected Command.SubCommand.B to be true")
- }
- }
-
- func TestCommandFlagOverride1(t *testing.T) {
- var opts = struct {
- Value bool `short:"v"`
-
- Command struct {
- Value bool `short:"v"`
- } `command:"cmd"`
- }{}
-
- assertParseSuccess(t, &opts, "-v", "cmd")
-
- if !opts.Value {
- t.Errorf("Expected Value to be true")
- }
-
- if opts.Command.Value {
- t.Errorf("Expected Command.Value to be false")
- }
- }
-
- func TestCommandFlagOverride2(t *testing.T) {
- var opts = struct {
- Value bool `short:"v"`
-
- Command struct {
- Value bool `short:"v"`
- } `command:"cmd"`
- }{}
-
- assertParseSuccess(t, &opts, "cmd", "-v")
-
- if opts.Value {
- t.Errorf("Expected Value to be false")
- }
-
- if !opts.Command.Value {
- t.Errorf("Expected Command.Value to be true")
- }
- }
-
- func TestCommandFlagOverrideSub(t *testing.T) {
- var opts = struct {
- Value bool `short:"v"`
-
- Command struct {
- Value bool `short:"v"`
-
- SubCommand struct {
- Value bool `short:"v"`
- } `command:"sub"`
- } `command:"cmd"`
- }{}
-
- assertParseSuccess(t, &opts, "cmd", "sub", "-v")
-
- if opts.Value {
- t.Errorf("Expected Value to be false")
- }
-
- if opts.Command.Value {
- t.Errorf("Expected Command.Value to be false")
- }
-
- if !opts.Command.SubCommand.Value {
- t.Errorf("Expected Command.Value to be true")
- }
- }
-
- func TestCommandFlagOverrideSub2(t *testing.T) {
- var opts = struct {
- Value bool `short:"v"`
-
- Command struct {
- Value bool `short:"v"`
-
- SubCommand struct {
- G bool `short:"g"`
- } `command:"sub"`
- } `command:"cmd"`
- }{}
-
- assertParseSuccess(t, &opts, "cmd", "sub", "-v")
-
- if opts.Value {
- t.Errorf("Expected Value to be false")
- }
-
- if !opts.Command.Value {
- t.Errorf("Expected Command.Value to be true")
- }
- }
-
- func TestCommandEstimate(t *testing.T) {
- var opts = struct {
- Value bool `short:"v"`
-
- Cmd1 struct {
- } `command:"remove"`
-
- Cmd2 struct {
- } `command:"add"`
- }{}
-
- p := NewParser(&opts, None)
- _, err := p.ParseArgs([]string{})
-
- assertError(t, err, ErrCommandRequired, "Please specify one command of: add or remove")
- }
-
- func TestCommandEstimate2(t *testing.T) {
- var opts = struct {
- Value bool `short:"v"`
-
- Cmd1 struct {
- } `command:"remove"`
-
- Cmd2 struct {
- } `command:"add"`
- }{}
-
- p := NewParser(&opts, None)
- _, err := p.ParseArgs([]string{"rmive"})
-
- assertError(t, err, ErrUnknownCommand, "Unknown command `rmive', did you mean `remove'?")
- }
-
- type testCommand struct {
- G bool `short:"g"`
- Executed bool
- EArgs []string
- }
-
- func (c *testCommand) Execute(args []string) error {
- c.Executed = true
- c.EArgs = args
-
- return nil
- }
-
- func TestCommandExecute(t *testing.T) {
- var opts = struct {
- Value bool `short:"v"`
-
- Command testCommand `command:"cmd"`
- }{}
-
- assertParseSuccess(t, &opts, "-v", "cmd", "-g", "a", "b")
-
- if !opts.Value {
- t.Errorf("Expected Value to be true")
- }
-
- if !opts.Command.Executed {
- t.Errorf("Did not execute command")
- }
-
- if !opts.Command.G {
- t.Errorf("Expected Command.C to be true")
- }
-
- assertStringArray(t, opts.Command.EArgs, []string{"a", "b"})
- }
-
- func TestCommandClosest(t *testing.T) {
- var opts = struct {
- Value bool `short:"v"`
-
- Cmd1 struct {
- } `command:"remove"`
-
- Cmd2 struct {
- } `command:"add"`
- }{}
-
- args := assertParseFail(t, ErrUnknownCommand, "Unknown command `addd', did you mean `add'?", &opts, "-v", "addd")
-
- assertStringArray(t, args, []string{"addd"})
- }
-
- func TestCommandAdd(t *testing.T) {
- var opts = struct {
- Value bool `short:"v"`
- }{}
-
- var cmd = struct {
- G bool `short:"g"`
- }{}
-
- p := NewParser(&opts, Default)
- c, err := p.AddCommand("cmd", "", "", &cmd)
-
- if err != nil {
- t.Fatalf("Unexpected error: %v", err)
- return
- }
-
- ret, err := p.ParseArgs([]string{"-v", "cmd", "-g", "rest"})
-
- if err != nil {
- t.Fatalf("Unexpected error: %v", err)
- return
- }
-
- assertStringArray(t, ret, []string{"rest"})
-
- if !opts.Value {
- t.Errorf("Expected Value to be true")
- }
-
- if !cmd.G {
- t.Errorf("Expected Command.G to be true")
- }
-
- if p.Command.Find("cmd") != c {
- t.Errorf("Expected to find command `cmd'")
- }
-
- if p.Commands()[0] != c {
- t.Errorf("Expected command %#v, but got %#v", c, p.Commands()[0])
- }
-
- if c.Options()[0].ShortName != 'g' {
- t.Errorf("Expected short name `g' but got %v", c.Options()[0].ShortName)
- }
- }
-
- func TestCommandNestedInline(t *testing.T) {
- var opts = struct {
- Value bool `short:"v"`
-
- Command struct {
- G bool `short:"g"`
-
- Nested struct {
- N string `long:"n"`
- } `command:"nested"`
- } `command:"cmd"`
- }{}
-
- p, ret := assertParserSuccess(t, &opts, "-v", "cmd", "-g", "nested", "--n", "n", "rest")
-
- assertStringArray(t, ret, []string{"rest"})
-
- if !opts.Value {
- t.Errorf("Expected Value to be true")
- }
-
- if !opts.Command.G {
- t.Errorf("Expected Command.G to be true")
- }
-
- assertString(t, opts.Command.Nested.N, "n")
-
- if c := p.Command.Find("cmd"); c == nil {
- t.Errorf("Expected to find command `cmd'")
- } else {
- if c != p.Active {
- t.Errorf("Expected `cmd' to be the active parser command")
- }
-
- if nested := c.Find("nested"); nested == nil {
- t.Errorf("Expected to find command `nested'")
- } else if nested != c.Active {
- t.Errorf("Expected to find command `nested' to be the active `cmd' command")
- }
- }
- }
-
- func TestRequiredOnCommand(t *testing.T) {
- var opts = struct {
- Value bool `short:"v" required:"true"`
-
- Command struct {
- G bool `short:"g"`
- } `command:"cmd"`
- }{}
-
- assertParseFail(t, ErrRequired, fmt.Sprintf("the required flag `%cv' was not specified", defaultShortOptDelimiter), &opts, "cmd")
- }
-
- func TestRequiredAllOnCommand(t *testing.T) {
- var opts = struct {
- Value bool `short:"v" required:"true"`
- Missing bool `long:"missing" required:"true"`
-
- Command struct {
- G bool `short:"g"`
- } `command:"cmd"`
- }{}
-
- assertParseFail(t, ErrRequired, fmt.Sprintf("the required flags `%smissing' and `%cv' were not specified", defaultLongOptDelimiter, defaultShortOptDelimiter), &opts, "cmd")
- }
-
- func TestDefaultOnCommand(t *testing.T) {
- var opts = struct {
- Command struct {
- G string `short:"g" default:"value"`
- } `command:"cmd"`
- }{}
-
- assertParseSuccess(t, &opts, "cmd")
-
- if opts.Command.G != "value" {
- t.Errorf("Expected G to be \"value\"")
- }
- }
-
- func TestAfterNonCommand(t *testing.T) {
- var opts = struct {
- Value bool `short:"v"`
-
- Cmd1 struct {
- } `command:"remove"`
-
- Cmd2 struct {
- } `command:"add"`
- }{}
-
- assertParseFail(t, ErrUnknownCommand, "Unknown command `nocmd'. Please specify one command of: add or remove", &opts, "nocmd", "remove")
- }
-
- func TestSubcommandsOptional(t *testing.T) {
- var opts = struct {
- Value bool `short:"v"`
-
- Cmd1 struct {
- } `command:"remove"`
-
- Cmd2 struct {
- } `command:"add"`
- }{}
-
- p := NewParser(&opts, None)
- p.SubcommandsOptional = true
-
- _, err := p.ParseArgs([]string{"-v"})
-
- if err != nil {
- t.Fatalf("Unexpected error: %v", err)
- return
- }
-
- if !opts.Value {
- t.Errorf("Expected Value to be true")
- }
- }
-
- func TestSubcommandsOptionalAfterNonCommand(t *testing.T) {
- var opts = struct {
- Value bool `short:"v"`
-
- Cmd1 struct {
- } `command:"remove"`
-
- Cmd2 struct {
- } `command:"add"`
- }{}
-
- p := NewParser(&opts, None)
- p.SubcommandsOptional = true
-
- retargs, err := p.ParseArgs([]string{"nocmd", "remove"})
-
- if err != nil {
- t.Fatalf("Unexpected error: %v", err)
- return
- }
-
- assertStringArray(t, retargs, []string{"nocmd", "remove"})
- }
-
- func TestCommandAlias(t *testing.T) {
- var opts = struct {
- Command struct {
- G string `short:"g" default:"value"`
- } `command:"cmd" alias:"cm"`
- }{}
-
- assertParseSuccess(t, &opts, "cm")
-
- if opts.Command.G != "value" {
- t.Errorf("Expected G to be \"value\"")
- }
- }
-
- func TestSubCommandFindOptionByLongFlag(t *testing.T) {
- var opts struct {
- Testing bool `long:"testing" description:"Testing"`
- }
-
- var cmd struct {
- Other bool `long:"other" description:"Other"`
- }
-
- p := NewParser(&opts, Default)
- c, _ := p.AddCommand("command", "Short", "Long", &cmd)
-
- opt := c.FindOptionByLongName("other")
-
- if opt == nil {
- t.Errorf("Expected option, but found none")
- }
-
- assertString(t, opt.LongName, "other")
-
- opt = c.FindOptionByLongName("testing")
-
- if opt == nil {
- t.Errorf("Expected option, but found none")
- }
-
- assertString(t, opt.LongName, "testing")
- }
-
- func TestSubCommandFindOptionByShortFlag(t *testing.T) {
- var opts struct {
- Testing bool `short:"t" description:"Testing"`
- }
-
- var cmd struct {
- Other bool `short:"o" description:"Other"`
- }
-
- p := NewParser(&opts, Default)
- c, _ := p.AddCommand("command", "Short", "Long", &cmd)
-
- opt := c.FindOptionByShortName('o')
-
- if opt == nil {
- t.Errorf("Expected option, but found none")
- }
-
- if opt.ShortName != 'o' {
- t.Errorf("Expected 'o', but got %v", opt.ShortName)
- }
-
- opt = c.FindOptionByShortName('t')
-
- if opt == nil {
- t.Errorf("Expected option, but found none")
- }
-
- if opt.ShortName != 't' {
- t.Errorf("Expected 'o', but got %v", opt.ShortName)
- }
- }
|