diff --git a/example/main.c b/example/main.c index 529b86f..f1a0eea 100644 --- a/example/main.c +++ b/example/main.c @@ -4,7 +4,7 @@ int main() { - auto json = json_init(stdout, INDENT_2); + auto json = json_init(stdout, MINIFIED, false); json_begin_object(&json); { diff --git a/json.c b/json.c index 01b018c..2bc7cb4 100644 --- a/json.c +++ b/json.c @@ -4,13 +4,14 @@ #define UNREACHABLE() assert(false) -Json json_init(FILE* stream, Whitespace whitespace) +Json json_init(FILE* stream, Whitespace whitespace, bool comma_separate) { return (Json){ .stream = stream, .whitespace = whitespace, .indent_level = 0, .next_punctuation = BEGINNING, + .comma_separate = comma_separate, }; } @@ -169,7 +170,11 @@ void begin_value(Json* json) /// End a JSON value. void end_value(Json* json) { - json->next_punctuation = COMMA; + if (json->indent_level > 0 || json->comma_separate) { + json->next_punctuation = COMMA; + } else { + json->next_punctuation = BEGINNING; + } } /// Increment the indent level by one. diff --git a/json.h b/json.h index aeaa7a6..3e4cda8 100644 --- a/json.h +++ b/json.h @@ -25,9 +25,10 @@ typedef struct Json { Whitespace whitespace; int indent_level; Punctuation next_punctuation; + bool comma_separate; } Json; -Json json_init(FILE* stream, Whitespace whitespace); +Json json_init(FILE* stream, Whitespace whitespace, bool comma_separate); void json_free(Json* json); void json_begin_array(Json* json); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f51a179..e5d53b9 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -13,6 +13,8 @@ list( json_tests_array json_tests_object json_tests_complex + json_tests_comma_separated + json_tests_non_comma_separated ) foreach(JSON_TEST IN LISTS JSON_TESTS) add_executable( diff --git a/tests/json_tests_array.c b/tests/json_tests_array.c index 0a05e88..31d8756 100644 --- a/tests/json_tests_array.c +++ b/tests/json_tests_array.c @@ -15,7 +15,7 @@ void setUp() tmp = tmpfile(); TEST_ASSERT_NOT_NULL(tmp); - json = json_init(tmp, MINIFIED); + json = json_init(tmp, MINIFIED, false); } void tearDown() diff --git a/tests/json_tests_comma_separated.c b/tests/json_tests_comma_separated.c new file mode 100644 index 0000000..9c28d58 --- /dev/null +++ b/tests/json_tests_comma_separated.c @@ -0,0 +1,147 @@ +#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, true); +} + +void tearDown() +{ + json_free(&json); + + if (tmp) { + fclose(tmp); + tmp = nullptr; + } +} + +void test_json_comma_separated_string() +{ + json_add_string(&json, "one"); + json_add_string(&json, "two"); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("\"one\",\"two\"", buffer); +} + +void test_json_comma_separated_long() +{ + json_add_long(&json, 42); + json_add_long(&json, 67); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("42,67", buffer); +} + +void test_json_comma_separated_double() +{ + json_add_double(&json, 3.14); + json_add_double(&json, 6.28); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("3.14,6.28", buffer); +} + +void test_json_comma_separated_bool() +{ + json_add_bool(&json, true); + json_add_bool(&json, false); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("true,false", buffer); +} + +void test_json_comma_separated_null() +{ + json_add_null(&json); + 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,null", buffer); +} + +void test_json_comma_separated_object() +{ + for (int i = 0; i < 2; ++i) { + json_begin_object(&json); + { + json_add_object_field(&json, "test"); + json_add_number(&json, i); + } + json_end_object(&json); + } + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("{\"test\":0},{\"test\":1}", buffer); +} + +void test_json_comma_separated_array() +{ + for (int i = 0; i < 2; ++i) { + json_begin_array(&json); + { + json_add_number(&json, i); + } + json_end_array(&json); + } + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("[0],[1]", buffer); +} + +int main() +{ + UNITY_BEGIN(); + { + RUN_TEST(test_json_comma_separated_string); + RUN_TEST(test_json_comma_separated_long); + RUN_TEST(test_json_comma_separated_double); + RUN_TEST(test_json_comma_separated_bool); + RUN_TEST(test_json_comma_separated_null); + RUN_TEST(test_json_comma_separated_object); + RUN_TEST(test_json_comma_separated_array); + } + return UNITY_END(); +} + diff --git a/tests/json_tests_complex.c b/tests/json_tests_complex.c index 8f3f3c0..7118b23 100644 --- a/tests/json_tests_complex.c +++ b/tests/json_tests_complex.c @@ -15,7 +15,7 @@ void setUp() tmp = tmpfile(); TEST_ASSERT_NOT_NULL(tmp); - json = json_init(tmp, INDENT_TAB); + json = json_init(tmp, INDENT_TAB, false); } void tearDown() diff --git a/tests/json_tests_non_comma_separated.c b/tests/json_tests_non_comma_separated.c new file mode 100644 index 0000000..16ea668 --- /dev/null +++ b/tests/json_tests_non_comma_separated.c @@ -0,0 +1,147 @@ +#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, false); +} + +void tearDown() +{ + json_free(&json); + + if (tmp) { + fclose(tmp); + tmp = nullptr; + } +} + +void test_json_non_comma_separated_string() +{ + json_add_string(&json, "one"); + json_add_string(&json, "two"); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("\"one\"\"two\"", buffer); +} + +void test_json_non_comma_separated_long() +{ + json_add_long(&json, 42); + json_add_long(&json, 67); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("4267", buffer); +} + +void test_json_non_comma_separated_double() +{ + json_add_double(&json, 3.14); + json_add_double(&json, 6.28); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("3.146.28", buffer); +} + +void test_json_non_comma_separated_bool() +{ + json_add_bool(&json, true); + json_add_bool(&json, false); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("truefalse", buffer); +} + +void test_json_non_comma_separated_null() +{ + json_add_null(&json); + json_add_null(&json); + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("nullnull", buffer); +} + +void test_json_non_comma_separated_object() +{ + for (int i = 0; i < 2; ++i) { + json_begin_object(&json); + { + json_add_object_field(&json, "test"); + json_add_number(&json, i); + } + json_end_object(&json); + } + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("{\"test\":0}{\"test\":1}", buffer); +} + +void test_json_non_comma_separated_array() +{ + for (int i = 0; i < 2; ++i) { + json_begin_array(&json); + { + json_add_number(&json, i); + } + json_end_array(&json); + } + fflush(tmp); + rewind(tmp); + + auto n = fread(buffer, 1, sizeof(buffer) - 1, tmp); + buffer[n] = '\0'; + + TEST_ASSERT_EQUAL_STRING("[0][1]", buffer); +} + +int main() +{ + UNITY_BEGIN(); + { + RUN_TEST(test_json_non_comma_separated_string); + RUN_TEST(test_json_non_comma_separated_long); + RUN_TEST(test_json_non_comma_separated_double); + RUN_TEST(test_json_non_comma_separated_bool); + RUN_TEST(test_json_non_comma_separated_null); + RUN_TEST(test_json_non_comma_separated_object); + RUN_TEST(test_json_non_comma_separated_array); + } + return UNITY_END(); +} + diff --git a/tests/json_tests_object.c b/tests/json_tests_object.c index 4788b33..96d9b0c 100644 --- a/tests/json_tests_object.c +++ b/tests/json_tests_object.c @@ -15,7 +15,7 @@ void setUp() tmp = tmpfile(); TEST_ASSERT_NOT_NULL(tmp); - json = json_init(tmp, MINIFIED); + json = json_init(tmp, MINIFIED, false); } void tearDown() diff --git a/tests/json_tests_simple.c b/tests/json_tests_simple.c index 5d6c02b..23844e8 100644 --- a/tests/json_tests_simple.c +++ b/tests/json_tests_simple.c @@ -15,7 +15,7 @@ void setUp() tmp = tmpfile(); TEST_ASSERT_NOT_NULL(tmp); - json = json_init(tmp, MINIFIED); + json = json_init(tmp, MINIFIED, false); } void tearDown()