@@ -212,3 +212,111 @@ GgReader gg_json_reader(const GgObject *obj) {
212212 assert (obj != NULL );
213213 return (GgReader ) { .read = obj_read , .ctx = (void * ) obj };
214214}
215+
216+ #ifdef GG_TESTING
217+
218+ #include <gg/map.h>
219+ #include <gg/test.h>
220+ #include <unity.h>
221+ #include <stdlib.h>
222+
223+ GG_TEST_DEFINE (json_encode_null_ok ) {
224+ GgObject null = GG_OBJ_NULL ;
225+ GgBuffer buf = GG_BUF ((uint8_t [4 ]) { 0 });
226+ GgByteVec vec = gg_byte_vec_init (buf );
227+ GG_TEST_ASSERT_OK (gg_json_encode (null , gg_byte_vec_writer (& vec )));
228+ TEST_ASSERT_EQUAL_UINT (4 , vec .buf .len );
229+ TEST_ASSERT_EQUAL_CHAR_ARRAY ("null" , (char * ) vec .buf .data , vec .buf .len );
230+ }
231+
232+ GG_TEST_DEFINE (json_encode_bool_ok ) {
233+ {
234+ GgObject obj_false = gg_obj_bool (false);
235+ GgBuffer buf = GG_BUF ((uint8_t [5 ]) { 0 });
236+ GgByteVec vec = gg_byte_vec_init (buf );
237+ GG_TEST_ASSERT_OK (gg_json_encode (obj_false , gg_byte_vec_writer (& vec )));
238+ GG_TEST_ASSERT_BUF_EQUAL (GG_STR ("false" ), vec .buf );
239+ }
240+
241+ {
242+ GgObject obj_true = gg_obj_bool (true);
243+ GgBuffer buf = GG_BUF ((uint8_t [4 ]) { 0 });
244+ GgByteVec vec = gg_byte_vec_init (buf );
245+ GG_TEST_ASSERT_OK (gg_json_encode (obj_true , gg_byte_vec_writer (& vec )));
246+ GG_TEST_ASSERT_BUF_EQUAL (GG_STR ("true" ), vec .buf );
247+ }
248+ }
249+
250+ GG_TEST_DEFINE (json_encode_i64_ok ) {
251+ GgObject obj = gg_obj_i64 (123 );
252+ GgBuffer buf = GG_BUF ((uint8_t [3 ]) { 0 });
253+ GgByteVec vec = gg_byte_vec_init (buf );
254+ GG_TEST_ASSERT_OK (gg_json_encode (obj , gg_byte_vec_writer (& vec )));
255+ GG_TEST_ASSERT_BUF_EQUAL (GG_STR ("123" ), vec .buf );
256+ }
257+
258+ GG_TEST_DEFINE (json_encode_f64_ok ) {
259+ GgObject obj = gg_obj_f64 (123.456 );
260+ GgBuffer buf = GG_BUF ((uint8_t [DBL_DECIMAL_DIG + 9 + 1 ]) { 0 });
261+ buf .len -= 1 ;
262+ GgByteVec vec = gg_byte_vec_init (buf );
263+ GG_TEST_ASSERT_OK (gg_json_encode (obj , gg_byte_vec_writer (& vec )));
264+
265+ // Only feasible to test that round-tripping results in a similar value
266+ TEST_ASSERT_EQUAL_DOUBLE (123.456 , strtod ((char * ) buf .data , NULL ));
267+ }
268+
269+ GG_TEST_DEFINE (json_encode_buf_ok ) {
270+ {
271+ GgObject obj = gg_obj_buf (GG_BUF ((uint8_t [1 ]) { 0x1F }));
272+ GgBuffer buf = GG_BUF ((uint8_t [8 ]) { 0 });
273+ GgByteVec vec = gg_byte_vec_init (buf );
274+ GG_TEST_ASSERT_OK (gg_json_encode (obj , gg_byte_vec_writer (& vec )));
275+ GG_TEST_ASSERT_BUF_EQUAL (GG_STR ("\"\\u001F\"" ), vec .buf );
276+ }
277+
278+ {
279+ GgObject obj = gg_obj_buf (GG_STR ("Hello, world!" ));
280+ GgBuffer buf = GG_BUF ((uint8_t [15 ]) { 0 });
281+ GgByteVec vec = gg_byte_vec_init (buf );
282+ GG_TEST_ASSERT_OK (gg_json_encode (obj , gg_byte_vec_writer (& vec )));
283+ GG_TEST_ASSERT_BUF_EQUAL (GG_STR ("\"Hello, world!\"" ), vec .buf );
284+ }
285+
286+ {
287+ GgObject obj = gg_obj_buf (GG_STR ("\"escape \\ me \" \0" ));
288+ GgBuffer buf = GG_BUF ((uint8_t [26 ]) { 0 });
289+ GgByteVec vec = gg_byte_vec_init (buf );
290+ GG_TEST_ASSERT_OK (gg_json_encode (obj , gg_byte_vec_writer (& vec )));
291+ GG_TEST_ASSERT_BUF_EQUAL (
292+ GG_STR ("\"\\\"escape \\\\ me \\\" \\u0000\"" ), vec .buf
293+ );
294+ }
295+ }
296+
297+ GG_TEST_DEFINE (json_encode_map_ok ) {
298+ {
299+ GgObject obj = gg_obj_map (GG_MAP (
300+ gg_kv (GG_STR ("a" ), gg_obj_i64 (1 )),
301+ gg_kv (GG_STR ("b" ), gg_obj_i64 (2 )),
302+ gg_kv (GG_STR ("c" ), gg_obj_i64 (3 ))
303+ ));
304+ GgBuffer buf = GG_BUF ((uint8_t [20 ]) { 0 });
305+ GgByteVec vec = gg_byte_vec_init (buf );
306+ GG_TEST_ASSERT_OK (gg_json_encode (obj , gg_byte_vec_writer (& vec )));
307+ GG_TEST_ASSERT_BUF_EQUAL (GG_STR ("{\"a\":1,\"b\":2,\"c\":3}" ), vec .buf );
308+ }
309+ }
310+
311+ GG_TEST_DEFINE (json_encode_list_ok ) {
312+ {
313+ GgObject obj
314+ = gg_obj_list (GG_LIST (gg_obj_i64 (1 ), gg_obj_i64 (2 ), gg_obj_i64 (3 )));
315+ GgBuffer buf = GG_BUF ((uint8_t [7 ]) { 0 });
316+ GgByteVec vec = gg_byte_vec_init (buf );
317+ GG_TEST_ASSERT_OK (gg_json_encode (obj , gg_byte_vec_writer (& vec )));
318+ GG_TEST_ASSERT_BUF_EQUAL (GG_STR ("[1,2,3]" ), vec .buf );
319+ }
320+ }
321+
322+ #endif
0 commit comments