diff options
Diffstat (limited to 'src/json/test_json.c')
| -rw-r--r-- | src/json/test_json.c | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/src/json/test_json.c b/src/json/test_json.c new file mode 100644 index 0000000..058f191 --- /dev/null +++ b/src/json/test_json.c @@ -0,0 +1,224 @@ +#include "json.h" +#include "../std/testing.h" + +#define JSON_parse_raw(a, s) JSON_parse(a, s, lengthof(s)); + +i32 test_json_integer() { + Arena perm = Arena_new(128e3); + + JSON json_int = JSON_parse_raw(&perm, "123"); + + t_assert_equal(json_int.as.integer, 123); + t_assert_equal(Arena_get_used(perm), 0); + return 0; +} + +i32 test_json_int_array() { + Arena perm = Arena_new(128e3); + + JSON json_int_array = JSON_parse_raw(&perm, "[1,2,3]"); + + t_assert_equal(json_int_array.type, JSON_ARRAY); + t_assert_equal(json_int_array.as.array.len, 3); + int ints[3]; + int sum = 0; + for (int i = 0; i < json_int_array.as.array.len; i++) { + JSON *item = Vec_get(json_int_array.as.array, JSON, i); + ints[i] = item->as.integer; + sum += item->as.integer; + } + t_assert_equal(ints[0], 1); + t_assert_equal(ints[1], 2); + t_assert_equal(ints[2], 3); + t_assert_equal(sum, 6); + t_assert_equal(Arena_get_used(perm), 576); + + return 0; +} + +i32 test_json_empty_array() { + Arena perm = Arena_new(128e3); + + JSON json_empty_array = JSON_parse_raw(&perm, "[]"); + + t_assert_equal(json_empty_array.as.array.len, 0); + t_assert_equal(Arena_get_used(perm), 0); // TODO: weird + + return 0; +} + +i32 test_json_nested_array() { + Arena perm = Arena_new(128e3); + + JSON doc = JSON_parse_raw(&perm, "[[1,\"abc\"]]"); + + JSON sub_array = *Vec_get(doc.as.array, JSON, 0); + JSON val_1 = *Vec_get(sub_array.as.array, JSON, 0); + t_assert_equal(val_1.as.integer, 1); + JSON val_2 = *Vec_get(sub_array.as.array, JSON, 1); + t_assert_strequal(val_2.as.string, S("abc")); + t_assert_equal(Arena_get_used(perm), 1152); + + return 0; +} + +i32 test_json_string() { + Arena perm = Arena_new(128e3); + + JSON js = JSON_parse_raw(&perm, "\"abc\""); + + t_assert_strequal(js.as.string, S("abc")); + t_assert_equal(Arena_get_used(perm), 0); + + return 0; +} + +i32 test_json_empty_object() { + Arena perm = Arena_new(128e3); + + JSON doc = JSON_parse_raw(&perm, "{}"); + + t_assert_equal(doc.as.object.len, 0); + t_assert_equal(Arena_get_used(perm), 672); + + return 0; +} + +i32 test_json_object() { + Arena perm = Arena_new(128e3); + + JSON doc = JSON_parse_raw(&perm, "{\"key\": \"value\"}"); + + t_assert_equal(doc.as.object.len, 1); + StrView key = *Vec_get(doc.as.object.keys, StrView, 0); + t_assert_strequal(key, S("key")); + JSON value = *JSONObject_get(doc.as.object, S("key")); + t_assert_strequal(value.as.string, S("value")); + t_assert_equal(Arena_get_used(perm), 672); + + return 0; +} + +i32 test_json_boolean() { + Arena perm = Arena_new(128e3); + + JSON doc = JSON_parse_raw(&perm, "{\"a\": true, \"b\": false}"); + + JSON a = *JSONObject_get(doc.as.object, S("a")); + t_assert_equal(a.as.boolean, true); + JSON b = *JSONObject_get(doc.as.object, S("b")); + t_assert_equal(b.as.boolean, false); + t_assert_equal(Arena_get_used(perm), 672); + + return 0; +} + +i32 test_json_float() { + Arena perm = Arena_new(128e3); + + JSON doc = JSON_parse_raw(&perm, "[1.2, 2.3]"); + t_assert_equal(doc.as.array.len, 2); + JSON first = *Vec_get(doc.as.array, JSON, 0); + t_assert_fequal(first.as.floating, 1.2); + JSON second = *Vec_get(doc.as.array, JSON, 1); + t_assert_fequal(second.as.floating, 2.3); + t_assert_equal(Arena_get_used(perm), 576); + + return 0; +} + +i32 test_json_null() { + Arena perm = Arena_new(128e3); + + JSON doc = JSON_parse_raw(&perm, "[null]"); + t_assert_equal(doc.as.array.len, 1); + JSON first = *Vec_get(doc.as.array, JSON, 0); + t_assert_equal(first.type, JSON_NULL); + t_assert_equal(Arena_get_used(perm), 576); + + return 0; +} + +i32 test_json_long_spaces() { + Arena perm = Arena_new(128e3); + JSON doc = JSON_parse_raw( + &perm, "{\t \t \t \t \t }"); + + t_assert_equal(doc.as.object.len, 0); + + return 0; +} + +i32 test_json_multiline() { + Arena perm = Arena_new(128e3); + MemoryFile file = + load_file(&perm, "src/json/test_json/test_json_multiline.json"); + JSON doc = JSON_parse(&perm, file.content, file.size); + JSON target_size_mb = *JSONObject_get(doc.as.object, S("target_size_mb")); + t_assert_equal(target_size_mb.as.integer, 1); + JSON generated_at = *JSONObject_get(doc.as.object, S("generated_at")); + t_assert_strequal(generated_at.as.string, S("2025-07-22T10:36:30.974926")); + + return 0; +} + +i32 test_json_nested_object() { + Arena perm = Arena_new(128e3); + + JSON doc = JSON_parse_raw(&perm, "{\"1\":{\"2\":{}}}"); + + JSON lvl_1 = *JSONObject_get(doc.as.object, S("1")); + t_assert_equal(lvl_1.type, JSON_OBJECT); + JSON lvl_2 = *JSONObject_get(lvl_1.as.object, S("2")); + t_assert_equal(lvl_2.type, JSON_OBJECT); + return 0; +} + +i32 test_json_array_in_object() { + Arena perm = Arena_new(128e3); + JSON doc = JSON_parse_raw(&perm, "{\"tags\": [\"TWvZi0\",\"pM0TPv9X\"]}"); + + JSON tags = *JSONObject_get(doc.as.object, S("tags")); + t_assert_equal(tags.type, JSON_ARRAY); + t_assert_equal(tags.as.array.len, 2); + + return 0; +} + +i32 test_json_complex_multiline() { + Arena perm = Arena_new(128e3); + MemoryFile file = + load_file(&perm, "src/json/test_json/test_json_complex_multiline.json"); + JSON doc = JSON_parse(&perm, file.content, file.size); + + JSON id = *JSONObject_get(doc.as.object, S("id")); + t_assert_equal(id.as.integer, 819228); + JSON metadata = *JSONObject_get(doc.as.object, S("metadata")); + JSON preferences = *JSONObject_get(metadata.as.object, S("preferences")); + JSON theme = *JSONObject_get(preferences.as.object, S("theme")); + t_assert_strequal(theme.as.string, S("auto")); + + return 0; +} + +i32 test_negative_numbers() { + Arena perm = Arena_new(128e3); + JSON doc = JSON_parse_raw(&perm, "[-1, -2.5]"); + + JSON integer = *Vec_get(doc.as.array, JSON, 0); + t_assert_equal(integer.as.integer, -1); + JSON floating = *Vec_get(doc.as.array, JSON, 1); + t_assert_fequal(floating.as.floating, -2.5); + + return 0; +} + +i32 test_json_backspaces() { + Arena perm = Arena_new(128e3); + MemoryFile file = + load_file(&perm, "src/json/test_json/test_json_backspaces.json"); + JSON doc = JSON_parse(&perm, file.content, file.size); + + t_assert_strequal(doc.as.string, S("weird text\\")); + return 0; +} |
