@ -122,12 +122,24 @@ func TestFlagsFromEnv(t *testing.T) {
return * s
}
newSetUintSlice := func ( defaults ... uint ) UintSlice {
s := NewUintSlice ( defaults ... )
s . hasBeenSet = false
return * s
}
newSetInt64Slice := func ( defaults ... int64 ) Int64Slice {
s := NewInt64Slice ( defaults ... )
s . hasBeenSet = false
return * s
}
newSetUint64Slice := func ( defaults ... uint64 ) Uint64Slice {
s := NewUint64Slice ( defaults ... )
s . hasBeenSet = false
return * s
}
newSetStringSlice := func ( defaults ... string ) StringSlice {
s := NewStringSlice ( defaults ... )
s . hasBeenSet = false
@ -171,10 +183,18 @@ func TestFlagsFromEnv(t *testing.T) {
{ "1.2,2" , newSetIntSlice ( ) , & IntSliceFlag { Name : "seconds" , EnvVars : [ ] string { "SECONDS" } } , ` could not parse "1.2,2" as int slice value from environment variable "SECONDS" for flag seconds: .* ` } ,
{ "foobar" , newSetIntSlice ( ) , & IntSliceFlag { Name : "seconds" , EnvVars : [ ] string { "SECONDS" } } , ` could not parse "foobar" as int slice value from environment variable "SECONDS" for flag seconds: .* ` } ,
{ "1,2" , newSetUintSlice ( 1 , 2 ) , & UintSliceFlag { Name : "seconds" , EnvVars : [ ] string { "SECONDS" } } , "" } ,
{ "1.2,2" , newSetUintSlice ( ) , & UintSliceFlag { Name : "seconds" , EnvVars : [ ] string { "SECONDS" } } , ` could not parse "1.2,2" as uint slice value from environment variable "SECONDS" for flag seconds: .* ` } ,
{ "foobar" , newSetUintSlice ( ) , & UintSliceFlag { Name : "seconds" , EnvVars : [ ] string { "SECONDS" } } , ` could not parse "foobar" as uint slice value from environment variable "SECONDS" for flag seconds: .* ` } ,
{ "1,2" , newSetInt64Slice ( 1 , 2 ) , & Int64SliceFlag { Name : "seconds" , EnvVars : [ ] string { "SECONDS" } } , "" } ,
{ "1.2,2" , newSetInt64Slice ( ) , & Int64SliceFlag { Name : "seconds" , EnvVars : [ ] string { "SECONDS" } } , ` could not parse "1.2,2" as int64 slice value from environment variable "SECONDS" for flag seconds: .* ` } ,
{ "foobar" , newSetInt64Slice ( ) , & Int64SliceFlag { Name : "seconds" , EnvVars : [ ] string { "SECONDS" } } , ` could not parse "foobar" as int64 slice value from environment variable "SECONDS" for flag seconds: .* ` } ,
{ "1,2" , newSetUint64Slice ( 1 , 2 ) , & Uint64SliceFlag { Name : "seconds" , EnvVars : [ ] string { "SECONDS" } } , "" } ,
{ "1.2,2" , newSetUint64Slice ( ) , & Uint64SliceFlag { Name : "seconds" , EnvVars : [ ] string { "SECONDS" } } , ` could not parse "1.2,2" as uint64 slice value from environment variable "SECONDS" for flag seconds: .* ` } ,
{ "foobar" , newSetUint64Slice ( ) , & Uint64SliceFlag { Name : "seconds" , EnvVars : [ ] string { "SECONDS" } } , ` could not parse "foobar" as uint64 slice value from environment variable "SECONDS" for flag seconds: .* ` } ,
{ "foo" , "foo" , & StringFlag { Name : "name" , EnvVars : [ ] string { "NAME" } } , "" } ,
{ "path" , "path" , & PathFlag { Name : "path" , EnvVars : [ ] string { "PATH" } } , "" } ,
@ -324,6 +344,16 @@ func TestFlagStringifying(t *testing.T) {
fl : & IntFlag { Name : "pens" , DefaultText : "-19" } ,
expected : "--pens value\t(default: -19)" ,
} ,
{
name : "uint-slice-flag" ,
fl : & UintSliceFlag { Name : "pencils" } ,
expected : "--pencils value\t" ,
} ,
{
name : "uint-slice-flag-with-default-text" ,
fl : & UintFlag { Name : "pens" , DefaultText : "29" } ,
expected : "--pens value\t(default: 29)" ,
} ,
{
name : "int64-flag" ,
fl : & Int64Flag { Name : "flume" } ,
@ -344,6 +374,16 @@ func TestFlagStringifying(t *testing.T) {
fl : & Int64SliceFlag { Name : "handles" , DefaultText : "-2" } ,
expected : "--handles value\t(default: -2)" ,
} ,
{
name : "uint64-slice-flag" ,
fl : & Uint64SliceFlag { Name : "drawers" } ,
expected : "--drawers value\t" ,
} ,
{
name : "uint64-slice-flag-with-default-text" ,
fl : & Uint64SliceFlag { Name : "handles" , DefaultText : "-2" } ,
expected : "--handles value\t(default: -2)" ,
} ,
{
name : "path-flag" ,
fl : & PathFlag { Name : "soup" } ,
@ -1169,6 +1209,198 @@ func TestInt64SliceFlagValueFromContext(t *testing.T) {
expect ( t , f . Get ( ctx ) , [ ] int64 { 1 , 2 , 3 } )
}
var uintSliceFlagTests = [ ] struct {
name string
aliases [ ] string
value * UintSlice
expected string
} {
{ "heads" , nil , NewUintSlice ( ) , "--heads value\t(accepts multiple inputs)" } ,
{ "H" , nil , NewUintSlice ( ) , "-H value\t(accepts multiple inputs)" } ,
{ "heads" , [ ] string { "H" } , NewUintSlice ( uint ( 2 ) , uint ( 17179869184 ) ) ,
"--heads value, -H value\t(default: 2, 17179869184)\t(accepts multiple inputs)" } ,
}
func TestUintSliceFlagHelpOutput ( t * testing . T ) {
for _ , test := range uintSliceFlagTests {
fl := UintSliceFlag { Name : test . name , Aliases : test . aliases , Value : test . value }
output := fl . String ( )
if output != test . expected {
t . Errorf ( "%q does not match %q" , output , test . expected )
}
}
}
func TestUintSliceFlagWithEnvVarHelpOutput ( t * testing . T ) {
defer resetEnv ( os . Environ ( ) )
os . Clearenv ( )
_ = os . Setenv ( "APP_SMURF" , "42,17179869184" )
for _ , test := range uintSliceFlagTests {
fl := UintSliceFlag { Name : test . name , Value : test . value , EnvVars : [ ] string { "APP_SMURF" } }
output := fl . 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 )
}
}
}
func TestUintSliceFlagApply_ParentContext ( t * testing . T ) {
_ = ( & App {
Flags : [ ] Flag {
& UintSliceFlag { Name : "numbers" , Aliases : [ ] string { "n" } , Value : NewUintSlice ( 1 , 2 , 3 ) } ,
} ,
Commands : [ ] * Command {
{
Name : "child" ,
Action : func ( ctx * Context ) error {
expected := [ ] uint { 1 , 2 , 3 }
if ! reflect . DeepEqual ( ctx . UintSlice ( "numbers" ) , expected ) {
t . Errorf ( "child context unable to view parent flag: %v != %v" , expected , ctx . UintSlice ( "numbers" ) )
}
if ! reflect . DeepEqual ( ctx . UintSlice ( "n" ) , expected ) {
t . Errorf ( "child context unable to view parent flag: %v != %v" , expected , ctx . UintSlice ( "n" ) )
}
return nil
} ,
} ,
} ,
} ) . Run ( [ ] string { "run" , "child" } )
}
func TestUintSliceFlag_SetFromParentContext ( t * testing . T ) {
fl := & UintSliceFlag { Name : "numbers" , Aliases : [ ] string { "n" } , Value : NewUintSlice ( 1 , 2 , 3 , 4 ) }
set := flag . NewFlagSet ( "test" , 0 )
_ = fl . Apply ( set )
ctx := & Context {
parentContext : & Context {
flagSet : set ,
} ,
flagSet : flag . NewFlagSet ( "empty" , 0 ) ,
}
expected := [ ] uint { 1 , 2 , 3 , 4 }
if ! reflect . DeepEqual ( ctx . UintSlice ( "numbers" ) , expected ) {
t . Errorf ( "child context unable to view parent flag: %v != %v" , expected , ctx . UintSlice ( "numbers" ) )
}
}
func TestUintSliceFlag_ReturnNil ( t * testing . T ) {
fl := & UintSliceFlag { }
set := flag . NewFlagSet ( "test" , 0 )
_ = fl . Apply ( set )
ctx := & Context {
parentContext : & Context {
flagSet : set ,
} ,
flagSet : flag . NewFlagSet ( "empty" , 0 ) ,
}
expected := [ ] uint ( nil )
if ! reflect . DeepEqual ( ctx . UintSlice ( "numbers" ) , expected ) {
t . Errorf ( "child context unable to view parent flag: %v != %v" , expected , ctx . UintSlice ( "numbers" ) )
}
}
var uint64SliceFlagTests = [ ] struct {
name string
aliases [ ] string
value * Uint64Slice
expected string
} {
{ "heads" , nil , NewUint64Slice ( ) , "--heads value\t(accepts multiple inputs)" } ,
{ "H" , nil , NewUint64Slice ( ) , "-H value\t(accepts multiple inputs)" } ,
{ "heads" , [ ] string { "H" } , NewUint64Slice ( uint64 ( 2 ) , uint64 ( 17179869184 ) ) ,
"--heads value, -H value\t(default: 2, 17179869184)\t(accepts multiple inputs)" } ,
}
func TestUint64SliceFlagHelpOutput ( t * testing . T ) {
for _ , test := range uint64SliceFlagTests {
fl := Uint64SliceFlag { Name : test . name , Aliases : test . aliases , Value : test . value }
output := fl . String ( )
if output != test . expected {
t . Errorf ( "%q does not match %q" , output , test . expected )
}
}
}
func TestUint64SliceFlagWithEnvVarHelpOutput ( t * testing . T ) {
defer resetEnv ( os . Environ ( ) )
os . Clearenv ( )
_ = os . Setenv ( "APP_SMURF" , "42,17179869184" )
for _ , test := range uint64SliceFlagTests {
fl := Uint64SliceFlag { Name : test . name , Value : test . value , EnvVars : [ ] string { "APP_SMURF" } }
output := fl . 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 )
}
}
}
func TestUint64SliceFlagApply_ParentContext ( t * testing . T ) {
_ = ( & App {
Flags : [ ] Flag {
& Uint64SliceFlag { Name : "numbers" , Aliases : [ ] string { "n" } , Value : NewUint64Slice ( 1 , 2 , 3 ) } ,
} ,
Commands : [ ] * Command {
{
Name : "child" ,
Action : func ( ctx * Context ) error {
expected := [ ] uint64 { 1 , 2 , 3 }
if ! reflect . DeepEqual ( ctx . Uint64Slice ( "numbers" ) , expected ) {
t . Errorf ( "child context unable to view parent flag: %v != %v" , expected , ctx . Uint64Slice ( "numbers" ) )
}
if ! reflect . DeepEqual ( ctx . Uint64Slice ( "n" ) , expected ) {
t . Errorf ( "child context unable to view parent flag: %v != %v" , expected , ctx . Uint64Slice ( "n" ) )
}
return nil
} ,
} ,
} ,
} ) . Run ( [ ] string { "run" , "child" } )
}
func TestUint64SliceFlag_SetFromParentContext ( t * testing . T ) {
fl := & Uint64SliceFlag { Name : "numbers" , Aliases : [ ] string { "n" } , Value : NewUint64Slice ( 1 , 2 , 3 , 4 ) }
set := flag . NewFlagSet ( "test" , 0 )
_ = fl . Apply ( set )
ctx := & Context {
parentContext : & Context {
flagSet : set ,
} ,
flagSet : flag . NewFlagSet ( "empty" , 0 ) ,
}
expected := [ ] uint64 { 1 , 2 , 3 , 4 }
if ! reflect . DeepEqual ( ctx . Uint64Slice ( "numbers" ) , expected ) {
t . Errorf ( "child context unable to view parent flag: %v != %v" , expected , ctx . Uint64Slice ( "numbers" ) )
}
}
func TestUint64SliceFlag_ReturnNil ( t * testing . T ) {
fl := & Uint64SliceFlag { }
set := flag . NewFlagSet ( "test" , 0 )
_ = fl . Apply ( set )
ctx := & Context {
parentContext : & Context {
flagSet : set ,
} ,
flagSet : flag . NewFlagSet ( "empty" , 0 ) ,
}
expected := [ ] uint64 ( nil )
if ! reflect . DeepEqual ( ctx . Uint64Slice ( "numbers" ) , expected ) {
t . Errorf ( "child context unable to view parent flag: %v != %v" , expected , ctx . Uint64Slice ( "numbers" ) )
}
}
var float64FlagTests = [ ] struct {
name string
expected string
@ -2458,29 +2690,41 @@ type flagDefaultTestCase struct {
func TestFlagDefaultValue ( t * testing . T ) {
cases := [ ] * flagDefaultTestCase {
{
name : "stringS c lice",
name : "stringS lice",
flag : & StringSliceFlag { Name : "flag" , Value : NewStringSlice ( "default1" , "default2" ) } ,
toParse : [ ] string { "--flag" , "parsed" } ,
expect : ` --flag value [ --flag value ] (default: "default1", "default2") ` ,
} ,
{
name : "float64S c lice",
name : "float64S lice",
flag : & Float64SliceFlag { Name : "flag" , Value : NewFloat64Slice ( 1.1 , 2.2 ) } ,
toParse : [ ] string { "--flag" , "13.3" } ,
expect : ` --flag value [ --flag value ] (default: 1.1, 2.2) ` ,
} ,
{
name : "int64S c lice",
name : "int64S lice",
flag : & Int64SliceFlag { Name : "flag" , Value : NewInt64Slice ( 1 , 2 ) } ,
toParse : [ ] string { "--flag" , "13" } ,
expect : ` --flag value [ --flag value ] (default: 1, 2) ` ,
} ,
{
name : "intS c lice",
name : "intS lice",
flag : & IntSliceFlag { Name : "flag" , Value : NewIntSlice ( 1 , 2 ) } ,
toParse : [ ] string { "--flag" , "13" } ,
expect : ` --flag value [ --flag value ] (default: 1, 2) ` ,
} ,
{
name : "uint64Slice" ,
flag : & Uint64SliceFlag { Name : "flag" , Value : NewUint64Slice ( 1 , 2 ) } ,
toParse : [ ] string { "--flag" , "13" } ,
expect : ` --flag value (default: 1, 2) (accepts multiple inputs) ` ,
} ,
{
name : "uintSlice" ,
flag : & UintSliceFlag { Name : "flag" , Value : NewUintSlice ( 1 , 2 ) } ,
toParse : [ ] string { "--flag" , "13" } ,
expect : ` --flag value (default: 1, 2) (accepts multiple inputs) ` ,
} ,
{
name : "string" ,
flag : & StringFlag { Name : "flag" , Value : "default" } ,
@ -2523,29 +2767,41 @@ type flagValueTestCase struct {
func TestFlagValue ( t * testing . T ) {
cases := [ ] * flagValueTestCase {
& flagValueTestCase {
name : "stringS c lice",
name : "stringS lice",
flag : & StringSliceFlag { Name : "flag" , Value : NewStringSlice ( "default1" , "default2" ) } ,
toParse : [ ] string { "--flag" , "parsed,parsed2" , "--flag" , "parsed3,parsed4" } ,
expect : ` [parsed parsed2 parsed3 parsed4] ` ,
} ,
& flagValueTestCase {
name : "float64S c lice",
name : "float64S lice",
flag : & Float64SliceFlag { Name : "flag" , Value : NewFloat64Slice ( 1.1 , 2.2 ) } ,
toParse : [ ] string { "--flag" , "13.3,14.4" , "--flag" , "15.5,16.6" } ,
expect : ` []float64 { 13.3, 14.4, 15.5, 16.6} ` ,
} ,
& flagValueTestCase {
name : "int64S c lice",
name : "int64S lice",
flag : & Int64SliceFlag { Name : "flag" , Value : NewInt64Slice ( 1 , 2 ) } ,
toParse : [ ] string { "--flag" , "13,14" , "--flag" , "15,16" } ,
expect : ` []int64 { 13, 14, 15, 16} ` ,
} ,
& flagValueTestCase {
name : "intS c lice",
name : "intS lice",
flag : & IntSliceFlag { Name : "flag" , Value : NewIntSlice ( 1 , 2 ) } ,
toParse : [ ] string { "--flag" , "13,14" , "--flag" , "15,16" } ,
expect : ` []int { 13, 14, 15, 16} ` ,
} ,
& flagValueTestCase {
name : "uint64Slice" ,
flag : & Uint64SliceFlag { Name : "flag" , Value : NewUint64Slice ( 1 , 2 ) } ,
toParse : [ ] string { "--flag" , "13,14" , "--flag" , "15,16" } ,
expect : ` []uint64 { 13, 14, 15, 16} ` ,
} ,
& flagValueTestCase {
name : "uintSlice" ,
flag : & UintSliceFlag { Name : "flag" , Value : NewUintSlice ( 1 , 2 ) } ,
toParse : [ ] string { "--flag" , "13,14" , "--flag" , "15,16" } ,
expect : ` []uint { 13, 14, 15, 16} ` ,
} ,
}
for i , v := range cases {
set := flag . NewFlagSet ( "test" , 0 )