File: golangflag_test.go

package info (click to toggle)
golang-github-spf13-pflag 1.0.10-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental, forky, sid
  • size: 612 kB
  • sloc: sh: 80; makefile: 2
file content (135 lines) | stat: -rw-r--r-- 3,867 bytes parent folder | download
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)
		}
	}
}