| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 bool hasStrongDirectionality; | 71 bool hasStrongDirectionality; |
| 72 String data(entry.text, entry.length); | 72 String data(entry.text, entry.length); |
| 73 TextRun run(data); | 73 TextRun run(data); |
| 74 TextDirection direction = | 74 TextDirection direction = |
| 75 determineParagraphDirectionality(run, &hasStrongDirectionality); | 75 determineParagraphDirectionality(run, &hasStrongDirectionality); |
| 76 EXPECT_EQ(entry.expectedStrong, hasStrongDirectionality); | 76 EXPECT_EQ(entry.expectedStrong, hasStrongDirectionality); |
| 77 EXPECT_EQ(entry.expectedDirection, direction); | 77 EXPECT_EQ(entry.expectedDirection, direction); |
| 78 } | 78 } |
| 79 | 79 |
| 80 TEST(BidiResolver, ParagraphDirectionSurrogates) { | 80 TEST(BidiResolver, ParagraphDirectionSurrogates) { |
| 81 const TestData testData[] = { | 81 const TestData testData[] = {// Test strong RTL, non-BMP. (U+10858 Imperial |
| 82 // Test strong RTL, non-BMP. (U+10858 Imperial Aramaic number one, strong
RTL) | 82 // Aramaic number one, strong RTL) |
| 83 {{0xD802, 0xDC58}, 2, RTL, true}, | 83 {{0xD802, 0xDC58}, 2, RTL, true}, |
| 84 | 84 |
| 85 // Test strong LTR, non-BMP. (U+1D15F Musical symbol quarter note, strong
LTR) | 85 // Test strong LTR, non-BMP. (U+1D15F Musical |
| 86 {{0xD834, 0xDD5F}, 2, LTR, true}, | 86 // symbol quarter note, strong LTR) |
| 87 {{0xD834, 0xDD5F}, 2, LTR, true}, |
| 87 | 88 |
| 88 // Test broken surrogate: valid leading, invalid trail. (Lead of U+10858,
space) | 89 // Test broken surrogate: valid leading, invalid |
| 89 {{0xD802, ' '}, 2, LTR, false}, | 90 // trail. (Lead of U+10858, space) |
| 91 {{0xD802, ' '}, 2, LTR, false}, |
| 90 | 92 |
| 91 // Test broken surrogate: invalid leading. (Trail of U+10858, U+05D0 Hebre
w Alef) | 93 // Test broken surrogate: invalid leading. (Trail |
| 92 {{0xDC58, 0x05D0}, 2, RTL, true}, | 94 // of U+10858, U+05D0 Hebrew Alef) |
| 95 {{0xDC58, 0x05D0}, 2, RTL, true}, |
| 93 | 96 |
| 94 // Test broken surrogate: valid leading, invalid trail/valid lead, valid t
rail. | 97 // Test broken surrogate: valid leading, invalid |
| 95 {{0xD802, 0xD802, 0xDC58}, 3, RTL, true}, | 98 // trail/valid lead, valid trail. |
| 99 {{0xD802, 0xD802, 0xDC58}, 3, RTL, true}, |
| 96 | 100 |
| 97 // Test broken surrogate: valid leading, no trail (string too short). (Lea
d of U+10858) | 101 // Test broken surrogate: valid leading, no trail |
| 98 {{0xD802, 0xDC58}, 1, LTR, false}, | 102 // (string too short). (Lead of U+10858) |
| 103 {{0xD802, 0xDC58}, 1, LTR, false}, |
| 99 | 104 |
| 100 // Test broken surrogate: trail appearing before lead. (U+10858 units reve
rsed) | 105 // Test broken surrogate: trail appearing before |
| 101 {{0xDC58, 0xD802}, 2, LTR, false}}; | 106 // lead. (U+10858 units reversed) |
| 107 {{0xDC58, 0xD802}, 2, LTR, false}}; |
| 102 for (size_t i = 0; i < WTF_ARRAY_LENGTH(testData); ++i) | 108 for (size_t i = 0; i < WTF_ARRAY_LENGTH(testData); ++i) |
| 103 testDirectionality(testData[i]); | 109 testDirectionality(testData[i]); |
| 104 } | 110 } |
| 105 | 111 |
| 106 class BidiTestRunner { | 112 class BidiTestRunner { |
| 107 public: | 113 public: |
| 108 BidiTestRunner() | 114 BidiTestRunner() |
| 109 : m_testsRun(0), | 115 : m_testsRun(0), |
| 110 m_testsSkipped(0), | 116 m_testsSkipped(0), |
| 111 m_ignoredCharFailures(0), | 117 m_ignoredCharFailures(0), |
| (...skipping 12 matching lines...) Expand all Loading... |
| 124 size_t m_testsRun; | 130 size_t m_testsRun; |
| 125 size_t m_testsSkipped; | 131 size_t m_testsSkipped; |
| 126 std::set<UChar> m_skippedCodePoints; | 132 std::set<UChar> m_skippedCodePoints; |
| 127 size_t m_ignoredCharFailures; | 133 size_t m_ignoredCharFailures; |
| 128 size_t m_levelFailures; | 134 size_t m_levelFailures; |
| 129 size_t m_orderFailures; | 135 size_t m_orderFailures; |
| 130 }; | 136 }; |
| 131 | 137 |
| 132 // Blink's UBA does not filter out control characters, etc. Maybe it should? | 138 // Blink's UBA does not filter out control characters, etc. Maybe it should? |
| 133 // Instead it depends on later layers of Blink to simply ignore them. | 139 // Instead it depends on later layers of Blink to simply ignore them. |
| 134 // This function helps us emulate that to be compatible with BidiTest.txt expect
ations. | 140 // This function helps us emulate that to be compatible with BidiTest.txt |
| 141 // expectations. |
| 135 static bool isNonRenderedCodePoint(UChar c) { | 142 static bool isNonRenderedCodePoint(UChar c) { |
| 136 // The tests also expect us to ignore soft-hyphen. | 143 // The tests also expect us to ignore soft-hyphen. |
| 137 if (c == 0xAD) | 144 if (c == 0xAD) |
| 138 return true; | 145 return true; |
| 139 // Control characters are not rendered: | 146 // Control characters are not rendered: |
| 140 return c >= 0x202A && c <= 0x202E; | 147 return c >= 0x202A && c <= 0x202E; |
| 141 // But it seems to expect LRI, etc. to be rendered!? | 148 // But it seems to expect LRI, etc. to be rendered!? |
| 142 } | 149 } |
| 143 | 150 |
| 144 std::string diffString(const std::vector<int>& actual, | 151 std::string diffString(const std::vector<int>& actual, |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 std::ostringstream errorContext; | 201 std::ostringstream errorContext; |
| 195 errorContext << ", line " << lineNumber << " \"" << line << "\""; | 202 errorContext << ", line " << lineNumber << " \"" << line << "\""; |
| 196 errorContext << " context: " | 203 errorContext << " context: " |
| 197 << bidi_test::nameFromParagraphDirection(paragraphDirection); | 204 << bidi_test::nameFromParagraphDirection(paragraphDirection); |
| 198 | 205 |
| 199 std::vector<int> actualOrder; | 206 std::vector<int> actualOrder; |
| 200 std::vector<int> actualLevels; | 207 std::vector<int> actualLevels; |
| 201 actualLevels.assign(input.size(), -1); | 208 actualLevels.assign(input.size(), -1); |
| 202 BidiCharacterRun* run = runs.firstRun(); | 209 BidiCharacterRun* run = runs.firstRun(); |
| 203 while (run) { | 210 while (run) { |
| 204 // Blink's UBA just makes runs, the actual ordering of the display of charac
ters | 211 // Blink's UBA just makes runs, the actual ordering of the display of |
| 205 // is handled later in our pipeline, so we fake it here: | 212 // characters is handled later in our pipeline, so we fake it here: |
| 206 bool reversed = run->reversed(false); | 213 bool reversed = run->reversed(false); |
| 207 ASSERT(run->stop() >= run->start()); | 214 ASSERT(run->stop() >= run->start()); |
| 208 size_t length = run->stop() - run->start(); | 215 size_t length = run->stop() - run->start(); |
| 209 for (size_t i = 0; i < length; i++) { | 216 for (size_t i = 0; i < length; i++) { |
| 210 int inputIndex = reversed ? run->stop() - i - 1 : run->start() + i; | 217 int inputIndex = reversed ? run->stop() - i - 1 : run->start() + i; |
| 211 if (!isNonRenderedCodePoint(input[inputIndex])) | 218 if (!isNonRenderedCodePoint(input[inputIndex])) |
| 212 actualOrder.push_back(inputIndex); | 219 actualOrder.push_back(inputIndex); |
| 213 // BidiTest.txt gives expected level data in the order of the original inp
ut. | 220 // BidiTest.txt gives expected level data in the order of the original |
| 221 // input. |
| 214 actualLevels[inputIndex] = run->level(); | 222 actualLevels[inputIndex] = run->level(); |
| 215 } | 223 } |
| 216 run = run->next(); | 224 run = run->next(); |
| 217 } | 225 } |
| 218 | 226 |
| 219 if (expectedOrder.size() != actualOrder.size()) { | 227 if (expectedOrder.size() != actualOrder.size()) { |
| 220 m_ignoredCharFailures++; | 228 m_ignoredCharFailures++; |
| 221 EXPECT_EQ(expectedOrder.size(), actualOrder.size()) << errorContext.str(); | 229 EXPECT_EQ(expectedOrder.size(), actualOrder.size()) << errorContext.str(); |
| 222 } else if (expectedOrder != actualOrder) { | 230 } else if (expectedOrder != actualOrder) { |
| 223 m_orderFailures++; | 231 m_orderFailures++; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 // The unittest harness only pays attention to GTest output, so we verify | 291 // The unittest harness only pays attention to GTest output, so we verify |
| 284 // that the tests behaved as expected: | 292 // that the tests behaved as expected: |
| 285 EXPECT_EQ(352098u, runner.m_testsRun); | 293 EXPECT_EQ(352098u, runner.m_testsRun); |
| 286 EXPECT_EQ(418143u, runner.m_testsSkipped); | 294 EXPECT_EQ(418143u, runner.m_testsSkipped); |
| 287 EXPECT_EQ(0u, runner.m_ignoredCharFailures); | 295 EXPECT_EQ(0u, runner.m_ignoredCharFailures); |
| 288 EXPECT_EQ(44882u, runner.m_levelFailures); | 296 EXPECT_EQ(44882u, runner.m_levelFailures); |
| 289 EXPECT_EQ(19151u, runner.m_orderFailures); | 297 EXPECT_EQ(19151u, runner.m_orderFailures); |
| 290 } | 298 } |
| 291 | 299 |
| 292 } // namespace blink | 300 } // namespace blink |
| OLD | NEW |