diff --git a/flake.nix b/flake.nix index b2df353..a614e1f 100644 --- a/flake.nix +++ b/flake.nix @@ -26,6 +26,7 @@ pkg-config clang-tools ctags + valgrind ]; in { diff --git a/json.c b/json.c index f3062b3..01b018c 100644 --- a/json.c +++ b/json.c @@ -117,7 +117,7 @@ void json_add_long(Json* json, long value) void json_add_double(Json* json, double value) { begin_value(json); - fprintf(json->stream, "%f", value); + fprintf(json->stream, "%g", value); end_value(json); } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 39b5967..57380c7 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -7,28 +7,35 @@ FetchContent_Declare( ) FetchContent_MakeAvailable(Unity) -add_executable( - json_test - json_test.c -) -set_target_properties( - json_test - PROPERTIES - C_STANDARD 23 - C_STANDARD_REQUIRED ON - C_EXTENSIONS OFF -) -target_link_libraries( - json_test - PRIVATE - json - unity::framework -) -target_include_directories( - json_test - PRIVATE - ${CMAKE_SOURCE_DIR} +list( + APPEND JSON_TESTS + json_tests_simple + json_tests_array ) +foreach(JSON_TEST IN LISTS JSON_TESTS) + add_executable( + ${JSON_TEST} + ${JSON_TEST}.c + ) + set_target_properties( + ${JSON_TEST} + PROPERTIES + C_STANDARD 23 + C_STANDARD_REQUIRED ON + C_EXTENSIONS OFF + ) + target_link_libraries( + ${JSON_TEST} + PRIVATE + json + unity::framework + ) + target_include_directories( + ${JSON_TEST} + PRIVATE + ${CMAKE_SOURCE_DIR} + ) -add_test(NAME json_test COMMAND json_test) + add_test(NAME ${JSON_TEST} COMMAND ${JSON_TEST}) +endforeach() diff --git a/tests/json_test.c b/tests/json_test.c deleted file mode 100644 index 37cc98f..0000000 --- a/tests/json_test.c +++ /dev/null @@ -1,52 +0,0 @@ -#include -#include - -#include - -#include - -static FILE* tmp = nullptr; -static char buffer[256]; - -static Json json; - -void setUp() -{ - tmp = tmpfile(); - TEST_ASSERT_NOT_NULL(tmp); - - json = json_init(tmp, MINIFIED); -} - -void tearDown() -{ - json_free(&json); - - if (tmp) { - fclose(tmp); - tmp = nullptr; - } -} - -void test_json_add_string() -{ - json_add_string(&json, "string"); - fflush(tmp); - rewind(tmp); - - char buffer[256]; - auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); - buffer[n] = '\0'; - - TEST_ASSERT_EQUAL_STRING("\"string\"", buffer); -} - -int main() -{ - UNITY_BEGIN(); - { - RUN_TEST(test_json_add_string); - } - return UNITY_END(); -} - diff --git a/tests/json_tests_array.c b/tests/json_tests_array.c new file mode 100644 index 0000000..06c2300 --- /dev/null +++ b/tests/json_tests_array.c @@ -0,0 +1,158 @@ +#include +#include + +#include + +#include + +static FILE* tmp = nullptr; +static char buffer[256]; + +static Json json; + +void setUp() +{ + tmp = tmpfile(); + TEST_ASSERT_NOT_NULL(tmp); + + json = json_init(tmp, MINIFIED); +} + +void tearDown() +{ + json_free(&json); + + if (tmp) { + fclose(tmp); + tmp = nullptr; + } +} + +void test_json_array_empty() +{ + json_begin_array(&json); + json_end_array(&json); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("[]", buffer); +} + +void test_json_array_string() +{ + json_begin_array(&json); + { + json_add_string(&json, "string"); + } + json_end_array(&json); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("[\"string\"]", buffer); +} + +void test_json_array_long() +{ + json_begin_array(&json); + { + json_add_long(&json, 42); + } + json_end_array(&json); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("[42]", buffer); +} + +void test_json_array_double() +{ + json_begin_array(&json); + { + json_add_double(&json, 3.14); + } + json_end_array(&json); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("[3.14]", buffer); +} + +void test_json_array_bool() +{ + json_begin_array(&json); + { + json_add_bool(&json, true); + } + json_end_array(&json); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("[true]", buffer); +} + +void test_json_array_null() +{ + json_begin_array(&json); + { + json_add_null(&json); + } + json_end_array(&json); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("[null]", buffer); +} + +void test_json_array_mixed() +{ + json_begin_array(&json); + { + json_add_string(&json, "string"); + json_add_long(&json, 42); + json_add_double(&json, 3.14); + json_add_bool(&json, true); + json_add_null(&json); + } + json_end_array(&json); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("[\"string\",42,3.14,true,null]", buffer); +} + +int main() +{ + UNITY_BEGIN(); + { + RUN_TEST(test_json_array_empty); + RUN_TEST(test_json_array_string); + RUN_TEST(test_json_array_long); + RUN_TEST(test_json_array_double); + RUN_TEST(test_json_array_bool); + RUN_TEST(test_json_array_null); + RUN_TEST(test_json_array_mixed); + } + return UNITY_END(); +} + diff --git a/tests/json_tests_simple.c b/tests/json_tests_simple.c new file mode 100644 index 0000000..b9b1feb --- /dev/null +++ b/tests/json_tests_simple.c @@ -0,0 +1,103 @@ +#include +#include + +#include + +#include + +static FILE* tmp = nullptr; +static char buffer[256]; + +static Json json; + +void setUp() +{ + tmp = tmpfile(); + TEST_ASSERT_NOT_NULL(tmp); + + json = json_init(tmp, MINIFIED); +} + +void tearDown() +{ + json_free(&json); + + if (tmp) { + fclose(tmp); + tmp = nullptr; + } +} + +void test_json_add_string() +{ + json_add_string(&json, "string"); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("\"string\"", buffer); +} + +void test_json_add_long() +{ + json_add_long(&json, 42); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("42", buffer); +} + +void test_json_add_double() +{ + json_add_double(&json, 3.14); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("3.14", buffer); +} + +void test_json_add_bool() +{ + json_add_bool(&json, true); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("true", buffer); +} + +void test_json_add_null() +{ + json_add_null(&json); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("null", buffer); +} + +int main() +{ + UNITY_BEGIN(); + { + RUN_TEST(test_json_add_string); + RUN_TEST(test_json_add_long); + RUN_TEST(test_json_add_double); + RUN_TEST(test_json_add_bool); + RUN_TEST(test_json_add_null); + } + return UNITY_END(); +} +