diff options
| author | Alex Flint <[email protected]> | 2022-10-29 12:29:07 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-10-29 12:29:07 -0700 |
| commit | 727f8533acca70ca429dce4bfea729a6af75c3f7 (patch) | |
| tree | 4f09f68ab87dbff2f2a40edc15ba85d38a8119be /parse_test.go | |
| parent | dbc2ba5d0c9a6a439d1f825f8c299fb276bbc911 (diff) | |
| parent | 3489ea5b2e9aa82dab4efc5e3f48fe6171f11ddd (diff) | |
Merge pull request #185 from alexflint/default-value-issue
Do not turn values intro strings and then back into values when processing default values
Diffstat (limited to 'parse_test.go')
| -rw-r--r-- | parse_test.go | 102 |
1 files changed, 92 insertions, 10 deletions
diff --git a/parse_test.go b/parse_test.go index 7e84def..5d38306 100644 --- a/parse_test.go +++ b/parse_test.go @@ -2,6 +2,7 @@ package arg import ( "bytes" + "encoding/json" "fmt" "net" "net/mail" @@ -1396,13 +1397,21 @@ func TestDefaultOptionValues(t *testing.T) { require.NoError(t, err) assert.Equal(t, 123, args.A) - assert.Equal(t, 123, *args.B) + if assert.NotNil(t, args.B) { + assert.Equal(t, 123, *args.B) + } assert.Equal(t, "xyz", args.C) - assert.Equal(t, "abc", *args.D) + if assert.NotNil(t, args.D) { + assert.Equal(t, "abc", *args.D) + } assert.Equal(t, 4.56, args.E) - assert.Equal(t, 1.23, *args.F) - assert.True(t, args.G) + if assert.NotNil(t, args.F) { + assert.Equal(t, 1.23, *args.F) + } assert.True(t, args.G) + if assert.NotNil(t, args.H) { + assert.True(t, *args.H) + } } func TestDefaultUnparseable(t *testing.T) { @@ -1411,7 +1420,7 @@ func TestDefaultUnparseable(t *testing.T) { } err := parse("", &args) - assert.EqualError(t, err, `error processing default value for --a: strconv.ParseInt: parsing "x": invalid syntax`) + assert.EqualError(t, err, `.A: error processing default value: strconv.ParseInt: parsing "x": invalid syntax`) } func TestDefaultPositionalValues(t *testing.T) { @@ -1430,13 +1439,21 @@ func TestDefaultPositionalValues(t *testing.T) { require.NoError(t, err) assert.Equal(t, 456, args.A) - assert.Equal(t, 789, *args.B) + if assert.NotNil(t, args.B) { + assert.Equal(t, 789, *args.B) + } assert.Equal(t, "abc", args.C) - assert.Equal(t, "abc", *args.D) + if assert.NotNil(t, args.D) { + assert.Equal(t, "abc", *args.D) + } assert.Equal(t, 1.23, args.E) - assert.Equal(t, 1.23, *args.F) - assert.True(t, args.G) + if assert.NotNil(t, args.F) { + assert.Equal(t, 1.23, *args.F) + } assert.True(t, args.G) + if assert.NotNil(t, args.H) { + assert.True(t, *args.H) + } } func TestDefaultValuesNotAllowedWithRequired(t *testing.T) { @@ -1450,7 +1467,7 @@ func TestDefaultValuesNotAllowedWithRequired(t *testing.T) { func TestDefaultValuesNotAllowedWithSlice(t *testing.T) { var args struct { - A []int `default:"123"` // required not allowed with default! + A []int `default:"invalid"` // default values not allowed with slices } err := parse("", &args) @@ -1532,3 +1549,68 @@ func TestMustParsePrintsVersion(t *testing.T) { assert.Equal(t, 0, *exitCode) assert.Equal(t, "example 3.2.1\n", b.String()) } + +type mapWithUnmarshalText struct { + val map[string]string +} + +func (v *mapWithUnmarshalText) UnmarshalText(data []byte) error { + return json.Unmarshal(data, &v.val) +} + +func TestTextUnmarshalerEmpty(t *testing.T) { + // based on https://github.com/alexflint/go-arg/issues/184 + var args struct { + Config mapWithUnmarshalText `arg:"--config"` + } + + err := parse("", &args) + require.NoError(t, err) + assert.Empty(t, args.Config) +} + +func TestTextUnmarshalerEmptyPointer(t *testing.T) { + // a slight variant on https://github.com/alexflint/go-arg/issues/184 + var args struct { + Config *mapWithUnmarshalText `arg:"--config"` + } + + err := parse("", &args) + require.NoError(t, err) + assert.Nil(t, args.Config) +} + +// similar to the above but also implements MarshalText +type mapWithMarshalText struct { + val map[string]string +} + +func (v *mapWithMarshalText) MarshalText(data []byte) error { + return json.Unmarshal(data, &v.val) +} + +func (v *mapWithMarshalText) UnmarshalText(data []byte) error { + return json.Unmarshal(data, &v.val) +} + +func TestTextMarshalerUnmarshalerEmpty(t *testing.T) { + // based on https://github.com/alexflint/go-arg/issues/184 + var args struct { + Config mapWithMarshalText `arg:"--config"` + } + + err := parse("", &args) + require.NoError(t, err) + assert.Empty(t, args.Config) +} + +func TestTextMarshalerUnmarshalerEmptyPointer(t *testing.T) { + // a slight variant on https://github.com/alexflint/go-arg/issues/184 + var args struct { + Config *mapWithMarshalText `arg:"--config"` + } + + err := parse("", &args) + require.NoError(t, err) + assert.Nil(t, args.Config) +} |
