1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "BidiUtils.h" 18 19 #include <gtest/gtest.h> 20 21 #include "minikin/Range.h" 22 23 #include "UnicodeUtils.h" 24 25 namespace minikin { 26 27 const char LTR_1[] = "Hello, World"; 28 const char RTL_1[] = "\u0627\u0644\u0633\u0644\u0627\u0645\u0020\u0639\u0644\u064A\u0643\u0645"; 29 const char LTR_2[] = "Hello, Android"; 30 const char RTL_2[] = "\u0639\u0644\u064A\u0643\u0645\u0020\u0627\u0644\u0633\u0644\u0627\u0645"; 31 32 TEST(BidiUtilsTest, AllLTRCharText) { 33 auto text = utf8ToUtf16(LTR_1); 34 uint32_t ltrLength = text.size(); 35 { 36 BidiText bidiText(text, Range(0, ltrLength), Bidi::LTR); 37 auto it = bidiText.begin(); 38 EXPECT_NE(bidiText.end(), it); 39 EXPECT_EQ(Range(0, ltrLength), (*it).range); 40 EXPECT_FALSE((*it).isRtl); 41 ++it; 42 EXPECT_EQ(bidiText.end(), it); 43 } 44 { 45 BidiText bidiText(text, Range(0, ltrLength), Bidi::RTL); 46 auto it = bidiText.begin(); 47 EXPECT_NE(bidiText.end(), it); 48 EXPECT_EQ(Range(0, ltrLength), (*it).range); 49 EXPECT_FALSE((*it).isRtl); 50 ++it; 51 EXPECT_EQ(bidiText.end(), it); 52 } 53 { 54 BidiText bidiText(text, Range(0, ltrLength), Bidi::DEFAULT_LTR); 55 auto it = bidiText.begin(); 56 EXPECT_NE(bidiText.end(), it); 57 EXPECT_EQ(Range(0, ltrLength), (*it).range); 58 EXPECT_FALSE((*it).isRtl); 59 ++it; 60 EXPECT_EQ(bidiText.end(), it); 61 } 62 { 63 BidiText bidiText(text, Range(0, ltrLength), Bidi::DEFAULT_RTL); 64 auto it = bidiText.begin(); 65 EXPECT_NE(bidiText.end(), it); 66 EXPECT_EQ(Range(0, ltrLength), (*it).range); 67 EXPECT_FALSE((*it).isRtl); 68 ++it; 69 EXPECT_EQ(bidiText.end(), it); 70 } 71 { 72 BidiText bidiText(text, Range(0, ltrLength), Bidi::FORCE_LTR); 73 auto it = bidiText.begin(); 74 EXPECT_NE(bidiText.end(), it); 75 EXPECT_EQ(Range(0, ltrLength), (*it).range); 76 EXPECT_FALSE((*it).isRtl); 77 ++it; 78 EXPECT_EQ(bidiText.end(), it); 79 } 80 { 81 BidiText bidiText(text, Range(0, ltrLength), Bidi::FORCE_RTL); 82 auto it = bidiText.begin(); 83 EXPECT_NE(bidiText.end(), it); 84 EXPECT_EQ(Range(0, ltrLength), (*it).range); 85 EXPECT_TRUE((*it).isRtl); 86 ++it; 87 EXPECT_EQ(bidiText.end(), it); 88 } 89 } 90 91 TEST(BidiUtilsTest, AllRTLCharText) { 92 auto text = utf8ToUtf16(RTL_1); 93 uint32_t rtlLength = text.size(); 94 { 95 BidiText bidiText(text, Range(0, rtlLength), Bidi::LTR); 96 auto it = bidiText.begin(); 97 EXPECT_NE(bidiText.end(), it); 98 EXPECT_EQ(Range(0, rtlLength), (*it).range); 99 EXPECT_TRUE((*it).isRtl); 100 ++it; 101 EXPECT_EQ(bidiText.end(), it); 102 } 103 { 104 BidiText bidiText(text, Range(0, rtlLength), Bidi::RTL); 105 auto it = bidiText.begin(); 106 EXPECT_NE(bidiText.end(), it); 107 EXPECT_EQ(Range(0, rtlLength), (*it).range); 108 EXPECT_TRUE((*it).isRtl); 109 ++it; 110 EXPECT_EQ(bidiText.end(), it); 111 } 112 { 113 BidiText bidiText(text, Range(0, rtlLength), Bidi::DEFAULT_LTR); 114 auto it = bidiText.begin(); 115 EXPECT_NE(bidiText.end(), it); 116 EXPECT_EQ(Range(0, rtlLength), (*it).range); 117 EXPECT_TRUE((*it).isRtl); 118 ++it; 119 EXPECT_EQ(bidiText.end(), it); 120 } 121 { 122 BidiText bidiText(text, Range(0, rtlLength), Bidi::DEFAULT_RTL); 123 auto it = bidiText.begin(); 124 EXPECT_NE(bidiText.end(), it); 125 EXPECT_EQ(Range(0, rtlLength), (*it).range); 126 EXPECT_TRUE((*it).isRtl); 127 ++it; 128 EXPECT_EQ(bidiText.end(), it); 129 } 130 { 131 BidiText bidiText(text, Range(0, rtlLength), Bidi::FORCE_LTR); 132 auto it = bidiText.begin(); 133 EXPECT_NE(bidiText.end(), it); 134 EXPECT_EQ(Range(0, rtlLength), (*it).range); 135 EXPECT_FALSE((*it).isRtl); 136 ++it; 137 EXPECT_EQ(bidiText.end(), it); 138 } 139 { 140 BidiText bidiText(text, Range(0, rtlLength), Bidi::FORCE_RTL); 141 auto it = bidiText.begin(); 142 EXPECT_NE(bidiText.end(), it); 143 EXPECT_EQ(Range(0, rtlLength), (*it).range); 144 EXPECT_TRUE((*it).isRtl); 145 ++it; 146 EXPECT_EQ(bidiText.end(), it); 147 } 148 } 149 150 TEST(BidiUtilsTest, LTR_RTL_CharText) { 151 auto text = utf8ToUtf16(std::string(LTR_1) + RTL_1); 152 uint32_t ltrLength = utf8ToUtf16(LTR_1).size(); 153 uint32_t rtlLength = utf8ToUtf16(RTL_1).size(); 154 { 155 // Logical Run: L1 L2 R1 R2 156 // Visual Run : L1 L2 R2 R1 157 BidiText bidiText(text, Range(0, text.size()), Bidi::LTR); 158 auto it = bidiText.begin(); 159 EXPECT_NE(bidiText.end(), it); 160 EXPECT_EQ(Range(0, ltrLength), (*it).range); 161 EXPECT_FALSE((*it).isRtl); 162 ++it; 163 EXPECT_NE(bidiText.end(), it); 164 EXPECT_EQ(Range(ltrLength, ltrLength + rtlLength), (*it).range); 165 EXPECT_TRUE((*it).isRtl); 166 ++it; 167 EXPECT_EQ(bidiText.end(), it); 168 } 169 { 170 // Logical Run: L1 L2 R1 R2 171 // Visual Run : R2 R1 L1 L2 172 BidiText bidiText(text, Range(0, text.size()), Bidi::RTL); 173 auto it = bidiText.begin(); 174 EXPECT_NE(bidiText.end(), it); 175 EXPECT_EQ(Range(ltrLength, ltrLength + rtlLength), (*it).range); 176 EXPECT_TRUE((*it).isRtl); 177 ++it; 178 EXPECT_NE(bidiText.end(), it); 179 EXPECT_EQ(Range(0, ltrLength), (*it).range); 180 EXPECT_FALSE((*it).isRtl); 181 ++it; 182 EXPECT_EQ(bidiText.end(), it); 183 } 184 { 185 // Logical Run: L1 L2 R1 R2 186 // Visual Run : L1 L2 R2 R1 187 BidiText bidiText(text, Range(0, text.size()), Bidi::DEFAULT_LTR); 188 auto it = bidiText.begin(); 189 EXPECT_NE(bidiText.end(), it); 190 EXPECT_EQ(Range(0, ltrLength), (*it).range); 191 EXPECT_FALSE((*it).isRtl); 192 ++it; 193 EXPECT_NE(bidiText.end(), it); 194 EXPECT_EQ(Range(ltrLength, ltrLength + rtlLength), (*it).range); 195 EXPECT_TRUE((*it).isRtl); 196 ++it; 197 EXPECT_EQ(bidiText.end(), it); 198 } 199 { 200 // Logical Run: L1 L2 R1 R2 201 // Visual Run : L1 L2 R2 R1 202 BidiText bidiText(text, Range(0, text.size()), Bidi::DEFAULT_RTL); 203 auto it = bidiText.begin(); 204 EXPECT_NE(bidiText.end(), it); 205 EXPECT_EQ(Range(0, ltrLength), (*it).range); 206 EXPECT_FALSE((*it).isRtl); 207 ++it; 208 EXPECT_NE(bidiText.end(), it); 209 EXPECT_EQ(Range(ltrLength, ltrLength + rtlLength), (*it).range); 210 EXPECT_TRUE((*it).isRtl); 211 ++it; 212 EXPECT_EQ(bidiText.end(), it); 213 } 214 { 215 // Logical Run: L1 L2 R1 R2 216 // Visual Run : L1 L2 R1 R2 217 BidiText bidiText(text, Range(0, text.size()), Bidi::FORCE_LTR); 218 auto it = bidiText.begin(); 219 EXPECT_NE(bidiText.end(), it); 220 EXPECT_EQ(Range(0, ltrLength + rtlLength), (*it).range); 221 EXPECT_FALSE((*it).isRtl); 222 ++it; 223 EXPECT_EQ(bidiText.end(), it); 224 } 225 { 226 // Logical Run: L1 L2 R1 R2 227 // Visual Run : R2 R1 L2 L1 228 BidiText bidiText(text, Range(0, text.size()), Bidi::FORCE_RTL); 229 auto it = bidiText.begin(); 230 EXPECT_NE(bidiText.end(), it); 231 EXPECT_EQ(Range(0, ltrLength + rtlLength), (*it).range); 232 EXPECT_TRUE((*it).isRtl); 233 ++it; 234 EXPECT_EQ(bidiText.end(), it); 235 } 236 } 237 238 TEST(BidiUtilsTest, RTL_LTR_CharText) { 239 auto text = utf8ToUtf16(std::string(RTL_1) + LTR_1); 240 uint32_t ltrLength = utf8ToUtf16(LTR_1).size(); 241 uint32_t rtlLength = utf8ToUtf16(RTL_1).size(); 242 { 243 // Logical Run: R1 R2 L1 L2 244 // Visual Run : R2 R1 L1 L2 245 BidiText bidiText(text, Range(0, text.size()), Bidi::LTR); 246 auto it = bidiText.begin(); 247 EXPECT_NE(bidiText.end(), it); 248 EXPECT_EQ(Range(0, rtlLength), (*it).range); 249 EXPECT_TRUE((*it).isRtl); 250 ++it; 251 EXPECT_NE(bidiText.end(), it); 252 EXPECT_EQ(Range(rtlLength, ltrLength + rtlLength), (*it).range); 253 EXPECT_FALSE((*it).isRtl); 254 ++it; 255 EXPECT_EQ(bidiText.end(), it); 256 } 257 { 258 // Logical Run: R1 R2 L1 L2 259 // Visual Run : L1 L2 R2 R1 260 BidiText bidiText(text, Range(0, text.size()), Bidi::RTL); 261 auto it = bidiText.begin(); 262 EXPECT_NE(bidiText.end(), it); 263 EXPECT_EQ(Range(rtlLength, ltrLength + rtlLength), (*it).range); 264 EXPECT_FALSE((*it).isRtl); 265 ++it; 266 EXPECT_NE(bidiText.end(), it); 267 EXPECT_EQ(Range(0, rtlLength), (*it).range); 268 EXPECT_TRUE((*it).isRtl); 269 ++it; 270 EXPECT_EQ(bidiText.end(), it); 271 } 272 { 273 // Logical Run: R1 R2 L1 L2 274 // Visual Run : L1 L2 R2 R1 275 BidiText bidiText(text, Range(0, text.size()), Bidi::DEFAULT_LTR); 276 auto it = bidiText.begin(); 277 EXPECT_NE(bidiText.end(), it); 278 EXPECT_EQ(Range(rtlLength, ltrLength + rtlLength), (*it).range); 279 EXPECT_FALSE((*it).isRtl); 280 ++it; 281 EXPECT_NE(bidiText.end(), it); 282 EXPECT_EQ(Range(0, rtlLength), (*it).range); 283 EXPECT_TRUE((*it).isRtl); 284 ++it; 285 EXPECT_EQ(bidiText.end(), it); 286 } 287 { 288 // Logical Run: R1 R2 L1 L2 289 // Visual Run : L1 L2 R2 R1 290 BidiText bidiText(text, Range(0, text.size()), Bidi::DEFAULT_RTL); 291 auto it = bidiText.begin(); 292 EXPECT_NE(bidiText.end(), it); 293 EXPECT_EQ(Range(rtlLength, ltrLength + rtlLength), (*it).range); 294 EXPECT_FALSE((*it).isRtl); 295 ++it; 296 EXPECT_NE(bidiText.end(), it); 297 EXPECT_EQ(Range(0, rtlLength), (*it).range); 298 EXPECT_TRUE((*it).isRtl); 299 ++it; 300 EXPECT_EQ(bidiText.end(), it); 301 } 302 { 303 // Logical Run: R1 R2 L1 L2 304 // Visual Run : R1 R2 L1 L2 305 BidiText bidiText(text, Range(0, text.size()), Bidi::FORCE_LTR); 306 auto it = bidiText.begin(); 307 EXPECT_NE(bidiText.end(), it); 308 EXPECT_EQ(Range(0, ltrLength + rtlLength), (*it).range); 309 EXPECT_FALSE((*it).isRtl); 310 ++it; 311 EXPECT_EQ(bidiText.end(), it); 312 } 313 { 314 // Logical Run: R1 R2 L1 L2 315 // Visual Run : L2 L1 R2 R1 316 BidiText bidiText(text, Range(0, text.size()), Bidi::FORCE_RTL); 317 auto it = bidiText.begin(); 318 EXPECT_NE(bidiText.end(), it); 319 EXPECT_EQ(Range(0, ltrLength + rtlLength), (*it).range); 320 EXPECT_TRUE((*it).isRtl); 321 ++it; 322 EXPECT_EQ(bidiText.end(), it); 323 } 324 } 325 326 TEST(BidiUtilsTest, LTR_RTL_LTR_CharText) { 327 auto text = utf8ToUtf16(std::string(LTR_1) + RTL_1 + LTR_2); 328 uint32_t ltr1Length = utf8ToUtf16(LTR_1).size(); 329 uint32_t ltr2Length = utf8ToUtf16(LTR_2).size(); 330 uint32_t rtlLength = utf8ToUtf16(RTL_1).size(); 331 { 332 // Logical Run: L1 L2 R1 R2 L3 L4 333 // Visual Run : L1 L2 R2 R1 L3 L4 334 BidiText bidiText(text, Range(0, text.size()), Bidi::LTR); 335 auto it = bidiText.begin(); 336 EXPECT_NE(bidiText.end(), it); 337 EXPECT_EQ(Range(0, ltr1Length), (*it).range); 338 EXPECT_FALSE((*it).isRtl); 339 ++it; 340 EXPECT_NE(bidiText.end(), it); 341 EXPECT_EQ(Range(ltr1Length, ltr1Length + rtlLength), (*it).range); 342 EXPECT_TRUE((*it).isRtl); 343 ++it; 344 EXPECT_NE(bidiText.end(), it); 345 EXPECT_EQ(Range(ltr1Length + rtlLength, ltr1Length + rtlLength + ltr2Length), (*it).range); 346 EXPECT_FALSE((*it).isRtl); 347 ++it; 348 EXPECT_EQ(bidiText.end(), it); 349 } 350 { 351 // Logical Run: L1 L2 R1 R2 L3 L4 352 // Visual Run : L3 L4 R2 R1 L1 2L 353 BidiText bidiText(text, Range(0, text.size()), Bidi::RTL); 354 auto it = bidiText.begin(); 355 EXPECT_NE(bidiText.end(), it); 356 EXPECT_EQ(Range(ltr1Length + rtlLength, text.size()), (*it).range); 357 EXPECT_FALSE((*it).isRtl); 358 ++it; 359 EXPECT_NE(bidiText.end(), it); 360 EXPECT_EQ(Range(ltr1Length, ltr1Length + rtlLength), (*it).range); 361 EXPECT_TRUE((*it).isRtl); 362 ++it; 363 EXPECT_NE(bidiText.end(), it); 364 EXPECT_EQ(Range(0, ltr1Length), (*it).range); 365 EXPECT_FALSE((*it).isRtl); 366 ++it; 367 EXPECT_EQ(bidiText.end(), it); 368 } 369 { 370 // Logical Run: L1 L2 R1 R2 L3 L4 371 // Visual Run : L1 L2 R2 R1 L3 L4 372 BidiText bidiText(text, Range(0, text.size()), Bidi::DEFAULT_LTR); 373 auto it = bidiText.begin(); 374 EXPECT_NE(bidiText.end(), it); 375 EXPECT_EQ(Range(0, ltr1Length), (*it).range); 376 EXPECT_FALSE((*it).isRtl); 377 ++it; 378 EXPECT_NE(bidiText.end(), it); 379 EXPECT_EQ(Range(ltr1Length, ltr1Length + rtlLength), (*it).range); 380 EXPECT_TRUE((*it).isRtl); 381 ++it; 382 EXPECT_NE(bidiText.end(), it); 383 EXPECT_EQ(Range(ltr1Length + rtlLength, ltr1Length + rtlLength + ltr2Length), (*it).range); 384 EXPECT_FALSE((*it).isRtl); 385 ++it; 386 EXPECT_EQ(bidiText.end(), it); 387 } 388 { 389 // Logical Run: L1 L2 R1 R2 L3 L4 390 // Visual Run : L1 L2 R2 R1 L3 L4 391 BidiText bidiText(text, Range(0, text.size()), Bidi::DEFAULT_RTL); 392 auto it = bidiText.begin(); 393 EXPECT_NE(bidiText.end(), it); 394 EXPECT_EQ(Range(0, ltr1Length), (*it).range); 395 EXPECT_FALSE((*it).isRtl); 396 ++it; 397 EXPECT_NE(bidiText.end(), it); 398 EXPECT_EQ(Range(ltr1Length, ltr1Length + rtlLength), (*it).range); 399 EXPECT_TRUE((*it).isRtl); 400 ++it; 401 EXPECT_NE(bidiText.end(), it); 402 EXPECT_EQ(Range(ltr1Length + rtlLength, ltr1Length + rtlLength + ltr2Length), (*it).range); 403 EXPECT_FALSE((*it).isRtl); 404 ++it; 405 EXPECT_EQ(bidiText.end(), it); 406 } 407 { 408 // Logical Run: L1 L2 R1 R2 L3 L4 409 // Visual Run : L1 L2 R2 R1 L3 L4 410 BidiText bidiText(text, Range(0, text.size()), Bidi::FORCE_LTR); 411 auto it = bidiText.begin(); 412 EXPECT_NE(bidiText.end(), it); 413 EXPECT_EQ(Range(0, ltr1Length + rtlLength + ltr2Length), (*it).range); 414 EXPECT_FALSE((*it).isRtl); 415 ++it; 416 EXPECT_EQ(bidiText.end(), it); 417 } 418 { 419 // Logical Run: L1 L2 R1 R2 L3 L4 420 // Visual Run : L1 L2 R2 R1 L3 L4 421 BidiText bidiText(text, Range(0, text.size()), Bidi::FORCE_RTL); 422 auto it = bidiText.begin(); 423 EXPECT_NE(bidiText.end(), it); 424 EXPECT_EQ(Range(0, ltr1Length + rtlLength + ltr2Length), (*it).range); 425 EXPECT_TRUE((*it).isRtl); 426 ++it; 427 EXPECT_EQ(bidiText.end(), it); 428 } 429 } 430 431 TEST(BidiUtilsTest, RTL_LTR_RTL_CharText) { 432 auto text = utf8ToUtf16(std::string(RTL_1) + LTR_1 + RTL_2); 433 uint32_t ltrLength = utf8ToUtf16(LTR_1).size(); 434 uint32_t rtl1Length = utf8ToUtf16(RTL_1).size(); 435 uint32_t rtl2Length = utf8ToUtf16(RTL_2).size(); 436 { 437 // Logical Run: R1 R2 L1 L2 R3 R4 438 // Visual Run : R2 R1 L1 L2 R4 R3 439 BidiText bidiText(text, Range(0, text.size()), Bidi::LTR); 440 auto it = bidiText.begin(); 441 EXPECT_NE(bidiText.end(), it); 442 EXPECT_EQ(Range(0, rtl1Length), (*it).range); 443 EXPECT_TRUE((*it).isRtl); 444 ++it; 445 EXPECT_NE(bidiText.end(), it); 446 EXPECT_EQ(Range(rtl1Length, ltrLength + rtl1Length), (*it).range); 447 EXPECT_FALSE((*it).isRtl); 448 ++it; 449 EXPECT_NE(bidiText.end(), it); 450 EXPECT_EQ(Range(rtl1Length + ltrLength, text.size()), (*it).range); 451 EXPECT_TRUE((*it).isRtl); 452 ++it; 453 EXPECT_EQ(bidiText.end(), it); 454 } 455 { 456 // Logical Run: R1 R2 L1 L2 R3 R4 457 // Visual Run : R4 R3 L1 L2 R2 R1 458 BidiText bidiText(text, Range(0, text.size()), Bidi::RTL); 459 auto it = bidiText.begin(); 460 EXPECT_NE(bidiText.end(), it); 461 EXPECT_EQ(Range(rtl1Length + ltrLength, text.size()), (*it).range); 462 EXPECT_TRUE((*it).isRtl); 463 ++it; 464 EXPECT_NE(bidiText.end(), it); 465 EXPECT_EQ(Range(rtl1Length, ltrLength + rtl1Length), (*it).range); 466 EXPECT_FALSE((*it).isRtl); 467 ++it; 468 EXPECT_NE(bidiText.end(), it); 469 EXPECT_EQ(Range(0, rtl1Length), (*it).range); 470 EXPECT_TRUE((*it).isRtl); 471 ++it; 472 EXPECT_EQ(bidiText.end(), it); 473 } 474 { 475 // Logical Run: R1 R2 L1 L2 R3 R4 476 // Visual Run : R4 R3 L1 L2 R2 R1 477 BidiText bidiText(text, Range(0, text.size()), Bidi::DEFAULT_LTR); 478 auto it = bidiText.begin(); 479 EXPECT_NE(bidiText.end(), it); 480 EXPECT_EQ(Range(rtl1Length + ltrLength, text.size()), (*it).range); 481 EXPECT_TRUE((*it).isRtl); 482 ++it; 483 EXPECT_NE(bidiText.end(), it); 484 EXPECT_EQ(Range(rtl1Length, ltrLength + rtl1Length), (*it).range); 485 EXPECT_FALSE((*it).isRtl); 486 ++it; 487 EXPECT_NE(bidiText.end(), it); 488 EXPECT_EQ(Range(0, rtl1Length), (*it).range); 489 EXPECT_TRUE((*it).isRtl); 490 ++it; 491 EXPECT_EQ(bidiText.end(), it); 492 } 493 { 494 // Logical Run: R1 R2 L1 L2 R3 R4 495 // Visual Run : R4 R3 L1 L2 R2 R1 496 BidiText bidiText(text, Range(0, text.size()), Bidi::DEFAULT_RTL); 497 auto it = bidiText.begin(); 498 EXPECT_NE(bidiText.end(), it); 499 EXPECT_EQ(Range(rtl1Length + ltrLength, text.size()), (*it).range); 500 EXPECT_TRUE((*it).isRtl); 501 ++it; 502 EXPECT_NE(bidiText.end(), it); 503 EXPECT_EQ(Range(rtl1Length, ltrLength + rtl1Length), (*it).range); 504 EXPECT_FALSE((*it).isRtl); 505 ++it; 506 EXPECT_NE(bidiText.end(), it); 507 EXPECT_EQ(Range(0, rtl1Length), (*it).range); 508 EXPECT_TRUE((*it).isRtl); 509 ++it; 510 EXPECT_EQ(bidiText.end(), it); 511 } 512 { 513 // Logical Run: R1 R2 L1 L2 R3 R4 514 // Visual Run : R1 R2 L1 L2 R3 R4 515 BidiText bidiText(text, Range(0, text.size()), Bidi::FORCE_LTR); 516 auto it = bidiText.begin(); 517 EXPECT_NE(bidiText.end(), it); 518 EXPECT_EQ(Range(0, rtl1Length + ltrLength + rtl2Length), (*it).range); 519 EXPECT_FALSE((*it).isRtl); 520 ++it; 521 EXPECT_EQ(bidiText.end(), it); 522 } 523 { 524 // Logical Run: R1 R2 L1 L2 R3 R4 525 // Visual Run : R4 R3 L2 L1 R2 R1 526 BidiText bidiText(text, Range(0, text.size()), Bidi::FORCE_RTL); 527 auto it = bidiText.begin(); 528 EXPECT_NE(bidiText.end(), it); 529 EXPECT_EQ(Range(0, rtl1Length + ltrLength + rtl2Length), (*it).range); 530 EXPECT_TRUE((*it).isRtl); 531 ++it; 532 EXPECT_EQ(bidiText.end(), it); 533 } 534 } 535 536 } // namespace minikin 537