// test_string.c #include #include cbool check_string(const char *str, const char *expect, cstring_t *output) { log_set_level(&__default_logger_root, 0); core_pos_t pos = core_pos_init(); core_mem_stream_t mem_stream; core_stream_t *stream = core_mem_stream_init(&mem_stream, str, smcc_strlen(str), false); cbool ret = lex_parse_string(stream, &pos, output); if (ret && expect) { return strcmp(output->data, expect) == 0; } return ret; } #define CHECK_STRING_VALID(str, expect) \ do { \ cstring_t _output = cstring_new(); \ cbool ret = check_string(str, expect, &_output); \ TEST_CHECK(ret == true); \ TEST_CHECK(strcmp(_output.data, expect) == 0); \ cstring_free(&_output); \ } while (0) #define CHECK_STRING_INVALID(str) \ do { \ cstring_t _output = cstring_new(); \ cbool ret = check_string(str, NULL, &_output); \ TEST_CHECK(ret == false); \ cstring_free(&_output); \ } while (0) void test_simple_string(void) { TEST_CASE("simple strings"); CHECK_STRING_VALID("\"\"", ""); CHECK_STRING_VALID("\"hello\"", "hello"); CHECK_STRING_VALID("\"hello world\"", "hello world"); } void test_escape_string(void) { TEST_CASE("escape strings"); CHECK_STRING_VALID("\"\\n\"", "\n"); CHECK_STRING_VALID("\"\\t\"", "\t"); CHECK_STRING_VALID("\"\\\"\"", "\""); CHECK_STRING_VALID("\"Hello\\nWorld\"", "Hello\nWorld"); } void test_invalid_string(void) { TEST_CASE("invalid strings"); CHECK_STRING_INVALID("\"unterminated"); CHECK_STRING_INVALID("\"newline\n\""); } TEST_LIST = { {"test_simple_string", test_simple_string}, {"test_escape_string", test_escape_string}, {"test_invalid_string", test_invalid_string}, {NULL, NULL}, };