1// Copyright 2009 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package pflag
6
7import (
8	"fmt"
9	"strconv"
10	"strings"
11	"testing"
12)
13
14func setUpF32SFlagSet(f32sp *[]float32) *FlagSet {
15	f := NewFlagSet("test", ContinueOnError)
16	f.Float32SliceVar(f32sp, "f32s", []float32{}, "Command separated list!")
17	return f
18}
19
20func setUpF32SFlagSetWithDefault(f32sp *[]float32) *FlagSet {
21	f := NewFlagSet("test", ContinueOnError)
22	f.Float32SliceVar(f32sp, "f32s", []float32{0.0, 1.0}, "Command separated list!")
23	return f
24}
25
26func TestEmptyF32S(t *testing.T) {
27	var f32s []float32
28	f := setUpF32SFlagSet(&f32s)
29	err := f.Parse([]string{})
30	if err != nil {
31		t.Fatal("expected no error; got", err)
32	}
33
34	getF32S, err := f.GetFloat32Slice("f32s")
35	if err != nil {
36		t.Fatal("got an error from GetFloat32Slice():", err)
37	}
38	if len(getF32S) != 0 {
39		t.Fatalf("got f32s %v with len=%d but expected length=0", getF32S, len(getF32S))
40	}
41}
42
43func TestF32S(t *testing.T) {
44	var f32s []float32
45	f := setUpF32SFlagSet(&f32s)
46
47	vals := []string{"1.0", "2.0", "4.0", "3.0"}
48	arg := fmt.Sprintf("--f32s=%s", strings.Join(vals, ","))
49	err := f.Parse([]string{arg})
50	if err != nil {
51		t.Fatal("expected no error; got", err)
52	}
53	for i, v := range f32s {
54		d64, err := strconv.ParseFloat(vals[i], 32)
55		if err != nil {
56			t.Fatalf("got error: %v", err)
57		}
58
59		d := float32(d64)
60		if d != v {
61			t.Fatalf("expected f32s[%d] to be %s but got: %f", i, vals[i], v)
62		}
63	}
64	getF32S, err := f.GetFloat32Slice("f32s")
65	if err != nil {
66		t.Fatalf("got error: %v", err)
67	}
68	for i, v := range getF32S {
69		d64, err := strconv.ParseFloat(vals[i], 32)
70		if err != nil {
71			t.Fatalf("got error: %v", err)
72		}
73
74		d := float32(d64)
75		if d != v {
76			t.Fatalf("expected f32s[%d] to be %s but got: %f from GetFloat32Slice", i, vals[i], v)
77		}
78	}
79}
80
81func TestF32SDefault(t *testing.T) {
82	var f32s []float32
83	f := setUpF32SFlagSetWithDefault(&f32s)
84
85	vals := []string{"0.0", "1.0"}
86
87	err := f.Parse([]string{})
88	if err != nil {
89		t.Fatal("expected no error; got", err)
90	}
91	for i, v := range f32s {
92		d64, err := strconv.ParseFloat(vals[i], 32)
93		if err != nil {
94			t.Fatalf("got error: %v", err)
95		}
96
97		d := float32(d64)
98		if d != v {
99			t.Fatalf("expected f32s[%d] to be %f but got: %f", i, d, v)
100		}
101	}
102
103	getF32S, err := f.GetFloat32Slice("f32s")
104	if err != nil {
105		t.Fatal("got an error from GetFloat32Slice():", err)
106	}
107	for i, v := range getF32S {
108		d64, err := strconv.ParseFloat(vals[i], 32)
109		if err != nil {
110			t.Fatal("got an error from GetFloat32Slice():", err)
111		}
112
113		d := float32(d64)
114		if d != v {
115			t.Fatalf("expected f32s[%d] to be %f from GetFloat32Slice but got: %f", i, d, v)
116		}
117	}
118}
119
120func TestF32SWithDefault(t *testing.T) {
121	var f32s []float32
122	f := setUpF32SFlagSetWithDefault(&f32s)
123
124	vals := []string{"1.0", "2.0"}
125	arg := fmt.Sprintf("--f32s=%s", strings.Join(vals, ","))
126	err := f.Parse([]string{arg})
127	if err != nil {
128		t.Fatal("expected no error; got", err)
129	}
130	for i, v := range f32s {
131		d64, err := strconv.ParseFloat(vals[i], 32)
132		if err != nil {
133			t.Fatalf("got error: %v", err)
134		}
135
136		d := float32(d64)
137		if d != v {
138			t.Fatalf("expected f32s[%d] to be %f but got: %f", i, d, v)
139		}
140	}
141
142	getF32S, err := f.GetFloat32Slice("f32s")
143	if err != nil {
144		t.Fatal("got an error from GetFloat32Slice():", err)
145	}
146	for i, v := range getF32S {
147		d64, err := strconv.ParseFloat(vals[i], 32)
148		if err != nil {
149			t.Fatalf("got error: %v", err)
150		}
151
152		d := float32(d64)
153		if d != v {
154			t.Fatalf("expected f32s[%d] to be %f from GetFloat32Slice but got: %f", i, d, v)
155		}
156	}
157}
158
159func TestF32SAsSliceValue(t *testing.T) {
160	var f32s []float32
161	f := setUpF32SFlagSet(&f32s)
162
163	in := []string{"1.0", "2.0"}
164	argfmt := "--f32s=%s"
165	arg1 := fmt.Sprintf(argfmt, in[0])
166	arg2 := fmt.Sprintf(argfmt, in[1])
167	err := f.Parse([]string{arg1, arg2})
168	if err != nil {
169		t.Fatal("expected no error; got", err)
170	}
171
172	f.VisitAll(func(f *Flag) {
173		if val, ok := f.Value.(SliceValue); ok {
174			_ = val.Replace([]string{"3.1"})
175		}
176	})
177	if len(f32s) != 1 || f32s[0] != 3.1 {
178		t.Fatalf("Expected ss to be overwritten with '3.1', but got: %v", f32s)
179	}
180}
181
182func TestF32SCalledTwice(t *testing.T) {
183	var f32s []float32
184	f := setUpF32SFlagSet(&f32s)
185
186	in := []string{"1.0,2.0", "3.0"}
187	expected := []float32{1.0, 2.0, 3.0}
188	argfmt := "--f32s=%s"
189	arg1 := fmt.Sprintf(argfmt, in[0])
190	arg2 := fmt.Sprintf(argfmt, in[1])
191	err := f.Parse([]string{arg1, arg2})
192	if err != nil {
193		t.Fatal("expected no error; got", err)
194	}
195	for i, v := range f32s {
196		if expected[i] != v {
197			t.Fatalf("expected f32s[%d] to be %f but got: %f", i, expected[i], v)
198		}
199	}
200}
201