mirror of https://github.com/dexidp/dex.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
4.4 KiB
180 lines
4.4 KiB
// 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 ( |
|
"bytes" |
|
"fmt" |
|
"strconv" |
|
"testing" |
|
) |
|
|
|
// This value can be a boolean ("true", "false") or "maybe" |
|
type triStateValue int |
|
|
|
const ( |
|
triStateFalse triStateValue = 0 |
|
triStateTrue triStateValue = 1 |
|
triStateMaybe triStateValue = 2 |
|
) |
|
|
|
const strTriStateMaybe = "maybe" |
|
|
|
func (v *triStateValue) IsBoolFlag() bool { |
|
return true |
|
} |
|
|
|
func (v *triStateValue) Get() interface{} { |
|
return triStateValue(*v) |
|
} |
|
|
|
func (v *triStateValue) Set(s string) error { |
|
if s == strTriStateMaybe { |
|
*v = triStateMaybe |
|
return nil |
|
} |
|
boolVal, err := strconv.ParseBool(s) |
|
if boolVal { |
|
*v = triStateTrue |
|
} else { |
|
*v = triStateFalse |
|
} |
|
return err |
|
} |
|
|
|
func (v *triStateValue) String() string { |
|
if *v == triStateMaybe { |
|
return strTriStateMaybe |
|
} |
|
return fmt.Sprintf("%v", bool(*v == triStateTrue)) |
|
} |
|
|
|
// The type of the flag as required by the pflag.Value interface |
|
func (v *triStateValue) Type() string { |
|
return "version" |
|
} |
|
|
|
func setUpFlagSet(tristate *triStateValue) *FlagSet { |
|
f := NewFlagSet("test", ContinueOnError) |
|
*tristate = triStateFalse |
|
flag := f.VarPF(tristate, "tristate", "t", "tristate value (true, maybe or false)") |
|
flag.NoOptDefVal = "true" |
|
return f |
|
} |
|
|
|
func TestExplicitTrue(t *testing.T) { |
|
var tristate triStateValue |
|
f := setUpFlagSet(&tristate) |
|
err := f.Parse([]string{"--tristate=true"}) |
|
if err != nil { |
|
t.Fatal("expected no error; got", err) |
|
} |
|
if tristate != triStateTrue { |
|
t.Fatal("expected", triStateTrue, "(triStateTrue) but got", tristate, "instead") |
|
} |
|
} |
|
|
|
func TestImplicitTrue(t *testing.T) { |
|
var tristate triStateValue |
|
f := setUpFlagSet(&tristate) |
|
err := f.Parse([]string{"--tristate"}) |
|
if err != nil { |
|
t.Fatal("expected no error; got", err) |
|
} |
|
if tristate != triStateTrue { |
|
t.Fatal("expected", triStateTrue, "(triStateTrue) but got", tristate, "instead") |
|
} |
|
} |
|
|
|
func TestShortFlag(t *testing.T) { |
|
var tristate triStateValue |
|
f := setUpFlagSet(&tristate) |
|
err := f.Parse([]string{"-t"}) |
|
if err != nil { |
|
t.Fatal("expected no error; got", err) |
|
} |
|
if tristate != triStateTrue { |
|
t.Fatal("expected", triStateTrue, "(triStateTrue) but got", tristate, "instead") |
|
} |
|
} |
|
|
|
func TestShortFlagExtraArgument(t *testing.T) { |
|
var tristate triStateValue |
|
f := setUpFlagSet(&tristate) |
|
// The"maybe"turns into an arg, since short boolean options will only do true/false |
|
err := f.Parse([]string{"-t", "maybe"}) |
|
if err != nil { |
|
t.Fatal("expected no error; got", err) |
|
} |
|
if tristate != triStateTrue { |
|
t.Fatal("expected", triStateTrue, "(triStateTrue) but got", tristate, "instead") |
|
} |
|
args := f.Args() |
|
if len(args) != 1 || args[0] != "maybe" { |
|
t.Fatal("expected an extra 'maybe' argument to stick around") |
|
} |
|
} |
|
|
|
func TestExplicitMaybe(t *testing.T) { |
|
var tristate triStateValue |
|
f := setUpFlagSet(&tristate) |
|
err := f.Parse([]string{"--tristate=maybe"}) |
|
if err != nil { |
|
t.Fatal("expected no error; got", err) |
|
} |
|
if tristate != triStateMaybe { |
|
t.Fatal("expected", triStateMaybe, "(triStateMaybe) but got", tristate, "instead") |
|
} |
|
} |
|
|
|
func TestExplicitFalse(t *testing.T) { |
|
var tristate triStateValue |
|
f := setUpFlagSet(&tristate) |
|
err := f.Parse([]string{"--tristate=false"}) |
|
if err != nil { |
|
t.Fatal("expected no error; got", err) |
|
} |
|
if tristate != triStateFalse { |
|
t.Fatal("expected", triStateFalse, "(triStateFalse) but got", tristate, "instead") |
|
} |
|
} |
|
|
|
func TestImplicitFalse(t *testing.T) { |
|
var tristate triStateValue |
|
f := setUpFlagSet(&tristate) |
|
err := f.Parse([]string{}) |
|
if err != nil { |
|
t.Fatal("expected no error; got", err) |
|
} |
|
if tristate != triStateFalse { |
|
t.Fatal("expected", triStateFalse, "(triStateFalse) but got", tristate, "instead") |
|
} |
|
} |
|
|
|
func TestInvalidValue(t *testing.T) { |
|
var tristate triStateValue |
|
f := setUpFlagSet(&tristate) |
|
var buf bytes.Buffer |
|
f.SetOutput(&buf) |
|
err := f.Parse([]string{"--tristate=invalid"}) |
|
if err == nil { |
|
t.Fatal("expected an error but did not get any, tristate has value", tristate) |
|
} |
|
} |
|
|
|
func TestBoolP(t *testing.T) { |
|
b := BoolP("bool", "b", false, "bool value in CommandLine") |
|
c := BoolP("c", "c", false, "other bool value") |
|
args := []string{"--bool"} |
|
if err := CommandLine.Parse(args); err != nil { |
|
t.Error("expected no error, got ", err) |
|
} |
|
if *b != true { |
|
t.Errorf("expected b=true got b=%s", b) |
|
} |
|
if *c != false { |
|
t.Errorf("expect c=false got c=%s", c) |
|
} |
|
}
|
|
|