@@ -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