Home | History | Annotate | Download | only in bidi
      1 /* GENERATED SOURCE. DO NOT MODIFY. */
      2 //  2016 and later: Unicode, Inc. and others.
      3 // License & terms of use: http://www.unicode.org/copyright.html#License
      4 /*
      5 *******************************************************************************
      6 *   Copyright (C) 2001-2010, International Business Machines
      7 *   Corporation and others.  All Rights Reserved.
      8 *******************************************************************************
      9 */
     10 
     11 package android.icu.dev.test.bidi;
     12 
     13 import java.util.Arrays;
     14 
     15 import org.junit.Test;
     16 
     17 import android.icu.text.Bidi;
     18 import android.icu.testsharding.MainTestShard;
     19 
     20 /**
     21  * Regression test for variants to the UBA.
     22  *
     23  * @author Lina Kemmel, Matitiahu Allouche
     24  */
     25 
     26 @MainTestShard
     27 public class TestReorderingMode extends BidiFmwk {
     28 
     29     static final String[] textIn = {
     30     /* (0) 123 */
     31         "123",
     32     /* (1) .123->4.5 */
     33         ".123->4.5",
     34     /* (2) 678 */
     35         "678",
     36     /* (3) .678->8.9 */
     37         ".678->8.9",
     38     /* (4) JIH1.2,3MLK */
     39         "JIH1.2,3MLK",
     40     /* (5) FE.>12-> */
     41         "FE.>12->",
     42     /* (6) JIH.>12->a */
     43         "JIH.>12->a",
     44     /* (7) CBA.>67->89=a */
     45         "CBA.>67->89=a",
     46     /* (8) CBA.123->xyz */
     47         "CBA.123->xyz",
     48     /* (9) .>12->xyz */
     49         ".>12->xyz",
     50     /* (10) a.>67->xyz */
     51         "a.>67->xyz",
     52     /* (11) 123JIH */
     53         "123JIH",
     54     /* (12) 123 JIH */
     55         "123 JIH"
     56     };
     57 
     58     static final String[] textOut = {
     59     /* TC 0: 123 */
     60         "123",                                                              /* (0) */
     61     /* TC 1: .123->4.5 */
     62         ".123->4.5",                                                        /* (1) */
     63         "4.5<-123.",                                                        /* (2) */
     64     /* TC 2: 678 */
     65         "678",                                                              /* (3) */
     66     /* TC 3: .678->8.9 */
     67         ".8.9<-678",                                                        /* (4) */
     68         "8.9<-678.",                                                        /* (5) */
     69         ".678->8.9",                                                        /* (6) */
     70     /* TC 4: MLK1.2,3JIH */
     71         "KLM1.2,3HIJ",                                                      /* (7) */
     72     /* TC 5: FE.>12-> */
     73         "12<.EF->",                                                         /* (8) */
     74         "<-12<.EF",                                                         /* (9) */
     75         "EF.>@12->",                                                        /* (10) */
     76     /* TC 6: JIH.>12->a */
     77         "12<.HIJ->a",                                                       /* (11) */
     78         "a<-12<.HIJ",                                                       /* (12) */
     79         "HIJ.>@12->a",                                                      /* (13) */
     80         "a&<-12<.HIJ",                                                      /* (14) */
     81     /* TC 7: CBA.>67->89=a */
     82         "ABC.>@67->89=a",                                                   /* (15) */
     83         "a=89<-67<.ABC",                                                    /* (16) */
     84         "a&=89<-67<.ABC",                                                   /* (17) */
     85         "89<-67<.ABC=a",                                                    /* (18) */
     86     /* TC 8: CBA.123->xyz */
     87         "123.ABC->xyz",                                                     /* (19) */
     88         "xyz<-123.ABC",                                                     /* (20) */
     89         "ABC.@123->xyz",                                                    /* (21) */
     90         "xyz&<-123.ABC",                                                    /* (22) */
     91     /* TC 9: .>12->xyz */
     92         ".>12->xyz",                                                        /* (23) */
     93         "xyz<-12<.",                                                        /* (24) */
     94         "xyz&<-12<.",                                                       /* (25) */
     95     /* TC 10: a.>67->xyz */
     96         "a.>67->xyz",                                                       /* (26) */
     97         "a.>@67@->xyz",                                                     /* (27) */
     98         "xyz<-67<.a",                                                       /* (28) */
     99     /* TC 11: 123JIH */
    100         "123HIJ",                                                           /* (29) */
    101         "HIJ123",                                                           /* (30) */
    102     /* TC 12: 123 JIH */
    103         "123 HIJ",                                                          /* (31) */
    104         "HIJ 123",                                                          /* (32) */
    105     };
    106 
    107     static final int[][][][] outIndices = {
    108         { /* TC 0: 123 */
    109             {{ 0,  0}, { 0,  0}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    110             {{ 0,  0}, { 0,  0}}, /* REORDER_INVERSE_LIKE_DIRECT */
    111             {{ 0,  0}, { 0,  0}}, /* REORDER_NUMBERS_SPECIAL */
    112             {{ 0,  0}, { 0,  0}}  /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    113         },
    114         { /* TC 1: .123->4.5 */
    115             {{ 1,  2}, { 1,  2}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    116             {{ 1,  2}, { 1,  2}}, /* REORDER_INVERSE_LIKE_DIRECT */
    117             {{ 1,  2}, { 1,  2}}, /* REORDER_NUMBERS_SPECIAL */
    118             {{ 1,  2}, { 1,  2}}  /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    119         },
    120         { /* TC 2: 678 */
    121             {{ 3,  3}, { 3,  3}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    122             {{ 3,  3}, { 3,  3}}, /* REORDER_INVERSE_LIKE_DIRECT */
    123             {{ 3,  3}, { 3,  3}}, /* REORDER_NUMBERS_SPECIAL */
    124             {{ 3,  3}, { 3,  3}}  /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    125         },
    126         { /* TC 3: .678->8.9 */
    127             {{ 6,  5}, { 6,  5}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    128             {{ 4,  5}, { 4,  5}}, /* REORDER_INVERSE_LIKE_DIRECT */
    129             {{ 6,  5}, { 6,  5}}, /* REORDER_NUMBERS_SPECIAL */
    130             {{ 6,  5}, { 6,  5}}  /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    131         },
    132         { /* TC 4: MLK1.2,3JIH */
    133             {{ 7,  7}, { 7,  7}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    134             {{ 7,  7}, { 7,  7}}, /* REORDER_INVERSE_LIKE_DIRECT */
    135             {{ 7,  7}, { 7,  7}}, /* REORDER_NUMBERS_SPECIAL */
    136             {{ 7,  7}, { 7,  7}}  /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    137         },
    138         { /* TC 5: FE.>12-> */
    139             {{ 8,  9}, { 8,  9}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    140             {{10,  9}, { 8,  9}}, /* REORDER_INVERSE_LIKE_DIRECT */
    141             {{ 8,  9}, { 8,  9}}, /* REORDER_NUMBERS_SPECIAL */
    142             {{10,  9}, { 8,  9}}  /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    143         },
    144         { /* TC 6: JIH.>12->a */
    145             {{11, 12}, {11, 12}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    146             {{13, 14}, {11, 12}}, /* REORDER_INVERSE_LIKE_DIRECT */
    147             {{11, 12}, {11, 12}}, /* REORDER_NUMBERS_SPECIAL */
    148             {{13, 14}, {11, 12}}  /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    149         },
    150         { /* TC 7: CBA.>67->89=a */
    151             {{18, 16}, {18, 16}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    152             {{18, 17}, {18, 16}}, /* REORDER_INVERSE_LIKE_DIRECT */
    153             {{18, 16}, {18, 16}}, /* REORDER_NUMBERS_SPECIAL */
    154             {{15, 17}, {18, 16}}  /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    155         },
    156         { /* TC 8: CBA.>124->xyz */
    157             {{19, 20}, {19, 20}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    158             {{21, 22}, {19, 20}}, /* REORDER_INVERSE_LIKE_DIRECT */
    159             {{19, 20}, {19, 20}}, /* REORDER_NUMBERS_SPECIAL */
    160             {{21, 22}, {19, 20}}  /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    161         },
    162         { /* TC 9: .>12->xyz */
    163             {{23, 24}, {23, 24}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    164             {{23, 25}, {23, 24}}, /* REORDER_INVERSE_LIKE_DIRECT */
    165             {{23, 24}, {23, 24}}, /* REORDER_NUMBERS_SPECIAL */
    166             {{23, 25}, {23, 24}}  /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    167         },
    168         { /* TC 10: a.>67->xyz */
    169             {{26, 26}, {26, 26}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    170             {{26, 27}, {26, 28}}, /* REORDER_INVERSE_LIKE_DIRECT */
    171             {{26, 28}, {26, 28}}, /* REORDER_NUMBERS_SPECIAL */
    172             {{26, 27}, {26, 28}}  /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    173         },
    174         { /* TC 11: 124JIH */
    175             {{30, 30}, {30, 30}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    176             {{29, 30}, {29, 30}}, /* REORDER_INVERSE_LIKE_DIRECT */
    177             {{30, 30}, {30, 30}}, /* REORDER_NUMBERS_SPECIAL */
    178             {{30, 30}, {30, 30}}  /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    179         },
    180         { /* TC 12: 124 JIH */
    181             {{32, 32}, {32, 32}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    182             {{31, 32}, {31, 32}}, /* REORDER_INVERSE_LIKE_DIRECT */
    183             {{31, 32}, {31, 32}}, /* REORDER_NUMBERS_SPECIAL */
    184             {{31, 32}, {31, 32}}  /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    185         }
    186     };
    187 
    188     static final short[] modes = {
    189         Bidi.REORDER_GROUP_NUMBERS_WITH_R,
    190         Bidi.REORDER_INVERSE_LIKE_DIRECT,
    191         Bidi.REORDER_NUMBERS_SPECIAL,
    192         Bidi.REORDER_INVERSE_FOR_NUMBERS_SPECIAL,
    193         Bidi.REORDER_INVERSE_NUMBERS_AS_L
    194     };
    195 
    196     static final int[] options = { Bidi.OPTION_INSERT_MARKS, 0 };
    197 
    198     static final byte[] paraLevels = { Bidi.LTR, Bidi.RTL };
    199 
    200     static final int TC_COUNT = textIn.length;
    201     static final int MODES_COUNT = modes.length;
    202     static final int OPTIONS_COUNT = options.length;
    203     static final int LEVELS_COUNT = paraLevels.length;
    204 
    205     @Test
    206     public void testReorderingMode() {
    207 
    208         String src, dest;
    209         Bidi bidi = new Bidi();
    210         Bidi bidi2 = new Bidi();
    211         Bidi bidi3 = new Bidi();
    212         int tc, mode, option, level;
    213         int modeValue, modeBack;
    214         int optionValue, optionBack;
    215         int index;
    216         String expected;
    217         boolean testOK = true;
    218 
    219         logln("\nEntering TestReorderingMode\n");
    220 
    221         bidi2.setInverse(true);
    222 
    223         for (tc = 0; tc < TC_COUNT; tc++) {
    224             src = textIn[tc];
    225 
    226             for (mode = 0; mode < MODES_COUNT; mode++) {
    227                 modeValue = modes[mode];
    228                 bidi.setReorderingMode(modeValue);
    229                 modeBack = bidi.getReorderingMode();
    230                 if (modeValue != modeBack) {
    231                     errln("Error while setting reordering mode to " +
    232                     modeValue + ", returned " + modeBack);
    233                 }
    234 
    235                 for (option = 0; option < OPTIONS_COUNT; option++) {
    236                     optionValue = options[option];
    237                     bidi.setReorderingOptions(optionValue);
    238                     optionBack = bidi.getReorderingOptions();
    239                     if (optionValue != optionBack) {
    240                         errln("Error while setting reordering options to " +
    241                         modeValue + ", returned " + modeBack);
    242                     }
    243 
    244                     for (level = 0; level < LEVELS_COUNT; level++) {
    245                         logln("starting test " + tc + " mode=" + modeValue +
    246                             " option=" + optionValue + " level=" + level);
    247                         bidi.setPara(pseudoToU16(src), paraLevels[level], null);
    248 
    249                         dest = bidi.writeReordered(Bidi.DO_MIRRORING);
    250                         dest = u16ToPseudo(dest);
    251                         if (!((modeValue == Bidi.REORDER_INVERSE_NUMBERS_AS_L) &&
    252                               (optionValue == Bidi.OPTION_INSERT_MARKS))) {
    253                             checkWhatYouCan(bidi, src, dest);
    254                         }
    255                         String modeDesc = modeToString(modeValue);
    256                         String optDesc = spOptionsToString(optionValue);
    257 
    258                         if (modeValue == Bidi.REORDER_INVERSE_NUMBERS_AS_L) {
    259                             index = -1;
    260                             expected = inverseBasic(bidi2, src, optionValue,
    261                                                     paraLevels[level]);
    262                         }
    263                         else {
    264                             index = outIndices[tc][mode][option][level];
    265                             expected = textOut[index];
    266                         }
    267                         if (!assertEquals("Actual and expected output mismatch",
    268                                           expected, dest, src, modeDesc, optDesc,
    269                                           String.valueOf(level))) {
    270                             testOK = false;
    271                             continue;
    272                         }
    273                         if ((optionValue == Bidi.OPTION_INSERT_MARKS) &&
    274                             !assertRoundTrip(bidi3, tc, index, src, dest,
    275                                              mode, option,
    276                                              paraLevels[level])) {
    277                             testOK = false;
    278                             continue;
    279                         }
    280                         if (!checkResultLength(bidi, src, dest, modeDesc, optDesc,
    281                                                paraLevels[level])) {
    282                             testOK = false;
    283                             continue;
    284                         }
    285                         if ((index > -1) &&
    286                             !checkMaps(bidi, index, src, dest, modeDesc, optDesc,
    287                                        paraLevels[level], true)) {
    288                             testOK = false;
    289                         }
    290                     }
    291                 }
    292             }
    293         }
    294         if (testOK) {
    295             logln("Reordering mode test OK");
    296         }
    297 
    298         logln("\nExiting TestReorderingMode\n");
    299     }
    300 
    301     String inverseBasic(Bidi bidi, String src, int option, byte level) {
    302         String dest2;
    303 
    304         if (bidi == null || src == null) {
    305             return null;
    306         }
    307         bidi.setReorderingOptions(option);
    308         bidi.setPara(pseudoToU16(src), level, null);
    309         dest2 = u16ToPseudo(bidi.writeReordered(Bidi.DO_MIRRORING));
    310         if (!(option == Bidi.OPTION_INSERT_MARKS)) {
    311             checkWhatYouCan(bidi, src, dest2);
    312         }
    313         return dest2;
    314     }
    315 
    316     static final byte roundtrip[][][][] =
    317     {
    318         { /* TC 0: 123 */
    319             {{ 1,  1}, { 1,  1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    320             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_LIKE_DIRECT */
    321             {{ 1,  1}, { 1,  1}}, /* REORDER_NUMBERS_SPECIAL */
    322             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    323             {{ 1,  1}, { 1,  1}}  /* REORDER_INVERSE_NUMBERS_AS_L */
    324         },
    325         { /* TC 1: .123->4.5 */
    326             {{ 1,  1}, { 1,  1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    327             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_LIKE_DIRECT */
    328             {{ 1,  1}, { 1,  1}}, /* REORDER_NUMBERS_SPECIAL */
    329             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    330             {{ 1,  1}, { 1,  1}}  /* REORDER_INVERSE_NUMBERS_AS_L */
    331         },
    332         { /* TC 2: 678 */
    333             {{ 1,  1}, { 1,  1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    334             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_LIKE_DIRECT */
    335             {{ 1,  1}, { 1,  1}}, /* REORDER_NUMBERS_SPECIAL */
    336             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    337             {{ 1,  1}, { 1,  1}}  /* REORDER_INVERSE_NUMBERS_AS_L */
    338         },
    339         { /* TC 3: .678->8.9 */
    340             {{ 1,  1}, { 1,  1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    341             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_LIKE_DIRECT */
    342             {{ 1,  1}, { 1,  1}}, /* REORDER_NUMBERS_SPECIAL */
    343             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    344             {{ 0,  0}, { 1,  1}}  /* REORDER_INVERSE_NUMBERS_AS_L */
    345         },
    346         { /* TC 4: MLK1.2,3JIH */
    347             {{ 1,  1}, { 1,  1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    348             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_LIKE_DIRECT */
    349             {{ 1,  1}, { 1,  1}}, /* REORDER_NUMBERS_SPECIAL */
    350             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    351             {{ 1,  1}, { 1,  1}}  /* REORDER_INVERSE_NUMBERS_AS_L */
    352         },
    353         { /* TC 5: FE.>12-> */
    354             {{ 1,  1}, { 1,  1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    355             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_LIKE_DIRECT */
    356             {{ 0,  1}, { 1,  1}}, /* REORDER_NUMBERS_SPECIAL */
    357             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    358             {{ 1,  1}, { 1,  1}}  /* REORDER_INVERSE_NUMBERS_AS_L */
    359         },
    360         { /* TC 6: JIH.>12->a */
    361             {{ 1,  1}, { 1,  1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    362             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_LIKE_DIRECT */
    363             {{ 0,  0}, { 1,  1}}, /* REORDER_NUMBERS_SPECIAL */
    364             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    365             {{ 1,  1}, { 1,  1}}  /* REORDER_INVERSE_NUMBERS_AS_L */
    366         },
    367         { /* TC 7: CBA.>67->89=a */
    368             {{ 1,  1}, { 1,  1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    369             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_LIKE_DIRECT */
    370             {{ 0,  1}, { 1,  1}}, /* REORDER_NUMBERS_SPECIAL */
    371             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    372             {{ 0,  0}, { 1,  1}}  /* REORDER_INVERSE_NUMBERS_AS_L */
    373         },
    374         { /* TC 8: CBA.>123->xyz */
    375             {{ 1,  1}, { 1,  1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    376             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_LIKE_DIRECT */
    377             {{ 0,  0}, { 1,  1}}, /* REORDER_NUMBERS_SPECIAL */
    378             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    379             {{ 1,  1}, { 1,  1}}  /* REORDER_INVERSE_NUMBERS_AS_L */
    380         },
    381         { /* TC 9: .>12->xyz */
    382             {{ 1,  1}, { 1,  1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    383             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_LIKE_DIRECT */
    384             {{ 1,  0}, { 1,  1}}, /* REORDER_NUMBERS_SPECIAL */
    385             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    386             {{ 1,  1}, { 1,  1}}  /* REORDER_INVERSE_NUMBERS_AS_L */
    387         },
    388         { /* TC 10: a.>67->xyz */
    389             {{ 1,  1}, { 1,  1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    390             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_LIKE_DIRECT */
    391             {{ 1,  1}, { 1,  1}}, /* REORDER_NUMBERS_SPECIAL */
    392             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    393             {{ 1,  0}, { 1,  1}}  /* REORDER_INVERSE_NUMBERS_AS_L */
    394         },
    395         { /* TC 11: 123JIH */
    396             {{ 1,  1}, { 1,  1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    397             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_LIKE_DIRECT */
    398             {{ 1,  1}, { 1,  1}}, /* REORDER_NUMBERS_SPECIAL */
    399             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    400             {{ 1,  1}, { 1,  1}}  /* REORDER_INVERSE_NUMBERS_AS_L */
    401         },
    402         { /* TC 12: 123 JIH */
    403             {{ 1,  1}, { 1,  1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
    404             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_LIKE_DIRECT */
    405             {{ 1,  1}, { 1,  1}}, /* REORDER_NUMBERS_SPECIAL */
    406             {{ 1,  1}, { 1,  1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
    407             {{ 1,  1}, { 1,  1}}  /* REORDER_INVERSE_NUMBERS_AS_L */
    408         }
    409     };
    410 
    411     private boolean assertRoundTrip(Bidi bidi, int tc, int outIndex,
    412                                     String src, String dest,
    413                                     int mode, int option, byte level) {
    414         String descMode, descOption;
    415         String dest2;
    416 
    417         switch (modes[mode]) {
    418             case Bidi.REORDER_NUMBERS_SPECIAL:
    419                 bidi.setReorderingMode(Bidi.REORDER_INVERSE_FOR_NUMBERS_SPECIAL);
    420                 break;
    421             case Bidi.REORDER_GROUP_NUMBERS_WITH_R:
    422                 bidi.setReorderingMode(Bidi.REORDER_GROUP_NUMBERS_WITH_R);
    423                 break;
    424             case Bidi.REORDER_RUNS_ONLY:
    425                 bidi.setReorderingMode(Bidi.REORDER_RUNS_ONLY);
    426                 break;
    427             case Bidi.REORDER_INVERSE_NUMBERS_AS_L:
    428                 bidi.setReorderingMode(Bidi.REORDER_DEFAULT);
    429                 break;
    430             case Bidi.REORDER_INVERSE_LIKE_DIRECT:
    431                 bidi.setReorderingMode(Bidi.REORDER_DEFAULT);
    432                 break;
    433             case Bidi.REORDER_INVERSE_FOR_NUMBERS_SPECIAL:
    434                 bidi.setReorderingMode(Bidi.REORDER_NUMBERS_SPECIAL);
    435                 break;
    436             default:
    437                 bidi.setReorderingMode(Bidi.REORDER_INVERSE_LIKE_DIRECT);
    438                 break;
    439         }
    440         bidi.setReorderingOptions(Bidi.OPTION_REMOVE_CONTROLS);
    441 
    442         bidi.setPara(pseudoToU16(dest), level, null);
    443         dest2 = bidi.writeReordered(Bidi.DO_MIRRORING);
    444 
    445         dest2 = u16ToPseudo(dest2);
    446         checkWhatYouCan(bidi, dest, dest2);
    447         descMode = modeToString(modes[mode]);
    448         descOption = spOptionsToString(options[option]);
    449         if (!src.equals(dest2)) {
    450             if (roundtrip[tc][mode][option][level] == 1) {
    451                 errln("\nRound trip failed for case=" + tc +
    452                       " mode=" + mode + " option=" + option +
    453                       "\nOriginal text:      " + src +
    454                       "\nRound-tripped text: " + dest2 +
    455                       "\nIntermediate text:  " + dest +
    456                       "\nReordering mode:    " + descMode +
    457                       "\nReordering option:  " + descOption +
    458                       "\nParagraph level:    " + level);
    459             } else {
    460                 logln("\nExpected round trip failure for case=" + tc +
    461                       " mode=" + mode + " option=" + option +
    462                       "\nOriginal text:      " + src +
    463                       "\nRound-tripped text: " + dest2 +
    464                       "\nIntermediate text:  " + dest +
    465                       "\nReordering mode:    " + descMode +
    466                       "\nReordering option:  " + descOption +
    467                       "\nParagraph level:    " + level);
    468             }
    469             return false;
    470         }
    471         if (!checkResultLength(bidi, dest, dest2, descMode,
    472                                "OPTION_REMOVE_CONTROLS", level)) {
    473             return false;
    474         }
    475         if ((outIndex > -1) &&
    476             !checkMaps(bidi, outIndex, src, dest, descMode,
    477                        "OPTION_REMOVE_CONTROLS", level, false)) {
    478             return false;
    479         }
    480         return true;
    481     }
    482 
    483     private boolean checkResultLength(Bidi bidi, String src, String dest,
    484                                    String mode, String option, byte level) {
    485         int actualLen;
    486         if (mode.equals("REORDER_INVERSE_NUMBERS_AS_L"))
    487             actualLen = dest.length();
    488         else
    489             actualLen = bidi.getResultLength();
    490         if (actualLen != dest.length()) {
    491             errln("\nBidi.getResultLength failed." +
    492                   "\nExpected:           " + dest.length() +
    493                   "\nActual:             " + actualLen +
    494                   "\nInput:              " + src +
    495                   "\nOutput:             " + dest +
    496                   "\nReordering mode:    " + mode +
    497                   "\nReordering option:  " + option +
    498                   "\nParagraph level:    " + level);
    499             return false;
    500         }
    501         return true;
    502     }
    503 
    504     static String formatMap(int[] map)
    505     {
    506         char[] buffer = new char[map.length];
    507         int i, k;
    508         char c;
    509         for (i = 0; i < map.length; i++) {
    510             k = map[i];
    511             if (k < 0)
    512                 c = '-';
    513             else if (k >= columns.length)
    514                 c = '+';
    515             else
    516                 c = columns[k];
    517             buffer[i] = c;
    518         }
    519         return new String(buffer);
    520     }
    521 
    522     static final int NO = Bidi.MAP_NOWHERE;
    523 
    524     static final int forwardMap[][] = {
    525     /* TC 0: 123 */
    526         { 0, 1, 2 },                                                    /* (0) */
    527     /* TC 1: .123->4.5 */
    528         { 0, 1, 2, 3, 4, 5, 6, 7, 8 },                                  /* (1) */
    529         { 8, 5, 6, 7, 4, 3, 0, 1, 2 },                                  /* (2) */
    530     /* TC 2: 678 */
    531         { 0, 1, 2 },                                                    /* (3) */
    532     /* TC 3: .678->8.9 */
    533         { 0, 6, 7, 8, 5, 4, 1, 2, 3 },                                  /* (4) */
    534         { 8, 5, 6, 7, 4, 3, 0, 1, 2 },                                  /* (5) */
    535         { 0, 1, 2, 3, 4, 5, 6, 7, 8 },                                  /* (6) */
    536     /* TC 4: MLK1.2,3JIH */
    537         { 10, 9, 8, 3, 4, 5, 6, 7, 2, 1, 0 },                           /* (7) */
    538     /* TC 5: FE.>12-> */
    539         { 5, 4, 3, 2, 0, 1, 6, 7 },                                     /* (8) */
    540         { 7, 6, 5, 4, 2, 3, 1, 0 },                                     /* (9) */
    541         { 1, 0, 2, 3, 5, 6, 7, 8 },                                     /* (10) */
    542     /* TC 6: JIH.>12->a */
    543         { 6, 5, 4, 3, 2, 0, 1, 7, 8, 9 },                               /* (11) */
    544         { 9, 8, 7, 6, 5, 3, 4, 2, 1, 0 },                               /* (12) */
    545         { 2, 1, 0, 3, 4, 6, 7, 8, 9, 10 },                              /* (13) */
    546         { 10, 9, 8, 7, 6, 4, 5, 3, 2, 0 },                              /* (14) */
    547     /* TC 7: CBA.>67->89=a */
    548         { 2, 1, 0, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13 },                  /* (15) */
    549         { 12, 11, 10, 9, 8, 6, 7, 5, 4, 2, 3, 1, 0 },                   /* (16) */
    550         { 13, 12, 11, 10, 9, 7, 8, 6, 5, 3, 4, 2, 0 },                  /* (17) */
    551         { 10, 9, 8, 7, 6, 4, 5, 3, 2, 0, 1, 11, 12 },                   /* (18) */
    552     /* TC 8: CBA.123->xyz */
    553         { 6, 5, 4, 3, 0, 1, 2, 7, 8, 9, 10, 11 },                       /* (19) */
    554         { 11, 10, 9, 8, 5, 6, 7, 4, 3, 0, 1, 2 },                       /* (20) */
    555         { 2, 1, 0, 3, 5, 6, 7, 8, 9, 10, 11, 12 },                      /* (21) */
    556         { 12, 11, 10, 9, 6, 7, 8, 5, 4, 0, 1, 2 },                      /* (22) */
    557     /* TC 9: .>12->xyz */
    558         { 0, 1, 2, 3, 4, 5, 6, 7, 8 },                                  /* (23) */
    559         { 8, 7, 5, 6, 4, 3, 0, 1, 2 },                                  /* (24) */
    560         { 9, 8, 6, 7, 5, 4, 0, 1, 2 },                                  /* (25) */
    561     /* TC 10: a.>67->xyz */
    562         { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },                               /* (26) */
    563         { 0, 1, 2, 4, 5, 7, 8, 9, 10, 11 },                             /* (27) */
    564         { 9, 8, 7, 5, 6, 4, 3, 0, 1, 2 },                               /* (28) */
    565     /* TC 11: 123JIH */
    566         { 0, 1, 2, 5, 4, 3 },                                           /* (29) */
    567         { 3, 4, 5, 2, 1, 0 },                                           /* (30) */
    568     /* TC 12: 123 JIH */
    569         { 0, 1, 2, 3, 6, 5, 4 },                                        /* (31) */
    570         { 4, 5, 6, 3, 2, 1, 0 },                                        /* (32) */
    571     };
    572     static final int inverseMap[][] = {
    573     /* TC 0: 123 */
    574         { 0, 1, 2 },                                                    /* (0) */
    575     /* TC 1: .123->4.5 */
    576         { 0, 1, 2, 3, 4, 5, 6, 7, 8 },                                  /* (1) */
    577         { 6, 7, 8, 5, 4, 1, 2, 3, 0 },                                  /* (2) */
    578     /* TC 2: 678 */
    579         { 0, 1, 2 },                                                    /* (3) */
    580     /* TC 3: .678->8.9 */
    581         { 0, 6, 7, 8, 5, 4, 1, 2, 3 },                                  /* (4) */
    582         { 6, 7, 8, 5, 4, 1, 2, 3, 0 },                                  /* (5) */
    583         { 0, 1, 2, 3, 4, 5, 6, 7, 8 },                                  /* (6) */
    584     /* TC 4: MLK1.2,3JIH */
    585         { 10, 9, 8, 3, 4, 5, 6, 7, 2, 1, 0 },                           /* (7) */
    586     /* TC 5: FE.>12-> */
    587         { 4, 5, 3, 2, 1, 0, 6, 7 },                                     /* (8) */
    588         { 7, 6, 4, 5, 3, 2, 1, 0 },                                     /* (9) */
    589         { 1, 0, 2, 3, NO, 4, 5, 6, 7 },                                 /* (10) */
    590     /* TC 6: JIH.>12->a */
    591         { 5, 6, 4, 3, 2, 1, 0, 7, 8, 9 },                               /* (11) */
    592         { 9, 8, 7, 5, 6, 4, 3, 2, 1, 0 },                               /* (12) */
    593         { 2, 1, 0, 3, 4, NO, 5, 6, 7, 8, 9 },                           /* (13) */
    594         { 9, NO, 8, 7, 5, 6, 4, 3, 2, 1, 0 },                           /* (14) */
    595     /* TC 7: CBA.>67->89=a */
    596         { 2, 1, 0, 3, 4, NO, 5, 6, 7, 8, 9, 10, 11, 12 },               /* (15) */
    597         { 12, 11, 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0 },                   /* (16) */
    598         { 12, NO, 11, 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0 },               /* (17) */
    599         { 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0, 11, 12 },                   /* (18) */
    600     /* TC 8: CBA.123->xyz */
    601         { 4, 5, 6, 3, 2, 1, 0, 7, 8, 9, 10, 11 },                       /* (19) */
    602         { 9, 10, 11, 8, 7, 4, 5, 6, 3, 2, 1, 0 },                       /* (20) */
    603         { 2, 1, 0, 3, NO, 4, 5, 6, 7, 8, 9, 10, 11 },                   /* (21) */
    604         { 9, 10, 11, NO, 8, 7, 4, 5, 6, 3, 2, 1, 0 },                   /* (22) */
    605     /* TC 9: .>12->xyz */
    606         { 0, 1, 2, 3, 4, 5, 6, 7, 8 },                                  /* (23) */
    607         { 6, 7, 8, 5, 4, 2, 3, 1, 0 },                                  /* (24) */
    608         { 6, 7, 8, NO, 5, 4, 2, 3, 1, 0 },                              /* (25) */
    609     /* TC 10: a.>67->xyz */
    610         { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },                               /* (26) */
    611         { 0, 1, 2, NO, 3, 4, NO, 5, 6, 7, 8, 9 },                       /* (27) */
    612         { 7, 8, 9, 6, 5, 3, 4, 2, 1, 0 },                               /* (28) */
    613     /* TC 11: 123JIH */
    614         { 0, 1, 2, 5, 4, 3 },                                           /* (29) */
    615         { 5, 4, 3, 0, 1, 2 },                                           /* (30) */
    616     /* TC 12: 123 JIH */
    617         { 0, 1, 2, 3, 6, 5, 4 },                                        /* (31) */
    618         { 6, 5, 4, 3, 0, 1, 2 },                                        /* (32) */
    619     };
    620 
    621     private boolean checkMaps(Bidi bidi, int stringIndex, String src, String dest,
    622             String mode, String option, byte level, boolean forward) {
    623 
    624         int[] actualLogicalMap;
    625         int[] actualVisualMap;
    626         int[] getIndexMap;
    627         int i, srcLen, resLen, index;
    628         int[] expectedLogicalMap, expectedVisualMap;
    629         boolean testOK = true;
    630 
    631         if (forward) {
    632             expectedLogicalMap = forwardMap[stringIndex];
    633             expectedVisualMap  = inverseMap[stringIndex];
    634         } else {
    635             expectedLogicalMap = inverseMap[stringIndex];
    636             expectedVisualMap  = forwardMap[stringIndex];
    637         }
    638         actualLogicalMap = bidi.getLogicalMap();
    639         srcLen = bidi.getProcessedLength();
    640         if (!Arrays.equals(expectedLogicalMap, actualLogicalMap)) {
    641             err("Bidi.getLogicalMap returned unexpected map for output " +
    642                 "string index " + stringIndex + "\n" +
    643                 "source: " + src + "\n" +
    644                 "dest  : " + dest + "\n" +
    645                 "Scale : " + columnString + "\n" +
    646                 "ExpMap: " + formatMap(expectedLogicalMap) + "\n" +
    647                 "Actual: " + formatMap(actualLogicalMap) + "\n" +
    648                 "Paragraph level  : " + level + " == " + bidi.getParaLevel() + "\n" +
    649                 "Reordering mode  : " + mode + " == " + bidi.getReorderingMode() + "\n" +
    650                 "Reordering option: " + option + " == " + bidi.getReorderingOptions() + "\n" +
    651                 "Forward flag     : " + forward + "\n");
    652             testOK = false;
    653         }
    654         resLen = bidi.getResultLength();
    655         actualVisualMap = bidi.getVisualMap();
    656         if (!Arrays.equals(expectedVisualMap, actualVisualMap)) {
    657             err("Bidi.getVisualMap returned unexpected map for output " +
    658                 "string index " + stringIndex + "\n" +
    659                 "source: " + src + "\n" +
    660                 "dest  : " + dest + "\n" +
    661                 "Scale : " + columnString + "\n" +
    662                 "ExpMap: " + formatMap(expectedVisualMap) + "\n" +
    663                 "Actual: " + formatMap(actualVisualMap) + "\n" +
    664                 "Paragraph level  : " + level + " == " + bidi.getParaLevel() + "\n" +
    665                 "Reordering mode  : " + mode + " == " + bidi.getReorderingMode() + "\n" +
    666                 "Reordering option: " + option + " == " + bidi.getReorderingOptions() + "\n" +
    667                 "Forward flag     : " + forward + "\n");
    668             testOK = false;
    669         }
    670         getIndexMap = new int[srcLen];
    671         for (i = 0; i < srcLen; i++) {
    672             index = bidi.getVisualIndex(i);
    673             getIndexMap[i] = index;
    674         }
    675         if (!Arrays.equals(actualLogicalMap, getIndexMap)) {
    676             err("Mismatch between getLogicalMap and getVisualIndex for output " +
    677                 "string index " + stringIndex + "\n" +
    678                 "source: " + src + "\n" +
    679                 "dest  : " + dest + "\n" +
    680                 "Scale : " + columnString + "\n" +
    681                 "ActMap: " + formatMap(actualLogicalMap) + "\n" +
    682                 "IdxMap: " + formatMap(getIndexMap) + "\n" +
    683                 "Paragraph level  : " + level + " == " + bidi.getParaLevel() + "\n" +
    684                 "Reordering mode  : " + mode + " == " + bidi.getReorderingMode() + "\n" +
    685                 "Reordering option: " + option + " == " + bidi.getReorderingOptions() + "\n" +
    686                 "Forward flag     : " + forward + "\n");
    687             testOK = false;
    688         }
    689         getIndexMap = new int[resLen];
    690         for (i = 0; i < resLen; i++) {
    691             index = bidi.getLogicalIndex(i);
    692             getIndexMap[i] = index;
    693         }
    694         if (!Arrays.equals(actualVisualMap, getIndexMap)) {
    695             err("Mismatch between getVisualMap and getLogicalIndex for output " +
    696                 "string index " + stringIndex + "\n" +
    697                 "source: " + src + "\n" +
    698                 "dest  : " + dest + "\n" +
    699                 "Scale : " + columnString + "\n" +
    700                 "ActMap: " + formatMap(actualVisualMap) + "\n" +
    701                 "IdxMap: " + formatMap(getIndexMap) + "\n" +
    702                 "Paragraph level  : " + level + " == " + bidi.getParaLevel() + "\n" +
    703                 "Reordering mode  : " + mode + " == " + bidi.getReorderingMode() + "\n" +
    704                 "Reordering option: " + option + " == " + bidi.getReorderingOptions() + "\n" +
    705                 "Forward flag     : " + forward + "\n");
    706             testOK = false;
    707         }
    708         return testOK;
    709     }
    710 }
    711