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
|
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package pflag
import (
goflag "flag"
"testing"
"time"
)
func TestGoflags(t *testing.T) {
goflag.String("stringFlag", "stringFlag", "stringFlag")
goflag.Bool("boolFlag", false, "boolFlag")
var testxxxValue string
goflag.StringVar(&testxxxValue, "test.xxx", "test.xxx", "it is a test flag")
f := NewFlagSet("test", ContinueOnError)
f.AddGoFlagSet(goflag.CommandLine)
args := []string{"--stringFlag=bob", "--boolFlag", "-test.xxx=testvalue"}
err := f.Parse(args)
if err != nil {
t.Fatal("expected no error; get", err)
}
getString, err := f.GetString("stringFlag")
if err != nil {
t.Fatal("expected no error; get", err)
}
if getString != "bob" {
t.Fatalf("expected getString=bob but got getString=%s", getString)
}
getBool, err := f.GetBool("boolFlag")
if err != nil {
t.Fatal("expected no error; get", err)
}
if getBool != true {
t.Fatalf("expected getBool=true but got getBool=%v", getBool)
}
if !f.Parsed() {
t.Fatal("f.Parsed() return false after f.Parse() called")
}
if testxxxValue != "test.xxx" {
t.Fatalf("expected testxxxValue to be test.xxx but got %v", testxxxValue)
}
err = ParseSkippedFlags(args, goflag.CommandLine)
if err != nil {
t.Fatal("expected no error; ParseSkippedFlags", err)
}
if testxxxValue != "testvalue" {
t.Fatalf("expected testxxxValue to be testvalue but got %v", testxxxValue)
}
// in fact it is useless. because `go test` called flag.Parse()
if !goflag.CommandLine.Parsed() {
t.Fatal("goflag.CommandLine.Parsed() return false after f.Parse() called")
}
}
func TestToGoflags(t *testing.T) {
pfs := FlagSet{}
gfs := goflag.FlagSet{}
pfs.String("StringFlag", "String value", "String flag usage")
pfs.Int("IntFlag", 1, "Int flag usage")
pfs.Uint("UintFlag", 2, "Uint flag usage")
pfs.Int64("Int64Flag", 3, "Int64 flag usage")
pfs.Uint64("Uint64Flag", 4, "Uint64 flag usage")
pfs.Int8("Int8Flag", 5, "Int8 flag usage")
pfs.Float64("Float64Flag", 6.0, "Float64 flag usage")
pfs.Duration("DurationFlag", time.Second, "Duration flag usage")
pfs.Bool("BoolFlag", true, "Bool flag usage")
pfs.String("deprecated", "Deprecated value", "Deprecated flag usage")
pfs.MarkDeprecated("deprecated", "obsolete")
pfs.CopyToGoFlagSet(&gfs)
// Modify via pfs. Should be visible via gfs because both share the
// same values.
for name, value := range map[string]string{
"StringFlag": "Modified String value",
"IntFlag": "11",
"UintFlag": "12",
"Int64Flag": "13",
"Uint64Flag": "14",
"Int8Flag": "15",
"Float64Flag": "16.0",
"BoolFlag": "false",
} {
pf := pfs.Lookup(name)
if pf == nil {
t.Errorf("%s: not found in pflag flag set", name)
continue
}
if err := pf.Value.Set(value); err != nil {
t.Errorf("error setting %s = %s: %v", name, value, err)
}
}
// Check that all flags were added and share the same value.
pfs.VisitAll(func(pf *Flag) {
gf := gfs.Lookup(pf.Name)
if gf == nil {
t.Errorf("%s: not found in Go flag set", pf.Name)
return
}
if gf.Value.String() != pf.Value.String() {
t.Errorf("%s: expected value %v from Go flag set, got %v",
pf.Name, pf.Value, gf.Value)
return
}
})
// Check for unexpected additional flags.
gfs.VisitAll(func(gf *goflag.Flag) {
pf := gfs.Lookup(gf.Name)
if pf == nil {
t.Errorf("%s: not found in pflag flag set", gf.Name)
return
}
})
deprecated := gfs.Lookup("deprecated")
if deprecated == nil {
t.Error("deprecated: not found in Go flag set")
} else {
expectedUsage := "Deprecated flag usage (DEPRECATED: obsolete)"
if deprecated.Usage != expectedUsage {
t.Errorf("deprecation remark not added, expected usage %q, got %q", expectedUsage, deprecated.Usage)
}
}
}
|