33#include  <assert.h> 
44#include  <stddef.h> 
55
6- #define  JSONB_MAX_DEPTH  4
7- #define  JSONB_DEBUG 
6+ #define  JSONB_MAX_DEPTH  1028
87#include  "json-build.h" 
98
109#include  "greatest.h" 
@@ -16,33 +15,34 @@ check_valid_singles(void)
1615    jsonb  b ;
1716
1817    jsonb_init (& b );
19-     ASSERT ( jsonb_push_array (& b , buf , sizeof (buf )) >=  0 );
20-     ASSERT ( jsonb_pop_array (& b , buf , sizeof (buf )) >=  0 );
18+     ASSERTm ( buf ,  JSONB_OK   ==   jsonb_push_array (& b , buf , sizeof (buf )));
19+     ASSERTm ( buf ,  JSONB_END   ==   jsonb_pop_array (& b , buf , sizeof (buf )));
2120    ASSERT_STR_EQ ("[]" , buf );
2221
2322    jsonb_init (& b );
24-     ASSERT ( jsonb_push_object (& b , buf , sizeof (buf )) >=  0 );
25-     ASSERT ( jsonb_pop_object (& b , buf , sizeof (buf )) >=  0 );
23+     ASSERTm ( buf ,  JSONB_OK   ==   jsonb_push_object (& b , buf , sizeof (buf )));
24+     ASSERTm ( buf ,  JSONB_END   ==   jsonb_pop_object (& b , buf , sizeof (buf )));
2625    ASSERT_STR_EQ ("{}" , buf );
2726
2827    jsonb_init (& b );
29-     ASSERT ( jsonb_push_bool (& b , buf , sizeof (buf ), 0 ) >=  0 );
28+     ASSERTm ( buf ,  JSONB_END   ==   jsonb_push_bool (& b , buf , sizeof (buf ), 0 ));
3029    ASSERT_STR_EQ ("false" , buf );
3130
3231    jsonb_init (& b );
33-     ASSERT ( jsonb_push_bool (& b , buf , sizeof (buf ), 1 ) >=  0 );
32+     ASSERTm ( buf ,  JSONB_END   ==   jsonb_push_bool (& b , buf , sizeof (buf ), 1 ));
3433    ASSERT_STR_EQ ("true" , buf );
3534
3635    jsonb_init (& b );
37-     ASSERT ( jsonb_push_number (& b , buf , sizeof (buf ), 10 ) >=  0 );
36+     ASSERTm ( buf ,  JSONB_END   ==   jsonb_push_number (& b , buf , sizeof (buf ), 10 ));
3837    ASSERT_STR_EQ ("10" , buf );
3938
4039    jsonb_init (& b );
41-     ASSERT (jsonb_push_string (& b , buf , sizeof (buf ), "hi" , 2 ) >= 0 );
40+     ASSERTm (buf ,
41+             JSONB_END  ==  jsonb_push_string (& b , buf , sizeof (buf ), "hi" , 2 ));
4242    ASSERT_STR_EQ ("\"hi\"" , buf );
4343
4444    jsonb_init (& b );
45-     ASSERT ( jsonb_push_null (& b , buf , sizeof (buf )) >=  0 );
45+     ASSERTm ( buf ,  JSONB_END   ==   jsonb_push_null (& b , buf , sizeof (buf )));
4646    ASSERT_STR_EQ ("null" , buf );
4747
4848    PASS ();
@@ -55,16 +55,17 @@ check_valid_array(void)
5555    jsonb  b ;
5656
5757    jsonb_init (& b );
58-     ASSERT ( jsonb_push_array (& b , buf , sizeof (buf )) >=  0 );
58+     ASSERTm ( buf ,  JSONB_OK   ==   jsonb_push_array (& b , buf , sizeof (buf )));
5959    {
60-         ASSERT (jsonb_push_bool (& b , buf , sizeof (buf ), 1 ) >= 0 );
61-         ASSERT (jsonb_push_bool (& b , buf , sizeof (buf ), 0 ) >= 0 );
62-         ASSERT (jsonb_push_null (& b , buf , sizeof (buf )) >= 0 );
63-         ASSERT (jsonb_push_number (& b , buf , sizeof (buf ), 10 ) >= 0 );
64-         ASSERT (jsonb_push_string (& b , buf , sizeof (buf ), "foo" , 3 ) >= 0 );
65-         ASSERT (jsonb_push_object (& b , buf , sizeof (buf )) >= 0 );
66-         ASSERT (jsonb_pop_object (& b , buf , sizeof (buf )) >= 0 );
67-         ASSERT (jsonb_pop_array (& b , buf , sizeof (buf )) >= 0 );
60+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_bool (& b , buf , sizeof (buf ), 1 ));
61+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_bool (& b , buf , sizeof (buf ), 0 ));
62+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_null (& b , buf , sizeof (buf )));
63+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_number (& b , buf , sizeof (buf ), 10 ));
64+         ASSERTm (buf ,
65+                 JSONB_OK  ==  jsonb_push_string (& b , buf , sizeof (buf ), "foo" , 3 ));
66+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_object (& b , buf , sizeof (buf )));
67+         ASSERTm (buf , JSONB_OK  ==  jsonb_pop_object (& b , buf , sizeof (buf )));
68+         ASSERTm (buf , JSONB_END  ==  jsonb_pop_array (& b , buf , sizeof (buf )));
6869    }
6970
7071    ASSERT_STR_EQ ("[true,false,null,10,\"foo\",{}]" , buf );
@@ -79,22 +80,23 @@ check_valid_object(void)
7980    jsonb  b ;
8081
8182    jsonb_init (& b );
82-     ASSERT ( jsonb_push_object (& b , buf , sizeof (buf )) >=  0 );
83+     ASSERTm ( buf ,  JSONB_OK   ==   jsonb_push_object (& b , buf , sizeof (buf )));
8384    {
84-         ASSERT (jsonb_push_key (& b , buf , sizeof (buf ), "a" , 1 ) >= 0 );
85-         ASSERT (jsonb_push_bool (& b , buf , sizeof (buf ), 1 ) >= 0 );
86-         ASSERT (jsonb_push_key (& b , buf , sizeof (buf ), "b" , 1 ) >= 0 );
87-         ASSERT (jsonb_push_bool (& b , buf , sizeof (buf ), 0 ) >= 0 );
88-         ASSERT (jsonb_push_key (& b , buf , sizeof (buf ), "c" , 1 ) >= 0 );
89-         ASSERT (jsonb_push_null (& b , buf , sizeof (buf )) >= 0 );
90-         ASSERT (jsonb_push_key (& b , buf , sizeof (buf ), "d" , 1 ) >= 0 );
91-         ASSERT (jsonb_push_number (& b , buf , sizeof (buf ), 10 ) >= 0 );
92-         ASSERT (jsonb_push_key (& b , buf , sizeof (buf ), "e" , 1 ) >= 0 );
93-         ASSERT (jsonb_push_string (& b , buf , sizeof (buf ), "foo" , 3 ) >= 0 );
94-         ASSERT (jsonb_push_key (& b , buf , sizeof (buf ), "f" , 1 ) >= 0 );
95-         ASSERT (jsonb_push_array (& b , buf , sizeof (buf )) >= 0 );
96-         ASSERT (jsonb_pop_array (& b , buf , sizeof (buf )) >= 0 );
97-         ASSERT (jsonb_pop_object (& b , buf , sizeof (buf )) >= 0 );
85+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_key (& b , buf , sizeof (buf ), "a" , 1 ));
86+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_bool (& b , buf , sizeof (buf ), 1 ));
87+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_key (& b , buf , sizeof (buf ), "b" , 1 ));
88+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_bool (& b , buf , sizeof (buf ), 0 ));
89+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_key (& b , buf , sizeof (buf ), "c" , 1 ));
90+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_null (& b , buf , sizeof (buf )));
91+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_key (& b , buf , sizeof (buf ), "d" , 1 ));
92+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_number (& b , buf , sizeof (buf ), 10 ));
93+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_key (& b , buf , sizeof (buf ), "e" , 1 ));
94+         ASSERTm (buf ,
95+                 JSONB_OK  ==  jsonb_push_string (& b , buf , sizeof (buf ), "foo" , 3 ));
96+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_key (& b , buf , sizeof (buf ), "f" , 1 ));
97+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_array (& b , buf , sizeof (buf )));
98+         ASSERTm (buf , JSONB_OK  ==  jsonb_pop_array (& b , buf , sizeof (buf )));
99+         ASSERTm (buf , JSONB_END  ==  jsonb_pop_object (& b , buf , sizeof (buf )));
98100    }
99101
100102    ASSERT_STR_EQ (
@@ -114,60 +116,82 @@ SUITE(valid_output)
114116TEST 
115117check_deep_nesting_array (void )
116118{
117-     char  buf [2048 ];
119+     char  buf [JSONB_MAX_DEPTH   *   sizeof ( "[]" ) ];
118120    jsonb  b ;
119121    int  i ;
120122
121123    jsonb_init (& b );
122124    for  (i  =  0 ; i  <  JSONB_MAX_DEPTH ; ++ i )
123-         ASSERT (jsonb_push_array (& b , buf , sizeof (buf )) >= 0 );
124-     for  (i  =  0 ; i  <  JSONB_MAX_DEPTH ; ++ i )
125-         ASSERT (jsonb_pop_array (& b , buf , sizeof (buf )) >= 0 );
125+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_array (& b , buf , sizeof (buf )));
126+     for  (i  =  0 ; i  <  JSONB_MAX_DEPTH  -  1 ; ++ i )
127+         ASSERTm (buf , JSONB_OK  ==  jsonb_pop_array (& b , buf , sizeof (buf )));
128+     ASSERTm (buf , JSONB_END  ==  jsonb_pop_array (& b , buf , sizeof (buf )));
129+ 
126130    PASS ();
127131}
128132
129133TEST 
130134check_deep_nesting_object (void )
131135{
132-     char  buf [4096 ];
136+     char  buf [JSONB_MAX_DEPTH   *  ( sizeof ( "{}" )  +   sizeof ( "\"a\":" )) ];
133137    jsonb  b ;
134138    int  i ;
135139
136140    jsonb_init (& b );
137141    for  (i  =  0 ; i  <  JSONB_MAX_DEPTH  -  1 ; ++ i ) {
138-         ASSERT (jsonb_push_object (& b , buf , sizeof (buf )) >= 0 );
139-         ASSERT (jsonb_push_key (& b , buf , sizeof (buf ), "a" , 1 ) >= 0 );
140-     }
141-     ASSERT (jsonb_push_object (& b , buf , sizeof (buf )) >= 0 );
142-     for  (i  =  0 ; i  <  JSONB_MAX_DEPTH ; ++ i ) {
143-         ASSERT (jsonb_pop_object (& b , buf , sizeof (buf )) >= 0 );
142+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_object (& b , buf , sizeof (buf )));
143+         ASSERTm (buf , JSONB_OK  ==  jsonb_push_key (& b , buf , sizeof (buf ), "a" , 1 ));
144144    }
145+     ASSERTm (buf , JSONB_OK  ==  jsonb_push_object (& b , buf , sizeof (buf )));
146+     for  (i  =  0 ; i  <  JSONB_MAX_DEPTH  -  1 ; ++ i )
147+         ASSERTm (buf , JSONB_OK  ==  jsonb_pop_object (& b , buf , sizeof (buf )));
148+     ASSERTm (buf , JSONB_END  ==  jsonb_pop_object (& b , buf , sizeof (buf )));
149+ 
145150    PASS ();
146151}
147152
148153TEST 
149154check_deep_nesting_object_and_array (void )
150155{
151-     char  buf [8192 ];
156+     char  buf [JSONB_MAX_DEPTH   *  ( sizeof ( "[{}]" )  +   sizeof ( "\"a\":" )) ];
152157    jsonb  b ;
153158    int  i ;
154159
155160    jsonb_init (& b );
156161    for  (i  =  0 ; i  <  JSONB_MAX_DEPTH ; ++ i ) {
157162        if  (i  % 2  ==  0 ) {
158-             ASSERT (jsonb_push_object (& b , buf , sizeof (buf )) >= 0 );
159-             ASSERT (jsonb_push_key (& b , buf , sizeof (buf ), "a" , 1 ) >= 0 );
163+             ASSERTm (buf , JSONB_OK  ==  jsonb_push_object (& b , buf , sizeof (buf )));
164+             ASSERTm (buf ,
165+                     JSONB_OK  ==  jsonb_push_key (& b , buf , sizeof (buf ), "a" , 1 ));
160166        }
161167        else  {
162-             ASSERT ( jsonb_push_array (& b , buf , sizeof (buf )) >=  0 );
168+             ASSERTm ( buf ,  JSONB_OK   ==   jsonb_push_array (& b , buf , sizeof (buf )));
163169        }
164170    }
165-     for  (i  =  0 ; i  <  JSONB_MAX_DEPTH ; ++ i ) {
166-         if  (i  % 2  ==  0 )
167-             ASSERT (jsonb_pop_array (& b , buf , sizeof (buf )) >= 0 );
168-         else 
169-             ASSERT (jsonb_pop_object (& b , buf , sizeof (buf )) >= 0 );
171+ 
172+     if  (JSONB_MAX_DEPTH  % 2  !=  0 ) {
173+         ASSERTm (buf , jsonb_push_null (& b , buf , sizeof (buf )) ==  JSONB_OK );
174+         for  (i  =  0 ; i  <  JSONB_MAX_DEPTH  -  1 ; ++ i ) {
175+             if  (i  % 2  ==  0 )
176+                 ASSERTm (buf ,
177+                         JSONB_OK  ==  jsonb_pop_object (& b , buf , sizeof (buf )));
178+             else 
179+                 ASSERTm (buf ,
180+                         JSONB_OK  ==  jsonb_pop_array (& b , buf , sizeof (buf )));
181+         }
182+     }
183+     else  {
184+         for  (i  =  0 ; i  <  JSONB_MAX_DEPTH  -  1 ; ++ i ) {
185+             if  (i  % 2  ==  0 )
186+                 ASSERTm (buf ,
187+                         JSONB_OK  ==  jsonb_pop_array (& b , buf , sizeof (buf )));
188+             else 
189+                 ASSERTm (buf ,
190+                         JSONB_OK  ==  jsonb_pop_object (& b , buf , sizeof (buf )));
191+         }
170192    }
193+     ASSERTm (buf , JSONB_END  ==  jsonb_pop_object (& b , buf , sizeof (buf )));
194+ 
171195    PASS ();
172196}
173197
@@ -194,14 +218,15 @@ check_string_escaping(void)
194218    jsonb  b ;
195219
196220    jsonb_init (& b );
197-     ASSERT ( jsonb_push_array (& b , buf , sizeof (buf )) >=  0 );
221+     ASSERTm ( buf ,  JSONB_OK   ==   jsonb_push_array (& b , buf , sizeof (buf )));
198222    for  (i  =  0 ; i  <  sizeof (strs ) / sizeof (char  * ); ++ i ) {
199223        size_t  len  =  strlen (strs [i ]);
200224        size_t  prev_pos  =  b .pos ;
201-         ASSERT (jsonb_push_string (& b , buf , sizeof (buf ), strs [i ], len ) >= 0 );
225+         ASSERTm (buf ,
226+                 jsonb_push_string (& b , buf , sizeof (buf ), strs [i ], len ) >= 0 );
202227        ASSERT_STR_EQ (expect [i ], buf  +  prev_pos );
203228    }
204-     ASSERT ( jsonb_pop_array (& b , buf , sizeof (buf )) >=  0 );
229+     ASSERTm ( buf ,  JSONB_END   ==   jsonb_pop_array (& b , buf , sizeof (buf )));
205230
206231    PASS ();
207232}
@@ -219,25 +244,28 @@ check_invalid_top_level_tokens_in_sequence(void)
219244
220245    jsonb_init (& b );
221246    jsonb_push_bool (& b , buf , sizeof (buf ), 1 );
222-     ASSERT (JSONB_ERROR_INPUT  ==  jsonb_push_bool (& b , buf , sizeof (buf ), 0 ));
247+     ASSERTm (buf ,
248+             JSONB_ERROR_INPUT  ==  jsonb_push_bool (& b , buf , sizeof (buf ), 0 ));
223249
224250    jsonb_init (& b );
225251    jsonb_push_array (& b , buf , sizeof (buf ));
226252    jsonb_pop_array (& b , buf , sizeof (buf ));
227-     ASSERT ( JSONB_ERROR_INPUT  ==  jsonb_push_array (& b , buf , sizeof (buf )));
253+     ASSERTm ( buf ,  JSONB_ERROR_INPUT  ==  jsonb_push_array (& b , buf , sizeof (buf )));
228254
229255    jsonb_init (& b );
230256    jsonb_push_array (& b , buf , sizeof (buf ));
231257    jsonb_pop_array (& b , buf , sizeof (buf ));
232-     ASSERT (JSONB_ERROR_INPUT  ==  jsonb_push_bool (& b , buf , sizeof (buf ), 1 ));
258+     ASSERTm (buf ,
259+             JSONB_ERROR_INPUT  ==  jsonb_push_bool (& b , buf , sizeof (buf ), 1 ));
233260
234261    jsonb_init (& b );
235262    jsonb_push_bool (& b , buf , sizeof (buf ), 1 );
236-     ASSERT ( JSONB_ERROR_INPUT  ==  jsonb_push_array (& b , buf , sizeof (buf )));
263+     ASSERTm ( buf ,  JSONB_ERROR_INPUT  ==  jsonb_push_array (& b , buf , sizeof (buf )));
237264
238265    jsonb_init (& b );
239266    jsonb_push_bool (& b , buf , sizeof (buf ), 1 );
240-     ASSERT (JSONB_ERROR_INPUT  ==  jsonb_push_string (& b , buf , sizeof (buf ), "" , 0 ));
267+     ASSERTm (buf , JSONB_ERROR_INPUT 
268+                      ==  jsonb_push_string (& b , buf , sizeof (buf ), "" , 0 ));
241269
242270    PASS ();
243271}
@@ -249,46 +277,63 @@ check_not_enough_buffer_memory(void)
249277    jsonb  b ;
250278
251279    jsonb_init (& b );
252-     ASSERT ( JSONB_ERROR_NOMEM  ==  jsonb_push_bool (& b , buf , 0 , 1 ));
253-     ASSERT ( JSONB_END  ==  jsonb_push_bool (& b , buf , sizeof (buf ), 1 ));
280+     ASSERTm ( buf ,  JSONB_ERROR_NOMEM  ==  jsonb_push_bool (& b , buf , 0 , 1 ));
281+     ASSERTm ( buf ,  JSONB_END  ==  jsonb_push_bool (& b , buf , sizeof (buf ), 1 ));
254282
255283    PASS ();
256284}
257285
258286TEST 
259287check_out_of_bounds_access (void )
260288{
261-     char  buf [1024 ];
289+     char  buf [JSONB_MAX_DEPTH   *   sizeof ( "[" ) ];
262290    jsonb  b ;
263291
264292    jsonb_init (& b );
265293    while  (1 ) {
266-         if  (JSONB_ERROR_STACK  ==  jsonb_push_array (& b , buf , sizeof (buf )))
267-             break ;
294+         if  (JSONB_ERROR_STACK  ==  jsonb_push_array (& b , buf , sizeof (buf ))) break ;
268295    }
269296
270297    PASS ();
271298}
272299
273300TEST 
274- check_no_operation_after_done (void )
301+ check_single_no_operation_after_done (void )
275302{
276303    char  buf [1024 ];
277304    jsonb  b ;
278305
279306    jsonb_init (& b );
280-     ASSERT (JSONB_OK  ==  jsonb_push_array (& b , buf , sizeof (buf )));
281-     ASSERT (JSONB_END  ==  jsonb_pop_array (& b , buf , sizeof (buf )));
282-     ASSERT (JSONB_ERROR_INPUT  ==  jsonb_push_array (& b , buf , sizeof (buf )));
307+     ASSERTm (buf , JSONB_END  ==  jsonb_push_null (& b , buf , sizeof (buf )));
308+     ASSERTm (buf , JSONB_ERROR_INPUT  ==  jsonb_push_null (& b , buf , sizeof (buf )));
309+ 
310+     PASS ();
311+ }
312+ 
313+ TEST 
314+ check_array_no_operation_after_done (void )
315+ {
316+     char  buf [1024 ];
317+     jsonb  b ;
283318
284319    jsonb_init (& b );
285-     ASSERT (JSONB_OK  ==  jsonb_push_object (& b , buf , sizeof (buf )));
286-     ASSERT (JSONB_END  ==  jsonb_pop_object (& b , buf , sizeof (buf )));
287-     ASSERT (JSONB_ERROR_INPUT  ==  jsonb_push_object (& b , buf , sizeof (buf )));
320+     ASSERTm (buf , JSONB_OK  ==  jsonb_push_array (& b , buf , sizeof (buf )));
321+     ASSERTm (buf , JSONB_END  ==  jsonb_pop_array (& b , buf , sizeof (buf )));
322+     ASSERTm (buf , JSONB_ERROR_INPUT  ==  jsonb_push_array (& b , buf , sizeof (buf )));
323+ 
324+     PASS ();
325+ }
326+ 
327+ TEST 
328+ check_object_no_operation_after_done (void )
329+ {
330+     char  buf [1024 ];
331+     jsonb  b ;
288332
289333    jsonb_init (& b );
290-     ASSERT (JSONB_END  ==  jsonb_push_null (& b , buf , sizeof (buf )));
291-     ASSERT (JSONB_ERROR_INPUT  ==  jsonb_push_null (& b , buf , sizeof (buf )));
334+     ASSERTm (buf , JSONB_OK  ==  jsonb_push_object (& b , buf , sizeof (buf )));
335+     ASSERTm (buf , JSONB_END  ==  jsonb_pop_object (& b , buf , sizeof (buf )));
336+     ASSERTm (buf , JSONB_ERROR_INPUT  ==  jsonb_push_object (& b , buf , sizeof (buf )));
292337
293338    PASS ();
294339}
@@ -298,7 +343,9 @@ SUITE(force_error)
298343    RUN_TEST (check_invalid_top_level_tokens_in_sequence );
299344    RUN_TEST (check_not_enough_buffer_memory );
300345    RUN_TEST (check_out_of_bounds_access );
301-     RUN_TEST (check_no_operation_after_done );
346+     RUN_TEST (check_single_no_operation_after_done );
347+     RUN_TEST (check_array_no_operation_after_done );
348+     RUN_TEST (check_object_no_operation_after_done );
302349}
303350
304351GREATEST_MAIN_DEFS ();
0 commit comments