gojay

high performance JSON encoder/decoder with stream API for Golang
git clone git://git.lair.cx/gojay
Log | Files | Refs | README | LICENSE

commit be7260a29b81275a2a127d049f6402700b999333
parent 7609d8b6ed1622f4be1cb3b5bd56d5b50e2c8ba1
Author: francoispqt <francois@parquet.ninja>
Date:   Sat, 23 Mar 2019 17:18:34 +0800

add tests

Diffstat:
Mdecode_object_test.go | 161+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdecode_sqlnull_test.go | 8++++----
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 }