commit
2392252a7c
@ -0,0 +1,497 @@ |
|||||||
|
package cli_test |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"os" |
||||||
|
"testing" |
||||||
|
|
||||||
|
"github.com/minio/cli" |
||||||
|
) |
||||||
|
|
||||||
|
func ExampleApp() { |
||||||
|
// set args for examples sake
|
||||||
|
os.Args = []string{"greet", "--name", "Jeremy"} |
||||||
|
|
||||||
|
app := cli.NewApp() |
||||||
|
app.Name = "greet" |
||||||
|
app.Flags = []cli.Flag{ |
||||||
|
cli.StringFlag{Name: "name", Value: "bob", Usage: "a name to say"}, |
||||||
|
} |
||||||
|
app.Action = func(c *cli.Context) { |
||||||
|
fmt.Printf("Hello %v\n", c.String("name")) |
||||||
|
} |
||||||
|
app.Author = "Harrison" |
||||||
|
app.Email = "harrison@lolwut.com" |
||||||
|
app.Authors = []cli.Author{{Name: "Oliver Allen", Email: "oliver@toyshop.com"}} |
||||||
|
app.Run(os.Args) |
||||||
|
// Output:
|
||||||
|
// Hello Jeremy
|
||||||
|
} |
||||||
|
|
||||||
|
func ExampleAppSubcommand() { |
||||||
|
// set args for examples sake
|
||||||
|
os.Args = []string{"say", "hi", "english", "--name", "Jeremy"} |
||||||
|
app := cli.NewApp() |
||||||
|
app.Name = "say" |
||||||
|
app.Commands = []cli.Command{ |
||||||
|
{ |
||||||
|
Name: "hello", |
||||||
|
Aliases: []string{"hi"}, |
||||||
|
Usage: "use it to see a description", |
||||||
|
Description: "This is how we describe hello the function", |
||||||
|
Subcommands: []cli.Command{ |
||||||
|
{ |
||||||
|
Name: "english", |
||||||
|
Aliases: []string{"en"}, |
||||||
|
Usage: "sends a greeting in english", |
||||||
|
Description: "greets someone in english", |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.StringFlag{ |
||||||
|
Name: "name", |
||||||
|
Value: "Bob", |
||||||
|
Usage: "Name of the person to greet", |
||||||
|
}, |
||||||
|
}, |
||||||
|
Action: func(c *cli.Context) { |
||||||
|
fmt.Println("Hello,", c.String("name")) |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
app.Run(os.Args) |
||||||
|
// Output:
|
||||||
|
// Hello, Jeremy
|
||||||
|
} |
||||||
|
|
||||||
|
func TestApp_Run(t *testing.T) { |
||||||
|
s := "" |
||||||
|
|
||||||
|
app := cli.NewApp() |
||||||
|
app.Action = func(c *cli.Context) { |
||||||
|
s = s + c.Args().First() |
||||||
|
} |
||||||
|
|
||||||
|
err := app.Run([]string{"command", "foo"}) |
||||||
|
expect(t, err, nil) |
||||||
|
err = app.Run([]string{"command", "bar"}) |
||||||
|
expect(t, err, nil) |
||||||
|
expect(t, s, "foobar") |
||||||
|
} |
||||||
|
|
||||||
|
var commandAppTests = []struct { |
||||||
|
name string |
||||||
|
expected bool |
||||||
|
}{ |
||||||
|
{"foobar", true}, |
||||||
|
{"batbaz", true}, |
||||||
|
{"b", true}, |
||||||
|
{"f", true}, |
||||||
|
{"bat", false}, |
||||||
|
{"nothing", false}, |
||||||
|
} |
||||||
|
|
||||||
|
func TestApp_Command(t *testing.T) { |
||||||
|
app := cli.NewApp() |
||||||
|
fooCommand := cli.Command{Name: "foobar", Aliases: []string{"f"}} |
||||||
|
batCommand := cli.Command{Name: "batbaz", Aliases: []string{"b"}} |
||||||
|
app.Commands = []cli.Command{ |
||||||
|
fooCommand, |
||||||
|
batCommand, |
||||||
|
} |
||||||
|
|
||||||
|
for _, test := range commandAppTests { |
||||||
|
expect(t, app.Command(test.name) != nil, test.expected) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestApp_CommandWithArgBeforeFlags(t *testing.T) { |
||||||
|
var parsedOption, firstArg string |
||||||
|
|
||||||
|
app := cli.NewApp() |
||||||
|
command := cli.Command{ |
||||||
|
Name: "cmd", |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.StringFlag{Name: "option", Value: "", Usage: "some option"}, |
||||||
|
}, |
||||||
|
Action: func(c *cli.Context) { |
||||||
|
parsedOption = c.String("option") |
||||||
|
firstArg = c.Args().First() |
||||||
|
}, |
||||||
|
} |
||||||
|
app.Commands = []cli.Command{command} |
||||||
|
|
||||||
|
app.Run([]string{"", "cmd", "my-arg", "--option", "my-option"}) |
||||||
|
|
||||||
|
expect(t, parsedOption, "my-option") |
||||||
|
expect(t, firstArg, "my-arg") |
||||||
|
} |
||||||
|
|
||||||
|
func TestApp_RunAsSubcommandParseFlags(t *testing.T) { |
||||||
|
var context *cli.Context |
||||||
|
|
||||||
|
a := cli.NewApp() |
||||||
|
a.Commands = []cli.Command{ |
||||||
|
{ |
||||||
|
Name: "foo", |
||||||
|
Action: func(c *cli.Context) { |
||||||
|
context = c |
||||||
|
}, |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.StringFlag{ |
||||||
|
Name: "lang", |
||||||
|
Value: "english", |
||||||
|
Usage: "language for the greeting", |
||||||
|
}, |
||||||
|
}, |
||||||
|
Before: func(_ *cli.Context) error { return nil }, |
||||||
|
}, |
||||||
|
} |
||||||
|
a.Run([]string{"", "foo", "--lang", "spanish"}) |
||||||
|
expect(t, context.String("lang"), "spanish") |
||||||
|
} |
||||||
|
|
||||||
|
func TestApp_CommandWithFlagBeforeTerminator(t *testing.T) { |
||||||
|
var parsedOption string |
||||||
|
var args []string |
||||||
|
|
||||||
|
app := cli.NewApp() |
||||||
|
command := cli.Command{ |
||||||
|
Name: "cmd", |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.StringFlag{Name: "option", Value: "", Usage: "some option"}, |
||||||
|
}, |
||||||
|
Action: func(c *cli.Context) { |
||||||
|
parsedOption = c.String("option") |
||||||
|
args = c.Args() |
||||||
|
}, |
||||||
|
} |
||||||
|
app.Commands = []cli.Command{command} |
||||||
|
|
||||||
|
app.Run([]string{"", "cmd", "my-arg", "--option", "my-option", "--", "--notARealFlag"}) |
||||||
|
|
||||||
|
expect(t, parsedOption, "my-option") |
||||||
|
expect(t, args[0], "my-arg") |
||||||
|
expect(t, args[1], "--") |
||||||
|
expect(t, args[2], "--notARealFlag") |
||||||
|
} |
||||||
|
|
||||||
|
func TestApp_CommandWithNoFlagBeforeTerminator(t *testing.T) { |
||||||
|
var args []string |
||||||
|
|
||||||
|
app := cli.NewApp() |
||||||
|
command := cli.Command{ |
||||||
|
Name: "cmd", |
||||||
|
Action: func(c *cli.Context) { |
||||||
|
args = c.Args() |
||||||
|
}, |
||||||
|
} |
||||||
|
app.Commands = []cli.Command{command} |
||||||
|
|
||||||
|
app.Run([]string{"", "cmd", "my-arg", "--", "notAFlagAtAll"}) |
||||||
|
|
||||||
|
expect(t, args[0], "my-arg") |
||||||
|
expect(t, args[1], "--") |
||||||
|
expect(t, args[2], "notAFlagAtAll") |
||||||
|
} |
||||||
|
|
||||||
|
func TestApp_Float64Flag(t *testing.T) { |
||||||
|
var meters float64 |
||||||
|
|
||||||
|
app := cli.NewApp() |
||||||
|
app.Flags = []cli.Flag{ |
||||||
|
cli.Float64Flag{Name: "height", Value: 1.5, Usage: "Set the height, in meters"}, |
||||||
|
} |
||||||
|
app.Action = func(c *cli.Context) { |
||||||
|
meters = c.Float64("height") |
||||||
|
} |
||||||
|
|
||||||
|
app.Run([]string{"", "--height", "1.93"}) |
||||||
|
expect(t, meters, 1.93) |
||||||
|
} |
||||||
|
|
||||||
|
func TestApp_ParseSliceFlags(t *testing.T) { |
||||||
|
var parsedOption, firstArg string |
||||||
|
var parsedIntSlice []int |
||||||
|
var parsedStringSlice []string |
||||||
|
|
||||||
|
app := cli.NewApp() |
||||||
|
command := cli.Command{ |
||||||
|
Name: "cmd", |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.IntSliceFlag{Name: "p", Value: &cli.IntSlice{}, Usage: "set one or more ip addr"}, |
||||||
|
cli.StringSliceFlag{Name: "ip", Value: &cli.StringSlice{}, Usage: "set one or more ports to open"}, |
||||||
|
}, |
||||||
|
Action: func(c *cli.Context) { |
||||||
|
parsedIntSlice = c.IntSlice("p") |
||||||
|
parsedStringSlice = c.StringSlice("ip") |
||||||
|
parsedOption = c.String("option") |
||||||
|
firstArg = c.Args().First() |
||||||
|
}, |
||||||
|
} |
||||||
|
app.Commands = []cli.Command{command} |
||||||
|
|
||||||
|
app.Run([]string{"", "cmd", "my-arg", "-p", "22", "-p", "80", "-ip", "8.8.8.8", "-ip", "8.8.4.4"}) |
||||||
|
|
||||||
|
IntsEquals := func(a, b []int) bool { |
||||||
|
if len(a) != len(b) { |
||||||
|
return false |
||||||
|
} |
||||||
|
for i, v := range a { |
||||||
|
if v != b[i] { |
||||||
|
return false |
||||||
|
} |
||||||
|
} |
||||||
|
return true |
||||||
|
} |
||||||
|
|
||||||
|
StrsEquals := func(a, b []string) bool { |
||||||
|
if len(a) != len(b) { |
||||||
|
return false |
||||||
|
} |
||||||
|
for i, v := range a { |
||||||
|
if v != b[i] { |
||||||
|
return false |
||||||
|
} |
||||||
|
} |
||||||
|
return true |
||||||
|
} |
||||||
|
var expectedIntSlice = []int{22, 80} |
||||||
|
var expectedStringSlice = []string{"8.8.8.8", "8.8.4.4"} |
||||||
|
|
||||||
|
if !IntsEquals(parsedIntSlice, expectedIntSlice) { |
||||||
|
t.Errorf("%v does not match %v", parsedIntSlice, expectedIntSlice) |
||||||
|
} |
||||||
|
|
||||||
|
if !StrsEquals(parsedStringSlice, expectedStringSlice) { |
||||||
|
t.Errorf("%v does not match %v", parsedStringSlice, expectedStringSlice) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestApp_DefaultStdout(t *testing.T) { |
||||||
|
app := cli.NewApp() |
||||||
|
|
||||||
|
if app.Writer != os.Stdout { |
||||||
|
t.Error("Default output writer not set.") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
type mockWriter struct { |
||||||
|
written []byte |
||||||
|
} |
||||||
|
|
||||||
|
func (fw *mockWriter) Write(p []byte) (n int, err error) { |
||||||
|
if fw.written == nil { |
||||||
|
fw.written = p |
||||||
|
} else { |
||||||
|
fw.written = append(fw.written, p...) |
||||||
|
} |
||||||
|
|
||||||
|
return len(p), nil |
||||||
|
} |
||||||
|
|
||||||
|
func (fw *mockWriter) GetWritten() (b []byte) { |
||||||
|
return fw.written |
||||||
|
} |
||||||
|
|
||||||
|
func TestApp_SetStdout(t *testing.T) { |
||||||
|
w := &mockWriter{} |
||||||
|
|
||||||
|
app := cli.NewApp() |
||||||
|
app.Name = "test" |
||||||
|
app.Writer = w |
||||||
|
|
||||||
|
err := app.Run([]string{"help"}) |
||||||
|
|
||||||
|
if err != nil { |
||||||
|
t.Fatalf("Run error: %s", err) |
||||||
|
} |
||||||
|
|
||||||
|
if len(w.written) == 0 { |
||||||
|
t.Error("App did not write output to desired writer.") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestApp_BeforeFunc(t *testing.T) { |
||||||
|
beforeRun, subcommandRun := false, false |
||||||
|
beforeError := fmt.Errorf("fail") |
||||||
|
var err error |
||||||
|
|
||||||
|
app := cli.NewApp() |
||||||
|
|
||||||
|
app.Before = func(c *cli.Context) error { |
||||||
|
beforeRun = true |
||||||
|
s := c.String("opt") |
||||||
|
if s == "fail" { |
||||||
|
return beforeError |
||||||
|
} |
||||||
|
|
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
app.Commands = []cli.Command{ |
||||||
|
{ |
||||||
|
Name: "sub", |
||||||
|
Action: func(c *cli.Context) { |
||||||
|
subcommandRun = true |
||||||
|
}, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
app.Flags = []cli.Flag{ |
||||||
|
cli.StringFlag{Name: "opt"}, |
||||||
|
} |
||||||
|
|
||||||
|
// run with the Before() func succeeding
|
||||||
|
err = app.Run([]string{"command", "--opt", "succeed", "sub"}) |
||||||
|
|
||||||
|
if err != nil { |
||||||
|
t.Fatalf("Run error: %s", err) |
||||||
|
} |
||||||
|
|
||||||
|
if beforeRun == false { |
||||||
|
t.Errorf("Before() not executed when expected") |
||||||
|
} |
||||||
|
|
||||||
|
if subcommandRun == false { |
||||||
|
t.Errorf("Subcommand not executed when expected") |
||||||
|
} |
||||||
|
|
||||||
|
// reset
|
||||||
|
beforeRun, subcommandRun = false, false |
||||||
|
|
||||||
|
// run with the Before() func failing
|
||||||
|
err = app.Run([]string{"command", "--opt", "fail", "sub"}) |
||||||
|
|
||||||
|
// should be the same error produced by the Before func
|
||||||
|
if err != beforeError { |
||||||
|
t.Errorf("Run error expected, but not received") |
||||||
|
} |
||||||
|
|
||||||
|
if beforeRun == false { |
||||||
|
t.Errorf("Before() not executed when expected") |
||||||
|
} |
||||||
|
|
||||||
|
if subcommandRun == true { |
||||||
|
t.Errorf("Subcommand executed when NOT expected") |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
func TestApp_AfterFunc(t *testing.T) { |
||||||
|
afterRun, subcommandRun := false, false |
||||||
|
afterError := fmt.Errorf("fail") |
||||||
|
var err error |
||||||
|
|
||||||
|
app := cli.NewApp() |
||||||
|
|
||||||
|
app.After = func(c *cli.Context) error { |
||||||
|
afterRun = true |
||||||
|
s := c.String("opt") |
||||||
|
if s == "fail" { |
||||||
|
return afterError |
||||||
|
} |
||||||
|
|
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
app.Commands = []cli.Command{ |
||||||
|
{ |
||||||
|
Name: "sub", |
||||||
|
Action: func(c *cli.Context) { |
||||||
|
subcommandRun = true |
||||||
|
}, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
app.Flags = []cli.Flag{ |
||||||
|
cli.StringFlag{Name: "opt"}, |
||||||
|
} |
||||||
|
|
||||||
|
// run with the After() func succeeding
|
||||||
|
err = app.Run([]string{"command", "--opt", "succeed", "sub"}) |
||||||
|
|
||||||
|
if err != nil { |
||||||
|
t.Fatalf("Run error: %s", err) |
||||||
|
} |
||||||
|
|
||||||
|
if afterRun == false { |
||||||
|
t.Errorf("After() not executed when expected") |
||||||
|
} |
||||||
|
|
||||||
|
if subcommandRun == false { |
||||||
|
t.Errorf("Subcommand not executed when expected") |
||||||
|
} |
||||||
|
|
||||||
|
// reset
|
||||||
|
afterRun, subcommandRun = false, false |
||||||
|
|
||||||
|
// run with the Before() func failing
|
||||||
|
err = app.Run([]string{"command", "--opt", "fail", "sub"}) |
||||||
|
|
||||||
|
// should be the same error produced by the Before func
|
||||||
|
if err != afterError { |
||||||
|
t.Errorf("Run error expected, but not received") |
||||||
|
} |
||||||
|
|
||||||
|
if afterRun == false { |
||||||
|
t.Errorf("After() not executed when expected") |
||||||
|
} |
||||||
|
|
||||||
|
if subcommandRun == false { |
||||||
|
t.Errorf("Subcommand not executed when expected") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestAppCommandNotFound(t *testing.T) { |
||||||
|
beforeRun, subcommandRun := false, false |
||||||
|
app := cli.NewApp() |
||||||
|
|
||||||
|
app.CommandNotFound = func(c *cli.Context, command string) { |
||||||
|
beforeRun = true |
||||||
|
} |
||||||
|
|
||||||
|
app.Commands = []cli.Command{ |
||||||
|
{ |
||||||
|
Name: "bar", |
||||||
|
Action: func(c *cli.Context) { |
||||||
|
subcommandRun = true |
||||||
|
}, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
app.Run([]string{"command", "foo"}) |
||||||
|
|
||||||
|
expect(t, beforeRun, true) |
||||||
|
expect(t, subcommandRun, false) |
||||||
|
} |
||||||
|
|
||||||
|
func TestGlobalFlagsInSubcommands(t *testing.T) { |
||||||
|
subcommandRun := false |
||||||
|
app := cli.NewApp() |
||||||
|
|
||||||
|
app.Flags = []cli.Flag{ |
||||||
|
cli.BoolFlag{Name: "debug, d", Usage: "Enable debugging"}, |
||||||
|
} |
||||||
|
|
||||||
|
app.Commands = []cli.Command{ |
||||||
|
{ |
||||||
|
Name: "foo", |
||||||
|
Subcommands: []cli.Command{ |
||||||
|
{ |
||||||
|
Name: "bar", |
||||||
|
Action: func(c *cli.Context) { |
||||||
|
if c.GlobalBool("debug") { |
||||||
|
subcommandRun = true |
||||||
|
} |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
app.Run([]string{"command", "-d", "foo", "bar"}) |
||||||
|
|
||||||
|
expect(t, subcommandRun, true) |
||||||
|
} |
@ -0,0 +1,100 @@ |
|||||||
|
package cli_test |
||||||
|
|
||||||
|
import ( |
||||||
|
"os" |
||||||
|
|
||||||
|
"github.com/minio/cli" |
||||||
|
) |
||||||
|
|
||||||
|
func Example() { |
||||||
|
app := cli.NewApp() |
||||||
|
app.Name = "todo" |
||||||
|
app.Usage = "task list on the command line" |
||||||
|
app.Commands = []cli.Command{ |
||||||
|
{ |
||||||
|
Name: "add", |
||||||
|
Aliases: []string{"a"}, |
||||||
|
Usage: "add a task to the list", |
||||||
|
Action: func(c *cli.Context) { |
||||||
|
println("added task: ", c.Args().First()) |
||||||
|
}, |
||||||
|
}, |
||||||
|
{ |
||||||
|
Name: "complete", |
||||||
|
Aliases: []string{"c"}, |
||||||
|
Usage: "complete a task on the list", |
||||||
|
Action: func(c *cli.Context) { |
||||||
|
println("completed task: ", c.Args().First()) |
||||||
|
}, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
app.Run(os.Args) |
||||||
|
} |
||||||
|
|
||||||
|
func ExampleSubcommand() { |
||||||
|
app := cli.NewApp() |
||||||
|
app.Name = "say" |
||||||
|
app.Commands = []cli.Command{ |
||||||
|
{ |
||||||
|
Name: "hello", |
||||||
|
Aliases: []string{"hi"}, |
||||||
|
Usage: "use it to see a description", |
||||||
|
Description: "This is how we describe hello the function", |
||||||
|
Subcommands: []cli.Command{ |
||||||
|
{ |
||||||
|
Name: "english", |
||||||
|
Aliases: []string{"en"}, |
||||||
|
Usage: "sends a greeting in english", |
||||||
|
Description: "greets someone in english", |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.StringFlag{ |
||||||
|
Name: "name", |
||||||
|
Value: "Bob", |
||||||
|
Usage: "Name of the person to greet", |
||||||
|
}, |
||||||
|
}, |
||||||
|
Action: func(c *cli.Context) { |
||||||
|
println("Hello, ", c.String("name")) |
||||||
|
}, |
||||||
|
}, { |
||||||
|
Name: "spanish", |
||||||
|
Aliases: []string{"sp"}, |
||||||
|
Usage: "sends a greeting in spanish", |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.StringFlag{ |
||||||
|
Name: "surname", |
||||||
|
Value: "Jones", |
||||||
|
Usage: "Surname of the person to greet", |
||||||
|
}, |
||||||
|
}, |
||||||
|
Action: func(c *cli.Context) { |
||||||
|
println("Hola, ", c.String("surname")) |
||||||
|
}, |
||||||
|
}, { |
||||||
|
Name: "french", |
||||||
|
Aliases: []string{"fr"}, |
||||||
|
Usage: "sends a greeting in french", |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.StringFlag{ |
||||||
|
Name: "nickname", |
||||||
|
Value: "Stevie", |
||||||
|
Usage: "Nickname of the person to greet", |
||||||
|
}, |
||||||
|
}, |
||||||
|
Action: func(c *cli.Context) { |
||||||
|
println("Bonjour, ", c.String("nickname")) |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, { |
||||||
|
Name: "bye", |
||||||
|
Usage: "says goodbye", |
||||||
|
Action: func(c *cli.Context) { |
||||||
|
println("bye") |
||||||
|
}, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
app.Run(os.Args) |
||||||
|
} |
@ -0,0 +1,49 @@ |
|||||||
|
package cli_test |
||||||
|
|
||||||
|
import ( |
||||||
|
"flag" |
||||||
|
"testing" |
||||||
|
|
||||||
|
"github.com/minio/cli" |
||||||
|
) |
||||||
|
|
||||||
|
func TestCommandDoNotIgnoreFlags(t *testing.T) { |
||||||
|
app := cli.NewApp() |
||||||
|
set := flag.NewFlagSet("test", 0) |
||||||
|
test := []string{"blah", "blah", "-break"} |
||||||
|
set.Parse(test) |
||||||
|
|
||||||
|
c := cli.NewContext(app, set, set) |
||||||
|
|
||||||
|
command := cli.Command{ |
||||||
|
Name: "test-cmd", |
||||||
|
Aliases: []string{"tc"}, |
||||||
|
Usage: "this is for testing", |
||||||
|
Description: "testing", |
||||||
|
Action: func(_ *cli.Context) {}, |
||||||
|
} |
||||||
|
err := command.Run(c) |
||||||
|
|
||||||
|
expect(t, err.Error(), "flag provided but not defined: -break") |
||||||
|
} |
||||||
|
|
||||||
|
func TestCommandIgnoreFlags(t *testing.T) { |
||||||
|
app := cli.NewApp() |
||||||
|
set := flag.NewFlagSet("test", 0) |
||||||
|
test := []string{"blah", "blah"} |
||||||
|
set.Parse(test) |
||||||
|
|
||||||
|
c := cli.NewContext(app, set, set) |
||||||
|
|
||||||
|
command := cli.Command{ |
||||||
|
Name: "test-cmd", |
||||||
|
Aliases: []string{"tc"}, |
||||||
|
Usage: "this is for testing", |
||||||
|
Description: "testing", |
||||||
|
Action: func(_ *cli.Context) {}, |
||||||
|
SkipFlagParsing: true, |
||||||
|
} |
||||||
|
err := command.Run(c) |
||||||
|
|
||||||
|
expect(t, err, nil) |
||||||
|
} |
@ -0,0 +1,111 @@ |
|||||||
|
package cli_test |
||||||
|
|
||||||
|
import ( |
||||||
|
"flag" |
||||||
|
"testing" |
||||||
|
"time" |
||||||
|
|
||||||
|
"github.com/minio/cli" |
||||||
|
) |
||||||
|
|
||||||
|
func TestNewContext(t *testing.T) { |
||||||
|
set := flag.NewFlagSet("test", 0) |
||||||
|
set.Int("myflag", 12, "doc") |
||||||
|
globalSet := flag.NewFlagSet("test", 0) |
||||||
|
globalSet.Int("myflag", 42, "doc") |
||||||
|
command := cli.Command{Name: "mycommand"} |
||||||
|
c := cli.NewContext(nil, set, globalSet) |
||||||
|
c.Command = command |
||||||
|
expect(t, c.Int("myflag"), 12) |
||||||
|
expect(t, c.GlobalInt("myflag"), 42) |
||||||
|
expect(t, c.Command.Name, "mycommand") |
||||||
|
} |
||||||
|
|
||||||
|
func TestContext_Int(t *testing.T) { |
||||||
|
set := flag.NewFlagSet("test", 0) |
||||||
|
set.Int("myflag", 12, "doc") |
||||||
|
c := cli.NewContext(nil, set, set) |
||||||
|
expect(t, c.Int("myflag"), 12) |
||||||
|
} |
||||||
|
|
||||||
|
func TestContext_Duration(t *testing.T) { |
||||||
|
set := flag.NewFlagSet("test", 0) |
||||||
|
set.Duration("myflag", time.Duration(12*time.Second), "doc") |
||||||
|
c := cli.NewContext(nil, set, set) |
||||||
|
expect(t, c.Duration("myflag"), time.Duration(12*time.Second)) |
||||||
|
} |
||||||
|
|
||||||
|
func TestContext_String(t *testing.T) { |
||||||
|
set := flag.NewFlagSet("test", 0) |
||||||
|
set.String("myflag", "hello world", "doc") |
||||||
|
c := cli.NewContext(nil, set, set) |
||||||
|
expect(t, c.String("myflag"), "hello world") |
||||||
|
} |
||||||
|
|
||||||
|
func TestContext_Bool(t *testing.T) { |
||||||
|
set := flag.NewFlagSet("test", 0) |
||||||
|
set.Bool("myflag", false, "doc") |
||||||
|
c := cli.NewContext(nil, set, set) |
||||||
|
expect(t, c.Bool("myflag"), false) |
||||||
|
} |
||||||
|
|
||||||
|
func TestContext_BoolT(t *testing.T) { |
||||||
|
set := flag.NewFlagSet("test", 0) |
||||||
|
set.Bool("myflag", true, "doc") |
||||||
|
c := cli.NewContext(nil, set, set) |
||||||
|
expect(t, c.BoolT("myflag"), true) |
||||||
|
} |
||||||
|
|
||||||
|
func TestContext_Args(t *testing.T) { |
||||||
|
set := flag.NewFlagSet("test", 0) |
||||||
|
set.Bool("myflag", false, "doc") |
||||||
|
c := cli.NewContext(nil, set, set) |
||||||
|
set.Parse([]string{"--myflag", "bat", "baz"}) |
||||||
|
expect(t, len(c.Args()), 2) |
||||||
|
expect(t, c.Bool("myflag"), true) |
||||||
|
} |
||||||
|
|
||||||
|
func TestContext_IsSet(t *testing.T) { |
||||||
|
set := flag.NewFlagSet("test", 0) |
||||||
|
set.Bool("myflag", false, "doc") |
||||||
|
set.String("otherflag", "hello world", "doc") |
||||||
|
globalSet := flag.NewFlagSet("test", 0) |
||||||
|
globalSet.Bool("myflagGlobal", true, "doc") |
||||||
|
c := cli.NewContext(nil, set, globalSet) |
||||||
|
set.Parse([]string{"--myflag", "bat", "baz"}) |
||||||
|
globalSet.Parse([]string{"--myflagGlobal", "bat", "baz"}) |
||||||
|
expect(t, c.IsSet("myflag"), true) |
||||||
|
expect(t, c.IsSet("otherflag"), false) |
||||||
|
expect(t, c.IsSet("bogusflag"), false) |
||||||
|
expect(t, c.IsSet("myflagGlobal"), false) |
||||||
|
} |
||||||
|
|
||||||
|
func TestContext_GlobalIsSet(t *testing.T) { |
||||||
|
set := flag.NewFlagSet("test", 0) |
||||||
|
set.Bool("myflag", false, "doc") |
||||||
|
set.String("otherflag", "hello world", "doc") |
||||||
|
globalSet := flag.NewFlagSet("test", 0) |
||||||
|
globalSet.Bool("myflagGlobal", true, "doc") |
||||||
|
globalSet.Bool("myflagGlobalUnset", true, "doc") |
||||||
|
c := cli.NewContext(nil, set, globalSet) |
||||||
|
set.Parse([]string{"--myflag", "bat", "baz"}) |
||||||
|
globalSet.Parse([]string{"--myflagGlobal", "bat", "baz"}) |
||||||
|
expect(t, c.GlobalIsSet("myflag"), false) |
||||||
|
expect(t, c.GlobalIsSet("otherflag"), false) |
||||||
|
expect(t, c.GlobalIsSet("bogusflag"), false) |
||||||
|
expect(t, c.GlobalIsSet("myflagGlobal"), true) |
||||||
|
expect(t, c.GlobalIsSet("myflagGlobalUnset"), false) |
||||||
|
expect(t, c.GlobalIsSet("bogusGlobal"), false) |
||||||
|
} |
||||||
|
|
||||||
|
func TestContext_NumFlags(t *testing.T) { |
||||||
|
set := flag.NewFlagSet("test", 0) |
||||||
|
set.Bool("myflag", false, "doc") |
||||||
|
set.String("otherflag", "hello world", "doc") |
||||||
|
globalSet := flag.NewFlagSet("test", 0) |
||||||
|
globalSet.Bool("myflagGlobal", true, "doc") |
||||||
|
c := cli.NewContext(nil, set, globalSet) |
||||||
|
set.Parse([]string{"--myflag", "--otherflag=foo"}) |
||||||
|
globalSet.Parse([]string{"--myflagGlobal"}) |
||||||
|
expect(t, c.NumFlags(), 2) |
||||||
|
} |
@ -0,0 +1,598 @@ |
|||||||
|
package cli_test |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"os" |
||||||
|
"reflect" |
||||||
|
"strings" |
||||||
|
"testing" |
||||||
|
|
||||||
|
"github.com/minio/cli" |
||||||
|
) |
||||||
|
|
||||||
|
var stringFlagTests = []struct { |
||||||
|
name string |
||||||
|
value string |
||||||
|
expected string |
||||||
|
}{ |
||||||
|
{"test", "Something", "--test \"Something\"\t"}, |
||||||
|
} |
||||||
|
|
||||||
|
func TestStringFlagHelpOutput(t *testing.T) { |
||||||
|
for _, test := range stringFlagTests { |
||||||
|
flag := cli.StringFlag{Name: test.name, Value: test.value} |
||||||
|
output := flag.String() |
||||||
|
|
||||||
|
if output != test.expected { |
||||||
|
t.Errorf("%s does not match %s", output, test.expected) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestStringFlagWithEnvVarHelpOutput(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_FOO", "derp") |
||||||
|
for _, test := range stringFlagTests { |
||||||
|
flag := cli.StringFlag{Name: test.name, Value: test.value, EnvVar: "APP_FOO"} |
||||||
|
output := flag.String() |
||||||
|
|
||||||
|
if !strings.HasSuffix(output, " [$APP_FOO]") { |
||||||
|
t.Errorf("%s does not end with [$APP_FOO]", output) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
var stringSliceFlagTests = []struct { |
||||||
|
name string |
||||||
|
value *cli.StringSlice |
||||||
|
expected string |
||||||
|
}{ |
||||||
|
{"test", func() *cli.StringSlice { |
||||||
|
s := &cli.StringSlice{} |
||||||
|
s.Set("Something") |
||||||
|
return s |
||||||
|
}(), "--test [--test option --test option]\t"}, |
||||||
|
} |
||||||
|
|
||||||
|
func TestStringSliceFlagHelpOutput(t *testing.T) { |
||||||
|
for _, test := range stringSliceFlagTests { |
||||||
|
flag := cli.StringSliceFlag{Name: test.name, Value: test.value} |
||||||
|
output := flag.String() |
||||||
|
|
||||||
|
if output != test.expected { |
||||||
|
t.Errorf("%q does not match %q", output, test.expected) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestStringSliceFlagWithEnvVarHelpOutput(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_QWWX", "11,4") |
||||||
|
for _, test := range stringSliceFlagTests { |
||||||
|
flag := cli.StringSliceFlag{Name: test.name, Value: test.value, EnvVar: "APP_QWWX"} |
||||||
|
output := flag.String() |
||||||
|
|
||||||
|
if !strings.HasSuffix(output, " [$APP_QWWX]") { |
||||||
|
t.Errorf("%q does not end with [$APP_QWWX]", output) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
var intSliceFlagTests = []struct { |
||||||
|
name string |
||||||
|
value *cli.IntSlice |
||||||
|
expected string |
||||||
|
}{ |
||||||
|
{"test", func() *cli.IntSlice { |
||||||
|
i := &cli.IntSlice{} |
||||||
|
i.Set("9") |
||||||
|
return i |
||||||
|
}(), "--test [--test option --test option]\t"}, |
||||||
|
} |
||||||
|
|
||||||
|
func TestIntSliceFlagHelpOutput(t *testing.T) { |
||||||
|
for _, test := range intSliceFlagTests { |
||||||
|
flag := cli.IntSliceFlag{Name: test.name, Value: test.value} |
||||||
|
output := flag.String() |
||||||
|
|
||||||
|
if output != test.expected { |
||||||
|
t.Errorf("%q does not match %q", output, test.expected) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestIntSliceFlagWithEnvVarHelpOutput(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_SMURF", "42,3") |
||||||
|
for _, test := range intSliceFlagTests { |
||||||
|
flag := cli.IntSliceFlag{Name: test.name, Value: test.value, EnvVar: "APP_SMURF"} |
||||||
|
output := flag.String() |
||||||
|
|
||||||
|
if !strings.HasSuffix(output, " [$APP_SMURF]") { |
||||||
|
t.Errorf("%q does not end with [$APP_SMURF]", output) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
var genericFlagTests = []struct { |
||||||
|
name string |
||||||
|
value cli.Generic |
||||||
|
expected string |
||||||
|
}{ |
||||||
|
{"test", &Parser{"abc", "def"}, "--test \"abc,def\"\ttest flag"}, |
||||||
|
{"t", &Parser{"abc", "def"}, "-t \"abc,def\"\ttest flag"}, |
||||||
|
} |
||||||
|
|
||||||
|
func TestGenericFlagHelpOutput(t *testing.T) { |
||||||
|
for _, test := range genericFlagTests { |
||||||
|
flag := cli.GenericFlag{Name: test.name, Value: test.value, Usage: "test flag"} |
||||||
|
output := flag.String() |
||||||
|
|
||||||
|
if output != test.expected { |
||||||
|
t.Errorf("%q does not match %q", output, test.expected) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestGenericFlagWithEnvVarHelpOutput(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_ZAP", "3") |
||||||
|
for _, test := range genericFlagTests { |
||||||
|
flag := cli.GenericFlag{Name: test.name, EnvVar: "APP_ZAP"} |
||||||
|
output := flag.String() |
||||||
|
|
||||||
|
if !strings.HasSuffix(output, " [$APP_ZAP]") { |
||||||
|
t.Errorf("%s does not end with [$APP_ZAP]", output) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiString(t *testing.T) { |
||||||
|
(&cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.StringFlag{Name: "serve, s"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if ctx.String("serve") != "10" { |
||||||
|
t.Errorf("main name not set") |
||||||
|
} |
||||||
|
if ctx.String("s") != "10" { |
||||||
|
t.Errorf("short name not set") |
||||||
|
} |
||||||
|
}, |
||||||
|
}).Run([]string{"run", "-s", "10"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiStringFromEnv(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_COUNT", "20") |
||||||
|
(&cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.StringFlag{Name: "count, c", EnvVar: "APP_COUNT"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if ctx.String("count") != "20" { |
||||||
|
t.Errorf("main name not set") |
||||||
|
} |
||||||
|
if ctx.String("c") != "20" { |
||||||
|
t.Errorf("short name not set") |
||||||
|
} |
||||||
|
}, |
||||||
|
}).Run([]string{"run"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiStringFromEnvCascade(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_COUNT", "20") |
||||||
|
(&cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.StringFlag{Name: "count, c", EnvVar: "COMPAT_COUNT,APP_COUNT"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if ctx.String("count") != "20" { |
||||||
|
t.Errorf("main name not set") |
||||||
|
} |
||||||
|
if ctx.String("c") != "20" { |
||||||
|
t.Errorf("short name not set") |
||||||
|
} |
||||||
|
}, |
||||||
|
}).Run([]string{"run"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiStringSlice(t *testing.T) { |
||||||
|
(&cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.StringSliceFlag{Name: "serve, s", Value: &cli.StringSlice{}}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if !reflect.DeepEqual(ctx.StringSlice("serve"), []string{"10", "20"}) { |
||||||
|
t.Errorf("main name not set") |
||||||
|
} |
||||||
|
if !reflect.DeepEqual(ctx.StringSlice("s"), []string{"10", "20"}) { |
||||||
|
t.Errorf("short name not set") |
||||||
|
} |
||||||
|
}, |
||||||
|
}).Run([]string{"run", "-s", "10", "-s", "20"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiStringSliceFromEnv(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_INTERVALS", "20,30,40") |
||||||
|
|
||||||
|
(&cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.StringSliceFlag{Name: "intervals, i", Value: &cli.StringSlice{}, EnvVar: "APP_INTERVALS"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if !reflect.DeepEqual(ctx.StringSlice("intervals"), []string{"20", "30", "40"}) { |
||||||
|
t.Errorf("main name not set from env") |
||||||
|
} |
||||||
|
if !reflect.DeepEqual(ctx.StringSlice("i"), []string{"20", "30", "40"}) { |
||||||
|
t.Errorf("short name not set from env") |
||||||
|
} |
||||||
|
}, |
||||||
|
}).Run([]string{"run"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiStringSliceFromEnvCascade(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_INTERVALS", "20,30,40") |
||||||
|
|
||||||
|
(&cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.StringSliceFlag{Name: "intervals, i", Value: &cli.StringSlice{}, EnvVar: "COMPAT_INTERVALS,APP_INTERVALS"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if !reflect.DeepEqual(ctx.StringSlice("intervals"), []string{"20", "30", "40"}) { |
||||||
|
t.Errorf("main name not set from env") |
||||||
|
} |
||||||
|
if !reflect.DeepEqual(ctx.StringSlice("i"), []string{"20", "30", "40"}) { |
||||||
|
t.Errorf("short name not set from env") |
||||||
|
} |
||||||
|
}, |
||||||
|
}).Run([]string{"run"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiInt(t *testing.T) { |
||||||
|
a := cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.IntFlag{Name: "serve, s"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if ctx.Int("serve") != 10 { |
||||||
|
t.Errorf("main name not set") |
||||||
|
} |
||||||
|
if ctx.Int("s") != 10 { |
||||||
|
t.Errorf("short name not set") |
||||||
|
} |
||||||
|
}, |
||||||
|
} |
||||||
|
a.Run([]string{"run", "-s", "10"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiIntFromEnv(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_TIMEOUT_SECONDS", "10") |
||||||
|
a := cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.IntFlag{Name: "timeout, t", EnvVar: "APP_TIMEOUT_SECONDS"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if ctx.Int("timeout") != 10 { |
||||||
|
t.Errorf("main name not set") |
||||||
|
} |
||||||
|
if ctx.Int("t") != 10 { |
||||||
|
t.Errorf("short name not set") |
||||||
|
} |
||||||
|
}, |
||||||
|
} |
||||||
|
a.Run([]string{"run"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiIntFromEnvCascade(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_TIMEOUT_SECONDS", "10") |
||||||
|
a := cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.IntFlag{Name: "timeout, t", EnvVar: "COMPAT_TIMEOUT_SECONDS,APP_TIMEOUT_SECONDS"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if ctx.Int("timeout") != 10 { |
||||||
|
t.Errorf("main name not set") |
||||||
|
} |
||||||
|
if ctx.Int("t") != 10 { |
||||||
|
t.Errorf("short name not set") |
||||||
|
} |
||||||
|
}, |
||||||
|
} |
||||||
|
a.Run([]string{"run"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiIntSlice(t *testing.T) { |
||||||
|
(&cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.IntSliceFlag{Name: "serve, s", Value: &cli.IntSlice{}}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if !reflect.DeepEqual(ctx.IntSlice("serve"), []int{10, 20}) { |
||||||
|
t.Errorf("main name not set") |
||||||
|
} |
||||||
|
if !reflect.DeepEqual(ctx.IntSlice("s"), []int{10, 20}) { |
||||||
|
t.Errorf("short name not set") |
||||||
|
} |
||||||
|
}, |
||||||
|
}).Run([]string{"run", "-s", "10", "-s", "20"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiIntSliceFromEnv(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_INTERVALS", "20,30,40") |
||||||
|
|
||||||
|
(&cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.IntSliceFlag{Name: "intervals, i", Value: &cli.IntSlice{}, EnvVar: "APP_INTERVALS"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if !reflect.DeepEqual(ctx.IntSlice("intervals"), []int{20, 30, 40}) { |
||||||
|
t.Errorf("main name not set from env") |
||||||
|
} |
||||||
|
if !reflect.DeepEqual(ctx.IntSlice("i"), []int{20, 30, 40}) { |
||||||
|
t.Errorf("short name not set from env") |
||||||
|
} |
||||||
|
}, |
||||||
|
}).Run([]string{"run"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiIntSliceFromEnvCascade(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_INTERVALS", "20,30,40") |
||||||
|
|
||||||
|
(&cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.IntSliceFlag{Name: "intervals, i", Value: &cli.IntSlice{}, EnvVar: "COMPAT_INTERVALS,APP_INTERVALS"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if !reflect.DeepEqual(ctx.IntSlice("intervals"), []int{20, 30, 40}) { |
||||||
|
t.Errorf("main name not set from env") |
||||||
|
} |
||||||
|
if !reflect.DeepEqual(ctx.IntSlice("i"), []int{20, 30, 40}) { |
||||||
|
t.Errorf("short name not set from env") |
||||||
|
} |
||||||
|
}, |
||||||
|
}).Run([]string{"run"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiFloat64(t *testing.T) { |
||||||
|
a := cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.Float64Flag{Name: "serve, s"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if ctx.Float64("serve") != 10.2 { |
||||||
|
t.Errorf("main name not set") |
||||||
|
} |
||||||
|
if ctx.Float64("s") != 10.2 { |
||||||
|
t.Errorf("short name not set") |
||||||
|
} |
||||||
|
}, |
||||||
|
} |
||||||
|
a.Run([]string{"run", "-s", "10.2"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiFloat64FromEnv(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_TIMEOUT_SECONDS", "15.5") |
||||||
|
a := cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.Float64Flag{Name: "timeout, t", EnvVar: "APP_TIMEOUT_SECONDS"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if ctx.Float64("timeout") != 15.5 { |
||||||
|
t.Errorf("main name not set") |
||||||
|
} |
||||||
|
if ctx.Float64("t") != 15.5 { |
||||||
|
t.Errorf("short name not set") |
||||||
|
} |
||||||
|
}, |
||||||
|
} |
||||||
|
a.Run([]string{"run"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiFloat64FromEnvCascade(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_TIMEOUT_SECONDS", "15.5") |
||||||
|
a := cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.Float64Flag{Name: "timeout, t", EnvVar: "COMPAT_TIMEOUT_SECONDS,APP_TIMEOUT_SECONDS"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if ctx.Float64("timeout") != 15.5 { |
||||||
|
t.Errorf("main name not set") |
||||||
|
} |
||||||
|
if ctx.Float64("t") != 15.5 { |
||||||
|
t.Errorf("short name not set") |
||||||
|
} |
||||||
|
}, |
||||||
|
} |
||||||
|
a.Run([]string{"run"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiBool(t *testing.T) { |
||||||
|
a := cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.BoolFlag{Name: "serve, s"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if ctx.Bool("serve") != true { |
||||||
|
t.Errorf("main name not set") |
||||||
|
} |
||||||
|
if ctx.Bool("s") != true { |
||||||
|
t.Errorf("short name not set") |
||||||
|
} |
||||||
|
}, |
||||||
|
} |
||||||
|
a.Run([]string{"run", "--serve"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiBoolFromEnv(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_DEBUG", "1") |
||||||
|
a := cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.BoolFlag{Name: "debug, d", EnvVar: "APP_DEBUG"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if ctx.Bool("debug") != true { |
||||||
|
t.Errorf("main name not set from env") |
||||||
|
} |
||||||
|
if ctx.Bool("d") != true { |
||||||
|
t.Errorf("short name not set from env") |
||||||
|
} |
||||||
|
}, |
||||||
|
} |
||||||
|
a.Run([]string{"run"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiBoolFromEnvCascade(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_DEBUG", "1") |
||||||
|
a := cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.BoolFlag{Name: "debug, d", EnvVar: "COMPAT_DEBUG,APP_DEBUG"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if ctx.Bool("debug") != true { |
||||||
|
t.Errorf("main name not set from env") |
||||||
|
} |
||||||
|
if ctx.Bool("d") != true { |
||||||
|
t.Errorf("short name not set from env") |
||||||
|
} |
||||||
|
}, |
||||||
|
} |
||||||
|
a.Run([]string{"run"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiBoolT(t *testing.T) { |
||||||
|
a := cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.BoolTFlag{Name: "serve, s"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if ctx.BoolT("serve") != true { |
||||||
|
t.Errorf("main name not set") |
||||||
|
} |
||||||
|
if ctx.BoolT("s") != true { |
||||||
|
t.Errorf("short name not set") |
||||||
|
} |
||||||
|
}, |
||||||
|
} |
||||||
|
a.Run([]string{"run", "--serve"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiBoolTFromEnv(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_DEBUG", "0") |
||||||
|
a := cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.BoolTFlag{Name: "debug, d", EnvVar: "APP_DEBUG"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if ctx.BoolT("debug") != false { |
||||||
|
t.Errorf("main name not set from env") |
||||||
|
} |
||||||
|
if ctx.BoolT("d") != false { |
||||||
|
t.Errorf("short name not set from env") |
||||||
|
} |
||||||
|
}, |
||||||
|
} |
||||||
|
a.Run([]string{"run"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseMultiBoolTFromEnvCascade(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_DEBUG", "0") |
||||||
|
a := cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.BoolTFlag{Name: "debug, d", EnvVar: "COMPAT_DEBUG,APP_DEBUG"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if ctx.BoolT("debug") != false { |
||||||
|
t.Errorf("main name not set from env") |
||||||
|
} |
||||||
|
if ctx.BoolT("d") != false { |
||||||
|
t.Errorf("short name not set from env") |
||||||
|
} |
||||||
|
}, |
||||||
|
} |
||||||
|
a.Run([]string{"run"}) |
||||||
|
} |
||||||
|
|
||||||
|
type Parser [2]string |
||||||
|
|
||||||
|
func (p *Parser) Set(value string) error { |
||||||
|
parts := strings.Split(value, ",") |
||||||
|
if len(parts) != 2 { |
||||||
|
return fmt.Errorf("invalid format") |
||||||
|
} |
||||||
|
|
||||||
|
(*p)[0] = parts[0] |
||||||
|
(*p)[1] = parts[1] |
||||||
|
|
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (p *Parser) String() string { |
||||||
|
return fmt.Sprintf("%s,%s", p[0], p[1]) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseGeneric(t *testing.T) { |
||||||
|
a := cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.GenericFlag{Name: "serve, s", Value: &Parser{}}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if !reflect.DeepEqual(ctx.Generic("serve"), &Parser{"10", "20"}) { |
||||||
|
t.Errorf("main name not set") |
||||||
|
} |
||||||
|
if !reflect.DeepEqual(ctx.Generic("s"), &Parser{"10", "20"}) { |
||||||
|
t.Errorf("short name not set") |
||||||
|
} |
||||||
|
}, |
||||||
|
} |
||||||
|
a.Run([]string{"run", "-s", "10,20"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseGenericFromEnv(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_SERVE", "20,30") |
||||||
|
a := cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.GenericFlag{Name: "serve, s", Value: &Parser{}, EnvVar: "APP_SERVE"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if !reflect.DeepEqual(ctx.Generic("serve"), &Parser{"20", "30"}) { |
||||||
|
t.Errorf("main name not set from env") |
||||||
|
} |
||||||
|
if !reflect.DeepEqual(ctx.Generic("s"), &Parser{"20", "30"}) { |
||||||
|
t.Errorf("short name not set from env") |
||||||
|
} |
||||||
|
}, |
||||||
|
} |
||||||
|
a.Run([]string{"run"}) |
||||||
|
} |
||||||
|
|
||||||
|
func TestParseGenericFromEnvCascade(t *testing.T) { |
||||||
|
os.Clearenv() |
||||||
|
os.Setenv("APP_FOO", "99,2000") |
||||||
|
a := cli.App{ |
||||||
|
Flags: []cli.Flag{ |
||||||
|
cli.GenericFlag{Name: "foos", Value: &Parser{}, EnvVar: "COMPAT_FOO,APP_FOO"}, |
||||||
|
}, |
||||||
|
Action: func(ctx *cli.Context) { |
||||||
|
if !reflect.DeepEqual(ctx.Generic("foos"), &Parser{"99", "2000"}) { |
||||||
|
t.Errorf("value not set from env") |
||||||
|
} |
||||||
|
}, |
||||||
|
} |
||||||
|
a.Run([]string{"run"}) |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
package cli_test |
||||||
|
|
||||||
|
import ( |
||||||
|
"reflect" |
||||||
|
"testing" |
||||||
|
) |
||||||
|
|
||||||
|
/* Test Helpers */ |
||||||
|
func expect(t *testing.T, a interface{}, b interface{}) { |
||||||
|
if a != b { |
||||||
|
t.Errorf("Expected %v (type %v) - Got %v (type %v)", b, reflect.TypeOf(b), a, reflect.TypeOf(a)) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func refute(t *testing.T, a interface{}, b interface{}) { |
||||||
|
if a == b { |
||||||
|
t.Errorf("Did not expect %v (type %v) - Got %v (type %v)", b, reflect.TypeOf(b), a, reflect.TypeOf(a)) |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue