1package getopt
2
3import (
4	"bytes"
5	"fmt"
6	"strings"
7	"testing"
8	"time"
9)
10
11type flagValue bool
12
13func (f *flagValue) Set(value string, opt Option) error {
14	switch strings.ToLower(value) {
15	case "true", "t", "on", "1":
16		*f = true
17	case "false", "f", "off", "0":
18		*f = false
19	default:
20		return fmt.Errorf("invalid flagValue %q", value)
21	}
22	return nil
23}
24func (f *flagValue) String() string {
25	return fmt.Sprint(bool(*f))
26}
27
28func TestHelpDefaults(t *testing.T) {
29	HelpColumn = 40
30	set := New()
31	bf := false
32	bt := true
33	set.FlagLong(&bf, "bool_false", 'f', "false bool value")
34	set.FlagLong(&bt, "bool_true", 't', "true bool value")
35	i := int(0)
36	i8 := int8(0)
37	i16 := int16(0)
38	i32 := int32(0)
39	i64 := int64(0)
40	si := int(1)
41	si8 := int8(8)
42	si16 := int16(16)
43	si32 := int32(32)
44	si64 := int64(64)
45	ui := uint(0)
46	ui8 := uint8(0)
47	ui16 := uint16(0)
48	ui32 := uint32(0)
49	ui64 := uint64(0)
50	sui := uint(1)
51	sui8 := uint8(8)
52	sui16 := uint16(16)
53	sui32 := uint32(32)
54	sui64 := uint64(64)
55
56	set.FlagLong(&i, "int", 0, "int value")
57	set.FlagLong(&si, "int_set", 0, "set int value")
58	set.FlagLong(&i8, "int8", 0, "int8 value")
59	set.FlagLong(&si8, "int8_set", 0, "set int8 value")
60	set.FlagLong(&i16, "int16", 0, "int16 value")
61	set.FlagLong(&si16, "int16_set", 0, "set int16 value")
62	set.FlagLong(&i32, "int32", 0, "int32 value")
63	set.FlagLong(&si32, "int32_set", 0, "set int32 value")
64	set.FlagLong(&i64, "int64", 0, "int64 value")
65	set.FlagLong(&si64, "int64_set", 0, "set int64 value")
66
67	set.FlagLong(&ui, "uint", 0, "uint value")
68	set.FlagLong(&sui, "uint_set", 0, "set uint value")
69	set.FlagLong(&ui8, "uint8", 0, "uint8 value")
70	set.FlagLong(&sui8, "uint8_set", 0, "set uint8 value")
71	set.FlagLong(&ui16, "uint16", 0, "uint16 value")
72	set.FlagLong(&sui16, "uint16_set", 0, "set uint16 value")
73	set.FlagLong(&ui32, "uint32", 0, "uint32 value")
74	set.FlagLong(&sui32, "uint32_set", 0, "set uint32 value")
75	set.FlagLong(&ui64, "uint64", 0, "uint64 value")
76	set.FlagLong(&sui64, "uint64_set", 0, "set uint64 value")
77
78	f32 := float32(0)
79	f64 := float64(0)
80	sf32 := float32(3.2)
81	sf64 := float64(6.4)
82
83	set.FlagLong(&f32, "float32", 0, "float32 value")
84	set.FlagLong(&sf32, "float32_set", 0, "set float32 value")
85	set.FlagLong(&f64, "float64", 0, "float64 value")
86	set.FlagLong(&sf64, "float64_set", 0, "set float64 value")
87
88	d := time.Duration(0)
89	sd := time.Duration(time.Second)
90
91	set.FlagLong(&d, "duration", 0, "duration value")
92	set.FlagLong(&sd, "duration_set", 0, "set duration value")
93
94	str := ""
95	sstr := "string"
96	set.FlagLong(&str, "string", 0, "string value")
97	set.FlagLong(&sstr, "string_set", 0, "set string value")
98
99	var fv flagValue
100	set.FlagLong(&fv, "vbool", 0, "value bool").SetFlag()
101
102	var fvo flagValue = true
103	set.FlagLong(&fvo, "vbool_on", 0, "value bool").SetFlag()
104
105	required := 17
106	set.FlagLong(&required, "required", 0, "a required option").Mandatory()
107
108	var a, b bool
109	set.Flag(&a, 'a', "use method A").SetGroup("method")
110	set.Flag(&b, 'b', "use method B").SetGroup("method")
111
112	want := `
113 -a                        use method A {method}
114 -b                        use method B {method}
115     --duration=value      duration value
116     --duration_set=value  set duration value [1s]
117 -f, --bool_false          false bool value
118     --float32=value       float32 value
119     --float32_set=value   set float32 value [3.2]
120     --float64=value       float64 value
121     --float64_set=value   set float64 value [6.4]
122     --int=value           int value
123     --int16=value         int16 value
124     --int16_set=value     set int16 value [16]
125     --int32=value         int32 value
126     --int32_set=value     set int32 value [32]
127     --int64=value         int64 value
128     --int64_set=value     set int64 value [64]
129     --int8=value          int8 value
130     --int8_set=value      set int8 value [8]
131     --int_set=value       set int value [1]
132     --required=value      a required option [17] (required)
133     --string=value        string value
134     --string_set=value    set string value [string]
135 -t, --bool_true           true bool value [true]
136     --uint=value          uint value
137     --uint16=value        uint16 value
138     --uint16_set=value    set uint16 value [16]
139     --uint32=value        uint32 value
140     --uint32_set=value    set uint32 value [32]
141     --uint64=value        uint64 value
142     --uint64_set=value    set uint64 value [64]
143     --uint8=value         uint8 value
144     --uint8_set=value     set uint8 value [8]
145     --uint_set=value      set uint value [1]
146     --vbool               value bool
147     --vbool_on            value bool [true]
148`[1:]
149
150	var buf bytes.Buffer
151	set.PrintOptions(&buf)
152	if got := buf.String(); got != want {
153		t.Errorf("got:\n%s\nwant:\n%s", got, want)
154	}
155}
156