1 #include "Test.h" 2 #include "SkRandom.h" 3 #include "SkTSearch.h" 4 #include "SkTSort.h" 5 #include "SkUtils.h" 6 7 #define kSEARCH_COUNT 91 8 9 static void test_search(skiatest::Reporter* reporter) { 10 int i, array[kSEARCH_COUNT]; 11 SkRandom rand; 12 13 for (i = 0; i < kSEARCH_COUNT; i++) { 14 array[i] = rand.nextS(); 15 } 16 17 SkTHeapSort<int>(array, kSEARCH_COUNT); 18 // make sure we got sorted properly 19 for (i = 1; i < kSEARCH_COUNT; i++) { 20 REPORTER_ASSERT(reporter, array[i-1] <= array[i]); 21 } 22 23 // make sure we can find all of our values 24 for (i = 0; i < kSEARCH_COUNT; i++) { 25 int index = SkTSearch<int>(array, kSEARCH_COUNT, array[i], sizeof(int)); 26 REPORTER_ASSERT(reporter, index == i); 27 } 28 29 // make sure that random values are either found, or the correct 30 // insertion index is returned 31 for (i = 0; i < 10000; i++) { 32 int value = rand.nextS(); 33 int index = SkTSearch<int>(array, kSEARCH_COUNT, value, sizeof(int)); 34 35 if (index >= 0) { 36 REPORTER_ASSERT(reporter, 37 index < kSEARCH_COUNT && array[index] == value); 38 } else { 39 index = ~index; 40 REPORTER_ASSERT(reporter, index <= kSEARCH_COUNT); 41 if (index < kSEARCH_COUNT) { 42 REPORTER_ASSERT(reporter, value < array[index]); 43 if (index > 0) { 44 REPORTER_ASSERT(reporter, value > array[index - 1]); 45 } 46 } else { 47 // we should append the new value 48 REPORTER_ASSERT(reporter, value > array[kSEARCH_COUNT - 1]); 49 } 50 } 51 } 52 } 53 54 static void test_utf16(skiatest::Reporter* reporter) { 55 static const SkUnichar gUni[] = { 56 0x10000, 0x18080, 0x20202, 0xFFFFF, 0x101234 57 }; 58 59 uint16_t buf[2]; 60 61 for (size_t i = 0; i < SK_ARRAY_COUNT(gUni); i++) { 62 size_t count = SkUTF16_FromUnichar(gUni[i], buf); 63 REPORTER_ASSERT(reporter, count == 2); 64 size_t count2 = SkUTF16_CountUnichars(buf, 2); 65 REPORTER_ASSERT(reporter, count2 == 1); 66 const uint16_t* ptr = buf; 67 SkUnichar c = SkUTF16_NextUnichar(&ptr); 68 REPORTER_ASSERT(reporter, c == gUni[i]); 69 REPORTER_ASSERT(reporter, ptr - buf == 2); 70 } 71 } 72 73 static void TestUTF(skiatest::Reporter* reporter) { 74 static const struct { 75 const char* fUtf8; 76 SkUnichar fUni; 77 } gTest[] = { 78 { "a", 'a' }, 79 { "\x7f", 0x7f }, 80 { "\xC2\x80", 0x80 }, 81 { "\xC3\x83", (3 << 6) | 3 }, 82 { "\xDF\xBF", 0x7ff }, 83 { "\xE0\xA0\x80", 0x800 }, 84 { "\xE0\xB0\xB8", 0xC38 }, 85 { "\xE3\x83\x83", (3 << 12) | (3 << 6) | 3 }, 86 { "\xEF\xBF\xBF", 0xFFFF }, 87 { "\xF0\x90\x80\x80", 0x10000 }, 88 { "\xF3\x83\x83\x83", (3 << 18) | (3 << 12) | (3 << 6) | 3 } 89 }; 90 91 for (size_t i = 0; i < SK_ARRAY_COUNT(gTest); i++) { 92 const char* p = gTest[i].fUtf8; 93 int n = SkUTF8_CountUnichars(p); 94 SkUnichar u0 = SkUTF8_ToUnichar(gTest[i].fUtf8); 95 SkUnichar u1 = SkUTF8_NextUnichar(&p); 96 97 REPORTER_ASSERT(reporter, n == 1); 98 REPORTER_ASSERT(reporter, u0 == u1); 99 REPORTER_ASSERT(reporter, u0 == gTest[i].fUni); 100 REPORTER_ASSERT(reporter, 101 p - gTest[i].fUtf8 == (int)strlen(gTest[i].fUtf8)); 102 } 103 104 test_utf16(reporter); 105 test_search(reporter); 106 } 107 108 #include "TestClassDef.h" 109 DEFINE_TESTCLASS("UTF", UtfTestClass, TestUTF) 110