Compare commits

...

3 commits

Author SHA1 Message Date
905251e586 Add more tests 2025-10-10 15:05:32 +00:00
932b593a58 Use %g instead of %f for double formatting
This can probably be refined further. This is just an improvement to get
rid of unnecessary trailing zeroes.
2025-10-10 15:03:04 +00:00
de2dd71bf3 Add valgrind to the dev env 2025-10-10 14:57:14 +00:00
6 changed files with 292 additions and 75 deletions

View file

@ -26,6 +26,7 @@
pkg-config pkg-config
clang-tools clang-tools
ctags ctags
valgrind
]; ];
in in
{ {

2
json.c
View file

@ -117,7 +117,7 @@ void json_add_long(Json* json, long value)
void json_add_double(Json* json, double value) void json_add_double(Json* json, double value)
{ {
begin_value(json); begin_value(json);
fprintf(json->stream, "%f", value); fprintf(json->stream, "%g", value);
end_value(json); end_value(json);
} }

View file

@ -7,28 +7,35 @@ FetchContent_Declare(
) )
FetchContent_MakeAvailable(Unity) FetchContent_MakeAvailable(Unity)
add_executable( list(
json_test APPEND JSON_TESTS
json_test.c json_tests_simple
) json_tests_array
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}
) )
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()

View file

@ -1,52 +0,0 @@
#include <stdio.h>
#include <string.h>
#include <unity.h>
#include <json.h>
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();
}

158
tests/json_tests_array.c Normal file
View file

@ -0,0 +1,158 @@
#include <stdio.h>
#include <string.h>
#include <unity.h>
#include <json.h>
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();
}

103
tests/json_tests_simple.c Normal file
View file

@ -0,0 +1,103 @@
#include <stdio.h>
#include <string.h>
#include <unity.h>
#include <json.h>
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();
}