@@ -948,6 +948,25 @@ func (o *ObjectNull) NKeys() int {
948
948
return 2
949
949
}
950
950
951
+ type ObjectNullZeroNKeys struct {
952
+ SubObject * ObjectNullZeroNKeys
953
+ SubArray * testSliceBools
954
+ }
955
+
956
+ func (o * ObjectNullZeroNKeys ) UnmarshalJSONObject (dec * Decoder , k string ) error {
957
+ switch k {
958
+ case "subobject" :
959
+ return dec .AddObjectNull (& o .SubObject )
960
+ case "subarray" :
961
+ return dec .AddArrayNull (& o .SubArray )
962
+ }
963
+ return nil
964
+ }
965
+
966
+ func (o * ObjectNullZeroNKeys ) NKeys () int {
967
+ return 0
968
+ }
969
+
951
970
func TestDecodeObjectNull (t * testing.T ) {
952
971
t .Run ("sub obj should not be nil" , func (t * testing.T ) {
953
972
var o = & ObjectNull {}
@@ -985,6 +1004,40 @@ func TestDecodeObjectNull(t *testing.T) {
985
1004
assert .Nil (t , o .SubObject )
986
1005
},
987
1006
)
1007
+ t .Run (
1008
+ "skip data" ,
1009
+ func (t * testing.T ) {
1010
+ var o = & ObjectNull {}
1011
+ var err = UnmarshalJSONObject ([]byte (`{
1012
+ "subobject": {
1013
+ "subobject": {},
1014
+ "subarray": [],
1015
+ "subarray": [],
1016
+ "skipped": ""
1017
+ }
1018
+ }` ), DecodeObjectFunc (func (dec * Decoder , k string ) error {
1019
+ return dec .ObjectNull (& o .SubObject )
1020
+ }))
1021
+ assert .Nil (t , err )
1022
+ assert .NotNil (t , o .SubObject )
1023
+ assert .Nil (t , o .SubArray )
1024
+ },
1025
+ )
1026
+ t .Run (
1027
+ "skip data not child" ,
1028
+ func (t * testing.T ) {
1029
+ var o = & ObjectNull {}
1030
+ var dec = NewDecoder (strings .NewReader (`{
1031
+ "subobject": {},
1032
+ "subarray": [],
1033
+ "subarray": [],
1034
+ "skipped": ""
1035
+ }` ))
1036
+ var _ , err = dec .decodeObjectNull (& o )
1037
+ assert .Nil (t , err )
1038
+ assert .NotNil (t , o .SubObject )
1039
+ },
1040
+ )
988
1041
t .Run (
989
1042
"should return an error as type is not ptr" ,
990
1043
func (t * testing.T ) {
@@ -1060,6 +1113,17 @@ func TestDecodeObjectNull(t *testing.T) {
1060
1113
assert .IsType (t , InvalidUnmarshalError ("" ), err )
1061
1114
},
1062
1115
)
1116
+ t .Run (
1117
+ "invalid JSON for object" ,
1118
+ func (t * testing.T ) {
1119
+ var o = & ObjectNull {}
1120
+ var err = UnmarshalJSONObject ([]byte (`{"subobject":{"subobject":{"a":a}` ), DecodeObjectFunc (func (dec * Decoder , k string ) error {
1121
+ return dec .ObjectNull (& o .SubObject )
1122
+ }))
1123
+ assert .NotNil (t , err )
1124
+ assert .IsType (t , InvalidJSONError ("" ), err )
1125
+ },
1126
+ )
1063
1127
t .Run (
1064
1128
"invalid JSON for object" ,
1065
1129
func (t * testing.T ) {
@@ -1071,6 +1135,17 @@ func TestDecodeObjectNull(t *testing.T) {
1071
1135
assert .IsType (t , InvalidJSONError ("" ), err )
1072
1136
},
1073
1137
)
1138
+ t .Run (
1139
+ "invalid JSON for object" ,
1140
+ func (t * testing.T ) {
1141
+ var o = & ObjectNull {}
1142
+ var err = UnmarshalJSONObject ([]byte (`{"subobject":{"subobject":{"sub}}` ), DecodeObjectFunc (func (dec * Decoder , k string ) error {
1143
+ return dec .ObjectNull (& o .SubObject )
1144
+ }))
1145
+ assert .NotNil (t , err )
1146
+ assert .IsType (t , InvalidJSONError ("" ), err )
1147
+ },
1148
+ )
1074
1149
t .Run (
1075
1150
"invalid JSON for object" ,
1076
1151
func (t * testing.T ) {
@@ -1122,6 +1197,92 @@ func TestDecodeObjectNull(t *testing.T) {
1122
1197
assert .IsType (t , InvalidJSONError ("" ), err )
1123
1198
},
1124
1199
)
1200
+ t .Run (
1201
+ "zero nkeys, no error, two keys" ,
1202
+ func (t * testing.T ) {
1203
+ var o = & ObjectNullZeroNKeys {}
1204
+ var err = UnmarshalJSONObject ([]byte (`{
1205
+ "subobject": {
1206
+ "subobject": {
1207
+ "subobject":{}
1208
+ },
1209
+ "subarray": []
1210
+ }
1211
+ }` ), DecodeObjectFunc (func (dec * Decoder , k string ) error {
1212
+ return dec .ObjectNull (& o .SubObject )
1213
+ }))
1214
+ assert .Nil (t , err )
1215
+ },
1216
+ )
1217
+ t .Run (
1218
+ "zero nkeys, no error, two keys, skip data" ,
1219
+ func (t * testing.T ) {
1220
+ var o = & ObjectNullZeroNKeys {}
1221
+ var err = UnmarshalJSONObject ([]byte (`{
1222
+ "subobject": {
1223
+ "subobject": {
1224
+ "subobject":{}
1225
+ },
1226
+ "subarray": [],
1227
+ "skipped": 1
1228
+ }
1229
+ }` ), DecodeObjectFunc (func (dec * Decoder , k string ) error {
1230
+ return dec .ObjectNull (& o .SubObject )
1231
+ }))
1232
+ assert .Nil (t , err )
1233
+ },
1234
+ )
1235
+ t .Run (
1236
+ "zero nkeys, error skip data" ,
1237
+ func (t * testing.T ) {
1238
+ var o = & ObjectNullZeroNKeys {}
1239
+ var err = UnmarshalJSONObject ([]byte (`{
1240
+ "subobject": {
1241
+ "subobject": {
1242
+ "subobject":{}
1243
+ },
1244
+ "subarray": [],
1245
+ "skippedInvalid": "q
1246
+ }
1247
+ }` ), DecodeObjectFunc (func (dec * Decoder , k string ) error {
1248
+ return dec .ObjectNull (& o .SubObject )
1249
+ }))
1250
+ assert .NotNil (t , err )
1251
+ assert .IsType (t , InvalidJSONError ("" ), err )
1252
+ },
1253
+ )
1254
+ t .Run (
1255
+ "zero nkeys, error invalid json in keys" ,
1256
+ func (t * testing.T ) {
1257
+ var o = & ObjectNullZeroNKeys {}
1258
+ var err = UnmarshalJSONObject ([]byte (`{
1259
+ "subobject": {
1260
+ "subobj
1261
+ }
1262
+ }` ), DecodeObjectFunc (func (dec * Decoder , k string ) error {
1263
+ return dec .ObjectNull (& o .SubObject )
1264
+ }))
1265
+ assert .NotNil (t , err )
1266
+ assert .IsType (t , InvalidJSONError ("" ), err )
1267
+ },
1268
+ )
1269
+ t .Run (
1270
+ "zero nkeys, error invalid json, sub object" ,
1271
+ func (t * testing.T ) {
1272
+ var o = & ObjectNullZeroNKeys {}
1273
+ var err = UnmarshalJSONObject ([]byte (`{
1274
+ "subobject": {
1275
+ "subobject": {
1276
+ "subobj
1277
+ }
1278
+ }
1279
+ }` ), DecodeObjectFunc (func (dec * Decoder , k string ) error {
1280
+ return dec .ObjectNull (& o .SubObject )
1281
+ }))
1282
+ assert .NotNil (t , err )
1283
+ assert .IsType (t , InvalidJSONError ("" ), err )
1284
+ },
1285
+ )
1125
1286
}
1126
1287
1127
1288
func TestDecodeObjectComplex (t * testing.T ) {
0 commit comments