Merge branch 'main' into feature/1316-simplified_flag_value_access
This commit is contained in:
105
flag_test.go
105
flag_test.go
@@ -411,7 +411,7 @@ func TestStringFlagWithEnvVarHelpOutput(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
var prefixStringFlagTests = []struct {
|
||||
var _ = []struct {
|
||||
name string
|
||||
aliases []string
|
||||
usage string
|
||||
@@ -517,7 +517,7 @@ func TestPathFlagValueFromContext(t *testing.T) {
|
||||
expect(t, f.Get(ctx), "/my/path")
|
||||
}
|
||||
|
||||
var envHintFlagTests = []struct {
|
||||
var _ = []struct {
|
||||
name string
|
||||
env string
|
||||
hinter FlagEnvHintFunc
|
||||
@@ -2298,43 +2298,43 @@ type flagDefaultTestCase struct {
|
||||
|
||||
func TestFlagDefaultValue(t *testing.T) {
|
||||
cases := []*flagDefaultTestCase{
|
||||
&flagDefaultTestCase{
|
||||
{
|
||||
name: "stringSclice",
|
||||
flag: &StringSliceFlag{Name: "flag", Value: NewStringSlice("default1", "default2")},
|
||||
toParse: []string{"--flag", "parsed"},
|
||||
expect: `--flag value (default: "default1", "default2") (accepts multiple inputs)`,
|
||||
},
|
||||
&flagDefaultTestCase{
|
||||
{
|
||||
name: "float64Sclice",
|
||||
flag: &Float64SliceFlag{Name: "flag", Value: NewFloat64Slice(1.1, 2.2)},
|
||||
toParse: []string{"--flag", "13.3"},
|
||||
expect: `--flag value (default: 1.1, 2.2) (accepts multiple inputs)`,
|
||||
},
|
||||
&flagDefaultTestCase{
|
||||
{
|
||||
name: "int64Sclice",
|
||||
flag: &Int64SliceFlag{Name: "flag", Value: NewInt64Slice(1, 2)},
|
||||
toParse: []string{"--flag", "13"},
|
||||
expect: `--flag value (default: 1, 2) (accepts multiple inputs)`,
|
||||
},
|
||||
&flagDefaultTestCase{
|
||||
{
|
||||
name: "intSclice",
|
||||
flag: &IntSliceFlag{Name: "flag", Value: NewIntSlice(1, 2)},
|
||||
toParse: []string{"--flag", "13"},
|
||||
expect: `--flag value (default: 1, 2) (accepts multiple inputs)`,
|
||||
},
|
||||
&flagDefaultTestCase{
|
||||
{
|
||||
name: "string",
|
||||
flag: &StringFlag{Name: "flag", Value: "default"},
|
||||
toParse: []string{"--flag", "parsed"},
|
||||
expect: `--flag value (default: "default")`,
|
||||
},
|
||||
&flagDefaultTestCase{
|
||||
{
|
||||
name: "bool",
|
||||
flag: &BoolFlag{Name: "flag", Value: true},
|
||||
toParse: []string{"--flag", "false"},
|
||||
expect: `--flag (default: true)`,
|
||||
},
|
||||
&flagDefaultTestCase{
|
||||
{
|
||||
name: "uint64",
|
||||
flag: &Uint64Flag{Name: "flag", Value: 1},
|
||||
toParse: []string{"--flag", "13"},
|
||||
@@ -2354,6 +2354,54 @@ func TestFlagDefaultValue(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
type flagValueTestCase struct {
|
||||
name string
|
||||
flag Flag
|
||||
toParse []string
|
||||
expect string
|
||||
}
|
||||
|
||||
func TestFlagValue(t *testing.T) {
|
||||
cases := []*flagValueTestCase{
|
||||
&flagValueTestCase{
|
||||
name: "stringSclice",
|
||||
flag: &StringSliceFlag{Name: "flag", Value: NewStringSlice("default1", "default2")},
|
||||
toParse: []string{"--flag", "parsed,parsed2", "--flag", "parsed3,parsed4"},
|
||||
expect: `[parsed parsed2 parsed3 parsed4]`,
|
||||
},
|
||||
&flagValueTestCase{
|
||||
name: "float64Sclice",
|
||||
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: "int64Sclice",
|
||||
flag: &Int64SliceFlag{Name: "flag", Value: NewInt64Slice(1, 2)},
|
||||
toParse: []string{"--flag", "13,14", "--flag", "15,16"},
|
||||
expect: `[]int64{13, 14, 15, 16}`,
|
||||
},
|
||||
&flagValueTestCase{
|
||||
name: "intSclice",
|
||||
flag: &IntSliceFlag{Name: "flag", Value: NewIntSlice(1, 2)},
|
||||
toParse: []string{"--flag", "13,14", "--flag", "15,16"},
|
||||
expect: `[]int{13, 14, 15, 16}`,
|
||||
},
|
||||
}
|
||||
for i, v := range cases {
|
||||
set := flag.NewFlagSet("test", 0)
|
||||
set.SetOutput(ioutil.Discard)
|
||||
_ = v.flag.Apply(set)
|
||||
if err := set.Parse(v.toParse); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
f := set.Lookup("flag")
|
||||
if got := f.Value.String(); got != v.expect {
|
||||
t.Errorf("TestFlagValue %d-%s\nexpect:%s\ngot:%s", i, v.name, v.expect, got)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestTimestampFlagApply_WithDestination(t *testing.T) {
|
||||
var destination Timestamp
|
||||
expectedResult, _ := time.Parse(time.RFC3339, "2006-01-02T15:04:05Z")
|
||||
@@ -2365,3 +2413,42 @@ func TestTimestampFlagApply_WithDestination(t *testing.T) {
|
||||
expect(t, err, nil)
|
||||
expect(t, *fl.Destination.timestamp, expectedResult)
|
||||
}
|
||||
|
||||
// Test issue #1254
|
||||
// StringSlice() with UseShortOptionHandling causes duplicated entries, depending on the ordering of the flags
|
||||
func TestSliceShortOptionHandle(t *testing.T) {
|
||||
wasCalled := false
|
||||
err := (&App{
|
||||
Commands: []*Command{
|
||||
{
|
||||
Name: "foobar",
|
||||
UseShortOptionHandling: true,
|
||||
Action: func(ctx *Context) error {
|
||||
wasCalled = true
|
||||
if ctx.Bool("i") != true {
|
||||
t.Error("bool i not set")
|
||||
}
|
||||
if ctx.Bool("t") != true {
|
||||
t.Error("bool i not set")
|
||||
}
|
||||
ss := ctx.StringSlice("net")
|
||||
if !reflect.DeepEqual(ss, []string{"foo"}) {
|
||||
t.Errorf("Got different slice(%v) than expected", ss)
|
||||
}
|
||||
return nil
|
||||
},
|
||||
Flags: []Flag{
|
||||
&StringSliceFlag{Name: "net"},
|
||||
&BoolFlag{Name: "i"},
|
||||
&BoolFlag{Name: "t"},
|
||||
},
|
||||
},
|
||||
},
|
||||
}).Run([]string{"run", "foobar", "--net=foo", "-it"})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !wasCalled {
|
||||
t.Fatal("Action callback was never called")
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user