commit be7260a29b81275a2a127d049f6402700b999333
parent 7609d8b6ed1622f4be1cb3b5bd56d5b50e2c8ba1
Author: francoispqt <francois@parquet.ninja>
Date: Sat, 23 Mar 2019 17:18:34 +0800
add tests
Diffstat:
2 files changed, 165 insertions(+), 4 deletions(-)
diff --git a/decode_object_test.go b/decode_object_test.go
@@ -948,6 +948,25 @@ func (o *ObjectNull) NKeys() int {
return 2
}
+type ObjectNullZeroNKeys struct {
+ SubObject *ObjectNullZeroNKeys
+ SubArray *testSliceBools
+}
+
+func (o *ObjectNullZeroNKeys) UnmarshalJSONObject(dec *Decoder, k string) error {
+ switch k {
+ case "subobject":
+ return dec.AddObjectNull(&o.SubObject)
+ case "subarray":
+ return dec.AddArrayNull(&o.SubArray)
+ }
+ return nil
+}
+
+func (o *ObjectNullZeroNKeys) NKeys() int {
+ return 0
+}
+
func TestDecodeObjectNull(t *testing.T) {
t.Run("sub obj should not be nil", func(t *testing.T) {
var o = &ObjectNull{}
@@ -986,6 +1005,40 @@ func TestDecodeObjectNull(t *testing.T) {
},
)
t.Run(
+ "skip data",
+ func(t *testing.T) {
+ var o = &ObjectNull{}
+ var err = UnmarshalJSONObject([]byte(`{
+ "subobject": {
+ "subobject": {},
+ "subarray": [],
+ "subarray": [],
+ "skipped": ""
+ }
+ }`), DecodeObjectFunc(func(dec *Decoder, k string) error {
+ return dec.ObjectNull(&o.SubObject)
+ }))
+ assert.Nil(t, err)
+ assert.NotNil(t, o.SubObject)
+ assert.Nil(t, o.SubArray)
+ },
+ )
+ t.Run(
+ "skip data not child",
+ func(t *testing.T) {
+ var o = &ObjectNull{}
+ var dec = NewDecoder(strings.NewReader(`{
+ "subobject": {},
+ "subarray": [],
+ "subarray": [],
+ "skipped": ""
+ }`))
+ var _, err = dec.decodeObjectNull(&o)
+ assert.Nil(t, err)
+ assert.NotNil(t, o.SubObject)
+ },
+ )
+ t.Run(
"should return an error as type is not ptr",
func(t *testing.T) {
var err = UnmarshalJSONObject([]byte(`{"key":{}}`), DecodeObjectFunc(func(dec *Decoder, k string) error {
@@ -1064,6 +1117,17 @@ func TestDecodeObjectNull(t *testing.T) {
"invalid JSON for object",
func(t *testing.T) {
var o = &ObjectNull{}
+ var err = UnmarshalJSONObject([]byte(`{"subobject":{"subobject":{"a":a}`), DecodeObjectFunc(func(dec *Decoder, k string) error {
+ return dec.ObjectNull(&o.SubObject)
+ }))
+ assert.NotNil(t, err)
+ assert.IsType(t, InvalidJSONError(""), err)
+ },
+ )
+ t.Run(
+ "invalid JSON for object",
+ func(t *testing.T) {
+ var o = &ObjectNull{}
var err = UnmarshalJSONObject([]byte(`{"subobject":{"subobject":a}`), DecodeObjectFunc(func(dec *Decoder, k string) error {
return dec.ObjectNull(&o.SubObject)
}))
@@ -1074,6 +1138,17 @@ func TestDecodeObjectNull(t *testing.T) {
t.Run(
"invalid JSON for object",
func(t *testing.T) {
+ var o = &ObjectNull{}
+ var err = UnmarshalJSONObject([]byte(`{"subobject":{"subobject":{"sub}}`), DecodeObjectFunc(func(dec *Decoder, k string) error {
+ return dec.ObjectNull(&o.SubObject)
+ }))
+ assert.NotNil(t, err)
+ assert.IsType(t, InvalidJSONError(""), err)
+ },
+ )
+ t.Run(
+ "invalid JSON for object",
+ func(t *testing.T) {
var o = &testSliceBools{}
var err = UnmarshalJSONObject([]byte(`{"subobject":a`), DecodeObjectFunc(func(dec *Decoder, k string) error {
return dec.ArrayNull(&o)
@@ -1122,6 +1197,92 @@ func TestDecodeObjectNull(t *testing.T) {
assert.IsType(t, InvalidJSONError(""), err)
},
)
+ t.Run(
+ "zero nkeys, no error, two keys",
+ func(t *testing.T) {
+ var o = &ObjectNullZeroNKeys{}
+ var err = UnmarshalJSONObject([]byte(`{
+ "subobject": {
+ "subobject": {
+ "subobject":{}
+ },
+ "subarray": []
+ }
+ }`), DecodeObjectFunc(func(dec *Decoder, k string) error {
+ return dec.ObjectNull(&o.SubObject)
+ }))
+ assert.Nil(t, err)
+ },
+ )
+ t.Run(
+ "zero nkeys, no error, two keys, skip data",
+ func(t *testing.T) {
+ var o = &ObjectNullZeroNKeys{}
+ var err = UnmarshalJSONObject([]byte(`{
+ "subobject": {
+ "subobject": {
+ "subobject":{}
+ },
+ "subarray": [],
+ "skipped": 1
+ }
+ }`), DecodeObjectFunc(func(dec *Decoder, k string) error {
+ return dec.ObjectNull(&o.SubObject)
+ }))
+ assert.Nil(t, err)
+ },
+ )
+ t.Run(
+ "zero nkeys, error skip data",
+ func(t *testing.T) {
+ var o = &ObjectNullZeroNKeys{}
+ var err = UnmarshalJSONObject([]byte(`{
+ "subobject": {
+ "subobject": {
+ "subobject":{}
+ },
+ "subarray": [],
+ "skippedInvalid": "q
+ }
+ }`), DecodeObjectFunc(func(dec *Decoder, k string) error {
+ return dec.ObjectNull(&o.SubObject)
+ }))
+ assert.NotNil(t, err)
+ assert.IsType(t, InvalidJSONError(""), err)
+ },
+ )
+ t.Run(
+ "zero nkeys, error invalid json in keys",
+ func(t *testing.T) {
+ var o = &ObjectNullZeroNKeys{}
+ var err = UnmarshalJSONObject([]byte(`{
+ "subobject": {
+ "subobj
+ }
+ }`), DecodeObjectFunc(func(dec *Decoder, k string) error {
+ return dec.ObjectNull(&o.SubObject)
+ }))
+ assert.NotNil(t, err)
+ assert.IsType(t, InvalidJSONError(""), err)
+ },
+ )
+ t.Run(
+ "zero nkeys, error invalid json, sub object",
+ func(t *testing.T) {
+ var o = &ObjectNullZeroNKeys{}
+ var err = UnmarshalJSONObject([]byte(`{
+ "subobject": {
+ "subobject": {
+ "subobj
+ }
+ }
+ }`), DecodeObjectFunc(func(dec *Decoder, k string) error {
+ return dec.ObjectNull(&o.SubObject)
+ }))
+ assert.NotNil(t, err)
+ assert.IsType(t, InvalidJSONError(""), err)
+ },
+ )
}
func TestDecodeObjectComplex(t *testing.T) {
diff --git a/decode_sqlnull_test.go b/decode_sqlnull_test.go
@@ -211,13 +211,13 @@ type SQLDecodeObject struct {
func (s *SQLDecodeObject) UnmarshalJSONObject(dec *Decoder, k string) error {
switch k {
case "s":
- return dec.SQLNullString(&s.S)
+ return dec.AddSQLNullString(&s.S)
case "f":
- return dec.SQLNullFloat64(&s.F)
+ return dec.AddSQLNullFloat64(&s.F)
case "i":
- return dec.SQLNullInt64(&s.I)
+ return dec.AddSQLNullInt64(&s.I)
case "b":
- return dec.SQLNullBool(&s.B)
+ return dec.AddSQLNullBool(&s.B)
}
return nil
}