mirror of
https://github.com/golang/go
synced 2024-11-17 13:35:08 -07:00
flag: test IsBoolFlag when creating the usage message
Although I can't think of any reason to do this, it is possible for a user-defined flag to implement IsBoolFlag but return "false". This is nuts because checking the interface is satisfied should obviously be sufficient, but the documentation kinda implies it's not. And if you try this, you'll discover that the usage message ignores the return value even though the rest of the package plays nice. Bother. So we fix it, as the fix is trivial: call the method when creating the usage message. Fixes #53473 Change-Id: I1ac80a876ad5626eebfc5ef6cb972cd3007afaad Reviewed-on: https://go-review.googlesource.com/c/go/+/431102 Reviewed-by: Cherry Mui <cherryyz@google.com> Run-TryBot: Ian Lance Taylor <iant@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@google.com>
This commit is contained in:
parent
d31f85009c
commit
2d741947d8
@ -550,9 +550,11 @@ func UnquoteUsage(flag *Flag) (name string, usage string) {
|
|||||||
}
|
}
|
||||||
// No explicit name, so use type if we can find one.
|
// No explicit name, so use type if we can find one.
|
||||||
name = "value"
|
name = "value"
|
||||||
switch flag.Value.(type) {
|
switch fv := flag.Value.(type) {
|
||||||
case boolFlag:
|
case boolFlag:
|
||||||
|
if fv.IsBoolFlag() {
|
||||||
name = ""
|
name = ""
|
||||||
|
}
|
||||||
case *durationValue:
|
case *durationValue:
|
||||||
name = "duration"
|
name = "duration"
|
||||||
case *float64Value:
|
case *float64Value:
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
package flag_test
|
package flag_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
. "flag"
|
. "flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"internal/testenv"
|
"internal/testenv"
|
||||||
@ -355,6 +356,31 @@ func TestUserDefinedBool(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUserDefinedBoolUsage(t *testing.T) {
|
||||||
|
var flags FlagSet
|
||||||
|
flags.Init("test", ContinueOnError)
|
||||||
|
var buf bytes.Buffer
|
||||||
|
flags.SetOutput(&buf)
|
||||||
|
var b boolFlagVar
|
||||||
|
flags.Var(&b, "b", "X")
|
||||||
|
b.count = 0
|
||||||
|
// b.IsBoolFlag() will return true and usage will look boolean.
|
||||||
|
flags.PrintDefaults()
|
||||||
|
got := buf.String()
|
||||||
|
want := " -b\tX\n"
|
||||||
|
if got != want {
|
||||||
|
t.Errorf("false: want %q; got %q", want, got)
|
||||||
|
}
|
||||||
|
b.count = 4
|
||||||
|
// b.IsBoolFlag() will return false and usage will look non-boolean.
|
||||||
|
flags.PrintDefaults()
|
||||||
|
got = buf.String()
|
||||||
|
want = " -b\tX\n -b value\n \tX\n"
|
||||||
|
if got != want {
|
||||||
|
t.Errorf("false: want %q; got %q", want, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestSetOutput(t *testing.T) {
|
func TestSetOutput(t *testing.T) {
|
||||||
var flags FlagSet
|
var flags FlagSet
|
||||||
var buf strings.Builder
|
var buf strings.Builder
|
||||||
|
Loading…
Reference in New Issue
Block a user