diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/PaintTest.cpp | 4 | ||||
-rw-r--r-- | tests/UnicodeTest.cpp | 36 | ||||
-rw-r--r-- | tests/UtilsTest.cpp | 152 |
3 files changed, 93 insertions, 99 deletions
diff --git a/tests/PaintTest.cpp b/tests/PaintTest.cpp index 647f8e2f23..0bf6df64de 100644 --- a/tests/PaintTest.cpp +++ b/tests/PaintTest.cpp @@ -23,7 +23,7 @@ static size_t uni_to_utf8(const SkUnichar src[], void* dst, int count) { char* u8 = (char*)dst; for (int i = 0; i < count; ++i) { - int n = SkToInt(SkUTF8_FromUnichar(src[i], u8)); + int n = SkToInt(SkUTF::ToUTF8(src[i], u8)); u8 += n; } return u8 - (char*)dst; @@ -32,7 +32,7 @@ static size_t uni_to_utf8(const SkUnichar src[], void* dst, int count) { static size_t uni_to_utf16(const SkUnichar src[], void* dst, int count) { uint16_t* u16 = (uint16_t*)dst; for (int i = 0; i < count; ++i) { - int n = SkToInt(SkUTF16_FromUnichar(src[i], u16)); + int n = SkToInt(SkUTF::ToUTF16(src[i], u16)); u16 += n; } return (char*)u16 - (char*)dst; diff --git a/tests/UnicodeTest.cpp b/tests/UnicodeTest.cpp index 5ed92d4b34..5dbcf08547 100644 --- a/tests/UnicodeTest.cpp +++ b/tests/UnicodeTest.cpp @@ -9,39 +9,10 @@ #include "SkUtils.h" #include "Test.h" -// Unicode Variation Selector ranges: inclusive -#define UVS_MIN0 0x180B -#define UVS_MAX0 0x180D -#define UVS_MIN1 0xFE00 -#define UVS_MAX1 0xFE0F -#define UVS_MIN2 0xE0100 -#define UVS_MAX2 0xE01EF - -static bool isUVS(SkUnichar uni) { - return (uni >= UVS_MIN0 && uni <= UVS_MAX0) || - (uni >= UVS_MIN1 && uni <= UVS_MAX1) || - (uni >= UVS_MIN2 && uni <= UVS_MAX2); -} - -static void test_uvs(skiatest::Reporter* reporter) { - // [min, max], [min, max] ... inclusive - static const SkUnichar gRanges[] = { - UVS_MIN0, UVS_MAX0, UVS_MIN1, UVS_MAX1, UVS_MIN2, UVS_MAX2 - }; - - for (size_t i = 0; i < SK_ARRAY_COUNT(gRanges); i += 2) { - for (SkUnichar uni = gRanges[i] - 8; uni <= gRanges[i+1] + 8; ++uni) { - bool uvs0 = isUVS(uni); - bool uvs1 = SkUnichar_IsVariationSelector(uni); - REPORTER_ASSERT(reporter, uvs0 == uvs1); - } - } -} - // Simple test to ensure that when we call textToGlyphs, we get the same // result (for the same text) when using UTF8, UTF16, UTF32. // TODO: make the text more complex (i.e. incorporate chars>7bits) -static void test_textencodings(skiatest::Reporter* reporter) { +DEF_TEST(Unicode_textencodings, reporter) { const char text8[] = "ABCDEFGabcdefg0123456789"; uint16_t text16[sizeof(text8)]; int32_t text32[sizeof(text8)]; @@ -76,8 +47,3 @@ static void test_textencodings(skiatest::Reporter* reporter) { REPORTER_ASSERT(reporter, !memcmp(glyphs8, glyphs16, count8 * sizeof(uint16_t))); REPORTER_ASSERT(reporter, !memcmp(glyphs8, glyphs32, count8 * sizeof(uint16_t))); } - -DEF_TEST(Unicode, reporter) { - test_uvs(reporter); - test_textencodings(reporter); -} diff --git a/tests/UtilsTest.cpp b/tests/UtilsTest.cpp index 6f8ec914bc..d621a8b12e 100644 --- a/tests/UtilsTest.cpp +++ b/tests/UtilsTest.cpp @@ -165,20 +165,19 @@ static void test_search(skiatest::Reporter* reporter) { } static void test_utf16(skiatest::Reporter* reporter) { + // Test non-basic-multilingual-plane unicode. static const SkUnichar gUni[] = { 0x10000, 0x18080, 0x20202, 0xFFFFF, 0x101234 }; - - uint16_t buf[2]; - - for (size_t i = 0; i < SK_ARRAY_COUNT(gUni); i++) { - size_t count = SkUTF16_FromUnichar(gUni[i], buf); + for (SkUnichar uni : gUni) { + uint16_t buf[2]; + size_t count = SkUTF::ToUTF16(uni, buf); REPORTER_ASSERT(reporter, count == 2); - size_t count2 = SkUTF16_CountUnichars(buf, 2 * sizeof(uint16_t)); + size_t count2 = SkUTF::CountUTF16(buf, sizeof(buf)); REPORTER_ASSERT(reporter, count2 == 1); const uint16_t* ptr = buf; - SkUnichar c = SkUTF16_NextUnichar(&ptr, buf + SK_ARRAY_COUNT(buf)); - REPORTER_ASSERT(reporter, c == gUni[i]); + SkUnichar c = SkUTF::NextUTF16(&ptr, buf + SK_ARRAY_COUNT(buf)); + REPORTER_ASSERT(reporter, c == uni); REPORTER_ASSERT(reporter, ptr - buf == 2); } } @@ -204,8 +203,8 @@ DEF_TEST(Utils, reporter) { for (size_t i = 0; i < SK_ARRAY_COUNT(gTest); i++) { const char* p = gTest[i].fUtf8; const char* stop = p + strlen(p); - int n = SkUTF8_CountUnichars(p, strlen(p)); - SkUnichar u1 = SkUTF8_NextUnichar(&p, stop); + int n = SkUTF::CountUTF8(p, strlen(p)); + SkUnichar u1 = SkUTF::NextUTF8(&p, stop); REPORTER_ASSERT(reporter, n == 1); REPORTER_ASSERT(reporter, u1 == gTest[i].fUni); @@ -220,62 +219,91 @@ DEF_TEST(Utils, reporter) { } #define ASCII_BYTE "X" -#define CONTINUATION_BYTE "\x80" -#define LEADING_TWO_BYTE "\xC4" -#define LEADING_THREE_BYTE "\xE0" +#define CONTINUATION_BYTE "\xA1" +#define LEADING_TWO_BYTE "\xC2" +#define LEADING_THREE_BYTE "\xE1" #define LEADING_FOUR_BYTE "\xF0" #define INVALID_BYTE "\xFC" -static bool valid_utf8(const char* p, size_t l) { - return SkUTF8_CountUnichars(p, l) >= 0; -} -DEF_TEST(Utils_UTF8_ValidLength, r) { - const char* goodTestcases[] = { - "", - ASCII_BYTE, - ASCII_BYTE ASCII_BYTE, - LEADING_TWO_BYTE CONTINUATION_BYTE, - ASCII_BYTE LEADING_TWO_BYTE CONTINUATION_BYTE, - ASCII_BYTE ASCII_BYTE LEADING_TWO_BYTE CONTINUATION_BYTE, - LEADING_THREE_BYTE CONTINUATION_BYTE CONTINUATION_BYTE, - ASCII_BYTE LEADING_THREE_BYTE CONTINUATION_BYTE CONTINUATION_BYTE, - ASCII_BYTE ASCII_BYTE LEADING_THREE_BYTE CONTINUATION_BYTE CONTINUATION_BYTE, - LEADING_FOUR_BYTE CONTINUATION_BYTE CONTINUATION_BYTE CONTINUATION_BYTE, - ASCII_BYTE LEADING_FOUR_BYTE CONTINUATION_BYTE CONTINUATION_BYTE CONTINUATION_BYTE, - ASCII_BYTE ASCII_BYTE LEADING_FOUR_BYTE CONTINUATION_BYTE CONTINUATION_BYTE - CONTINUATION_BYTE, +DEF_TEST(SkUTF_CountUTF8, r) { + struct { + int expectedCount; + const char* utf8String; + } testCases[] = { + { 0, "" }, + { 1, ASCII_BYTE }, + { 2, ASCII_BYTE ASCII_BYTE }, + { 1, LEADING_TWO_BYTE CONTINUATION_BYTE }, + { 2, ASCII_BYTE LEADING_TWO_BYTE CONTINUATION_BYTE }, + { 3, ASCII_BYTE ASCII_BYTE LEADING_TWO_BYTE CONTINUATION_BYTE }, + { 1, LEADING_THREE_BYTE CONTINUATION_BYTE CONTINUATION_BYTE }, + { 2, ASCII_BYTE LEADING_THREE_BYTE CONTINUATION_BYTE CONTINUATION_BYTE }, + { 3, ASCII_BYTE ASCII_BYTE LEADING_THREE_BYTE CONTINUATION_BYTE CONTINUATION_BYTE }, + { 1, LEADING_FOUR_BYTE CONTINUATION_BYTE CONTINUATION_BYTE CONTINUATION_BYTE }, + { 2, ASCII_BYTE LEADING_FOUR_BYTE CONTINUATION_BYTE CONTINUATION_BYTE CONTINUATION_BYTE }, + { 3, ASCII_BYTE ASCII_BYTE LEADING_FOUR_BYTE CONTINUATION_BYTE CONTINUATION_BYTE + CONTINUATION_BYTE }, + { -1, INVALID_BYTE }, + { -1, INVALID_BYTE CONTINUATION_BYTE }, + { -1, INVALID_BYTE CONTINUATION_BYTE CONTINUATION_BYTE }, + { -1, INVALID_BYTE CONTINUATION_BYTE CONTINUATION_BYTE CONTINUATION_BYTE }, + { -1, LEADING_TWO_BYTE }, + { -1, CONTINUATION_BYTE }, + { -1, CONTINUATION_BYTE CONTINUATION_BYTE }, + { -1, LEADING_THREE_BYTE CONTINUATION_BYTE }, + { -1, CONTINUATION_BYTE CONTINUATION_BYTE CONTINUATION_BYTE }, + { -1, LEADING_FOUR_BYTE CONTINUATION_BYTE }, + { -1, CONTINUATION_BYTE CONTINUATION_BYTE CONTINUATION_BYTE CONTINUATION_BYTE }, }; - for (const char* testcase : goodTestcases) { - REPORTER_ASSERT(r, valid_utf8(testcase, strlen(testcase))); + for (auto testCase : testCases) { + const char* str = testCase.utf8String; + REPORTER_ASSERT(r, testCase.expectedCount == SkUTF::CountUTF8(str, strlen(str))); } - const char* badTestcases[] = { - INVALID_BYTE, - INVALID_BYTE CONTINUATION_BYTE, - INVALID_BYTE CONTINUATION_BYTE CONTINUATION_BYTE, - INVALID_BYTE CONTINUATION_BYTE CONTINUATION_BYTE CONTINUATION_BYTE, - LEADING_TWO_BYTE, - CONTINUATION_BYTE, - CONTINUATION_BYTE CONTINUATION_BYTE, - LEADING_THREE_BYTE CONTINUATION_BYTE, - CONTINUATION_BYTE CONTINUATION_BYTE CONTINUATION_BYTE, - LEADING_FOUR_BYTE CONTINUATION_BYTE, - CONTINUATION_BYTE CONTINUATION_BYTE CONTINUATION_BYTE CONTINUATION_BYTE, - - ASCII_BYTE INVALID_BYTE, - ASCII_BYTE INVALID_BYTE CONTINUATION_BYTE, - ASCII_BYTE INVALID_BYTE CONTINUATION_BYTE CONTINUATION_BYTE, - ASCII_BYTE INVALID_BYTE CONTINUATION_BYTE CONTINUATION_BYTE CONTINUATION_BYTE, - ASCII_BYTE LEADING_TWO_BYTE, - ASCII_BYTE CONTINUATION_BYTE, - ASCII_BYTE CONTINUATION_BYTE CONTINUATION_BYTE, - ASCII_BYTE LEADING_THREE_BYTE CONTINUATION_BYTE, - ASCII_BYTE CONTINUATION_BYTE CONTINUATION_BYTE CONTINUATION_BYTE, - ASCII_BYTE LEADING_FOUR_BYTE CONTINUATION_BYTE, - ASCII_BYTE CONTINUATION_BYTE CONTINUATION_BYTE CONTINUATION_BYTE CONTINUATION_BYTE, - - // LEADING_FOUR_BYTE LEADING_TWO_BYTE CONTINUATION_BYTE, +} + +DEF_TEST(SkUTF_NextUTF8_ToUTF8, r) { + struct { + SkUnichar expected; + const char* utf8String; + } testCases[] = { + { -1, INVALID_BYTE }, + { -1, "" }, + { 0x0058, ASCII_BYTE }, + { 0x00A1, LEADING_TWO_BYTE CONTINUATION_BYTE }, + { 0x1861, LEADING_THREE_BYTE CONTINUATION_BYTE CONTINUATION_BYTE }, + { 0x010330, LEADING_FOUR_BYTE "\x90\x8C\xB0" }, }; - for (const char* testcase : badTestcases) { - REPORTER_ASSERT(r, !valid_utf8(testcase, strlen(testcase))); + for (auto testCase : testCases) { + const char* str = testCase.utf8String; + SkUnichar uni = SkUTF::NextUTF8(&str, str + strlen(str)); + REPORTER_ASSERT(r, str == testCase.utf8String + strlen(testCase.utf8String)); + REPORTER_ASSERT(r, uni == testCase.expected); + char buff[5] = {0, 0, 0, 0, 0}; + size_t len = SkUTF::ToUTF8(uni, buff); + if (buff[len] != 0) { + ERRORF(r, "unexpected write"); + continue; + } + if (uni == -1) { + REPORTER_ASSERT(r, len == 0); + continue; + } + if (len == 0) { + ERRORF(r, "unexpected failure."); + continue; + } + if (len > 4) { + ERRORF(r, "wrote too much"); + continue; + } + str = testCase.utf8String; + REPORTER_ASSERT(r, len == strlen(buff)); + REPORTER_ASSERT(r, len == strlen(str)); + REPORTER_ASSERT(r, 0 == strcmp(str, buff)); } - } +#undef ASCII_BYTE +#undef CONTINUATION_BYTE +#undef LEADING_TWO_BYTE +#undef LEADING_THREE_BYTE +#undef LEADING_FOUR_BYTE +#undef INVALID_BYTE |