forked from urfave/sflags
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgflag_test.go
125 lines (112 loc) · 2.69 KB
/
gflag_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package gflag
import (
"errors"
"flag"
"os"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/urfave/sflags"
)
type cfg1 struct {
StringValue1 string
StringValue2 string `flag:"string-value-two"`
CounterValue1 sflags.Counter
StringSliceValue1 []string
}
func TestParse(t *testing.T) {
tests := []struct {
name string
cfg interface{}
args []string
expCfg interface{}
expErr1 error // sflag Parse error
expErr2 error // flag Parse error
}{
{
name: "Test cfg1",
cfg: &cfg1{
StringValue1: "string_value1_value",
StringValue2: "string_value2_value",
CounterValue1: 1,
StringSliceValue1: []string{"one", "two"},
},
expCfg: &cfg1{
StringValue1: "string_value1_value2",
StringValue2: "string_value2_value2",
CounterValue1: 3,
StringSliceValue1: []string{
"one2", "two2", "three", "4"},
},
args: []string{
"-string-value1", "string_value1_value2",
"-string-value-two", "string_value2_value2",
"-counter-value1", "-counter-value1",
"-string-slice-value1", "one2",
"-string-slice-value1", "two2",
"-string-slice-value1", "three,4",
},
},
{
name: "Test cfg1 no args",
cfg: &cfg1{
StringValue1: "string_value1_value",
StringValue2: "",
},
expCfg: &cfg1{
StringValue1: "string_value1_value",
StringValue2: "",
},
args: []string{},
},
{
name: "Test cfg1 without default values",
cfg: &cfg1{},
expCfg: &cfg1{
StringValue1: "string_value1_value2",
StringValue2: "string_value2_value2",
CounterValue1: 3,
},
args: []string{
"-string-value1", "string_value1_value2",
"-string-value-two", "string_value2_value2",
"-counter-value1=2", "-counter-value1",
},
},
{
name: "Test bad cfg value",
cfg: "bad config",
expErr1: errors.New("object must be a pointer to struct or interface"),
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
fs, err := Parse(test.cfg)
require.Equal(t, test.expErr1, err)
if err != nil {
return
}
err = fs.Parse(test.args)
require.Equal(t, test.expErr2, err)
if err != nil {
return
}
assert.Equal(t, test.expCfg, test.cfg)
})
}
}
func TestParseToDef(t *testing.T) {
oldCommandLine := flag.CommandLine
defer func() {
flag.CommandLine = oldCommandLine
}()
cfg := &cfg1{StringValue1: "value1"}
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ContinueOnError)
err := ParseToDef(cfg)
assert.NoError(t, err)
err = flag.CommandLine.Parse([]string{"-string-value1", "value2"})
assert.NoError(t, err)
assert.Equal(t, "value2", cfg.StringValue1)
err = ParseToDef("bad string")
assert.Error(t, err)
}