package flags import ( "fmt" "testing" ) type marshalled string func (m *marshalled) UnmarshalFlag(value string) error { if value == "yes" { *m = "true" } else if value == "no" { *m = "false" } else { return fmt.Errorf("`%s' is not a valid value, please specify `yes' or `no'", value) } return nil } func (m marshalled) MarshalFlag() (string, error) { if m == "true" { return "yes", nil } return "no", nil } type marshalledError bool func (m marshalledError) MarshalFlag() (string, error) { return "", newErrorf(ErrMarshal, "Failed to marshal") } func TestUnmarshal(t *testing.T) { var opts = struct { Value marshalled `short:"v"` }{} ret := assertParseSuccess(t, &opts, "-v=yes") assertStringArray(t, ret, []string{}) if opts.Value != "true" { t.Errorf("Expected Value to be \"true\"") } } func TestUnmarshalDefault(t *testing.T) { var opts = struct { Value marshalled `short:"v" default:"yes"` }{} ret := assertParseSuccess(t, &opts) assertStringArray(t, ret, []string{}) if opts.Value != "true" { t.Errorf("Expected Value to be \"true\"") } } func TestUnmarshalOptional(t *testing.T) { var opts = struct { Value marshalled `short:"v" optional:"yes" optional-value:"yes"` }{} ret := assertParseSuccess(t, &opts, "-v") assertStringArray(t, ret, []string{}) if opts.Value != "true" { t.Errorf("Expected Value to be \"true\"") } } func TestUnmarshalError(t *testing.T) { var opts = struct { Value marshalled `short:"v"` }{} assertParseFail(t, ErrMarshal, fmt.Sprintf("invalid argument for flag `%cv' (expected flags.marshalled): `invalid' is not a valid value, please specify `yes' or `no'", defaultShortOptDelimiter), &opts, "-vinvalid") } func TestUnmarshalPositionalError(t *testing.T) { var opts = struct { Args struct { Value marshalled } `positional-args:"yes"` }{} parser := NewParser(&opts, Default&^PrintErrors) _, err := parser.ParseArgs([]string{"invalid"}) msg := "`invalid' is not a valid value, please specify `yes' or `no'" if err == nil { assertFatalf(t, "Expected error: %s", msg) return } if err.Error() != msg { assertErrorf(t, "Expected error message %#v, but got %#v", msg, err.Error()) } } func TestMarshalError(t *testing.T) { var opts = struct { Value marshalledError `short:"v"` }{} p := NewParser(&opts, Default) o := p.Command.Groups()[0].Options()[0] _, err := convertToString(o.value, o.tag) assertError(t, err, ErrMarshal, "Failed to marshal") }