@@ -37,8 +37,7 @@ check_valid_singles(void)
3737 ASSERT_STR_EQ ("10" , buf );
3838
3939 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 ));
4241 ASSERT_STR_EQ ("\"hi\"" , buf );
4342
4443 jsonb_init (& b );
@@ -61,8 +60,8 @@ check_valid_array(void)
6160 ASSERT_EQm (buf , JSONB_OK , jsonb_bool (& b , buf , sizeof (buf ), 0 ));
6261 ASSERT_EQm (buf , JSONB_OK , jsonb_null (& b , buf , sizeof (buf )));
6362 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 ));
6665 ASSERT_EQm (buf , JSONB_OK , jsonb_object (& b , buf , sizeof (buf )));
6766 ASSERT_EQm (buf , JSONB_OK , jsonb_object_pop (& b , buf , sizeof (buf )));
6867 ASSERT_EQm (buf , JSONB_END , jsonb_array_pop (& b , buf , sizeof (buf )));
@@ -91,8 +90,8 @@ check_valid_object(void)
9190 ASSERT_EQm (buf , JSONB_OK , jsonb_key (& b , buf , sizeof (buf ), "d" , 1 ));
9291 ASSERT_EQm (buf , JSONB_OK , jsonb_number (& b , buf , sizeof (buf ), 10 ));
9392 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 ));
9695 ASSERT_EQm (buf , JSONB_OK , jsonb_key (& b , buf , sizeof (buf ), "f" , 1 ));
9796 ASSERT_EQm (buf , JSONB_OK , jsonb_array (& b , buf , sizeof (buf )));
9897 ASSERT_EQm (buf , JSONB_OK , jsonb_array_pop (& b , buf , sizeof (buf )));
@@ -161,8 +160,7 @@ check_deep_nesting_object_and_array(void)
161160 for (i = 0 ; i < JSONB_MAX_DEPTH ; ++ i ) {
162161 if (i % 2 == 0 ) {
163162 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 ));
166164 }
167165 else {
168166 ASSERT_EQm (buf , JSONB_OK , jsonb_array (& b , buf , sizeof (buf )));
@@ -173,21 +171,21 @@ check_deep_nesting_object_and_array(void)
173171 ASSERT_EQm (buf , JSONB_OK , jsonb_null (& b , buf , sizeof (buf )));
174172 for (i = 0 ; i < JSONB_MAX_DEPTH - 1 ; ++ i ) {
175173 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 )));
178176 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 )));
181179 }
182180 }
183181 else {
184182 for (i = 0 ; i < JSONB_MAX_DEPTH - 1 ; ++ i ) {
185183 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 )));
188186 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 )));
191189 }
192190 }
193191 ASSERT_EQm (buf , JSONB_END , jsonb_object_pop (& b , buf , sizeof (buf )));
@@ -222,18 +220,94 @@ check_string_escaping(void)
222220 for (i = 0 ; i < sizeof (strs ) / sizeof (char * ); ++ i ) {
223221 size_t len = strlen (strs [i ]);
224222 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 );
227224 ASSERT_STR_EQ (expect [i ], buf + prev_pos );
228225 }
229226 ASSERT_EQm (buf , JSONB_END , jsonb_array_pop (& b , buf , sizeof (buf )));
230227
231228 PASS ();
232229}
233230
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+
234307SUITE (string )
235308{
236309 RUN_TEST (check_string_escaping );
310+ RUN_TEST (check_string_streaming );
237311}
238312
239313TEST
@@ -244,8 +318,7 @@ check_invalid_top_level_tokens_in_sequence(void)
244318
245319 jsonb_init (& b );
246320 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 ));
249322
250323 jsonb_init (& b );
251324 jsonb_array (& b , buf , sizeof (buf ));
@@ -255,17 +328,16 @@ check_invalid_top_level_tokens_in_sequence(void)
255328 jsonb_init (& b );
256329 jsonb_array (& b , buf , sizeof (buf ));
257330 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 ));
260332
261333 jsonb_init (& b );
262334 jsonb_bool (& b , buf , sizeof (buf ), 1 );
263335 ASSERT_EQm (buf , JSONB_ERROR_INPUT , jsonb_array (& b , buf , sizeof (buf )));
264336
265337 jsonb_init (& b );
266338 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 ));
269341
270342 PASS ();
271343}
0 commit comments