Home | History | Annotate | Download | only in unittest
      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