- Fix a new line issue for minioHelpTemplate. - Fixes #974master
parent
ffa22cf31e
commit
ab3fd8ea7f
@ -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