1package kingpin
2
3import (
4	"net"
5
6	"github.com/stretchr/testify/assert"
7
8	"testing"
9)
10
11func TestAccumulatorStrings(t *testing.T) {
12	target := []string{}
13	acc := newAccumulator(&target, func(v interface{}) Value { return newStringValue(v.(*string)) })
14	acc.Set("a")
15	assert.Equal(t, []string{"a"}, target)
16	acc.Set("b")
17	assert.Equal(t, []string{"a", "b"}, target)
18}
19
20func TestStrings(t *testing.T) {
21	app := New("", "")
22	app.Arg("a", "").Required().String()
23	app.Arg("b", "").Required().String()
24	c := app.Arg("c", "").Required().Strings()
25	app.Parse([]string{"a", "b", "a", "b"})
26	assert.Equal(t, []string{"a", "b"}, *c)
27}
28
29func TestEnum(t *testing.T) {
30	app := New("", "")
31	a := app.Arg("a", "").Enum("one", "two", "three")
32	_, err := app.Parse([]string{"moo"})
33	assert.Error(t, err)
34	_, err = app.Parse([]string{"one"})
35	assert.NoError(t, err)
36	assert.Equal(t, "one", *a)
37}
38
39func TestEnumVar(t *testing.T) {
40	app := New("", "")
41	var a string
42	app.Arg("a", "").EnumVar(&a, "one", "two", "three")
43	_, err := app.Parse([]string{"moo"})
44	assert.Error(t, err)
45	_, err = app.Parse([]string{"one"})
46	assert.NoError(t, err)
47	assert.Equal(t, "one", a)
48}
49
50func TestCounter(t *testing.T) {
51	app := New("", "")
52	c := app.Flag("f", "").Counter()
53	_, err := app.Parse([]string{"--f", "--f", "--f"})
54	assert.NoError(t, err)
55	assert.Equal(t, 3, *c)
56}
57
58func TestIPv4Addr(t *testing.T) {
59	app := newTestApp()
60	flag := app.Flag("addr", "").ResolvedIP()
61	_, err := app.Parse([]string{"--addr", net.IPv4(1, 2, 3, 4).String()})
62	assert.NoError(t, err)
63	assert.NotNil(t, *flag)
64	assert.Equal(t, net.IPv4(1, 2, 3, 4), *flag)
65}
66
67func TestInvalidIPv4Addr(t *testing.T) {
68	app := newTestApp()
69	app.Flag("addr", "").ResolvedIP()
70	_, err := app.Parse([]string{"--addr", "1.2.3.256"})
71	assert.Error(t, err)
72}
73
74func TestIPv6Addr(t *testing.T) {
75	app := newTestApp()
76	flag := app.Flag("addr", "").ResolvedIP()
77	_, err := app.Parse([]string{"--addr", net.IPv6interfacelocalallnodes.String()})
78	assert.NoError(t, err)
79	assert.NotNil(t, *flag)
80	assert.Equal(t, net.IPv6interfacelocalallnodes, *flag)
81}
82
83func TestHexBytes(t *testing.T) {
84	app := newTestApp()
85	actual := app.Arg("bytes", "").HexBytes()
86	_, err := app.Parse([]string{"01020aff"})
87	assert.NoError(t, err)
88	assert.Equal(t, []byte{0x01, 0x02, 0x0a, 0xff}, *actual)
89}
90
91func TestSetValueDoesNotReset(t *testing.T) {
92	app := newTestApp()
93	mapping := map[string]string{
94		"key": "value",
95	}
96	app.Flag("set", "").StringMapVar(&mapping)
97	assert.NotEmpty(t, mapping)
98}
99