1
2
3
4
5 package pflag
6
7 import (
8 "bytes"
9 "encoding/csv"
10 "fmt"
11 "strings"
12 "testing"
13 )
14
15 func setUpS2SFlagSet(s2sp *map[string]string) *FlagSet {
16 f := NewFlagSet("test", ContinueOnError)
17 f.StringToStringVar(s2sp, "s2s", map[string]string{}, "Command separated ls2st!")
18 return f
19 }
20
21 func setUpS2SFlagSetWithDefault(s2sp *map[string]string) *FlagSet {
22 f := NewFlagSet("test", ContinueOnError)
23 f.StringToStringVar(s2sp, "s2s", map[string]string{"da": "1", "db": "2", "de": "5,6"}, "Command separated ls2st!")
24 return f
25 }
26
27 func createS2SFlag(vals map[string]string) string {
28 records := make([]string, 0, len(vals)>>1)
29 for k, v := range vals {
30 records = append(records, k+"="+v)
31 }
32
33 var buf bytes.Buffer
34 w := csv.NewWriter(&buf)
35 if err := w.Write(records); err != nil {
36 panic(err)
37 }
38 w.Flush()
39 return strings.TrimSpace(buf.String())
40 }
41
42 func TestEmptyS2S(t *testing.T) {
43 var s2s map[string]string
44 f := setUpS2SFlagSet(&s2s)
45 err := f.Parse([]string{})
46 if err != nil {
47 t.Fatal("expected no error; got", err)
48 }
49
50 getS2S, err := f.GetStringToString("s2s")
51 if err != nil {
52 t.Fatal("got an error from GetStringToString():", err)
53 }
54 if len(getS2S) != 0 {
55 t.Fatalf("got s2s %v with len=%d but expected length=0", getS2S, len(getS2S))
56 }
57 }
58
59 func TestS2S(t *testing.T) {
60 var s2s map[string]string
61 f := setUpS2SFlagSet(&s2s)
62
63 vals := map[string]string{"a": "1", "b": "2", "d": "4", "c": "3", "e": "5,6"}
64 arg := fmt.Sprintf("--s2s=%s", createS2SFlag(vals))
65 err := f.Parse([]string{arg})
66 if err != nil {
67 t.Fatal("expected no error; got", err)
68 }
69 for k, v := range s2s {
70 if vals[k] != v {
71 t.Fatalf("expected s2s[%s] to be %s but got: %s", k, vals[k], v)
72 }
73 }
74 getS2S, err := f.GetStringToString("s2s")
75 if err != nil {
76 t.Fatalf("got error: %v", err)
77 }
78 for k, v := range getS2S {
79 if vals[k] != v {
80 t.Fatalf("expected s2s[%s] to be %s but got: %s from GetStringToString", k, vals[k], v)
81 }
82 }
83 }
84
85 func TestS2SDefault(t *testing.T) {
86 var s2s map[string]string
87 f := setUpS2SFlagSetWithDefault(&s2s)
88
89 vals := map[string]string{"da": "1", "db": "2", "de": "5,6"}
90
91 err := f.Parse([]string{})
92 if err != nil {
93 t.Fatal("expected no error; got", err)
94 }
95 for k, v := range s2s {
96 if vals[k] != v {
97 t.Fatalf("expected s2s[%s] to be %s but got: %s", k, vals[k], v)
98 }
99 }
100
101 getS2S, err := f.GetStringToString("s2s")
102 if err != nil {
103 t.Fatal("got an error from GetStringToString():", err)
104 }
105 for k, v := range getS2S {
106 if vals[k] != v {
107 t.Fatalf("expected s2s[%s] to be %s from GetStringToString but got: %s", k, vals[k], v)
108 }
109 }
110 }
111
112 func TestS2SWithDefault(t *testing.T) {
113 var s2s map[string]string
114 f := setUpS2SFlagSetWithDefault(&s2s)
115
116 vals := map[string]string{"a": "1", "b": "2", "e": "5,6"}
117 arg := fmt.Sprintf("--s2s=%s", createS2SFlag(vals))
118 err := f.Parse([]string{arg})
119 if err != nil {
120 t.Fatal("expected no error; got", err)
121 }
122 for k, v := range s2s {
123 if vals[k] != v {
124 t.Fatalf("expected s2s[%s] to be %s but got: %s", k, vals[k], v)
125 }
126 }
127
128 getS2S, err := f.GetStringToString("s2s")
129 if err != nil {
130 t.Fatal("got an error from GetStringToString():", err)
131 }
132 for k, v := range getS2S {
133 if vals[k] != v {
134 t.Fatalf("expected s2s[%s] to be %s from GetStringToString but got: %s", k, vals[k], v)
135 }
136 }
137 }
138
139 func TestS2SCalledTwice(t *testing.T) {
140 var s2s map[string]string
141 f := setUpS2SFlagSet(&s2s)
142
143 in := []string{"a=1,b=2", "b=3", `"e=5,6"`, `f=7,8`}
144 expected := map[string]string{"a": "1", "b": "3", "e": "5,6", "f": "7,8"}
145 argfmt := "--s2s=%s"
146 arg0 := fmt.Sprintf(argfmt, in[0])
147 arg1 := fmt.Sprintf(argfmt, in[1])
148 arg2 := fmt.Sprintf(argfmt, in[2])
149 arg3 := fmt.Sprintf(argfmt, in[3])
150 err := f.Parse([]string{arg0, arg1, arg2, arg3})
151 if err != nil {
152 t.Fatal("expected no error; got", err)
153 }
154 if len(s2s) != len(expected) {
155 t.Fatalf("expected %d flags; got %d flags", len(expected), len(s2s))
156 }
157 for i, v := range s2s {
158 if expected[i] != v {
159 t.Fatalf("expected s2s[%s] to be %s but got: %s", i, expected[i], v)
160 }
161 }
162 }
163
View as plain text