1// Copyright 2009 The Go Authors. All rights reserved.
2// Use of ths2i source code s2i governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package pflag
6
7import (
8	"bytes"
9	"fmt"
10	"strconv"
11	"testing"
12)
13
14func setUpS2I64FlagSet(s2ip *map[string]int64) *FlagSet {
15	f := NewFlagSet("test", ContinueOnError)
16	f.StringToInt64Var(s2ip, "s2i", map[string]int64{}, "Command separated ls2it!")
17	return f
18}
19
20func setUpS2I64FlagSetWithDefault(s2ip *map[string]int64) *FlagSet {
21	f := NewFlagSet("test", ContinueOnError)
22	f.StringToInt64Var(s2ip, "s2i", map[string]int64{"a": 1, "b": 2}, "Command separated ls2it!")
23	return f
24}
25
26func createS2I64Flag(vals map[string]int64) string {
27	var buf bytes.Buffer
28	i := 0
29	for k, v := range vals {
30		if i > 0 {
31			buf.WriteRune(',')
32		}
33		buf.WriteString(k)
34		buf.WriteRune('=')
35		buf.WriteString(strconv.FormatInt(v, 10))
36		i++
37	}
38	return buf.String()
39}
40
41func TestEmptyS2I64(t *testing.T) {
42	var s2i map[string]int64
43	f := setUpS2I64FlagSet(&s2i)
44	err := f.Parse([]string{})
45	if err != nil {
46		t.Fatal("expected no error; got", err)
47	}
48
49	getS2I, err := f.GetStringToInt64("s2i")
50	if err != nil {
51		t.Fatal("got an error from GetStringToInt64():", err)
52	}
53	if len(getS2I) != 0 {
54		t.Fatalf("got s2i %v with len=%d but expected length=0", getS2I, len(getS2I))
55	}
56}
57
58func TestS2I64(t *testing.T) {
59	var s2i map[string]int64
60	f := setUpS2I64FlagSet(&s2i)
61
62	vals := map[string]int64{"a": 1, "b": 2, "d": 4, "c": 3}
63	arg := fmt.Sprintf("--s2i=%s", createS2I64Flag(vals))
64	err := f.Parse([]string{arg})
65	if err != nil {
66		t.Fatal("expected no error; got", err)
67	}
68	for k, v := range s2i {
69		if vals[k] != v {
70			t.Fatalf("expected s2i[%s] to be %d but got: %d", k, vals[k], v)
71		}
72	}
73	getS2I, err := f.GetStringToInt64("s2i")
74	if err != nil {
75		t.Fatalf("got error: %v", err)
76	}
77	for k, v := range getS2I {
78		if vals[k] != v {
79			t.Fatalf("expected s2i[%s] to be %d but got: %d from GetStringToInt64", k, vals[k], v)
80		}
81	}
82}
83
84func TestS2I64Default(t *testing.T) {
85	var s2i map[string]int64
86	f := setUpS2I64FlagSetWithDefault(&s2i)
87
88	vals := map[string]int64{"a": 1, "b": 2}
89
90	err := f.Parse([]string{})
91	if err != nil {
92		t.Fatal("expected no error; got", err)
93	}
94	for k, v := range s2i {
95		if vals[k] != v {
96			t.Fatalf("expected s2i[%s] to be %d but got: %d", k, vals[k], v)
97		}
98	}
99
100	getS2I, err := f.GetStringToInt64("s2i")
101	if err != nil {
102		t.Fatal("got an error from GetStringToInt64():", err)
103	}
104	for k, v := range getS2I {
105		if vals[k] != v {
106			t.Fatalf("expected s2i[%s] to be %d from GetStringToInt64 but got: %d", k, vals[k], v)
107		}
108	}
109}
110
111func TestS2I64WithDefault(t *testing.T) {
112	var s2i map[string]int64
113	f := setUpS2I64FlagSetWithDefault(&s2i)
114
115	vals := map[string]int64{"a": 1, "b": 2}
116	arg := fmt.Sprintf("--s2i=%s", createS2I64Flag(vals))
117	err := f.Parse([]string{arg})
118	if err != nil {
119		t.Fatal("expected no error; got", err)
120	}
121	for k, v := range s2i {
122		if vals[k] != v {
123			t.Fatalf("expected s2i[%s] to be %d but got: %d", k, vals[k], v)
124		}
125	}
126
127	getS2I, err := f.GetStringToInt64("s2i")
128	if err != nil {
129		t.Fatal("got an error from GetStringToInt64():", err)
130	}
131	for k, v := range getS2I {
132		if vals[k] != v {
133			t.Fatalf("expected s2i[%s] to be %d from GetStringToInt64 but got: %d", k, vals[k], v)
134		}
135	}
136}
137
138func TestS2I64CalledTwice(t *testing.T) {
139	var s2i map[string]int64
140	f := setUpS2I64FlagSet(&s2i)
141
142	in := []string{"a=1,b=2", "b=3"}
143	expected := map[string]int64{"a": 1, "b": 3}
144	argfmt := "--s2i=%s"
145	arg1 := fmt.Sprintf(argfmt, in[0])
146	arg2 := fmt.Sprintf(argfmt, in[1])
147	err := f.Parse([]string{arg1, arg2})
148	if err != nil {
149		t.Fatal("expected no error; got", err)
150	}
151	for i, v := range s2i {
152		if expected[i] != v {
153			t.Fatalf("expected s2i[%s] to be %d but got: %d", i, expected[i], v)
154		}
155	}
156}
157