static void test_unicode_utf_conversion(void) { const char utf8_string[] = "Unicode ÀÊ�öúĎǧɵܢވ࡞शཌ�♎☀⚑€♫��鿿�"; const uint8_t invalid_utf8[][4] = { { 0xA0, 0x01, 0x0, 0x0 }, { 0xA0, 0xFF, 0x0, 0x0 }, { 0xE5, 0x01, 0x80, 0x0 }, { 0xE5, 0xFF, 0x80, 0x0 }, { 0xE5, 0x80, 0x01, 0x0 }, { 0xE5, 0x80, 0xFF, 0x0 }, { 0xF2, 0x0, 0x0, 0x0 }, { 0xF0, 0x0, 0x0, 0x0 }, { 0xF0, 0x90, 0x0, 0x0 }, { 0xF0, 0x90, 0x80, 0x0 }, }; uint8_t utf8_buf[4]; const int32_t unicode_codes[] = { 0x0055, 0x006E, 0x0069, 0x0063, 0x006f, 0x0064, 0x0065, 0x0020, 0x00c0, 0x00CA, 0x00CD, 0x00f6, 0x00FA, 0x010e, 0x01e7, 0x0275, 0x0722, 0x0788, 0x085E, 0x0936, 0x0f4c, 0x2764, 0x264e, 0x2600, 0x2691, 0x20ac, 0x266b, 0x10123, 0x10fff, 0x9fff, 0x10000, 0x0 }; size_t i, str_len, r; const uint8_t *p = (const uint8_t *)utf8_string; int32_t code; uint8_t read, written; str_len = sizeof(utf8_string); for (i = 0; i < SOL_UTIL_ARRAY_SIZE(unicode_codes); i++) { code = sol_util_unicode_code_from_utf8(p, str_len, &read); ASSERT_INT_EQ(code, unicode_codes[i]); written = sol_util_utf8_from_unicode_code(utf8_buf, 4, unicode_codes[i]); ASSERT_INT_EQ(read, written); ASSERT_INT_EQ(memcmp(utf8_buf, p, written), 0); p += read; str_len += read; } //Invalid values r = sol_util_utf8_from_unicode_code(utf8_buf, 4, 0x110000); ASSERT_INT_EQ(r, -EINVAL); r = sol_util_utf8_from_unicode_code(utf8_buf, 3, 0x10000); ASSERT_INT_EQ(r, -EINVAL); r = sol_util_utf8_from_unicode_code(utf8_buf, 2, 0x0800); ASSERT_INT_EQ(r, -EINVAL); r = sol_util_utf8_from_unicode_code(utf8_buf, 1, 0x080); ASSERT_INT_EQ(r, -EINVAL); r = sol_util_utf8_from_unicode_code(utf8_buf, 0, 0x0); ASSERT_INT_EQ(r, -EINVAL); for (i = 0; i < SOL_UTIL_ARRAY_SIZE(invalid_utf8); i++) { code = sol_util_unicode_code_from_utf8(invalid_utf8[i], sizeof(invalid_utf8[i]), NULL); ASSERT_INT_EQ(code, -EINVAL); } }
static void test_unicode_utf_conversion(void) { const char utf8_string[] = "Unicode ÀÊÍöúĎǧɵܢވ࡞शཌ❤♎☀⚑€♫𐄣鿿𐀀"; const uint8_t invalid_utf8[][4] = { { 0xA0, 0x01, 0x0, 0x0 }, { 0xA0, 0xFF, 0x0, 0x0 }, { 0xE5, 0x01, 0x80, 0x0 }, { 0xE5, 0xFF, 0x80, 0x0 }, { 0xE5, 0x80, 0x01, 0x0 }, { 0xE5, 0x80, 0xFF, 0x0 }, { 0xF2, 0x0, 0x0, 0x0 }, { 0xF0, 0x0, 0x0, 0x0 }, { 0xF0, 0x90, 0x0, 0x0 }, { 0xF0, 0x90, 0x80, 0x0 }, }; uint8_t utf8_buf[4]; const int32_t unicode_codes[] = { 0x0055, 0x006E, 0x0069, 0x0063, 0x006f, 0x0064, 0x0065, 0x0020, 0x00c0, 0x00CA, 0x00CD, 0x00f6, 0x00FA, 0x010e, 0x01e7, 0x0275, 0x0722, 0x0788, 0x085E, 0x0936, 0x0f4c, 0x2764, 0x264e, 0x2600, 0x2691, 0x20ac, 0x266b, 0x10123, 0x10fff, 0x9fff, 0x10000, 0x0 }; size_t i, str_len, r; const uint8_t *p = (const uint8_t *)utf8_string; int32_t code; uint8_t read, written; str_len = sizeof(utf8_string); for (i = 0; i < sol_util_array_size(unicode_codes); i++) { code = sol_util_unicode_code_from_utf8(p, str_len, &read); ASSERT_INT_EQ(code, unicode_codes[i]); written = sol_util_utf8_from_unicode_code(utf8_buf, 4, unicode_codes[i]); ASSERT_INT_EQ(read, written); ASSERT_INT_EQ(memcmp(utf8_buf, p, written), 0); p += read; str_len += read; } //Invalid values r = sol_util_utf8_from_unicode_code(utf8_buf, 4, 0x110000); ASSERT_INT_EQ(r, -EINVAL); r = sol_util_utf8_from_unicode_code(utf8_buf, 3, 0x10000); ASSERT_INT_EQ(r, -EINVAL); r = sol_util_utf8_from_unicode_code(utf8_buf, 2, 0x0800); ASSERT_INT_EQ(r, -EINVAL); r = sol_util_utf8_from_unicode_code(utf8_buf, 1, 0x080); ASSERT_INT_EQ(r, -EINVAL); r = sol_util_utf8_from_unicode_code(utf8_buf, 0, 0x0); ASSERT_INT_EQ(r, -EINVAL); for (i = 0; i < sol_util_array_size(invalid_utf8); i++) { code = sol_util_unicode_code_from_utf8(invalid_utf8[i], sizeof(invalid_utf8[i]), NULL); ASSERT_INT_EQ(code, -EINVAL); } }