mirror of
https://github.com/restic/restic.git
synced 2026-02-18 18:18:18 -05:00
119 lines
2.4 KiB
Go
119 lines
2.4 KiB
Go
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")
|
|
}
|