@@ -37,8 +37,7 @@ check_valid_singles(void)
37
37
ASSERT_STR_EQ ("10" , buf );
38
38
39
39
jsonb_init (& b );
40
- ASSERT_EQm (buf ,
41
- JSONB_END , jsonb_string (& b , buf , sizeof (buf ), "hi" , 2 ));
40
+ ASSERT_EQm (buf , JSONB_END , jsonb_string (& b , buf , sizeof (buf ), "hi" , 2 ));
42
41
ASSERT_STR_EQ ("\"hi\"" , buf );
43
42
44
43
jsonb_init (& b );
@@ -61,8 +60,8 @@ check_valid_array(void)
61
60
ASSERT_EQm (buf , JSONB_OK , jsonb_bool (& b , buf , sizeof (buf ), 0 ));
62
61
ASSERT_EQm (buf , JSONB_OK , jsonb_null (& b , buf , sizeof (buf )));
63
62
ASSERT_EQm (buf , JSONB_OK , jsonb_number (& b , buf , sizeof (buf ), 10 ));
64
- ASSERT_EQm (buf ,
65
- JSONB_OK , jsonb_string (& b , buf , sizeof (buf ), "foo" , 3 ));
63
+ ASSERT_EQm (buf , JSONB_OK ,
64
+ jsonb_string (& b , buf , sizeof (buf ), "foo" , 3 ));
66
65
ASSERT_EQm (buf , JSONB_OK , jsonb_object (& b , buf , sizeof (buf )));
67
66
ASSERT_EQm (buf , JSONB_OK , jsonb_object_pop (& b , buf , sizeof (buf )));
68
67
ASSERT_EQm (buf , JSONB_END , jsonb_array_pop (& b , buf , sizeof (buf )));
@@ -91,8 +90,8 @@ check_valid_object(void)
91
90
ASSERT_EQm (buf , JSONB_OK , jsonb_key (& b , buf , sizeof (buf ), "d" , 1 ));
92
91
ASSERT_EQm (buf , JSONB_OK , jsonb_number (& b , buf , sizeof (buf ), 10 ));
93
92
ASSERT_EQm (buf , JSONB_OK , jsonb_key (& b , buf , sizeof (buf ), "e" , 1 ));
94
- ASSERT_EQm (buf ,
95
- JSONB_OK , jsonb_string (& b , buf , sizeof (buf ), "foo" , 3 ));
93
+ ASSERT_EQm (buf , JSONB_OK ,
94
+ jsonb_string (& b , buf , sizeof (buf ), "foo" , 3 ));
96
95
ASSERT_EQm (buf , JSONB_OK , jsonb_key (& b , buf , sizeof (buf ), "f" , 1 ));
97
96
ASSERT_EQm (buf , JSONB_OK , jsonb_array (& b , buf , sizeof (buf )));
98
97
ASSERT_EQm (buf , JSONB_OK , jsonb_array_pop (& b , buf , sizeof (buf )));
@@ -161,8 +160,7 @@ check_deep_nesting_object_and_array(void)
161
160
for (i = 0 ; i < JSONB_MAX_DEPTH ; ++ i ) {
162
161
if (i % 2 == 0 ) {
163
162
ASSERT_EQm (buf , JSONB_OK , jsonb_object (& b , buf , sizeof (buf )));
164
- ASSERT_EQm (buf ,
165
- JSONB_OK , jsonb_key (& b , buf , sizeof (buf ), "a" , 1 ));
163
+ ASSERT_EQm (buf , JSONB_OK , jsonb_key (& b , buf , sizeof (buf ), "a" , 1 ));
166
164
}
167
165
else {
168
166
ASSERT_EQm (buf , JSONB_OK , jsonb_array (& b , buf , sizeof (buf )));
@@ -173,21 +171,21 @@ check_deep_nesting_object_and_array(void)
173
171
ASSERT_EQm (buf , JSONB_OK , jsonb_null (& b , buf , sizeof (buf )));
174
172
for (i = 0 ; i < JSONB_MAX_DEPTH - 1 ; ++ i ) {
175
173
if (i % 2 == 0 )
176
- ASSERT_EQm (buf ,
177
- JSONB_OK , jsonb_object_pop (& b , buf , sizeof (buf )));
174
+ ASSERT_EQm (buf , JSONB_OK ,
175
+ jsonb_object_pop (& b , buf , sizeof (buf )));
178
176
else
179
- ASSERT_EQm (buf ,
180
- JSONB_OK , jsonb_array_pop (& b , buf , sizeof (buf )));
177
+ ASSERT_EQm (buf , JSONB_OK ,
178
+ jsonb_array_pop (& b , buf , sizeof (buf )));
181
179
}
182
180
}
183
181
else {
184
182
for (i = 0 ; i < JSONB_MAX_DEPTH - 1 ; ++ i ) {
185
183
if (i % 2 == 0 )
186
- ASSERT_EQm (buf ,
187
- JSONB_OK , jsonb_array_pop (& b , buf , sizeof (buf )));
184
+ ASSERT_EQm (buf , JSONB_OK ,
185
+ jsonb_array_pop (& b , buf , sizeof (buf )));
188
186
else
189
- ASSERT_EQm (buf ,
190
- JSONB_OK , jsonb_object_pop (& b , buf , sizeof (buf )));
187
+ ASSERT_EQm (buf , JSONB_OK ,
188
+ jsonb_object_pop (& b , buf , sizeof (buf )));
191
189
}
192
190
}
193
191
ASSERT_EQm (buf , JSONB_END , jsonb_object_pop (& b , buf , sizeof (buf )));
@@ -222,18 +220,94 @@ check_string_escaping(void)
222
220
for (i = 0 ; i < sizeof (strs ) / sizeof (char * ); ++ i ) {
223
221
size_t len = strlen (strs [i ]);
224
222
size_t prev_pos = b .pos ;
225
- ASSERT_GTEm (buf ,
226
- jsonb_string (& b , buf , sizeof (buf ), strs [i ], len ), 0 );
223
+ ASSERT_GTEm (buf , jsonb_string (& b , buf , sizeof (buf ), strs [i ], len ), 0 );
227
224
ASSERT_STR_EQ (expect [i ], buf + prev_pos );
228
225
}
229
226
ASSERT_EQm (buf , JSONB_END , jsonb_array_pop (& b , buf , sizeof (buf )));
230
227
231
228
PASS ();
232
229
}
233
230
231
+ TEST
232
+ check_string_streaming (void )
233
+ {
234
+ const char expect [] =
235
+ "{\"foo\":null,\"bar\":0,\"baz\":\"\",\"tuna\":{},\"spam\":[]}" ;
236
+ char buf [10 ] = { 0 }, dest [1024 ] = { 0 };
237
+ enum jsonbcode code ;
238
+ int k ;
239
+ jsonb b ;
240
+
241
+ jsonb_init (& b );
242
+ /* 1 < 10 : '{' */
243
+ ASSERT_EQ (JSONB_OK , jsonb_object (& b , buf , sizeof (buf )));
244
+ /* 7 < 10 : '{"foo":' */
245
+ ASSERT_EQ (JSONB_OK , jsonb_key (& b , buf , sizeof (buf ), "foo" , 3 ));
246
+ /* 11 > 10: '{"foo":null' */
247
+ for (k = 0 ; (code = jsonb_null (& b , buf , sizeof (buf ))); k = 1 ) {
248
+ ASSERT_EQm ("token can't fit alone in buffer" , 0 , k );
249
+ ASSERT_EQ (JSONB_ERROR_NOMEM , code );
250
+ strcat (dest , buf );
251
+ jsonb_reset (& b );
252
+ }
253
+ /* 10 == 10 : 'null,"bar":' */
254
+ for (k = 0 ; (code = jsonb_key (& b , buf , sizeof (buf ), "bar" , 3 )); k = 1 ) {
255
+ ASSERT_EQm ("token can't fit alone in buffer" , 0 , k );
256
+ ASSERT_EQ (JSONB_ERROR_NOMEM , code );
257
+ strcat (dest , buf );
258
+ jsonb_reset (& b );
259
+ }
260
+ /* 8 < 10 : ',"bar":0' */
261
+ ASSERT_EQ (JSONB_OK , jsonb_number (& b , buf , sizeof (buf ), 0 ));
262
+ /* 15 > 10 : ',"bar":0,"baz":' */
263
+ for (k = 0 ; (code = jsonb_key (& b , buf , sizeof (buf ), "baz" , 3 )); k = 1 ) {
264
+ ASSERT_EQm ("token can't fit alone in buffer" , 0 , k );
265
+ ASSERT_EQ (JSONB_ERROR_NOMEM , code );
266
+ strcat (dest , buf );
267
+ jsonb_reset (& b );
268
+ }
269
+ /* 9 < 10 : ',"baz":""' */
270
+ ASSERT_EQ (JSONB_OK , jsonb_string (& b , buf , sizeof (buf ), "" , 0 ));
271
+ /* 17 > 10 : ',"baz":"","tuna":' */
272
+ for (k = 0 ; (code = jsonb_key (& b , buf , sizeof (buf ), "tuna" , 4 )); k = 1 ) {
273
+ ASSERT_EQm ("token can't fit alone in buffer" , 0 , k );
274
+ ASSERT_EQ (JSONB_ERROR_NOMEM , code );
275
+ strcat (dest , buf );
276
+ jsonb_reset (& b );
277
+ }
278
+ /* 9 < 10 : ',"tuna":{' */
279
+ ASSERT_EQ (JSONB_OK , jsonb_object (& b , buf , sizeof (buf )));
280
+ /* 10 == 10 : ',"tuna":{}' */
281
+ for (k = 0 ; (code = jsonb_object_pop (& b , buf , sizeof (buf ))); k = 1 ) {
282
+ ASSERT_EQm ("token can't fit alone in buffer" , 0 , k );
283
+ ASSERT_EQ (JSONB_ERROR_NOMEM , code );
284
+ strcat (dest , buf );
285
+ jsonb_reset (& b );
286
+ }
287
+ /* 9 < 10 : '},"spam":' */
288
+ ASSERT_EQ (JSONB_OK , jsonb_key (& b , buf , sizeof (buf ), "spam" , 4 ));
289
+ /* 10 == 10 : '},"spam":[' */
290
+ for (k = 0 ; (code = jsonb_array (& b , buf , sizeof (buf ))); k = 1 ) {
291
+ ASSERT_EQm ("token can't fit alone in buffer" , 0 , k );
292
+ ASSERT_EQ (JSONB_ERROR_NOMEM , code );
293
+ strcat (dest , buf );
294
+ jsonb_reset (& b );
295
+ }
296
+ /* 2 < 10 : '[]' */
297
+ ASSERT_EQ (JSONB_OK , jsonb_array_pop (& b , buf , sizeof (buf )));
298
+ /* 3 < 10 : '[]}' */
299
+ ASSERT_EQ (JSONB_END , jsonb_object_pop (& b , buf , sizeof (buf )));
300
+ strcat (dest , buf );
301
+
302
+ ASSERT_STR_EQ (expect , dest );
303
+
304
+ PASS ();
305
+ }
306
+
234
307
SUITE (string )
235
308
{
236
309
RUN_TEST (check_string_escaping );
310
+ RUN_TEST (check_string_streaming );
237
311
}
238
312
239
313
TEST
@@ -244,8 +318,7 @@ check_invalid_top_level_tokens_in_sequence(void)
244
318
245
319
jsonb_init (& b );
246
320
jsonb_bool (& b , buf , sizeof (buf ), 1 );
247
- ASSERT_EQm (buf ,
248
- JSONB_ERROR_INPUT , jsonb_bool (& b , buf , sizeof (buf ), 0 ));
321
+ ASSERT_EQm (buf , JSONB_ERROR_INPUT , jsonb_bool (& b , buf , sizeof (buf ), 0 ));
249
322
250
323
jsonb_init (& b );
251
324
jsonb_array (& b , buf , sizeof (buf ));
@@ -255,17 +328,16 @@ check_invalid_top_level_tokens_in_sequence(void)
255
328
jsonb_init (& b );
256
329
jsonb_array (& b , buf , sizeof (buf ));
257
330
jsonb_array_pop (& b , buf , sizeof (buf ));
258
- ASSERT_EQm (buf ,
259
- JSONB_ERROR_INPUT , jsonb_bool (& b , buf , sizeof (buf ), 1 ));
331
+ ASSERT_EQm (buf , JSONB_ERROR_INPUT , jsonb_bool (& b , buf , sizeof (buf ), 1 ));
260
332
261
333
jsonb_init (& b );
262
334
jsonb_bool (& b , buf , sizeof (buf ), 1 );
263
335
ASSERT_EQm (buf , JSONB_ERROR_INPUT , jsonb_array (& b , buf , sizeof (buf )));
264
336
265
337
jsonb_init (& b );
266
338
jsonb_bool (& b , buf , sizeof (buf ), 1 );
267
- ASSERT_EQm (buf ,
268
- JSONB_ERROR_INPUT , jsonb_string (& b , buf , sizeof (buf ), "" , 0 ));
339
+ ASSERT_EQm (buf , JSONB_ERROR_INPUT ,
340
+ jsonb_string (& b , buf , sizeof (buf ), "" , 0 ));
269
341
270
342
PASS ();
271
343
}
0 commit comments