2015-07-20 19:18:25 +00:00
package cli
2013-09-09 18:51:46 +00:00
import (
2014-04-15 14:16:47 +00:00
"fmt"
2017-04-01 03:37:06 +00:00
"io"
"io/ioutil"
2014-07-11 22:13:10 +00:00
"os"
2014-03-19 02:26:57 +00:00
"reflect"
2017-03-04 22:28:24 +00:00
"regexp"
2016-04-25 22:10:10 +00:00
"runtime"
2014-04-15 14:16:47 +00:00
"strings"
2013-09-09 18:51:46 +00:00
"testing"
2016-05-02 17:05:21 +00:00
"time"
2013-09-09 18:51:46 +00:00
)
var boolFlagTests = [ ] struct {
name string
expected string
} {
{ "help" , "--help\t" } ,
{ "h" , "-h\t" } ,
}
func TestBoolFlagHelpOutput ( t * testing . T ) {
for _ , test := range boolFlagTests {
2015-07-20 19:18:25 +00:00
flag := BoolFlag { Name : test . name }
2013-09-09 18:51:46 +00:00
output := flag . String ( )
if output != test . expected {
2016-05-02 17:05:21 +00:00
t . Errorf ( "%q does not match %q" , output , test . expected )
2013-09-09 18:51:46 +00:00
}
}
}
2016-09-17 23:54:29 +00:00
func TestFlagsFromEnv ( t * testing . T ) {
var flagTests = [ ] struct {
2017-03-04 22:28:24 +00:00
input string
output interface { }
flag Flag
errRegexp string
2016-09-12 03:32:43 +00:00
} {
2017-03-04 22:28:24 +00:00
{ "" , false , BoolFlag { Name : "debug" , EnvVar : "DEBUG" } , "" } ,
{ "1" , true , BoolFlag { Name : "debug" , EnvVar : "DEBUG" } , "" } ,
{ "false" , false , BoolFlag { Name : "debug" , EnvVar : "DEBUG" } , "" } ,
{ "foobar" , true , BoolFlag { Name : "debug" , EnvVar : "DEBUG" } , fmt . Sprintf ( ` could not parse foobar as bool value for flag debug: .* ` ) } ,
2016-09-17 23:54:29 +00:00
2017-03-04 22:28:24 +00:00
{ "" , false , BoolTFlag { Name : "debug" , EnvVar : "DEBUG" } , "" } ,
{ "1" , true , BoolTFlag { Name : "debug" , EnvVar : "DEBUG" } , "" } ,
{ "false" , false , BoolTFlag { Name : "debug" , EnvVar : "DEBUG" } , "" } ,
{ "foobar" , true , BoolTFlag { Name : "debug" , EnvVar : "DEBUG" } , fmt . Sprintf ( ` could not parse foobar as bool value for flag debug: .* ` ) } ,
2016-09-17 23:54:29 +00:00
2017-03-04 22:28:24 +00:00
{ "1s" , 1 * time . Second , DurationFlag { Name : "time" , EnvVar : "TIME" } , "" } ,
{ "foobar" , false , DurationFlag { Name : "time" , EnvVar : "TIME" } , fmt . Sprintf ( ` could not parse foobar as duration for flag time: .* ` ) } ,
2016-09-17 23:54:29 +00:00
2017-03-04 22:28:24 +00:00
{ "1.2" , 1.2 , Float64Flag { Name : "seconds" , EnvVar : "SECONDS" } , "" } ,
{ "1" , 1.0 , Float64Flag { Name : "seconds" , EnvVar : "SECONDS" } , "" } ,
{ "foobar" , 0 , Float64Flag { Name : "seconds" , EnvVar : "SECONDS" } , fmt . Sprintf ( ` could not parse foobar as float64 value for flag seconds: .* ` ) } ,
2016-09-17 23:54:29 +00:00
2017-03-04 22:28:24 +00:00
{ "1" , int64 ( 1 ) , Int64Flag { Name : "seconds" , EnvVar : "SECONDS" } , "" } ,
{ "1.2" , 0 , Int64Flag { Name : "seconds" , EnvVar : "SECONDS" } , fmt . Sprintf ( ` could not parse 1.2 as int value for flag seconds: .* ` ) } ,
{ "foobar" , 0 , Int64Flag { Name : "seconds" , EnvVar : "SECONDS" } , fmt . Sprintf ( ` could not parse foobar as int value for flag seconds: .* ` ) } ,
2016-09-17 23:54:29 +00:00
2017-03-04 22:28:24 +00:00
{ "1" , 1 , IntFlag { Name : "seconds" , EnvVar : "SECONDS" } , "" } ,
{ "1.2" , 0 , IntFlag { Name : "seconds" , EnvVar : "SECONDS" } , fmt . Sprintf ( ` could not parse 1.2 as int value for flag seconds: .* ` ) } ,
{ "foobar" , 0 , IntFlag { Name : "seconds" , EnvVar : "SECONDS" } , fmt . Sprintf ( ` could not parse foobar as int value for flag seconds: .* ` ) } ,
2016-09-17 23:54:29 +00:00
2017-03-04 22:28:24 +00:00
{ "1,2" , IntSlice { 1 , 2 } , IntSliceFlag { Name : "seconds" , EnvVar : "SECONDS" } , "" } ,
{ "1.2,2" , IntSlice { } , IntSliceFlag { Name : "seconds" , EnvVar : "SECONDS" } , fmt . Sprintf ( ` could not parse 1.2,2 as int slice value for flag seconds: .* ` ) } ,
{ "foobar" , IntSlice { } , IntSliceFlag { Name : "seconds" , EnvVar : "SECONDS" } , fmt . Sprintf ( ` could not parse foobar as int slice value for flag seconds: .* ` ) } ,
2016-09-17 23:54:29 +00:00
2017-03-04 22:28:24 +00:00
{ "1,2" , Int64Slice { 1 , 2 } , Int64SliceFlag { Name : "seconds" , EnvVar : "SECONDS" } , "" } ,
{ "1.2,2" , Int64Slice { } , Int64SliceFlag { Name : "seconds" , EnvVar : "SECONDS" } , fmt . Sprintf ( ` could not parse 1.2,2 as int64 slice value for flag seconds: .* ` ) } ,
{ "foobar" , Int64Slice { } , Int64SliceFlag { Name : "seconds" , EnvVar : "SECONDS" } , fmt . Sprintf ( ` could not parse foobar as int64 slice value for flag seconds: .* ` ) } ,
2016-09-17 23:54:29 +00:00
2017-03-04 22:28:24 +00:00
{ "foo" , "foo" , StringFlag { Name : "name" , EnvVar : "NAME" } , "" } ,
2016-09-17 23:54:29 +00:00
2017-03-04 22:28:24 +00:00
{ "foo,bar" , StringSlice { "foo" , "bar" } , StringSliceFlag { Name : "names" , EnvVar : "NAMES" } , "" } ,
2016-09-17 23:54:29 +00:00
2017-03-04 22:28:24 +00:00
{ "1" , uint ( 1 ) , UintFlag { Name : "seconds" , EnvVar : "SECONDS" } , "" } ,
{ "1.2" , 0 , UintFlag { Name : "seconds" , EnvVar : "SECONDS" } , fmt . Sprintf ( ` could not parse 1.2 as uint value for flag seconds: .* ` ) } ,
{ "foobar" , 0 , UintFlag { Name : "seconds" , EnvVar : "SECONDS" } , fmt . Sprintf ( ` could not parse foobar as uint value for flag seconds: .* ` ) } ,
2016-09-17 23:54:29 +00:00
2017-03-04 22:28:24 +00:00
{ "1" , uint64 ( 1 ) , Uint64Flag { Name : "seconds" , EnvVar : "SECONDS" } , "" } ,
{ "1.2" , 0 , Uint64Flag { Name : "seconds" , EnvVar : "SECONDS" } , fmt . Sprintf ( ` could not parse 1.2 as uint64 value for flag seconds: .* ` ) } ,
{ "foobar" , 0 , Uint64Flag { Name : "seconds" , EnvVar : "SECONDS" } , fmt . Sprintf ( ` could not parse foobar as uint64 value for flag seconds: .* ` ) } ,
2016-09-17 23:54:29 +00:00
2017-03-04 22:28:24 +00:00
{ "foo,bar" , & Parser { "foo" , "bar" } , GenericFlag { Name : "names" , Value : & Parser { } , EnvVar : "NAMES" } , "" } ,
2016-09-12 03:32:43 +00:00
}
2016-09-17 23:54:29 +00:00
for _ , test := range flagTests {
2016-09-12 03:32:43 +00:00
os . Clearenv ( )
2016-09-17 23:54:29 +00:00
os . Setenv ( reflect . ValueOf ( test . flag ) . FieldByName ( "EnvVar" ) . String ( ) , test . input )
2016-09-12 03:32:43 +00:00
a := App {
2016-09-17 23:54:29 +00:00
Flags : [ ] Flag { test . flag } ,
2016-09-12 03:32:43 +00:00
Action : func ( ctx * Context ) error {
2016-09-17 23:54:29 +00:00
if ! reflect . DeepEqual ( ctx . value ( test . flag . GetName ( ) ) , test . output ) {
t . Errorf ( "expected %+v to be parsed as %+v, instead was %+v" , test . input , test . output , ctx . value ( test . flag . GetName ( ) ) )
2016-09-12 03:32:43 +00:00
}
return nil
} ,
}
2016-09-17 23:54:29 +00:00
err := a . Run ( [ ] string { "run" } )
2017-03-04 22:28:24 +00:00
if test . errRegexp != "" {
if err == nil {
t . Errorf ( "expected error to match %s, got none" , test . errRegexp )
} else {
if matched , _ := regexp . MatchString ( test . errRegexp , err . Error ( ) ) ; ! matched {
t . Errorf ( "expected error to match %s, got error %s" , test . errRegexp , err )
}
}
} else {
if err != nil && test . errRegexp == "" {
t . Errorf ( "expected no error got %s" , err )
}
2016-09-17 23:54:29 +00:00
}
2016-09-12 03:32:43 +00:00
}
}
2013-09-09 18:51:46 +00:00
var stringFlagTests = [ ] struct {
name string
2016-04-22 03:02:06 +00:00
usage string
2014-04-11 19:09:59 +00:00
value string
2013-09-09 18:51:46 +00:00
expected string
} {
2016-05-02 23:42:08 +00:00
{ "foo" , "" , "" , "--foo value\t" } ,
{ "f" , "" , "" , "-f value\t" } ,
{ "f" , "The total `foo` desired" , "all" , "-f foo\tThe total foo desired (default: \"all\")" } ,
{ "test" , "" , "Something" , "--test value\t(default: \"Something\")" } ,
2016-05-02 17:05:21 +00:00
{ "config,c" , "Load configuration from `FILE`" , "" , "--config FILE, -c FILE\tLoad configuration from FILE" } ,
2016-05-02 23:42:08 +00:00
{ "config,c" , "Load configuration from `CONFIG`" , "config.json" , "--config CONFIG, -c CONFIG\tLoad configuration from CONFIG (default: \"config.json\")" } ,
2013-09-09 18:51:46 +00:00
}
func TestStringFlagHelpOutput ( t * testing . T ) {
for _ , test := range stringFlagTests {
2016-04-22 03:02:06 +00:00
flag := StringFlag { Name : test . name , Usage : test . usage , Value : test . value }
2013-09-09 18:51:46 +00:00
output := flag . String ( )
if output != test . expected {
2016-05-02 17:05:21 +00:00
t . Errorf ( "%q does not match %q" , output , test . expected )
2013-09-09 18:51:46 +00:00
}
}
}
2014-07-11 22:13:10 +00:00
func TestStringFlagWithEnvVarHelpOutput ( t * testing . T ) {
2014-09-23 03:24:08 +00:00
os . Clearenv ( )
2014-07-11 22:13:10 +00:00
os . Setenv ( "APP_FOO" , "derp" )
for _ , test := range stringFlagTests {
2015-07-20 19:18:25 +00:00
flag := StringFlag { Name : test . name , Value : test . value , EnvVar : "APP_FOO" }
2014-07-11 22:13:10 +00:00
output := flag . String ( )
2016-01-22 14:08:27 +00:00
expectedSuffix := " [$APP_FOO]"
if runtime . GOOS == "windows" {
expectedSuffix = " [%APP_FOO%]"
}
if ! strings . HasSuffix ( output , expectedSuffix ) {
2016-04-25 22:10:10 +00:00
t . Errorf ( "%s does not end with" + expectedSuffix , output )
2014-07-11 22:13:10 +00:00
}
}
}
2017-09-18 04:44:42 +00:00
var prefixStringFlagTests = [ ] struct {
name string
usage string
value string
prefixer FlagNamePrefixFunc
expected string
} {
{ "foo" , "" , "" , func ( a , b string ) string {
return fmt . Sprintf ( "name: %s, ph: %s" , a , b )
} , "name: foo, ph: value\t" } ,
{ "f" , "" , "" , func ( a , b string ) string {
return fmt . Sprintf ( "name: %s, ph: %s" , a , b )
} , "name: f, ph: value\t" } ,
{ "f" , "The total `foo` desired" , "all" , func ( a , b string ) string {
return fmt . Sprintf ( "name: %s, ph: %s" , a , b )
} , "name: f, ph: foo\tThe total foo desired (default: \"all\")" } ,
{ "test" , "" , "Something" , func ( a , b string ) string {
return fmt . Sprintf ( "name: %s, ph: %s" , a , b )
} , "name: test, ph: value\t(default: \"Something\")" } ,
{ "config,c" , "Load configuration from `FILE`" , "" , func ( a , b string ) string {
return fmt . Sprintf ( "name: %s, ph: %s" , a , b )
} , "name: config,c, ph: FILE\tLoad configuration from FILE" } ,
{ "config,c" , "Load configuration from `CONFIG`" , "config.json" , func ( a , b string ) string {
return fmt . Sprintf ( "name: %s, ph: %s" , a , b )
} , "name: config,c, ph: CONFIG\tLoad configuration from CONFIG (default: \"config.json\")" } ,
}
func TestFlagNamePrefixer ( t * testing . T ) {
defer func ( ) {
FlagNamePrefixer = prefixedNames
} ( )
for _ , test := range prefixStringFlagTests {
FlagNamePrefixer = test . prefixer
flag := StringFlag { Name : test . name , Usage : test . usage , Value : test . value }
output := flag . String ( )
if output != test . expected {
t . Errorf ( "%q does not match %q" , output , test . expected )
}
}
}
var envHintFlagTests = [ ] struct {
name string
env string
hinter FlagEnvHintFunc
expected string
} {
{ "foo" , "" , func ( a , b string ) string {
return fmt . Sprintf ( "env: %s, str: %s" , a , b )
} , "env: , str: --foo value\t" } ,
{ "f" , "" , func ( a , b string ) string {
return fmt . Sprintf ( "env: %s, str: %s" , a , b )
} , "env: , str: -f value\t" } ,
{ "foo" , "ENV_VAR" , func ( a , b string ) string {
return fmt . Sprintf ( "env: %s, str: %s" , a , b )
} , "env: ENV_VAR, str: --foo value\t" } ,
{ "f" , "ENV_VAR" , func ( a , b string ) string {
return fmt . Sprintf ( "env: %s, str: %s" , a , b )
} , "env: ENV_VAR, str: -f value\t" } ,
}
func TestFlagEnvHinter ( t * testing . T ) {
defer func ( ) {
FlagEnvHinter = withEnvHint
} ( )
for _ , test := range envHintFlagTests {
FlagEnvHinter = test . hinter
flag := StringFlag { Name : test . name , EnvVar : test . env }
output := flag . String ( )
if output != test . expected {
t . Errorf ( "%q does not match %q" , output , test . expected )
}
}
}
2014-07-11 22:13:10 +00:00
var stringSliceFlagTests = [ ] struct {
name string
2015-07-20 19:18:25 +00:00
value * StringSlice
2014-07-11 22:13:10 +00:00
expected string
} {
2016-05-02 23:42:08 +00:00
{ "foo" , func ( ) * StringSlice {
2015-07-20 19:18:25 +00:00
s := & StringSlice { }
2014-07-11 22:30:16 +00:00
s . Set ( "" )
return s
2016-05-02 23:42:08 +00:00
} ( ) , "--foo value\t" } ,
{ "f" , func ( ) * StringSlice {
2015-07-20 19:18:25 +00:00
s := & StringSlice { }
2014-07-11 22:30:16 +00:00
s . Set ( "" )
return s
2016-05-02 23:42:08 +00:00
} ( ) , "-f value\t" } ,
{ "f" , func ( ) * StringSlice {
2015-07-20 19:18:25 +00:00
s := & StringSlice { }
2016-05-02 23:42:08 +00:00
s . Set ( "Lipstick" )
2014-07-11 22:30:16 +00:00
return s
2016-05-02 23:42:08 +00:00
} ( ) , "-f value\t(default: \"Lipstick\")" } ,
2015-07-20 19:18:25 +00:00
{ "test" , func ( ) * StringSlice {
s := & StringSlice { }
2014-07-11 22:30:16 +00:00
s . Set ( "Something" )
return s
2016-05-02 23:42:08 +00:00
} ( ) , "--test value\t(default: \"Something\")" } ,
2014-07-11 22:13:10 +00:00
}
func TestStringSliceFlagHelpOutput ( t * testing . T ) {
for _ , test := range stringSliceFlagTests {
2015-07-20 19:18:25 +00:00
flag := StringSliceFlag { Name : test . name , Value : test . value }
2014-07-11 22:13:10 +00:00
output := flag . String ( )
if output != test . expected {
t . Errorf ( "%q does not match %q" , output , test . expected )
}
}
}
func TestStringSliceFlagWithEnvVarHelpOutput ( t * testing . T ) {
2014-09-23 03:24:08 +00:00
os . Clearenv ( )
2014-07-11 22:13:10 +00:00
os . Setenv ( "APP_QWWX" , "11,4" )
for _ , test := range stringSliceFlagTests {
2015-07-20 19:18:25 +00:00
flag := StringSliceFlag { Name : test . name , Value : test . value , EnvVar : "APP_QWWX" }
2014-07-11 22:13:10 +00:00
output := flag . String ( )
2016-01-22 14:08:27 +00:00
expectedSuffix := " [$APP_QWWX]"
if runtime . GOOS == "windows" {
expectedSuffix = " [%APP_QWWX%]"
}
if ! strings . HasSuffix ( output , expectedSuffix ) {
2016-04-25 22:10:10 +00:00
t . Errorf ( "%q does not end with" + expectedSuffix , output )
2014-07-11 22:13:10 +00:00
}
}
}
2013-09-09 18:51:46 +00:00
var intFlagTests = [ ] struct {
name string
expected string
} {
2016-05-02 23:42:08 +00:00
{ "hats" , "--hats value\t(default: 9)" } ,
{ "H" , "-H value\t(default: 9)" } ,
2013-09-09 18:51:46 +00:00
}
func TestIntFlagHelpOutput ( t * testing . T ) {
for _ , test := range intFlagTests {
2016-05-02 23:42:08 +00:00
flag := IntFlag { Name : test . name , Value : 9 }
2013-09-09 18:51:46 +00:00
output := flag . String ( )
2013-12-03 13:42:09 +00:00
if output != test . expected {
t . Errorf ( "%s does not match %s" , output , test . expected )
}
}
}
2014-07-11 22:13:10 +00:00
func TestIntFlagWithEnvVarHelpOutput ( t * testing . T ) {
2014-09-23 03:24:08 +00:00
os . Clearenv ( )
2014-07-11 22:13:10 +00:00
os . Setenv ( "APP_BAR" , "2" )
for _ , test := range intFlagTests {
2015-07-20 19:18:25 +00:00
flag := IntFlag { Name : test . name , EnvVar : "APP_BAR" }
2014-07-11 22:13:10 +00:00
output := flag . String ( )
2016-01-22 14:08:27 +00:00
expectedSuffix := " [$APP_BAR]"
if runtime . GOOS == "windows" {
expectedSuffix = " [%APP_BAR%]"
}
if ! strings . HasSuffix ( output , expectedSuffix ) {
2016-04-25 22:10:10 +00:00
t . Errorf ( "%s does not end with" + expectedSuffix , output )
2014-07-11 22:13:10 +00:00
}
}
}
2016-06-11 22:22:07 +00:00
var int64FlagTests = [ ] struct {
name string
expected string
} {
{ "hats" , "--hats value\t(default: 8589934592)" } ,
{ "H" , "-H value\t(default: 8589934592)" } ,
}
func TestInt64FlagHelpOutput ( t * testing . T ) {
for _ , test := range int64FlagTests {
flag := Int64Flag { Name : test . name , Value : 8589934592 }
output := flag . String ( )
if output != test . expected {
t . Errorf ( "%s does not match %s" , output , test . expected )
}
}
}
func TestInt64FlagWithEnvVarHelpOutput ( t * testing . T ) {
os . Clearenv ( )
os . Setenv ( "APP_BAR" , "2" )
for _ , test := range int64FlagTests {
flag := IntFlag { Name : test . name , EnvVar : "APP_BAR" }
output := flag . String ( )
expectedSuffix := " [$APP_BAR]"
if runtime . GOOS == "windows" {
2016-06-16 15:13:32 +00:00
expectedSuffix = " [%APP_BAR%]"
}
if ! strings . HasSuffix ( output , expectedSuffix ) {
t . Errorf ( "%s does not end with" + expectedSuffix , output )
}
}
}
var uintFlagTests = [ ] struct {
name string
expected string
} {
{ "nerfs" , "--nerfs value\t(default: 41)" } ,
{ "N" , "-N value\t(default: 41)" } ,
}
func TestUintFlagHelpOutput ( t * testing . T ) {
for _ , test := range uintFlagTests {
flag := UintFlag { Name : test . name , Value : 41 }
output := flag . String ( )
if output != test . expected {
t . Errorf ( "%s does not match %s" , output , test . expected )
}
}
}
func TestUintFlagWithEnvVarHelpOutput ( t * testing . T ) {
os . Clearenv ( )
os . Setenv ( "APP_BAR" , "2" )
for _ , test := range uintFlagTests {
flag := UintFlag { Name : test . name , EnvVar : "APP_BAR" }
output := flag . String ( )
expectedSuffix := " [$APP_BAR]"
if runtime . GOOS == "windows" {
expectedSuffix = " [%APP_BAR%]"
}
if ! strings . HasSuffix ( output , expectedSuffix ) {
t . Errorf ( "%s does not end with" + expectedSuffix , output )
}
}
}
var uint64FlagTests = [ ] struct {
name string
expected string
} {
{ "gerfs" , "--gerfs value\t(default: 8589934582)" } ,
{ "G" , "-G value\t(default: 8589934582)" } ,
}
func TestUint64FlagHelpOutput ( t * testing . T ) {
for _ , test := range uint64FlagTests {
flag := Uint64Flag { Name : test . name , Value : 8589934582 }
output := flag . String ( )
if output != test . expected {
t . Errorf ( "%s does not match %s" , output , test . expected )
}
}
}
func TestUint64FlagWithEnvVarHelpOutput ( t * testing . T ) {
os . Clearenv ( )
os . Setenv ( "APP_BAR" , "2" )
for _ , test := range uint64FlagTests {
flag := UintFlag { Name : test . name , EnvVar : "APP_BAR" }
output := flag . String ( )
expectedSuffix := " [$APP_BAR]"
if runtime . GOOS == "windows" {
2016-06-11 22:22:07 +00:00
expectedSuffix = " [%APP_BAR%]"
}
if ! strings . HasSuffix ( output , expectedSuffix ) {
t . Errorf ( "%s does not end with" + expectedSuffix , output )
}
}
}
2014-08-02 21:32:32 +00:00
var durationFlagTests = [ ] struct {
name string
expected string
} {
2016-05-02 23:42:08 +00:00
{ "hooting" , "--hooting value\t(default: 1s)" } ,
{ "H" , "-H value\t(default: 1s)" } ,
2014-08-02 21:32:32 +00:00
}
func TestDurationFlagHelpOutput ( t * testing . T ) {
for _ , test := range durationFlagTests {
2016-05-02 17:05:21 +00:00
flag := DurationFlag { Name : test . name , Value : 1 * time . Second }
2014-08-02 21:32:32 +00:00
output := flag . String ( )
if output != test . expected {
2016-05-02 17:05:21 +00:00
t . Errorf ( "%q does not match %q" , output , test . expected )
2014-08-02 21:32:32 +00:00
}
}
}
func TestDurationFlagWithEnvVarHelpOutput ( t * testing . T ) {
2014-09-23 03:24:08 +00:00
os . Clearenv ( )
2014-08-02 21:32:32 +00:00
os . Setenv ( "APP_BAR" , "2h3m6s" )
for _ , test := range durationFlagTests {
2015-07-20 19:18:25 +00:00
flag := DurationFlag { Name : test . name , EnvVar : "APP_BAR" }
2014-08-02 21:32:32 +00:00
output := flag . String ( )
2016-01-22 14:08:27 +00:00
expectedSuffix := " [$APP_BAR]"
if runtime . GOOS == "windows" {
expectedSuffix = " [%APP_BAR%]"
}
if ! strings . HasSuffix ( output , expectedSuffix ) {
2016-04-25 22:10:10 +00:00
t . Errorf ( "%s does not end with" + expectedSuffix , output )
2014-08-02 21:32:32 +00:00
}
}
}
2014-07-11 22:13:10 +00:00
var intSliceFlagTests = [ ] struct {
name string
2015-07-20 19:18:25 +00:00
value * IntSlice
2014-07-11 22:13:10 +00:00
expected string
} {
2016-05-02 23:42:08 +00:00
{ "heads" , & IntSlice { } , "--heads value\t" } ,
{ "H" , & IntSlice { } , "-H value\t" } ,
{ "H, heads" , func ( ) * IntSlice {
2015-07-20 19:18:25 +00:00
i := & IntSlice { }
2014-07-11 22:30:16 +00:00
i . Set ( "9" )
2016-05-02 23:42:08 +00:00
i . Set ( "3" )
2014-07-11 22:30:16 +00:00
return i
2016-05-02 23:42:08 +00:00
} ( ) , "-H value, --heads value\t(default: 9, 3)" } ,
2014-07-11 22:13:10 +00:00
}
func TestIntSliceFlagHelpOutput ( t * testing . T ) {
for _ , test := range intSliceFlagTests {
2015-07-20 19:18:25 +00:00
flag := IntSliceFlag { Name : test . name , Value : test . value }
2014-07-11 22:13:10 +00:00
output := flag . String ( )
if output != test . expected {
t . Errorf ( "%q does not match %q" , output , test . expected )
}
}
}
func TestIntSliceFlagWithEnvVarHelpOutput ( t * testing . T ) {
2014-09-23 03:24:08 +00:00
os . Clearenv ( )
2014-07-11 22:13:10 +00:00
os . Setenv ( "APP_SMURF" , "42,3" )
for _ , test := range intSliceFlagTests {
2015-07-20 19:18:25 +00:00
flag := IntSliceFlag { Name : test . name , Value : test . value , EnvVar : "APP_SMURF" }
2014-07-11 22:13:10 +00:00
output := flag . String ( )
2016-01-22 14:08:27 +00:00
expectedSuffix := " [$APP_SMURF]"
if runtime . GOOS == "windows" {
expectedSuffix = " [%APP_SMURF%]"
}
if ! strings . HasSuffix ( output , expectedSuffix ) {
2016-04-25 22:10:10 +00:00
t . Errorf ( "%q does not end with" + expectedSuffix , output )
2014-07-11 22:13:10 +00:00
}
}
}
2016-06-12 04:54:33 +00:00
var int64SliceFlagTests = [ ] struct {
name string
value * Int64Slice
expected string
} {
{ "heads" , & Int64Slice { } , "--heads value\t" } ,
{ "H" , & Int64Slice { } , "-H value\t" } ,
{ "H, heads" , func ( ) * Int64Slice {
i := & Int64Slice { }
i . Set ( "2" )
i . Set ( "17179869184" )
return i
} ( ) , "-H value, --heads value\t(default: 2, 17179869184)" } ,
}
func TestInt64SliceFlagHelpOutput ( t * testing . T ) {
for _ , test := range int64SliceFlagTests {
flag := Int64SliceFlag { Name : test . name , Value : test . value }
output := flag . String ( )
if output != test . expected {
t . Errorf ( "%q does not match %q" , output , test . expected )
}
}
}
func TestInt64SliceFlagWithEnvVarHelpOutput ( t * testing . T ) {
os . Clearenv ( )
os . Setenv ( "APP_SMURF" , "42,17179869184" )
for _ , test := range int64SliceFlagTests {
flag := Int64SliceFlag { Name : test . name , Value : test . value , EnvVar : "APP_SMURF" }
output := flag . String ( )
expectedSuffix := " [$APP_SMURF]"
if runtime . GOOS == "windows" {
expectedSuffix = " [%APP_SMURF%]"
}
if ! strings . HasSuffix ( output , expectedSuffix ) {
t . Errorf ( "%q does not end with" + expectedSuffix , output )
}
}
}
2013-12-03 13:42:09 +00:00
var float64FlagTests = [ ] struct {
name string
expected string
} {
2016-05-02 23:42:08 +00:00
{ "hooting" , "--hooting value\t(default: 0.1)" } ,
{ "H" , "-H value\t(default: 0.1)" } ,
2013-12-03 13:42:09 +00:00
}
func TestFloat64FlagHelpOutput ( t * testing . T ) {
for _ , test := range float64FlagTests {
2016-05-02 17:05:21 +00:00
flag := Float64Flag { Name : test . name , Value : float64 ( 0.1 ) }
2013-12-03 13:42:09 +00:00
output := flag . String ( )
2013-09-09 18:51:46 +00:00
if output != test . expected {
2016-05-02 17:05:21 +00:00
t . Errorf ( "%q does not match %q" , output , test . expected )
2013-09-09 18:51:46 +00:00
}
}
2013-11-01 14:31:37 +00:00
}
2013-11-18 23:35:23 +00:00
2014-07-11 22:13:10 +00:00
func TestFloat64FlagWithEnvVarHelpOutput ( t * testing . T ) {
2014-09-23 03:24:08 +00:00
os . Clearenv ( )
2014-07-11 22:13:10 +00:00
os . Setenv ( "APP_BAZ" , "99.4" )
for _ , test := range float64FlagTests {
2015-07-20 19:18:25 +00:00
flag := Float64Flag { Name : test . name , EnvVar : "APP_BAZ" }
2014-07-11 22:13:10 +00:00
output := flag . String ( )
2016-01-22 14:08:27 +00:00
expectedSuffix := " [$APP_BAZ]"
if runtime . GOOS == "windows" {
expectedSuffix = " [%APP_BAZ%]"
}
if ! strings . HasSuffix ( output , expectedSuffix ) {
2016-04-25 22:10:10 +00:00
t . Errorf ( "%s does not end with" + expectedSuffix , output )
2014-07-11 22:13:10 +00:00
}
}
}
var genericFlagTests = [ ] struct {
name string
2015-07-20 19:18:25 +00:00
value Generic
2014-07-11 22:13:10 +00:00
expected string
} {
2016-05-02 23:42:08 +00:00
{ "toads" , & Parser { "abc" , "def" } , "--toads value\ttest flag (default: abc,def)" } ,
{ "t" , & Parser { "abc" , "def" } , "-t value\ttest flag (default: abc,def)" } ,
2014-07-11 22:13:10 +00:00
}
func TestGenericFlagHelpOutput ( t * testing . T ) {
for _ , test := range genericFlagTests {
2015-07-20 19:18:25 +00:00
flag := GenericFlag { Name : test . name , Value : test . value , Usage : "test flag" }
2014-07-11 22:13:10 +00:00
output := flag . String ( )
if output != test . expected {
t . Errorf ( "%q does not match %q" , output , test . expected )
}
}
}
func TestGenericFlagWithEnvVarHelpOutput ( t * testing . T ) {
2014-09-23 03:24:08 +00:00
os . Clearenv ( )
2014-07-11 22:13:10 +00:00
os . Setenv ( "APP_ZAP" , "3" )
for _ , test := range genericFlagTests {
2015-07-20 19:18:25 +00:00
flag := GenericFlag { Name : test . name , EnvVar : "APP_ZAP" }
2014-07-11 22:13:10 +00:00
output := flag . String ( )
2016-01-22 14:08:27 +00:00
expectedSuffix := " [$APP_ZAP]"
if runtime . GOOS == "windows" {
expectedSuffix = " [%APP_ZAP%]"
}
if ! strings . HasSuffix ( output , expectedSuffix ) {
2016-04-25 22:10:10 +00:00
t . Errorf ( "%s does not end with" + expectedSuffix , output )
2014-07-11 22:13:10 +00:00
}
}
}
2013-11-18 23:35:23 +00:00
func TestParseMultiString ( t * testing . T ) {
2015-07-20 19:18:25 +00:00
( & App {
Flags : [ ] Flag {
StringFlag { Name : "serve, s" } ,
2013-11-18 23:35:23 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2013-11-18 23:35:23 +00:00
if ctx . String ( "serve" ) != "10" {
t . Errorf ( "main name not set" )
}
if ctx . String ( "s" ) != "10" {
t . Errorf ( "short name not set" )
}
2016-04-27 13:12:34 +00:00
return nil
2013-11-18 23:35:23 +00:00
} ,
} ) . Run ( [ ] string { "run" , "-s" , "10" } )
}
2015-11-14 21:39:38 +00:00
func TestParseDestinationString ( t * testing . T ) {
var dest string
a := App {
Flags : [ ] Flag {
StringFlag {
Name : "dest" ,
Destination : & dest ,
} ,
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2015-11-14 21:39:38 +00:00
if dest != "10" {
t . Errorf ( "expected destination String 10" )
}
2016-04-27 13:12:34 +00:00
return nil
2015-11-14 21:39:38 +00:00
} ,
}
a . Run ( [ ] string { "run" , "--dest" , "10" } )
}
2014-07-11 22:13:10 +00:00
func TestParseMultiStringFromEnv ( t * testing . T ) {
2014-09-23 03:24:08 +00:00
os . Clearenv ( )
2014-07-11 22:13:10 +00:00
os . Setenv ( "APP_COUNT" , "20" )
2015-07-20 19:18:25 +00:00
( & App {
Flags : [ ] Flag {
StringFlag { Name : "count, c" , EnvVar : "APP_COUNT" } ,
2014-07-11 22:13:10 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-07-11 22:13:10 +00:00
if ctx . String ( "count" ) != "20" {
t . Errorf ( "main name not set" )
}
if ctx . String ( "c" ) != "20" {
t . Errorf ( "short name not set" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-07-11 22:13:10 +00:00
} ,
} ) . Run ( [ ] string { "run" } )
}
2014-09-23 03:24:08 +00:00
func TestParseMultiStringFromEnvCascade ( t * testing . T ) {
os . Clearenv ( )
os . Setenv ( "APP_COUNT" , "20" )
2015-07-20 19:18:25 +00:00
( & App {
Flags : [ ] Flag {
StringFlag { Name : "count, c" , EnvVar : "COMPAT_COUNT,APP_COUNT" } ,
2014-09-23 03:24:08 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-09-23 03:24:08 +00:00
if ctx . String ( "count" ) != "20" {
t . Errorf ( "main name not set" )
}
if ctx . String ( "c" ) != "20" {
t . Errorf ( "short name not set" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-09-23 03:24:08 +00:00
} ,
} ) . Run ( [ ] string { "run" } )
}
2014-03-19 02:26:57 +00:00
func TestParseMultiStringSlice ( t * testing . T ) {
2015-07-20 19:18:25 +00:00
( & App {
Flags : [ ] Flag {
StringSliceFlag { Name : "serve, s" , Value : & StringSlice { } } ,
2014-03-19 02:26:57 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-03-19 02:26:57 +00:00
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" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-03-19 02:26:57 +00:00
} ,
} ) . Run ( [ ] string { "run" , "-s" , "10" , "-s" , "20" } )
}
2014-07-11 22:13:10 +00:00
func TestParseMultiStringSliceFromEnv ( t * testing . T ) {
2014-09-23 03:24:08 +00:00
os . Clearenv ( )
2014-07-11 22:13:10 +00:00
os . Setenv ( "APP_INTERVALS" , "20,30,40" )
2015-07-20 19:18:25 +00:00
( & App {
Flags : [ ] Flag {
StringSliceFlag { Name : "intervals, i" , Value : & StringSlice { } , EnvVar : "APP_INTERVALS" } ,
2014-07-11 22:13:10 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-07-11 22:13:10 +00:00
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" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-07-11 22:13:10 +00:00
} ,
} ) . Run ( [ ] string { "run" } )
}
2014-09-23 03:24:08 +00:00
func TestParseMultiStringSliceFromEnvCascade ( t * testing . T ) {
os . Clearenv ( )
os . Setenv ( "APP_INTERVALS" , "20,30,40" )
2015-07-20 19:18:25 +00:00
( & App {
Flags : [ ] Flag {
StringSliceFlag { Name : "intervals, i" , Value : & StringSlice { } , EnvVar : "COMPAT_INTERVALS,APP_INTERVALS" } ,
2014-09-23 03:24:08 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-09-23 03:24:08 +00:00
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" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-09-23 03:24:08 +00:00
} ,
} ) . Run ( [ ] string { "run" } )
}
2013-11-18 23:35:23 +00:00
func TestParseMultiInt ( t * testing . T ) {
2015-07-20 19:18:25 +00:00
a := App {
Flags : [ ] Flag {
IntFlag { Name : "serve, s" } ,
2013-11-18 23:35:23 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2013-11-18 23:35:23 +00:00
if ctx . Int ( "serve" ) != 10 {
t . Errorf ( "main name not set" )
}
if ctx . Int ( "s" ) != 10 {
t . Errorf ( "short name not set" )
}
2016-04-27 13:12:34 +00:00
return nil
2013-11-18 23:35:23 +00:00
} ,
}
2013-11-20 08:05:18 +00:00
a . Run ( [ ] string { "run" , "-s" , "10" } )
2013-11-18 23:35:23 +00:00
}
2013-11-18 23:37:59 +00:00
2015-11-14 21:39:38 +00:00
func TestParseDestinationInt ( t * testing . T ) {
var dest int
a := App {
Flags : [ ] Flag {
IntFlag {
Name : "dest" ,
Destination : & dest ,
} ,
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2015-11-14 21:39:38 +00:00
if dest != 10 {
t . Errorf ( "expected destination Int 10" )
}
2016-04-27 13:12:34 +00:00
return nil
2015-11-14 21:39:38 +00:00
} ,
}
a . Run ( [ ] string { "run" , "--dest" , "10" } )
}
2014-07-11 22:13:10 +00:00
func TestParseMultiIntFromEnv ( t * testing . T ) {
2014-09-23 03:24:08 +00:00
os . Clearenv ( )
2014-07-11 22:13:10 +00:00
os . Setenv ( "APP_TIMEOUT_SECONDS" , "10" )
2015-07-20 19:18:25 +00:00
a := App {
Flags : [ ] Flag {
IntFlag { Name : "timeout, t" , EnvVar : "APP_TIMEOUT_SECONDS" } ,
2014-07-11 22:13:10 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-07-11 22:13:10 +00:00
if ctx . Int ( "timeout" ) != 10 {
t . Errorf ( "main name not set" )
}
if ctx . Int ( "t" ) != 10 {
t . Errorf ( "short name not set" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-07-11 22:13:10 +00:00
} ,
}
a . Run ( [ ] string { "run" } )
}
2014-09-23 03:24:08 +00:00
func TestParseMultiIntFromEnvCascade ( t * testing . T ) {
os . Clearenv ( )
os . Setenv ( "APP_TIMEOUT_SECONDS" , "10" )
2015-07-20 19:18:25 +00:00
a := App {
Flags : [ ] Flag {
IntFlag { Name : "timeout, t" , EnvVar : "COMPAT_TIMEOUT_SECONDS,APP_TIMEOUT_SECONDS" } ,
2014-09-23 03:24:08 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-09-23 03:24:08 +00:00
if ctx . Int ( "timeout" ) != 10 {
t . Errorf ( "main name not set" )
}
if ctx . Int ( "t" ) != 10 {
t . Errorf ( "short name not set" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-09-23 03:24:08 +00:00
} ,
}
a . Run ( [ ] string { "run" } )
}
2014-07-11 22:13:10 +00:00
func TestParseMultiIntSlice ( t * testing . T ) {
2015-07-20 19:18:25 +00:00
( & App {
Flags : [ ] Flag {
IntSliceFlag { Name : "serve, s" , Value : & IntSlice { } } ,
2014-07-11 22:13:10 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-07-11 22:13:10 +00:00
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" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-07-11 22:13:10 +00:00
} ,
} ) . Run ( [ ] string { "run" , "-s" , "10" , "-s" , "20" } )
}
func TestParseMultiIntSliceFromEnv ( t * testing . T ) {
2014-09-23 03:24:08 +00:00
os . Clearenv ( )
2014-07-11 22:13:10 +00:00
os . Setenv ( "APP_INTERVALS" , "20,30,40" )
2015-07-20 19:18:25 +00:00
( & App {
Flags : [ ] Flag {
IntSliceFlag { Name : "intervals, i" , Value : & IntSlice { } , EnvVar : "APP_INTERVALS" } ,
2014-07-11 22:13:10 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-07-11 22:13:10 +00:00
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" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-07-11 22:13:10 +00:00
} ,
} ) . Run ( [ ] string { "run" } )
}
2014-09-23 03:24:08 +00:00
func TestParseMultiIntSliceFromEnvCascade ( t * testing . T ) {
os . Clearenv ( )
os . Setenv ( "APP_INTERVALS" , "20,30,40" )
2015-07-20 19:18:25 +00:00
( & App {
Flags : [ ] Flag {
IntSliceFlag { Name : "intervals, i" , Value : & IntSlice { } , EnvVar : "COMPAT_INTERVALS,APP_INTERVALS" } ,
2014-09-23 03:24:08 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-09-23 03:24:08 +00:00
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" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-09-23 03:24:08 +00:00
} ,
} ) . Run ( [ ] string { "run" } )
}
2016-06-12 04:54:33 +00:00
func TestParseMultiInt64Slice ( t * testing . T ) {
( & App {
Flags : [ ] Flag {
Int64SliceFlag { Name : "serve, s" , Value : & Int64Slice { } } ,
} ,
Action : func ( ctx * Context ) error {
if ! reflect . DeepEqual ( ctx . Int64Slice ( "serve" ) , [ ] int64 { 10 , 17179869184 } ) {
t . Errorf ( "main name not set" )
}
if ! reflect . DeepEqual ( ctx . Int64Slice ( "s" ) , [ ] int64 { 10 , 17179869184 } ) {
t . Errorf ( "short name not set" )
}
return nil
} ,
} ) . Run ( [ ] string { "run" , "-s" , "10" , "-s" , "17179869184" } )
}
func TestParseMultiInt64SliceFromEnv ( t * testing . T ) {
os . Clearenv ( )
os . Setenv ( "APP_INTERVALS" , "20,30,17179869184" )
( & App {
Flags : [ ] Flag {
Int64SliceFlag { Name : "intervals, i" , Value : & Int64Slice { } , EnvVar : "APP_INTERVALS" } ,
} ,
Action : func ( ctx * Context ) error {
if ! reflect . DeepEqual ( ctx . Int64Slice ( "intervals" ) , [ ] int64 { 20 , 30 , 17179869184 } ) {
t . Errorf ( "main name not set from env" )
}
if ! reflect . DeepEqual ( ctx . Int64Slice ( "i" ) , [ ] int64 { 20 , 30 , 17179869184 } ) {
t . Errorf ( "short name not set from env" )
}
return nil
} ,
} ) . Run ( [ ] string { "run" } )
}
func TestParseMultiInt64SliceFromEnvCascade ( t * testing . T ) {
os . Clearenv ( )
os . Setenv ( "APP_INTERVALS" , "20,30,17179869184" )
( & App {
Flags : [ ] Flag {
Int64SliceFlag { Name : "intervals, i" , Value : & Int64Slice { } , EnvVar : "COMPAT_INTERVALS,APP_INTERVALS" } ,
} ,
Action : func ( ctx * Context ) error {
if ! reflect . DeepEqual ( ctx . Int64Slice ( "intervals" ) , [ ] int64 { 20 , 30 , 17179869184 } ) {
t . Errorf ( "main name not set from env" )
}
if ! reflect . DeepEqual ( ctx . Int64Slice ( "i" ) , [ ] int64 { 20 , 30 , 17179869184 } ) {
t . Errorf ( "short name not set from env" )
}
return nil
} ,
} ) . Run ( [ ] string { "run" } )
}
2014-07-11 22:13:10 +00:00
func TestParseMultiFloat64 ( t * testing . T ) {
2015-07-20 19:18:25 +00:00
a := App {
Flags : [ ] Flag {
Float64Flag { Name : "serve, s" } ,
2014-07-11 22:13:10 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-07-11 22:13:10 +00:00
if ctx . Float64 ( "serve" ) != 10.2 {
t . Errorf ( "main name not set" )
}
if ctx . Float64 ( "s" ) != 10.2 {
t . Errorf ( "short name not set" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-07-11 22:13:10 +00:00
} ,
}
a . Run ( [ ] string { "run" , "-s" , "10.2" } )
}
2015-11-14 21:39:38 +00:00
func TestParseDestinationFloat64 ( t * testing . T ) {
var dest float64
a := App {
Flags : [ ] Flag {
Float64Flag {
Name : "dest" ,
Destination : & dest ,
} ,
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2015-11-14 21:39:38 +00:00
if dest != 10.2 {
t . Errorf ( "expected destination Float64 10.2" )
}
2016-04-27 13:12:34 +00:00
return nil
2015-11-14 21:39:38 +00:00
} ,
}
a . Run ( [ ] string { "run" , "--dest" , "10.2" } )
}
2014-07-11 22:13:10 +00:00
func TestParseMultiFloat64FromEnv ( t * testing . T ) {
2014-09-23 03:24:08 +00:00
os . Clearenv ( )
2014-07-11 22:13:10 +00:00
os . Setenv ( "APP_TIMEOUT_SECONDS" , "15.5" )
2015-07-20 19:18:25 +00:00
a := App {
Flags : [ ] Flag {
Float64Flag { Name : "timeout, t" , EnvVar : "APP_TIMEOUT_SECONDS" } ,
2014-07-11 22:13:10 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-07-11 22:13:10 +00:00
if ctx . Float64 ( "timeout" ) != 15.5 {
t . Errorf ( "main name not set" )
}
if ctx . Float64 ( "t" ) != 15.5 {
t . Errorf ( "short name not set" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-07-11 22:13:10 +00:00
} ,
}
a . Run ( [ ] string { "run" } )
}
2014-09-23 03:24:08 +00:00
func TestParseMultiFloat64FromEnvCascade ( t * testing . T ) {
os . Clearenv ( )
os . Setenv ( "APP_TIMEOUT_SECONDS" , "15.5" )
2015-07-20 19:18:25 +00:00
a := App {
Flags : [ ] Flag {
Float64Flag { Name : "timeout, t" , EnvVar : "COMPAT_TIMEOUT_SECONDS,APP_TIMEOUT_SECONDS" } ,
2014-09-23 03:24:08 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-09-23 03:24:08 +00:00
if ctx . Float64 ( "timeout" ) != 15.5 {
t . Errorf ( "main name not set" )
}
if ctx . Float64 ( "t" ) != 15.5 {
t . Errorf ( "short name not set" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-09-23 03:24:08 +00:00
} ,
}
a . Run ( [ ] string { "run" } )
}
2013-11-18 23:35:23 +00:00
func TestParseMultiBool ( t * testing . T ) {
2015-07-20 19:18:25 +00:00
a := App {
Flags : [ ] Flag {
BoolFlag { Name : "serve, s" } ,
2013-11-18 23:35:23 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2013-11-18 23:35:23 +00:00
if ctx . Bool ( "serve" ) != true {
t . Errorf ( "main name not set" )
}
if ctx . Bool ( "s" ) != true {
t . Errorf ( "short name not set" )
}
2016-04-27 13:12:34 +00:00
return nil
2013-11-18 23:35:23 +00:00
} ,
}
a . Run ( [ ] string { "run" , "--serve" } )
}
2014-04-15 14:16:47 +00:00
2017-11-13 21:28:23 +00:00
func TestParseBoolShortOptionHandle ( t * testing . T ) {
a := App {
Commands : [ ] Command {
{
2019-07-12 03:22:16 +00:00
Name : "foobar" ,
2017-11-13 21:28:23 +00:00
UseShortOptionHandling : true ,
Action : func ( ctx * Context ) error {
if ctx . Bool ( "serve" ) != true {
t . Errorf ( "main name not set" )
}
if ctx . Bool ( "option" ) != true {
t . Errorf ( "short name not set" )
}
return nil
} ,
Flags : [ ] Flag {
BoolFlag { Name : "serve, s" } ,
BoolFlag { Name : "option, o" } ,
} ,
} ,
} ,
}
a . Run ( [ ] string { "run" , "foobar" , "-so" } )
}
2015-11-14 21:39:38 +00:00
func TestParseDestinationBool ( t * testing . T ) {
var dest bool
a := App {
Flags : [ ] Flag {
BoolFlag {
Name : "dest" ,
Destination : & dest ,
} ,
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2015-11-14 21:39:38 +00:00
if dest != true {
t . Errorf ( "expected destination Bool true" )
}
2016-04-27 13:12:34 +00:00
return nil
2015-11-14 21:39:38 +00:00
} ,
}
a . Run ( [ ] string { "run" , "--dest" } )
}
2014-07-11 22:13:10 +00:00
func TestParseMultiBoolFromEnv ( t * testing . T ) {
2014-09-23 03:24:08 +00:00
os . Clearenv ( )
2014-07-11 22:13:10 +00:00
os . Setenv ( "APP_DEBUG" , "1" )
2015-07-20 19:18:25 +00:00
a := App {
Flags : [ ] Flag {
BoolFlag { Name : "debug, d" , EnvVar : "APP_DEBUG" } ,
2014-07-11 22:13:10 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-07-11 22:13:10 +00:00
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" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-07-11 22:13:10 +00:00
} ,
}
a . Run ( [ ] string { "run" } )
}
2014-09-23 03:24:08 +00:00
func TestParseMultiBoolFromEnvCascade ( t * testing . T ) {
os . Clearenv ( )
os . Setenv ( "APP_DEBUG" , "1" )
2015-07-20 19:18:25 +00:00
a := App {
Flags : [ ] Flag {
BoolFlag { Name : "debug, d" , EnvVar : "COMPAT_DEBUG,APP_DEBUG" } ,
2014-09-23 03:24:08 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-09-23 03:24:08 +00:00
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" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-09-23 03:24:08 +00:00
} ,
}
a . Run ( [ ] string { "run" } )
}
2016-09-12 03:32:43 +00:00
func TestParseBoolTFromEnv ( t * testing . T ) {
var boolTFlagTests = [ ] struct {
input string
output bool
} {
{ "" , false } ,
{ "1" , true } ,
{ "false" , false } ,
{ "true" , true } ,
}
for _ , test := range boolTFlagTests {
os . Clearenv ( )
os . Setenv ( "DEBUG" , test . input )
a := App {
Flags : [ ] Flag {
BoolTFlag { Name : "debug, d" , EnvVar : "DEBUG" } ,
} ,
Action : func ( ctx * Context ) error {
if ctx . Bool ( "debug" ) != test . output {
t . Errorf ( "expected %+v to be parsed as %+v, instead was %+v" , test . input , test . output , ctx . Bool ( "debug" ) )
}
if ctx . Bool ( "d" ) != test . output {
t . Errorf ( "expected %+v to be parsed as %+v, instead was %+v" , test . input , test . output , ctx . Bool ( "d" ) )
}
return nil
} ,
}
a . Run ( [ ] string { "run" } )
}
}
2014-07-11 22:13:10 +00:00
func TestParseMultiBoolT ( t * testing . T ) {
2015-07-20 19:18:25 +00:00
a := App {
Flags : [ ] Flag {
BoolTFlag { Name : "serve, s" } ,
2014-07-11 22:13:10 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-07-11 22:13:10 +00:00
if ctx . BoolT ( "serve" ) != true {
t . Errorf ( "main name not set" )
}
if ctx . BoolT ( "s" ) != true {
t . Errorf ( "short name not set" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-07-11 22:13:10 +00:00
} ,
}
a . Run ( [ ] string { "run" , "--serve" } )
}
2015-11-14 21:39:38 +00:00
func TestParseDestinationBoolT ( t * testing . T ) {
var dest bool
a := App {
Flags : [ ] Flag {
BoolTFlag {
Name : "dest" ,
Destination : & dest ,
} ,
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2015-11-14 21:39:38 +00:00
if dest != true {
t . Errorf ( "expected destination BoolT true" )
}
2016-04-27 13:12:34 +00:00
return nil
2015-11-14 21:39:38 +00:00
} ,
}
a . Run ( [ ] string { "run" , "--dest" } )
}
2014-07-11 22:13:10 +00:00
func TestParseMultiBoolTFromEnv ( t * testing . T ) {
2014-09-23 03:24:08 +00:00
os . Clearenv ( )
2014-07-11 22:13:10 +00:00
os . Setenv ( "APP_DEBUG" , "0" )
2015-07-20 19:18:25 +00:00
a := App {
Flags : [ ] Flag {
BoolTFlag { Name : "debug, d" , EnvVar : "APP_DEBUG" } ,
2014-07-11 22:13:10 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-07-11 22:13:10 +00:00
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" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-07-11 22:13:10 +00:00
} ,
}
a . Run ( [ ] string { "run" } )
}
2014-09-23 03:24:08 +00:00
func TestParseMultiBoolTFromEnvCascade ( t * testing . T ) {
os . Clearenv ( )
os . Setenv ( "APP_DEBUG" , "0" )
2015-07-20 19:18:25 +00:00
a := App {
Flags : [ ] Flag {
BoolTFlag { Name : "debug, d" , EnvVar : "COMPAT_DEBUG,APP_DEBUG" } ,
2014-09-23 03:24:08 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-09-23 03:24:08 +00:00
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" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-09-23 03:24:08 +00:00
} ,
}
a . Run ( [ ] string { "run" } )
}
2014-04-15 14:16:47 +00:00
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 ] )
}
2016-09-17 23:54:29 +00:00
func ( p * Parser ) Get ( ) interface { } {
return p
}
2014-04-15 14:16:47 +00:00
func TestParseGeneric ( t * testing . T ) {
2015-07-20 19:18:25 +00:00
a := App {
Flags : [ ] Flag {
GenericFlag { Name : "serve, s" , Value : & Parser { } } ,
2014-04-15 14:16:47 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-04-15 14:16:47 +00:00
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" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-04-15 14:16:47 +00:00
} ,
}
a . Run ( [ ] string { "run" , "-s" , "10,20" } )
}
2014-07-11 22:13:10 +00:00
func TestParseGenericFromEnv ( t * testing . T ) {
2014-09-23 03:24:08 +00:00
os . Clearenv ( )
2014-07-11 22:13:10 +00:00
os . Setenv ( "APP_SERVE" , "20,30" )
2015-07-20 19:18:25 +00:00
a := App {
Flags : [ ] Flag {
GenericFlag { Name : "serve, s" , Value : & Parser { } , EnvVar : "APP_SERVE" } ,
2014-07-11 22:13:10 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-07-11 22:13:10 +00:00
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" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-07-11 22:13:10 +00:00
} ,
}
a . Run ( [ ] string { "run" } )
}
2014-09-23 03:24:08 +00:00
func TestParseGenericFromEnvCascade ( t * testing . T ) {
os . Clearenv ( )
os . Setenv ( "APP_FOO" , "99,2000" )
2015-07-20 19:18:25 +00:00
a := App {
Flags : [ ] Flag {
GenericFlag { Name : "foos" , Value : & Parser { } , EnvVar : "COMPAT_FOO,APP_FOO" } ,
2014-09-23 03:24:08 +00:00
} ,
2016-04-27 13:12:34 +00:00
Action : func ( ctx * Context ) error {
2014-09-23 03:24:08 +00:00
if ! reflect . DeepEqual ( ctx . Generic ( "foos" ) , & Parser { "99" , "2000" } ) {
t . Errorf ( "value not set from env" )
}
2016-04-27 13:12:34 +00:00
return nil
2014-09-23 03:24:08 +00:00
} ,
}
a . Run ( [ ] string { "run" } )
}
2017-03-31 07:24:15 +00:00
2017-04-01 03:37:06 +00:00
func TestFlagFromFile ( t * testing . T ) {
os . Clearenv ( )
os . Setenv ( "APP_FOO" , "123" )
temp , err := ioutil . TempFile ( "" , "urfave_cli_test" )
if err != nil {
t . Error ( err )
return
}
io . WriteString ( temp , "abc" )
temp . Close ( )
defer func ( ) {
os . Remove ( temp . Name ( ) )
} ( )
var filePathTests = [ ] struct {
path string
name string
expected string
} {
{ "file-does-not-exist" , "APP_BAR" , "" } ,
{ "file-does-not-exist" , "APP_FOO" , "123" } ,
{ "file-does-not-exist" , "APP_FOO,APP_BAR" , "123" } ,
2017-10-26 18:08:03 +00:00
{ temp . Name ( ) , "APP_FOO" , "123" } ,
2017-04-01 03:37:06 +00:00
{ temp . Name ( ) , "APP_BAR" , "abc" } ,
}
for _ , filePathTest := range filePathTests {
got , _ := flagFromFileEnv ( filePathTest . path , filePathTest . name )
if want := filePathTest . expected ; got != want {
t . Errorf ( "Did not expect %v - Want %v" , got , want )
}
}
}