static void test_back_utf8_char(TestBatchRunner *runner) { char buffer[4]; char *buf = buffer + 1; uint32_t len = Str_encode_utf8_char(0x263A, buffer); char *end = buffer + len; TEST_TRUE(runner, StrHelp_back_utf8_char(end, buffer) == buffer, "back_utf8_char"); TEST_TRUE(runner, StrHelp_back_utf8_char(end, buf) == NULL, "back_utf8_char returns NULL rather than back up beyond start"); TEST_TRUE(runner, StrHelp_back_utf8_char(buffer, buffer) == NULL, "back_utf8_char returns NULL when end == start"); int32_t code_point; for (code_point = 0; code_point <= 0x10FFFF; code_point++) { uint32_t size = Str_encode_utf8_char(code_point, buffer); char *start = buffer; char *end = start + size; if (StrHelp_back_utf8_char(end, start) != start) { break; } } if (code_point == 0x110000) { PASS(runner, "back_utf8_char works for code points 0 - 0x10FFFF"); } else { FAIL(runner, "Failed back_utf8_char at 0x%.1X", (unsigned)code_point); } }
static void test_back_utf8_char(TestBatchRunner *runner) { char buffer[4]; char *buf = buffer + 1; uint32_t len = StrHelp_encode_utf8_char(0x263A, buffer); char *end = buffer + len; TEST_TRUE(runner, StrHelp_back_utf8_char(end, buffer) == buffer, "back_utf8_char"); TEST_TRUE(runner, StrHelp_back_utf8_char(end, buf) == NULL, "back_utf8_char returns NULL rather than back up beyond start"); TEST_TRUE(runner, StrHelp_back_utf8_char(buffer, buffer) == NULL, "back_utf8_char returns NULL when end == start"); }
static void S_set_error(CharBuf *mess, char *json, char *limit, int line, const char *func) { if (func) { CB_catf(mess, " at %s %s line %i32 near ", func, __FILE__, (int32_t)line); } else { CB_catf(mess, " at %s line %i32 near ", __FILE__, (int32_t)line); } // Append escaped text. int64_t len = limit - json; if (len > 32) { const char *end = StrHelp_back_utf8_char(json + 32, json); len = end - json; } ZombieCharBuf *snippet = ZCB_WRAP_STR(json, len); S_append_json_string((Obj*)snippet, mess); // Set Err_error. Err_set_error(Err_new(mess)); }
static void test_utf8_round_trip(TestBatchRunner *runner) { int32_t code_point; for (code_point = 0; code_point <= 0x10FFFF; code_point++) { char buffer[4]; uint32_t size = StrHelp_encode_utf8_char(code_point, buffer); char *start = buffer; char *end = start + size; // Verify length returned by encode_utf8_char(). if (size != StrHelp_UTF8_COUNT[(unsigned char)buffer[0]]) { break; } // Verify that utf8_valid() agrees with alternate implementation. if (!!StrHelp_utf8_valid(start, size) != !!S_utf8_valid_alt(start, size) ) { break; } // Verify back_utf8_char(). if (StrHelp_back_utf8_char(end, start) != start) { break; } // Verify round trip of encode/decode. if (StrHelp_decode_utf8_char(buffer) != code_point) { break; } } if (code_point == 0x110000) { PASS(runner, "Successfully round tripped 0 - 0x10FFFF"); } else { FAIL(runner, "Failed round trip at 0x%.1X", (unsigned)code_point); } }