-
-
Notifications
You must be signed in to change notification settings - Fork 176
Expand file tree
/
Copy pathsignature_test.go
More file actions
163 lines (135 loc) · 4.03 KB
/
Copy pathsignature_test.go
File metadata and controls
163 lines (135 loc) · 4.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
package kong_test
import (
"strings"
"testing"
"github.com/alecthomas/assert/v2"
"github.com/alecthomas/kong"
)
// Command with value receiver.
type signatureCmd struct {
Arg string `arg:"" optional:""`
}
func (signatureCmd) Signature() string {
return `cmd:"" name:"sig" help:"Signature help" aliases:"s,sg"`
}
func TestSignatureCommand(t *testing.T) {
var cli struct {
Cmd signatureCmd
}
p := mustNew(t, &cli)
// Should be reachable by the signature-provided name.
_, err := p.Parse([]string{"sig", "value"})
assert.NoError(t, err)
assert.Equal(t, "value", cli.Cmd.Arg)
// Should be reachable by aliases.
_, err = p.Parse([]string{"s", "other"})
assert.NoError(t, err)
assert.Equal(t, "other", cli.Cmd.Arg)
_, err = p.Parse([]string{"sg", "third"})
assert.NoError(t, err)
assert.Equal(t, "third", cli.Cmd.Arg)
}
func TestSignatureCommandHelp(t *testing.T) {
var cli struct {
Cmd signatureCmd
}
buf := &strings.Builder{}
p := mustNew(t, &cli, kong.Writers(buf, buf), kong.Exit(func(int) {}))
_, _ = p.Parse([]string{"--help"})
assert.Contains(t, buf.String(), "Signature help")
}
// Command with pointer receiver.
type signaturePtrCmd struct {
Flag string `default:"def"`
}
func (*signaturePtrCmd) Signature() string {
return `cmd:"" name:"ptrcmd" help:"Pointer receiver help"`
}
func TestSignaturePointerReceiver(t *testing.T) {
var cli struct {
Cmd *signaturePtrCmd
}
p := mustNew(t, &cli)
_, err := p.Parse([]string{"ptrcmd"})
assert.NoError(t, err)
assert.Equal(t, "def", cli.Cmd.Flag)
}
func TestSignaturePointerReceiverHelp(t *testing.T) {
var cli struct {
Cmd *signaturePtrCmd
}
buf := &strings.Builder{}
p := mustNew(t, &cli, kong.Writers(buf, buf), kong.Exit(func(int) {}))
_, _ = p.Parse([]string{"--help"})
assert.Contains(t, buf.String(), "Pointer receiver help")
}
func TestSignatureFieldTagOverrides(t *testing.T) {
var cli struct {
// Field tag overrides the name from the signature, but help comes from signature.
Cmd signatureCmd `cmd:"" name:"override"`
}
p := mustNew(t, &cli)
// The overridden name should work.
_, err := p.Parse([]string{"override", "val"})
assert.NoError(t, err)
assert.Equal(t, "val", cli.Cmd.Arg)
// The signature name should NOT work because the field tag overrode it.
_, err = p.Parse([]string{"sig"})
assert.Error(t, err)
}
func TestSignatureFieldTagOverridesHelp(t *testing.T) {
var cli struct {
Cmd signatureCmd `cmd:"" name:"override"`
}
buf := &strings.Builder{}
p := mustNew(t, &cli, kong.Writers(buf, buf), kong.Exit(func(int) {}))
_, _ = p.Parse([]string{"--help"})
// Help from signature should still be present since field tag didn't override it.
assert.Contains(t, buf.String(), "Signature help")
}
// Non-struct type implementing Signature as a flag.
type signatureFlag string
func (signatureFlag) Signature() string {
return `help:"Flag from signature" default:"sigdefault"`
}
func TestSignatureNonStructFlag(t *testing.T) {
var cli struct {
Flag signatureFlag
}
p := mustNew(t, &cli)
_, err := p.Parse(nil)
assert.NoError(t, err)
assert.Equal(t, signatureFlag("sigdefault"), cli.Flag)
}
func TestSignatureNonStructFlagFieldOverrides(t *testing.T) {
var cli struct {
Flag signatureFlag `default:"fieldval"`
}
p := mustNew(t, &cli)
_, err := p.Parse(nil)
assert.NoError(t, err)
// Field tag should override the signature default.
assert.Equal(t, signatureFlag("fieldval"), cli.Flag)
}
// Empty signature should be ignored.
type emptySignatureCmd struct{}
func (emptySignatureCmd) Signature() string { return "" }
func TestSignatureEmptyIgnored(t *testing.T) {
var cli struct {
Cmd emptySignatureCmd `cmd:""`
}
p := mustNew(t, &cli)
_, err := p.Parse([]string{"cmd"})
assert.NoError(t, err)
}
// Whitespace-only signature should also be ignored.
type whitespaceSignatureCmd struct{}
func (whitespaceSignatureCmd) Signature() string { return " " }
func TestSignatureWhitespaceIgnored(t *testing.T) {
var cli struct {
Cmd whitespaceSignatureCmd `cmd:""`
}
p := mustNew(t, &cli)
_, err := p.Parse([]string{"cmd"})
assert.NoError(t, err)
}