| // 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" | |
| "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 *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 strconv.FormatBool(*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 TestCustomIsBoolFlagGetsNoOptDefaultAutomatically(t *testing.T) { | |
| var tristate triStateValue | |
| f := NewFlagSet("test", ContinueOnError) | |
| tristate = triStateFalse | |
| f.VarPF(&tristate, "tristate", "t", "tristate value (true, maybe or false)") | |
| if err := f.Parse([]string{"--tristate"}); err != nil { | |
| t.Fatal("expected no error; got", err) | |
| } | |
| if tristate != triStateTrue { | |
| t.Fatal("expected", triStateTrue, "(triStateTrue) but got", tristate, "instead") | |
| } | |
| } | |
| func TestCustomIsBoolFlagShortFormGetsNoOptDefaultAutomatically(t *testing.T) { | |
| var tristate triStateValue | |
| f := NewFlagSet("test", ContinueOnError) | |
| tristate = triStateFalse | |
| f.VarPF(&tristate, "tristate", "t", "tristate value (true, maybe or false)") | |
| if err := f.Parse([]string{"-t"}); err != nil { | |
| t.Fatal("expected no error; got", err) | |
| } | |
| if tristate != triStateTrue { | |
| t.Fatal("expected", triStateTrue, "(triStateTrue) 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=%v", *b) | |
| } | |
| if *c != false { | |
| t.Errorf("expect c=false got c=%v", *c) | |
| } | |
| } |