16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/********************************************************************
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT:
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1997-2013, International Business Machines Corporation and
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*   file name:  cbiditst.c
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   encoding:   US-ASCII
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   tab size:   8 (not used)
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   indentation:4
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   created on: 1999sep27
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   created by: Markus W. Scherer, updated by Matitiahu Allouche
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cintltst.h"
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uchar.h"
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h"
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ubidi.h"
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ushape.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cbiditst.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h"
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* the following include is needed for sprintf */
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h>
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MAXLEN      MAX_STRING_LENGTH
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define LENGTHOF(array) (sizeof(array)/sizeof((array)[0]))
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* prototypes ---------------------------------------------------------------*/
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addComplexTest(TestNode** root);
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testCharFromDirProp(void);
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testBidi(void);
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doTests(UBiDi *pBiDi, UBiDi *pLine, UBool countRunsFirst);
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doMisc(void);
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doTest(UBiDi *pBiDi, int testNumber, const BiDiTestData *test,
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   int32_t lineStart, UBool countRunsFirst);
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void _testReordering(UBiDi *pBiDi, int testNumber);
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testInverse(void);
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void _testManyInverseBidi(UBiDi *pBiDi, UBiDiLevel direction);
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void _testInverseBidi(UBiDi *pBiDi, const UChar *src, int32_t srcLength,
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             UBiDiLevel direction, UErrorCode *pErrorCode);
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void _testWriteReverse(void);
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void _testManyAddedPoints(void);
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void _testMisc(void);
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doArabicShapingTest(void);
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doLamAlefSpecialVLTRArabicShapingTest(void);
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doTashkeelSpecialVLTRArabicShapingTest(void);
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doLOGICALArabicDeShapingTest(void);
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doArabicShapingTestForBug5421(void);
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doArabicShapingTestForBug8703(void);
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doArabicShapingTestForBug9024(void);
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testReorder(void);
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testReorderArabicMathSymbols(void);
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testFailureRecovery(void);
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testMultipleParagraphs(void);
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testGetBaseDirection(void);
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testContext(void);
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doTailTest(void);
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
87d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.orgstatic void testBracketOverflow(void);
88d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* new BIDI API */
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testReorderingMode(void);
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testReorderRunsOnly(void);
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testStreaming(void);
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testClassOverride(void);
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char* inverseBasic(UBiDi *pBiDi, const char *src, int32_t srcLen,
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                uint32_t option, UBiDiLevel level, char *result);
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool assertRoundTrip(UBiDi *pBiDi, int32_t tc, int32_t outIndex,
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             const char *srcChars, const char *destChars,
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             const UChar *dest, int32_t destLen, int mode,
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             int option, UBiDiLevel level);
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool checkResultLength(UBiDi *pBiDi, const char *srcChars,
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               const char *destChars,
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               int32_t destLen, const char *mode,
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               const char *option, UBiDiLevel level);
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool checkMaps(UBiDi *pBiDi, int32_t stringIndex, const char *src,
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       const char *dest, const char *mode, const char* option,
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       UBiDiLevel level, UBool forward);
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* helpers ------------------------------------------------------------------ */
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char *levelString="...............................................................";
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void initCharFromDirProps(void);
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UChar *
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orggetStringFromDirProps(const uint8_t *dirProps, int32_t length, UChar *buffer);
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void printUnicode(const UChar *s, int32_t length, const UBiDiLevel *levels);
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* regression tests ---------------------------------------------------------*/
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgaddComplexTest(TestNode** root) {
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, testCharFromDirProp, "complex/bidi/TestCharFromDirProp");
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, testBidi, "complex/bidi/TestBidi");
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, testInverse, "complex/bidi/TestInverse");
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, testReorder,"complex/bidi/TestReorder");
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, testFailureRecovery,"complex/bidi/TestFailureRecovery");
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, testMultipleParagraphs,"complex/bidi/TestMultipleParagraphs");
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, testReorderingMode, "complex/bidi/TestReorderingMode");
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, testReorderRunsOnly, "complex/bidi/TestReorderRunsOnly");
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, testStreaming, "complex/bidi/TestStreaming");
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, testClassOverride, "complex/bidi/TestClassOverride");
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, testGetBaseDirection, "complex/bidi/testGetBaseDirection");
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, testContext, "complex/bidi/testContext");
135d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org    addTest(root, testBracketOverflow, "complex/bidi/TestBracketOverflow");
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, doArabicShapingTest, "complex/arabic-shaping/ArabicShapingTest");
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, doLamAlefSpecialVLTRArabicShapingTest, "complex/arabic-shaping/lamalef");
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, doTashkeelSpecialVLTRArabicShapingTest, "complex/arabic-shaping/tashkeel");
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, doLOGICALArabicDeShapingTest, "complex/arabic-shaping/unshaping");
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, doArabicShapingTestForBug5421, "complex/arabic-shaping/bug-5421");
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, doTailTest, "complex/arabic-shaping/tailtest");
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, doArabicShapingTestForBug8703, "complex/arabic-shaping/bug-8703");
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, testReorderArabicMathSymbols, "complex/bidi/bug-9024");
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, doArabicShapingTestForBug9024, "complex/arabic-shaping/bug-9024");
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestCharFromDirProp(void) {
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* verify that the exemplar characters have the expected bidi classes */
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nEntering TestCharFromDirProp\n\n");
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    initCharFromDirProps();
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<U_CHAR_DIRECTION_COUNT; ++i) {
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(u_charDirection(charFromDirProp[i])!=(UCharDirection)i) {
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("\nu_charDirection(charFromDirProp[%d]=U+%04x)==%d!=%d\n",
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    i, charFromDirProp[i], u_charDirection(charFromDirProp[i]), i);
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nExiting TestCharFromDirProp\n\n");
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestBidi(void) {
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDi *pBiDi, *pLine=NULL;
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode=U_ZERO_ERROR;
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nEntering TestBidi\n\n");
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pBiDi=ubidi_openSized(MAXLEN, 0, &errorCode);
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pBiDi!=NULL) {
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pLine=ubidi_open();
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(pLine!=NULL) {
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            doTests(pBiDi, pLine, FALSE);
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            doTests(pBiDi, pLine, TRUE);
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_open() returned NULL, out of memory\n");
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubidi_openSized() returned NULL, errorCode %s\n", myErrorName(errorCode));
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    doMisc();
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pLine!=NULL) {
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_close(pLine);
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pBiDi!=NULL) {
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_close(pBiDi);
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nExiting TestBidi\n\n");
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoTests(UBiDi *pBiDi, UBiDi *pLine, UBool countRunsFirst) {
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int testNumber;
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar string[MAXLEN];
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t lineStart;
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDiLevel paraLevel;
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(testNumber=0; testNumber<bidiTestCount; ++testNumber) {
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        getStringFromDirProps(tests[testNumber].text, tests[testNumber].length, string);
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        paraLevel=tests[testNumber].paraLevel;
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setPara(pBiDi, string, -1, paraLevel, NULL, &errorCode);
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(errorCode)) {
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("ubidi_setPara(tests[%d], paraLevel %d) ok, direction %d paraLevel=%d\n",
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    testNumber, paraLevel, ubidi_getDirection(pBiDi), paraLevel);
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            lineStart=tests[testNumber].lineStart;
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(lineStart==-1) {
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                doTest(pBiDi, testNumber, tests+testNumber, 0, countRunsFirst);
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ubidi_setLine(pBiDi, lineStart, tests[testNumber].lineLimit, pLine, &errorCode);
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if(U_SUCCESS(errorCode)) {
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_verbose("ubidi_setLine(%d, %d) ok, direction %d paraLevel=%d\n",
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            lineStart, tests[testNumber].lineLimit, ubidi_getDirection(pLine), ubidi_getParaLevel(pLine));
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    doTest(pLine, testNumber, tests+testNumber, lineStart, countRunsFirst);
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else {
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("ubidi_setLine(tests[%d], %d, %d) failed with errorCode %s\n",
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            testNumber, lineStart, tests[testNumber].lineLimit, myErrorName(errorCode));
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n",
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    testNumber, paraLevel, myErrorName(errorCode));
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char columns[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TABLE_SIZE  256
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool   tablesInitialized = FALSE;
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UChar   pseudoToUChar[TABLE_SIZE];
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint8_t UCharToPseudo[TABLE_SIZE];    /* used for Unicode chars < 0x0100 */
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint8_t UCharToPseud2[TABLE_SIZE];    /* used for Unicode chars >=0x0100 */
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void buildPseudoTables(void)
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    The rules for pseudo-Bidi are as follows:
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    - [ == LRE
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    - ] == RLE
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    - { == LRO
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    - } == RLO
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    - ^ == PDF
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    - @ == LRM
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    - & == RLM
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    - A-F == Arabic Letters 0631-0636
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    - G-V == Hebrew letters 05d7-05e6
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    - W-Z == Unassigned RTL 08d0-08d3
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    - 0-5 == western digits 0030-0035
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    - 6-9 == Arabic-Indic digits 0666-0669
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    - ` == Combining Grave Accent 0300 (NSM)
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    - ~ == Delete 007f (BN)
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    - | == Paragraph Separator 2029 (B)
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    - _ == Info Separator 1 001f (S)
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    All other characters represent themselves as Latin-1, with the corresponding
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Bidi properties.
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int             i;
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar           uchar;
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint8_t         c;
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* initialize all tables to unknown */
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=0; i < TABLE_SIZE; i++) {
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pseudoToUChar[i] = 0xFFFD;
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UCharToPseudo[i] = '?';
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UCharToPseud2[i] = '?';
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* initialize non letters or digits */
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t) 0 ] = 0x0000;    UCharToPseudo[0x00] = (uint8_t) 0 ;
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)' '] = 0x0020;    UCharToPseudo[0x20] = (uint8_t)' ';
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'!'] = 0x0021;    UCharToPseudo[0x21] = (uint8_t)'!';
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'"'] = 0x0022;    UCharToPseudo[0x22] = (uint8_t)'"';
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'#'] = 0x0023;    UCharToPseudo[0x23] = (uint8_t)'#';
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'$'] = 0x0024;    UCharToPseudo[0x24] = (uint8_t)'$';
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'%'] = 0x0025;    UCharToPseudo[0x25] = (uint8_t)'%';
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'\'']= 0x0027;    UCharToPseudo[0x27] = (uint8_t)'\'';
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'('] = 0x0028;    UCharToPseudo[0x28] = (uint8_t)'(';
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)')'] = 0x0029;    UCharToPseudo[0x29] = (uint8_t)')';
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'*'] = 0x002A;    UCharToPseudo[0x2A] = (uint8_t)'*';
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'+'] = 0x002B;    UCharToPseudo[0x2B] = (uint8_t)'+';
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)','] = 0x002C;    UCharToPseudo[0x2C] = (uint8_t)',';
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'-'] = 0x002D;    UCharToPseudo[0x2D] = (uint8_t)'-';
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'.'] = 0x002E;    UCharToPseudo[0x2E] = (uint8_t)'.';
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'/'] = 0x002F;    UCharToPseudo[0x2F] = (uint8_t)'/';
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)':'] = 0x003A;    UCharToPseudo[0x3A] = (uint8_t)':';
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)';'] = 0x003B;    UCharToPseudo[0x3B] = (uint8_t)';';
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'<'] = 0x003C;    UCharToPseudo[0x3C] = (uint8_t)'<';
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'='] = 0x003D;    UCharToPseudo[0x3D] = (uint8_t)'=';
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'>'] = 0x003E;    UCharToPseudo[0x3E] = (uint8_t)'>';
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'?'] = 0x003F;    UCharToPseudo[0x3F] = (uint8_t)'?';
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'\\']= 0x005C;    UCharToPseudo[0x5C] = (uint8_t)'\\';
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* initialize specially used characters */
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'`'] = 0x0300;    UCharToPseud2[0x00] = (uint8_t)'`';  /* NSM */
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'@'] = 0x200E;    UCharToPseud2[0x0E] = (uint8_t)'@';  /* LRM */
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'&'] = 0x200F;    UCharToPseud2[0x0F] = (uint8_t)'&';  /* RLM */
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'_'] = 0x001F;    UCharToPseudo[0x1F] = (uint8_t)'_';  /* S   */
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'|'] = 0x2029;    UCharToPseud2[0x29] = (uint8_t)'|';  /* B   */
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'['] = 0x202A;    UCharToPseud2[0x2A] = (uint8_t)'[';  /* LRE */
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)']'] = 0x202B;    UCharToPseud2[0x2B] = (uint8_t)']';  /* RLE */
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'^'] = 0x202C;    UCharToPseud2[0x2C] = (uint8_t)'^';  /* PDF */
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'{'] = 0x202D;    UCharToPseud2[0x2D] = (uint8_t)'{';  /* LRO */
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'}'] = 0x202E;    UCharToPseud2[0x2E] = (uint8_t)'}';  /* RLO */
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToUChar[(uint8_t)'~'] = 0x007F;    UCharToPseudo[0x7F] = (uint8_t)'~';  /* BN  */
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* initialize western digits */
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0, uchar = 0x0030; i < 6; i++, uchar++) {
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c = (uint8_t)columns[i];
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pseudoToUChar[c] = uchar;
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UCharToPseudo[uchar & 0x00ff] = c;
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* initialize Hindi digits */
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 6, uchar = 0x0666; i < 10; i++, uchar++) {
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c = (uint8_t)columns[i];
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pseudoToUChar[c] = uchar;
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UCharToPseud2[uchar & 0x00ff] = c;
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* initialize Arabic letters */
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 10, uchar = 0x0631; i < 16; i++, uchar++) {
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c = (uint8_t)columns[i];
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pseudoToUChar[c] = uchar;
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UCharToPseud2[uchar & 0x00ff] = c;
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* initialize Hebrew letters */
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 16, uchar = 0x05D7; i < 32; i++, uchar++) {
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c = (uint8_t)columns[i];
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pseudoToUChar[c] = uchar;
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UCharToPseud2[uchar & 0x00ff] = c;
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* initialize Unassigned code points */
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 32, uchar=0x08D0; i < 36; i++, uchar++) {
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c = (uint8_t)columns[i];
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pseudoToUChar[c] = uchar;
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UCharToPseud2[uchar & 0x00ff] = c;
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* initialize Latin lower case letters */
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 36, uchar = 0x0061; i < 62; i++, uchar++) {
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c = (uint8_t)columns[i];
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pseudoToUChar[c] = uchar;
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UCharToPseudo[uchar & 0x00ff] = c;
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    tablesInitialized = TRUE;
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*----------------------------------------------------------------------*/
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int pseudoToU16(const int length, const char * input, UChar * output)
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*  This function converts a pseudo-Bidi string into a UChar string.
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    It returns the length of the UChar string.
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int             i;
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!tablesInitialized) {
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        buildPseudoTables();
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0; i < length; i++)
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output[i] = pseudoToUChar[(uint8_t)input[i]];
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    output[length] = 0;
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return length;
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*----------------------------------------------------------------------*/
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int u16ToPseudo(const int length, const UChar * input, char * output)
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*  This function converts a UChar string into a pseudo-Bidi string.
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    It returns the length of the pseudo-Bidi string.
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int             i;
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar           uchar;
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!tablesInitialized) {
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        buildPseudoTables();
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0; i < length; i++)
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uchar = input[i];
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        output[i] = uchar < 0x0100 ? UCharToPseudo[uchar] :
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                        UCharToPseud2[uchar & 0x00ff];
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    output[length] = '\0';
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return length;
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic char * formatLevels(UBiDi *bidi, char *buffer) {
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode ec = U_ZERO_ERROR;
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UBiDiLevel* gotLevels = ubidi_getLevels(bidi, &ec);
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int len = ubidi_getLength(bidi);
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char c;
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i, k;
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(ec)) {
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strcpy(buffer, "BAD LEVELS");
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return buffer;
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=0; i<len; i++) {
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        k = gotLevels[i];
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (k >= sizeof(columns))
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            c = '+';
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            c = columns[k];
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        buffer[i] = c;
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    buffer[len] = '\0';
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return buffer;
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char *reorderingModeNames[] = {
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "UBIDI_REORDER_DEFAULT",
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "UBIDI_REORDER_NUMBERS_SPECIAL",
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "UBIDI_REORDER_GROUP_NUMBERS_WITH_R",
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "UBIDI_REORDER_RUNS_ONLY",
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "UBIDI_REORDER_INVERSE_NUMBERS_AS_L",
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "UBIDI_REORDER_INVERSE_LIKE_DIRECT",
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL"};
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic char *reorderingOptionNames(char *buffer, int options) {
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    buffer[0] = 0;
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (options & UBIDI_OPTION_INSERT_MARKS) {
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strcat(buffer, " UBIDI_OPTION_INSERT_MARKS");
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (options & UBIDI_OPTION_REMOVE_CONTROLS) {
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strcat(buffer, " UBIDI_OPTION_REMOVE_CONTROLS");
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (options & UBIDI_OPTION_STREAMING) {
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strcat(buffer, " UBIDI_OPTION_STREAMING");
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return buffer;
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void printCaseInfo(UBiDi *bidi, const char *src, const char *dst)
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* src and dst are char arrays encoded as pseudo Bidi */
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Since calls to log_err with a \n within the pattern increment the
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * error count, new lines are issued via fputs, except when we want the
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * increment to happen.
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode=U_ZERO_ERROR;
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i, length = ubidi_getProcessedLength(bidi);
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UBiDiLevel *levels;
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char levelChars[MAXLEN];
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDiLevel lev;
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t runCount;
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char buffer[100];
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err("========================================"); fputs("\n", stderr);
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    levels = ubidi_getLevels(bidi, &errorCode);
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(errorCode)) {
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strcpy(levelChars, "BAD LEVELS");
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Processed length: %d", length); fputs("\n", stderr);
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i = 0; i < length; i++) {
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            lev = levels[i];
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (lev < sizeof(columns)) {
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                levelChars[i] = columns[lev];
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                levelChars[i] = '+';
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        levelChars[length] = 0;
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err("Levels: %s", levelChars); fputs("\n", stderr);
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err("Source: %s", src); fputs("\n", stderr);
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err("Result: %s", dst); fputs("\n", stderr);
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err("Direction: %d", ubidi_getDirection(bidi)); fputs("\n", stderr);
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err("paraLevel: %d", ubidi_getParaLevel(bidi)); fputs("\n", stderr);
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    i = ubidi_getReorderingMode(bidi);
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err("reorderingMode: %d = %s", i, reorderingModeNames[i]);
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fputs("\n", stderr);
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    i = ubidi_getReorderingOptions(bidi);
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err("reorderingOptions: %d = %s", i, reorderingOptionNames(buffer, i));
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fputs("\n", stderr);
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    runCount = ubidi_countRuns(bidi, &errorCode);
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(errorCode)) {
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err( "BAD RUNS");
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Runs: %d => logicalStart.length/level: ", runCount);
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i = 0; i < runCount; i++) {
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UBiDiDirection dir;
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t start, len;
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dir = ubidi_getVisualRun(bidi, i, &start, &len);
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err(" %d.%d/%d", start, len, dir);
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fputs("\n", stderr);
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool matchingPair(UBiDi *bidi, int32_t i, char c1, char c2)
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* No test for []{} since they have special meaning for pseudo Bidi */
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static char mates1Chars[] = "<>()";
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static char mates2Chars[] = "><)(";
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDiLevel level;
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int k, len;
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (c1 == c2) {
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return TRUE;
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* For UBIDI_REORDER_RUNS_ONLY, it would not be correct to check levels[i],
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       so we use the appropriate run's level, which is good for all cases.
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_getLogicalRun(bidi, i, NULL, &level);
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ((level & 1) == 0) {
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    len = strlen(mates1Chars);
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (k = 0; k < len; k++) {
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if ((c1 == mates1Chars[k]) && (c2 == mates2Chars[k])) {
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return TRUE;
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return FALSE;
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool checkWhatYouCan(UBiDi *bidi, const char *srcChars, const char *dstChars)
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* srcChars and dstChars are char arrays encoded as pseudo Bidi */
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i, idx, logLimit, visLimit;
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool testOK, errMap, errDst;
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode=U_ZERO_ERROR;
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t visMap[MAXLEN];
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t logMap[MAXLEN];
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char accumSrc[MAXLEN];
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char accumDst[MAXLEN];
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_getVisualMap(bidi, visMap, &errorCode);
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_getLogicalMap(bidi, logMap, &errorCode);
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(errorCode)) {
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error #1 invoking ICU within checkWhatYouCan\n");
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testOK = TRUE;
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errMap = errDst = FALSE;
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logLimit = ubidi_getProcessedLength(bidi);
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    visLimit = ubidi_getResultLength(bidi);
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(accumSrc, '?', logLimit);
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(accumDst, '?', visLimit);
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0; i < logLimit; i++) {
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        idx = ubidi_getVisualIndex(bidi, i, &errorCode);
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (idx != logMap[i]) {
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errMap = TRUE;
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (idx == UBIDI_MAP_NOWHERE) {
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (idx >= visLimit) {
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        accumDst[idx] = srcChars[i];
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!matchingPair(bidi, i, srcChars[i], dstChars[idx])) {
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errDst = TRUE;
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    accumDst[visLimit] = 0;
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(errorCode)) {
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error #2 invoking ICU within checkWhatYouCan\n");
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (errMap) {
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (testOK) {
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            printCaseInfo(bidi, srcChars, dstChars);
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testOK = FALSE;
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Mismatch between getLogicalMap() and getVisualIndex()\n");
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Map    :");
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i = 0; i < logLimit; i++) {
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err(" %d", logMap[i]);
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fputs("\n", stderr);
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Indexes:");
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i = 0; i < logLimit; i++) {
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err(" %d", ubidi_getVisualIndex(bidi, i, &errorCode));
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fputs("\n", stderr);
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (errDst) {
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (testOK) {
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            printCaseInfo(bidi, srcChars, dstChars);
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testOK = FALSE;
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Source does not map to Result\n");
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("We got: %s", accumDst); fputs("\n", stderr);
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errMap = errDst = FALSE;
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0; i < visLimit; i++) {
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        idx = ubidi_getLogicalIndex(bidi, i, &errorCode);
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (idx != visMap[i]) {
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errMap = TRUE;
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (idx == UBIDI_MAP_NOWHERE) {
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (idx >= logLimit) {
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        accumSrc[idx] = dstChars[i];
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!matchingPair(bidi, idx, srcChars[idx], dstChars[i])) {
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errDst = TRUE;
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    accumSrc[logLimit] = 0;
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(errorCode)) {
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error #3 invoking ICU within checkWhatYouCan\n");
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (errMap) {
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (testOK) {
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            printCaseInfo(bidi, srcChars, dstChars);
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testOK = FALSE;
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Mismatch between getVisualMap() and getLogicalIndex()\n");
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Map    :");
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i = 0; i < visLimit; i++) {
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err(" %d", visMap[i]);
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fputs("\n", stderr);
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Indexes:");
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i = 0; i < visLimit; i++) {
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err(" %d", ubidi_getLogicalIndex(bidi, i, &errorCode));
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fputs("\n", stderr);
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (errDst) {
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (testOK) {
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            printCaseInfo(bidi, srcChars, dstChars);
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testOK = FALSE;
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Result does not map to Source\n");
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("We got: %s", accumSrc);
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fputs("\n", stderr);
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return testOK;
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestReorder(void) {
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const char* const logicalOrder[] ={
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "del(KC)add(K.C.&)",
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "del(QDVT) add(BVDL)",
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "del(PQ)add(R.S.)T)U.&",
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "del(LV)add(L.V.) L.V.&",
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "day  0  R  DPDHRVR dayabbr",
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "day  1  H  DPHPDHDA dayabbr",
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "day  2   L  DPBLENDA dayabbr",
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "day  3  J  DPJQVM  dayabbr",
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "day  4   I  DPIQNF    dayabbr",
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "day  5  M  DPMEG  dayabbr",
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "helloDPMEG",
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "hello WXYZ"
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const char* const visualOrder[]={
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "del(CK)add(&.C.K)",
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "del(TVDQ) add(LDVB)",
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "del(QP)add(S.R.)&.U(T",            /* updated for Unicode 6.3 matching brackets */
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "del(VL)add(V.L.) &.V.L",           /* updated for Unicode 6.3 matching brackets */
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "day  0  RVRHDPD  R dayabbr",
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "day  1  ADHDPHPD  H dayabbr",
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "day  2   ADNELBPD  L dayabbr",
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "day  3  MVQJPD  J  dayabbr",
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "day  4   FNQIPD  I    dayabbr",
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "day  5  GEMPD  M  dayabbr",
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "helloGEMPD",
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "hello ZYXW"
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const char* const visualOrder1[]={
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ")K.C.&(dda)KC(led",
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ")BVDL(dda )QDVT(led",
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "T(U.&).R.S(dda)PQ(led",            /* updated for Unicode 6.3 matching brackets */
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "L.V.& ).L.V(dda)LV(led",           /* updated for Unicode 6.3 matching brackets */
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "rbbayad R  DPDHRVR  0  yad",
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "rbbayad H  DPHPDHDA  1  yad",
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "rbbayad L  DPBLENDA   2  yad",
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "rbbayad  J  DPJQVM  3  yad",
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "rbbayad    I  DPIQNF   4  yad",
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "rbbayad  M  DPMEG  5  yad",
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "DPMEGolleh",
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "WXYZ olleh"
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const char* const visualOrder2[]={
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "@)@K.C.&@(dda)@KC@(led",
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "@)@BVDL@(dda )@QDVT@(led",
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "R.S.)T)U.&@(dda)@PQ@(led",
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "L.V.) L.V.&@(dda)@LV@(led",
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "rbbayad @R  DPDHRVR@  0  yad",
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "rbbayad @H  DPHPDHDA@  1  yad",
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "rbbayad @L  DPBLENDA@   2  yad",
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "rbbayad  @J  DPJQVM@  3  yad",
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "rbbayad    @I  DPIQNF@   4  yad",
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "rbbayad  @M  DPMEG@  5  yad",
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "DPMEGolleh",
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "WXYZ@ olleh"
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const char* const visualOrder3[]={
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ")K.C.&(KC)dda(led",
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ")BVDL(ddaQDVT) (led",
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "R.S.)T)U.&(PQ)dda(led",
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "L.V.) L.V.&(LV)dda(led",
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "rbbayad DPDHRVR   R  0 yad",
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "rbbayad DPHPDHDA   H  1 yad",
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "rbbayad DPBLENDA     L 2 yad",
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "rbbayad  DPJQVM   J  3 yad",
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "rbbayad    DPIQNF     I 4 yad",
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "rbbayad  DPMEG   M  5 yad",
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "DPMEGolleh",
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "WXYZ olleh"
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const char* const visualOrder4[]={
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "del(add(CK(.C.K)",
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "del( (TVDQadd(LDVB)",
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "del(add(QP(.U(T(.S.R",
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "del(add(VL(.V.L (.V.L",
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "day 0  R   RVRHDPD dayabbr",
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "day 1  H   ADHDPHPD dayabbr",
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "day 2 L     ADNELBPD dayabbr",
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "day 3  J   MVQJPD  dayabbr",
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "day 4 I     FNQIPD    dayabbr",
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "day 5  M   GEMPD  dayabbr",
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "helloGEMPD",
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "hello ZYXW"
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char formatChars[MAXLEN];
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode ec = U_ZERO_ERROR;
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDi* bidi = ubidi_open();
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i;
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nEntering TestReorder\n\n");
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0;i<LENGTHOF(logicalOrder);i++){
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t srcSize = (int32_t)strlen(logicalOrder[i]);
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t destSize = srcSize*2;
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar src[MAXLEN];
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar dest[MAXLEN];
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char chars[MAXLEN];
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Testing L2V #1 for case %d\n", i);
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pseudoToU16(srcSize,logicalOrder[i],src);
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ec = U_ZERO_ERROR;
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR ,NULL,&ec);
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(ec)){
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n",
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    i, UBIDI_DEFAULT_LTR, u_errorName(ec));
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* try pre-flighting */
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_DO_MIRRORING,&ec);
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(ec!=U_BUFFER_OVERFLOW_ERROR){
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec));
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else if(destSize!=srcSize){
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Pre-flighting did not give expected size: Expected: %d. Got: %d \n",srcSize,destSize);
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else{
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ec= U_ZERO_ERROR;
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_DO_MIRRORING,&ec);
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u16ToPseudo(destSize,dest,chars);
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(destSize!=srcSize){
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_writeReordered() destSize and srcSize do not match\n");
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else if(strcmp(visualOrder[i],chars)!=0){
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_writeReordered() did not give expected results for UBIDI_DO_MIRRORING.\n"
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "Input   : %s\nExpected: %s\nGot     : %s\nLevels  : %s\nAt Index: %d\n",
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    logicalOrder[i],visualOrder[i],chars,formatLevels(bidi, formatChars),i);
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        checkWhatYouCan(bidi, logicalOrder[i], chars);
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0;i<LENGTHOF(logicalOrder);i++){
7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t srcSize = (int32_t)strlen(logicalOrder[i]);
7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t destSize = srcSize*2;
7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar src[MAXLEN];
7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar dest[MAXLEN];
7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char chars[MAXLEN];
7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Testing L2V #2 for case %d\n", i);
7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pseudoToU16(srcSize,logicalOrder[i],src);
7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ec = U_ZERO_ERROR;
7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR ,NULL,&ec);
7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(ec)){
7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n",
7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    i, UBIDI_DEFAULT_LTR, u_errorName(ec));
7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* try pre-flighting */
7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_DO_MIRRORING+UBIDI_OUTPUT_REVERSE,&ec);
7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(ec!=U_BUFFER_OVERFLOW_ERROR){
7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec));
7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else if(destSize!=srcSize){
7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Pre-flighting did not give expected size: Expected: %d. Got: %d \n",srcSize,destSize);
7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else{
7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ec= U_ZERO_ERROR;
7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_DO_MIRRORING+UBIDI_OUTPUT_REVERSE,&ec);
7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u16ToPseudo(destSize,dest,chars);
7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(destSize!=srcSize){
7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_writeReordered() destSize and srcSize do not match\n");
7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else if(strcmp(visualOrder1[i],chars)!=0){
7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_writeReordered() did not give expected results for UBIDI_DO_MIRRORING+UBIDI_OUTPUT_REVERSE.\n"
7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "Input   : %s\nExpected: %s\nGot     : %s\nLevels  : %s\nAt Index: %d\n",
7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    logicalOrder[i],visualOrder1[i],chars,formatLevels(bidi, formatChars),i);
7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0;i<LENGTHOF(logicalOrder);i++){
8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t srcSize = (int32_t)strlen(logicalOrder[i]);
8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t destSize = srcSize*2;
8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar src[MAXLEN];
8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar dest[MAXLEN];
8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char chars[MAXLEN];
8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Testing V2L #3 for case %d\n", i);
8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pseudoToU16(srcSize,logicalOrder[i],src);
8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ec = U_ZERO_ERROR;
8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setInverse(bidi,TRUE);
8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR ,NULL,&ec);
8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(ec)){
8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n",
8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    i, UBIDI_DEFAULT_LTR, u_errorName(ec));
8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* try pre-flighting */
8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_INSERT_LRM_FOR_NUMERIC+UBIDI_OUTPUT_REVERSE,&ec);
8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(ec!=U_BUFFER_OVERFLOW_ERROR){
8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec));
8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else{
8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ec= U_ZERO_ERROR;
8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_INSERT_LRM_FOR_NUMERIC+UBIDI_OUTPUT_REVERSE,&ec);
8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u16ToPseudo(destSize,dest,chars);
8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(strcmp(visualOrder2[i],chars)!=0){
8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_writeReordered() did not give expected results for UBIDI_INSERT_LRM_FOR_NUMERIC+UBIDI_OUTPUT_REVERSE.\n"
8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "Input   : %s\nExpected: %s\nGot     : %s\nLevels  : %s\nAt Index: %d\n",
8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    logicalOrder[i],visualOrder2[i],chars,formatLevels(bidi, formatChars),i);
8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Max Explicit level */
8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0;i<LENGTHOF(logicalOrder);i++){
8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t srcSize = (int32_t)strlen(logicalOrder[i]);
8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t destSize = srcSize*2;
8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar src[MAXLEN];
8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar dest[MAXLEN];
8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char chars[MAXLEN];
8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBiDiLevel levels[UBIDI_MAX_EXPLICIT_LEVEL]={1,2,3,4,5,6,7,8,9,10};
8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Testing V2L #4 for case %d\n", i);
8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pseudoToU16(srcSize,logicalOrder[i],src);
8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ec = U_ZERO_ERROR;
8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR,levels,&ec);
8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(ec)){
8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n",
8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    i, UBIDI_MAX_EXPLICIT_LEVEL, u_errorName(ec));
8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* try pre-flighting */
8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_OUTPUT_REVERSE,&ec);
8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(ec!=U_BUFFER_OVERFLOW_ERROR){
8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec));
8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else if(destSize!=srcSize){
8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Pre-flighting did not give expected size: Expected: %d. Got: %d \n",srcSize,destSize);
8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else{
8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ec = U_ZERO_ERROR;
8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_OUTPUT_REVERSE,&ec);
8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u16ToPseudo(destSize,dest,chars);
8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(destSize!=srcSize){
8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_writeReordered() destSize and srcSize do not match. Dest Size = %d Source Size = %d\n",destSize,srcSize );
8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else if(strcmp(visualOrder3[i],chars)!=0){
8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_writeReordered() did not give expected results for UBIDI_OUTPUT_REVERSE.\n"
8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "Input   : %s\nExpected: %s\nGot     : %s\nLevels  : %s\nAt Index: %d\n",
8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    logicalOrder[i],visualOrder3[i],chars,formatLevels(bidi, formatChars),i);
8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0;i<LENGTHOF(logicalOrder);i++){
8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t srcSize = (int32_t)strlen(logicalOrder[i]);
8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t destSize = srcSize*2;
8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar src[MAXLEN];
8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar dest[MAXLEN];
8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char chars[MAXLEN];
8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBiDiLevel levels[UBIDI_MAX_EXPLICIT_LEVEL]={1,2,3,4,5,6,7,8,9,10};
8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Testing V2L #5 for case %d\n", i);
8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pseudoToU16(srcSize,logicalOrder[i],src);
8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ec = U_ZERO_ERROR;
8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR,levels,&ec);
8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(ec)){
8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n",
8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    i, UBIDI_MAX_EXPLICIT_LEVEL, u_errorName(ec));
8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* try pre-flighting */
8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_DO_MIRRORING+UBIDI_REMOVE_BIDI_CONTROLS,&ec);
8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(ec!=U_BUFFER_OVERFLOW_ERROR){
8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec));
8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else{
8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ec= U_ZERO_ERROR;
8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_DO_MIRRORING+UBIDI_REMOVE_BIDI_CONTROLS,&ec);
8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u16ToPseudo(destSize,dest,chars);
8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(strcmp(visualOrder4[i],chars)!=0){
8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_writeReordered() did not give expected results for UBIDI_DO_MIRRORING+UBIDI_REMOVE_BIDI_CONTROLS.\n"
8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "Input   : %s\nExpected: %s\nGot     : %s\nLevels  : %s\nAt Index: %d\n",
8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    logicalOrder[i],visualOrder4[i],chars,formatLevels(bidi, formatChars),i);
8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(bidi);
8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nExiting TestReorder\n\n");
8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestReorderArabicMathSymbols(void) {
9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar logicalOrder[][MAXLEN]={
9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Arabic mathematical Symbols 0x1EE00 - 0x1EE1B */
9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0xD83B, 0xDE00, 0xD83B, 0xDE01, 0xD83B, 0xDE02, 0xD83B, 0xDE03, 0x20,
9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE24, 0xD83B, 0xDE05, 0xD83B, 0xDE06, 0x20,
9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE07, 0xD83B, 0xDE08, 0xD83B, 0xDE09, 0x20,
9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE0A, 0xD83B, 0xDE0B, 0xD83B, 0xDE0C, 0xD83B, 0xDE0D, 0x20,
9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE0E, 0xD83B, 0xDE0F, 0xD83B, 0xDE10, 0xD83B, 0xDE11, 0x20,
9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE12, 0xD83B, 0xDE13, 0xD83B, 0xDE14, 0xD83B, 0xDE15, 0x20,
9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE16, 0xD83B, 0xDE17, 0xD83B, 0xDE18, 0x20,
9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE19, 0xD83B, 0xDE1A, 0xD83B, 0xDE1B},
9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Arabic mathematical Symbols - Looped Symbols, 0x1EE80 - 0x1EE9B */
9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0xD83B, 0xDE80, 0xD83B, 0xDE81, 0xD83B, 0xDE82, 0xD83B, 0xDE83, 0x20,
9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE84, 0xD83B, 0xDE85, 0xD83B, 0xDE86, 0x20,
9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE87, 0xD83B, 0xDE88, 0xD83B, 0xDE89, 0x20,
9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE8B, 0xD83B, 0xDE8C, 0xD83B, 0xDE8D, 0x20,
9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE8E, 0xD83B, 0xDE8F, 0xD83B, 0xDE90, 0xD83B, 0xDE91, 0x20,
9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE92, 0xD83B, 0xDE93, 0xD83B, 0xDE94, 0xD83B, 0xDE95, 0x20,
9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE96, 0xD83B, 0xDE97, 0xD83B, 0xDE98, 0x20,
9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE99, 0xD83B, 0xDE9A, 0xD83B, 0xDE9B},
9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Arabic mathematical Symbols - Double-struck Symbols, 0x1EEA1 - 0x1EEBB */
9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0xD83B, 0xDEA1, 0xD83B, 0xDEA2, 0xD83B, 0xDEA3, 0x20,
9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEA5, 0xD83B, 0xDEA6, 0x20,
9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEA7, 0xD83B, 0xDEA8, 0xD83B, 0xDEA9, 0x20,
9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEAB, 0xD83B, 0xDEAC, 0xD83B, 0xDEAD, 0x20,
9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEAE, 0xD83B, 0xDEAF, 0xD83B, 0xDEB0, 0xD83B, 0xDEB1, 0x20,
9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEB2, 0xD83B, 0xDEB3, 0xD83B, 0xDEB4, 0xD83B, 0xDEB5, 0x20,
9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEB6, 0xD83B, 0xDEB7, 0xD83B, 0xDEB8, 0x20,
9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEB9, 0xD83B, 0xDEBA, 0xD83B, 0xDEBB},
9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Arabic mathematical Symbols - Initial Symbols, 0x1EE21 - 0x1EE3B */
9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0xD83B, 0xDE21, 0xD83B, 0xDE22, 0x20,
9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE27, 0xD83B, 0xDE29, 0x20,
9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE2A, 0xD83B, 0xDE2B, 0xD83B, 0xDE2C, 0xD83B, 0xDE2D, 0x20,
9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE2E, 0xD83B, 0xDE2F, 0xD83B, 0xDE30, 0xD83B, 0xDE31, 0x20,
9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE32, 0xD83B, 0xDE34, 0xD83B, 0xDE35, 0x20,
9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE36, 0xD83B, 0xDE37, 0x20,
9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE39, 0xD83B, 0xDE3B},
9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Arabic mathematical Symbols - Tailed Symbols */
9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0xD83B, 0xDE42, 0xD83B, 0xDE47, 0xD83B, 0xDE49, 0xD83B, 0xDE4B, 0x20,
9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE4D, 0xD83B, 0xDE4E, 0xD83B, 0xDE4F, 0x20,
9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE51, 0xD83B, 0xDE52, 0xD83B, 0xDE54, 0xD83B, 0xDE57, 0x20,
9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE59, 0xD83B, 0xDE5B, 0xD83B, 0xDE5D, 0xD83B, 0xDE5F}
9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar visualOrder[][MAXLEN]={
9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Arabic mathematical Symbols 0x1EE00 - 0x1EE1B */
9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0xD83B, 0xDE1B, 0xD83B, 0xDE1A, 0xD83B, 0xDE19, 0x20,
9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE18, 0xD83B, 0xDE17, 0xD83B, 0xDE16, 0x20,
9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE15, 0xD83B, 0xDE14, 0xD83B, 0xDE13, 0xD83B, 0xDE12, 0x20,
9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE11, 0xD83B, 0xDE10, 0xD83B, 0xDE0F, 0xD83B, 0xDE0E, 0x20,
9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE0D, 0xD83B, 0xDE0C, 0xD83B, 0xDE0B, 0xD83B, 0xDE0A, 0x20,
9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE09, 0xD83B, 0xDE08, 0xD83B, 0xDE07, 0x20,
9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE06, 0xD83B, 0xDE05, 0xD83B, 0xDE24, 0x20,
9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE03, 0xD83B, 0xDE02, 0xD83B, 0xDE01, 0xD83B, 0xDE00},
9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Arabic mathematical Symbols - Looped Symbols, 0x1EE80 - 0x1EE9B */
9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0xD83B, 0xDE9B, 0xD83B, 0xDE9A, 0xD83B, 0xDE99, 0x20,
9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE98, 0xD83B, 0xDE97, 0xD83B, 0xDE96, 0x20,
9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE95, 0xD83B, 0xDE94, 0xD83B, 0xDE93, 0xD83B, 0xDE92, 0x20,
9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE91, 0xD83B, 0xDE90, 0xD83B, 0xDE8F, 0xD83B, 0xDE8E, 0x20,
9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE8D, 0xD83B, 0xDE8C, 0xD83B, 0xDE8B, 0x20,
9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE89, 0xD83B, 0xDE88, 0xD83B, 0xDE87, 0x20,
9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE86, 0xD83B, 0xDE85, 0xD83B, 0xDE84, 0x20,
9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE83, 0xD83B, 0xDE82, 0xD83B, 0xDE81, 0xD83B, 0xDE80},
9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Arabic mathematical Symbols - Double-struck Symbols, 0x1EEA1 - 0x1EEBB */
9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0xD83B, 0xDEBB, 0xD83B, 0xDEBA, 0xD83B, 0xDEB9, 0x20,
9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEB8, 0xD83B, 0xDEB7, 0xD83B, 0xDEB6, 0x20,
9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEB5, 0xD83B, 0xDEB4, 0xD83B, 0xDEB3, 0xD83B, 0xDEB2, 0x20,
9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEB1, 0xD83B, 0xDEB0, 0xD83B, 0xDEAF, 0xD83B, 0xDEAE, 0x20,
9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEAD, 0xD83B, 0xDEAC, 0xD83B, 0xDEAB, 0x20,
9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEA9, 0xD83B, 0xDEA8, 0xD83B, 0xDEA7, 0x20,
9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEA6, 0xD83B, 0xDEA5, 0x20,
9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEA3, 0xD83B, 0xDEA2, 0xD83B, 0xDEA1},
9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Arabic mathematical Symbols - Initial Symbols, 0x1EE21 - 0x1EE3B */
9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0xD83B, 0xDE3B, 0xD83B, 0xDE39, 0x20,
9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE37, 0xD83B, 0xDE36, 0x20,
9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE35, 0xD83B, 0xDE34, 0xD83B, 0xDE32, 0x20,
9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE31, 0xD83B, 0xDE30, 0xD83B, 0xDE2F, 0xD83B, 0xDE2E, 0x20,
9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE2D, 0xD83B, 0xDE2C, 0xD83B, 0xDE2B, 0xD83B, 0xDE2A, 0x20,
9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE29, 0xD83B, 0xDE27, 0x20,
9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE22, 0xD83B, 0xDE21},
9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Arabic mathematical Symbols - Tailed Symbols */
9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {0xD83B, 0xDE5F, 0xD83B, 0xDE5D, 0xD83B, 0xDE5B, 0xD83B, 0xDE59, 0x20,
9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE57, 0xD83B, 0xDE54, 0xD83B, 0xDE52, 0xD83B, 0xDE51, 0x20,
9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE4F, 0xD83B, 0xDE4E, 0xD83B, 0xDE4D, 0x20,
9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE4B, 0xD83B, 0xDE49, 0xD83B, 0xDE47, 0xD83B, 0xDE42}
9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char formatChars[MAXLEN];
9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode ec = U_ZERO_ERROR;
9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDi* bidi = ubidi_open();
9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i;
9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nEntering TestReorderArabicMathSymbols\n\n");
9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0;i<LENGTHOF(logicalOrder);i++){
9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t srcSize = u_strlen(logicalOrder[i]);
9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t destSize = srcSize*2;
9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar dest[MAXLEN];
9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Testing L2V #1 for case %d\n", i);
9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ec = U_ZERO_ERROR;
9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setPara(bidi,logicalOrder[i],srcSize,UBIDI_DEFAULT_LTR ,NULL,&ec);
10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(ec)){
10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n",
10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    i, UBIDI_DEFAULT_LTR, u_errorName(ec));
10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* try pre-flighting */
10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_DO_MIRRORING,&ec);
10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(ec!=U_BUFFER_OVERFLOW_ERROR){
10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec));
10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else if(destSize!=srcSize){
10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Pre-flighting did not give expected size: Expected: %d. Got: %d \n",srcSize,destSize);
10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else{
10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ec= U_ZERO_ERROR;
10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_DO_MIRRORING,&ec);
10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(destSize!=srcSize){
10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_writeReordered() destSize and srcSize do not match\n");
10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }else if(memcmp(dest, visualOrder[i], destSize*U_SIZEOF_UCHAR)!=0){
10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_writeReordered() did not give expected results for UBIDI_DO_MIRRORING.\n"
10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "Input   : %s\nExpected: %s\nGot     : %s\nLevels  : %s\nAt Index: %d\n",
10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    logicalOrder[i],visualOrder[i],dest,formatLevels(bidi, formatChars),i);
10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(bidi);
10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nExiting TestReorderArabicMathSymbols\n\n");
10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoTest(UBiDi *pBiDi, int testNumber, const BiDiTestData *test, int32_t lineStart, UBool countRunsFirst) {
10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const uint8_t *dirProps=test->text+lineStart;
10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UBiDiLevel *levels=test->levels;
10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const uint8_t *visualMap=test->visualMap;
10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i, len=ubidi_getLength(pBiDi), logicalIndex, runCount = 0;
10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode=U_ZERO_ERROR;
10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDiLevel level, level2;
10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (countRunsFirst) {
10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Calling ubidi_countRuns() first.\n");
10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        runCount = ubidi_countRuns(pBiDi, &errorCode);
10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(errorCode)) {
10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_countRuns(tests[%d]): error %s\n", testNumber, myErrorName(errorCode));
10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Calling ubidi_getLogicalMap() first.\n");
10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    _testReordering(pBiDi, testNumber);
10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<len; ++i) {
10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("%3d %3d %.*s%-3s @%d\n",
10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                i, ubidi_getLevelAt(pBiDi, i), ubidi_getLevelAt(pBiDi, i), levelString,
10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                dirPropNames[dirProps[i]],
10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ubidi_getVisualIndex(pBiDi, i, &errorCode));
10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\n-----levels:");
10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<len; ++i) {
10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(i>0) {
10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose(",");
10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose(" %d", ubidi_getLevelAt(pBiDi, i));
10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\n--reordered:");
10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<len; ++i) {
10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(i>0) {
10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose(",");
10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose(" %d", ubidi_getVisualIndex(pBiDi, i, &errorCode));
10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\n");
10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test->direction!=ubidi_getDirection(pBiDi)) {
10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubidi_getDirection(tests[%d]): wrong direction %d\n", testNumber, ubidi_getDirection(pBiDi));
10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test->resultLevel!=ubidi_getParaLevel(pBiDi)) {
10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubidi_getParaLevel(tests[%d]): wrong paragraph level %d\n", testNumber, ubidi_getParaLevel(pBiDi));
10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<len; ++i) {
10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(levels[i]!=ubidi_getLevelAt(pBiDi, i)) {
10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_getLevelAt(tests[%d], %d): wrong level %d, expected %d\n", testNumber, i, ubidi_getLevelAt(pBiDi, i), levels[i]);
10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<len; ++i) {
10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logicalIndex=ubidi_getVisualIndex(pBiDi, i, &errorCode);
10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(errorCode)) {
10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_getVisualIndex(tests[%d], %d): error %s\n", testNumber, i, myErrorName(errorCode));
10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(visualMap[i]!=logicalIndex) {
10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_getVisualIndex(tests[%d], %d): wrong index %d\n", testNumber, i, logicalIndex);
10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (! countRunsFirst) {
11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        runCount=ubidi_countRuns(pBiDi, &errorCode);
11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(errorCode)) {
11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_countRuns(tests[%d]): error %s\n", testNumber, myErrorName(errorCode));
11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(logicalIndex=0; logicalIndex<len;) {
11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        level=ubidi_getLevelAt(pBiDi, logicalIndex);
11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_getLogicalRun(pBiDi, logicalIndex, &logicalIndex, &level2);
11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(level!=level2) {
11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_getLogicalRun(tests[%d], run ending at index %d): "
11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "wrong level %d instead of %d\n",
11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    testNumber, logicalIndex, level, level2);
11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(--runCount<0) {
11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("\nubidi_getLogicalRun(tests[%d]): wrong number of runs "
11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "compared to %d=ubidi_countRuns()\n",
11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    testNumber, ubidi_countRuns(pBiDi, &errorCode));
11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(runCount!=0) {
11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nubidi_getLogicalRun(tests[%d]): wrong number of runs "
11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "compared to %d=ubidi_getRunCount()\n",
11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                testNumber, ubidi_countRuns(pBiDi, &errorCode));
11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\n\n");
11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org_testReordering(UBiDi *pBiDi, int testNumber) {
11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t
11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logicalMap1[MAXLEN], logicalMap2[MAXLEN], logicalMap3[MAXLEN],
11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        visualMap1[MAXLEN], visualMap2[MAXLEN], visualMap3[MAXLEN], visualMap4[MAXLEN];
11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode=U_ZERO_ERROR;
11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UBiDiLevel *levels;
11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i, length=ubidi_getLength(pBiDi),
11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               destLength=ubidi_getResultLength(pBiDi);
11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t runCount, visualIndex, logicalStart, runLength;
11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool odd;
11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(length<=0) {
11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get the logical and visual maps from the object */
11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_getLogicalMap(pBiDi, logicalMap1, &errorCode);
11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)) {
11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubidi_getLogicalMap(tests[%d]): error %s\n", testNumber, myErrorName(errorCode));
11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_getVisualMap(pBiDi, visualMap1, &errorCode);
11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)) {
11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubidi_getVisualMap(tests[%d]): error %s\n", testNumber, myErrorName(errorCode));
11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* invert them both */
11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_invertMap(logicalMap1, visualMap2, length);
11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_invertMap(visualMap1, logicalMap2, destLength);
11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get them from the levels array, too */
11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    levels=ubidi_getLevels(pBiDi, &errorCode);
11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)) {
11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubidi_getLevels(tests[%d]): error %s\n", testNumber, myErrorName(errorCode));
11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_reorderLogical(levels, length, logicalMap3);
11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_reorderVisual(levels, length, visualMap3);
11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get the visual map from the runs, too */
11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    runCount=ubidi_countRuns(pBiDi, &errorCode);
11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)) {
11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubidi_countRuns(tests[%d]): error %s\n", testNumber, myErrorName(errorCode));
11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\n----%2d runs:", runCount);
11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    visualIndex=0;
11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<runCount; ++i) {
11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        odd=(UBool)ubidi_getVisualRun(pBiDi, i, &logicalStart, &runLength);
11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose(" (%c @%d[%d])", odd ? 'R' : 'L', logicalStart, runLength);
11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(UBIDI_LTR==odd) {
11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            do { /* LTR */
11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                visualMap4[visualIndex++]=logicalStart++;
11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } while(--runLength>0);
11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            logicalStart+=runLength;   /* logicalLimit */
11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            do { /* RTL */
11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                visualMap4[visualIndex++]=--logicalStart;
11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } while(--runLength>0);
12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\n");
12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* print all the maps */
12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("logical maps:\n");
12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<length; ++i) {
12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("%4d", logicalMap1[i]);
12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\n");
12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<length; ++i) {
12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("%4d", logicalMap2[i]);
12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\n");
12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<length; ++i) {
12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("%4d", logicalMap3[i]);
12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nvisual maps:\n");
12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<destLength; ++i) {
12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("%4d", visualMap1[i]);
12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\n");
12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<destLength; ++i) {
12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("%4d", visualMap2[i]);
12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\n");
12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<length; ++i) {
12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("%4d", visualMap3[i]);
12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\n");
12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<length; ++i) {
12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("%4d", visualMap4[i]);
12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\n");
12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check that the indexes are the same between these and ubidi_getLogical/VisualIndex() */
12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<length; ++i) {
12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(logicalMap1[i]!=logicalMap2[i]) {
12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("bidi reordering error in tests[%d]: logicalMap1[i]!=logicalMap2[i] at i=%d\n", testNumber, i);
12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(logicalMap1[i]!=logicalMap3[i]) {
12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("bidi reordering error in tests[%d]: logicalMap1[i]!=logicalMap3[i] at i=%d\n", testNumber, i);
12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(visualMap1[i]!=visualMap2[i]) {
12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("bidi reordering error in tests[%d]: visualMap1[i]!=visualMap2[i] at i=%d\n", testNumber, i);
12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(visualMap1[i]!=visualMap3[i]) {
12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("bidi reordering error in tests[%d]: visualMap1[i]!=visualMap3[i] at i=%d\n", testNumber, i);
12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(visualMap1[i]!=visualMap4[i]) {
12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("bidi reordering error in tests[%d]: visualMap1[i]!=visualMap4[i] at i=%d\n", testNumber, i);
12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(logicalMap1[i]!=ubidi_getVisualIndex(pBiDi, i, &errorCode)) {
12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("bidi reordering error in tests[%d]: logicalMap1[i]!=ubidi_getVisualIndex(i) at i=%d\n", testNumber, i);
12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(errorCode)) {
12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_getVisualIndex(tests[%d], %d): error %s\n", testNumber, i, myErrorName(errorCode));
12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(visualMap1[i]!=ubidi_getLogicalIndex(pBiDi, i, &errorCode)) {
12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("bidi reordering error in tests[%d]: visualMap1[i]!=ubidi_getLogicalIndex(i) at i=%d\n", testNumber, i);
12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(errorCode)) {
12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ubidi_getLogicalIndex(tests[%d], %d): error %s\n", testNumber, i, myErrorName(errorCode));
12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define RETURN_IF_BAD_ERRCODE(x)    \
12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(errorCode)) {      \
12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nbad errorCode %d at %s\n", errorCode, (x));  \
12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;     \
12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }               \
12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define STRING_TEST_CASE(s) { (s), LENGTHOF(s) }
12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testGetBaseDirection(void) {
12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDiDirection dir;
12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i;
12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Test Data */
12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar
12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Mixed Start with L*/
12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    stringMixedEnglishFirst[]={ 0x61, 0x627, 0x32, 0x6f3, 0x61, 0x34, 0 },
12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Mixed Start with AL*/
12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    stringMixedArabicFirst[]={ 0x661, 0x627, 0x662, 0x6f3, 0x61, 0x664, 0 },
12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Mixed Start with R*/
12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    stringMixedHebrewFirst[]={ 0x05EA, 0x627, 0x662, 0x6f3, 0x61, 0x664, 0 },
12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All AL (Arabic. Persian)*/
13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    stringPersian[]={0x0698, 0x067E, 0x0686, 0x06AF, 0},
13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All R (Hebrew etc.)*/
13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    stringHebrew[]={0x0590, 0x05D5, 0x05EA, 0x05F1, 0},
13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All L (English)*/
13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    stringEnglish[]={0x71, 0x61, 0x66, 0},
13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Mixed Start with weak AL an then L*/
13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    stringStartWeakAL[]={ 0x0663, 0x71, 0x61, 0x66, 0},
13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Mixed Start with weak L and then AL*/
13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    stringStartWeakL[]={0x31, 0x0698, 0x067E, 0x0686, 0x06AF, 0},
13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Empty*/
13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    stringEmpty[]={0},
13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Surrogate Char.*/
13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    stringSurrogateChar[]={0xD800, 0xDC00, 0},
13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Invalid UChar*/
13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    stringInvalidUchar[]={-1},
13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All weak L (English Digits)*/
13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    stringAllEnglishDigits[]={0x31, 0x32, 0x33, 0},
13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All weak AL (Arabic Digits)*/
13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    stringAllArabicDigits[]={0x0663, 0x0664, 0x0665, 0},
13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*First L (English) others are R (Hebrew etc.) */
13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    stringFirstL[] = {0x71, 0x0590, 0x05D5, 0x05EA, 0x05F1, 0},
13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Last R (Hebrew etc.) others are weak L (English Digits)*/
13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    stringLastR[] = {0x31, 0x32, 0x33, 0x05F1, 0};
13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const struct {
13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *s;
13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t length;
13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } testCases[]={
13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(stringMixedEnglishFirst),
13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(stringMixedArabicFirst),
13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(stringMixedHebrewFirst),
13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(stringPersian),
13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(stringHebrew),
13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(stringEnglish),
13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(stringStartWeakAL),
13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(stringStartWeakL),
13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(stringEmpty),
13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(stringSurrogateChar),
13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(stringInvalidUchar),
13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(stringAllEnglishDigits),
13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(stringAllArabicDigits),
13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(stringFirstL),
13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(stringLastR),
13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Expected results */
13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UBiDiDirection expectedDir[] ={
13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBIDI_LTR, UBIDI_RTL, UBIDI_RTL,
13486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBIDI_RTL, UBIDI_RTL, UBIDI_LTR,
13496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBIDI_LTR, UBIDI_RTL, UBIDI_NEUTRAL,
13506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBIDI_LTR, UBIDI_NEUTRAL, UBIDI_NEUTRAL,
13516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBIDI_NEUTRAL, UBIDI_LTR, UBIDI_RTL
13526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
13536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("testGetBaseDirection() with %u test cases ---\n",
13556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    LENGTHOF(testCases));
13566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Run Tests */
13576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     for(i=0; i<LENGTHOF(testCases); ++i) {
13586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dir = ubidi_getBaseDirection(testCases[i].s, testCases[i].length );
13596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Testing case %d\tReceived dir %d\n", i, dir);
13606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (dir != expectedDir[i])
13616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("\nFailed getBaseDirection case %d Expected  %d \tReceived %d\n",
13626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            i, expectedDir[i], dir);
13636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Misc. tests */
13666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* NULL string */
13676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dir = ubidi_getBaseDirection(NULL, 3);
13686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (dir != UBIDI_NEUTRAL )
13696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nFailed getBaseDirection for NULL string " ,
13706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\nExpected  %d \nReceived %d", UBIDI_NEUTRAL, dir);
13716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All L- English string and length=-3 */
13726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dir = ubidi_getBaseDirection( stringEnglish, -3);
13736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (dir != UBIDI_NEUTRAL )
13746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nFailed getBaseDirection for string w length= -3 ",
13756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\nExpected  %d \nReceived %d", UBIDI_NEUTRAL, dir);
13766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All L- English string and length=-1 */
13776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dir = ubidi_getBaseDirection( stringEnglish, -1);
13786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (dir != UBIDI_LTR )
13796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nFailed getBaseDirection for English string w length= -1 ",
13806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\nExpected  %d \nReceived %d", UBIDI_LTR, dir);
13816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All AL- Persian string and length=-1 */
13826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dir = ubidi_getBaseDirection( stringPersian, -1);
13836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (dir != UBIDI_RTL )
13846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nFailed getBaseDirection for Persian string w length= -1 ",
13856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\nExpected  %d \nReceived %d", UBIDI_RTL, dir);
13866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All R- Hebrew string and length=-1 */
13876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dir = ubidi_getBaseDirection( stringHebrew, -1);
13886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (dir != UBIDI_RTL )
13896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nFailed getBaseDirection for Hebrew string w length= -1 ",
13906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\nExpected  %d \nReceived %d", UBIDI_RTL, dir);
13916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All weak L- English digits string and length=-1 */
13926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dir = ubidi_getBaseDirection(stringAllEnglishDigits, -1);
13936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (dir != UBIDI_NEUTRAL )
13946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nFailed getBaseDirection for English digits string w length= -1 ",
13956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\nExpected  %d \nReceived %d", UBIDI_NEUTRAL, dir);
13966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*All weak AL- Arabic digits string and length=-1 */
13976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dir = ubidi_getBaseDirection(stringAllArabicDigits, -1);
13986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (dir != UBIDI_NEUTRAL )
13996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nFailed getBaseDirection for Arabic string w length= -1 ",
14006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        "\nExpected  %d \nReceived %d", UBIDI_NEUTRAL, dir);
14016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
14036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void doMisc(void) {
14066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Miscellaneous tests to exercize less popular code paths */
14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDi *bidi, *bidiLine;
14086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar src[MAXLEN], dest[MAXLEN];
14096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t srcLen, destLen, runCount, i;
14106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDiLevel level;
14116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDiDirection dir;
14126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t map[MAXLEN];
14136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode=U_ZERO_ERROR;
14146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const int32_t srcMap[6] = {0,1,-1,5,4};
14156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const int32_t dstMap[6] = {0,1,-1,-1,4,3};
14166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bidi = ubidi_openSized(120, 66, &errorCode);
14186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (bidi == NULL) {
14196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error with openSized(120, 66)\n");
14206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
14216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bidiLine = ubidi_open();
14236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (bidi == NULL) {
14246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error with open()\n");
14256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
14266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReverse(src, 0, dest, MAXLEN, 0, &errorCode);
14296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (destLen != 0) {
14306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nwriteReverse should return zero length, ",
14316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "returned %d instead\n", destLen);
14326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#1#");
14346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, 0, UBIDI_LTR, NULL, &errorCode);
14366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
14376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (destLen != 0) {
14386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nwriteReordered should return zero length, ",
14396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "returned %d instead\n", destLen);
14406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#2#");
14426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("abc       ", src, MAXLEN);
14446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode);
14456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode);
14466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 3; i < 6; i++) {
14476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        level = ubidi_getLevelAt(bidiLine, i);
14486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (level != UBIDI_RTL) {
14496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("\nTrailing space at index %d should get paragraph level"
14506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "%d, got %d instead\n", i, UBIDI_RTL, level);
14516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#3#");
14546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("abc       def", src, MAXLEN);
14566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode);
14576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode);
14586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 3; i < 6; i++) {
14596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        level = ubidi_getLevelAt(bidiLine, i);
14606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (level != UBIDI_RTL) {
14616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("\nTrailing space at index %d should get paragraph level"
14626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "%d, got %d instead\n", i, UBIDI_RTL, level);
14636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#4#");
14666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("abcdefghi    ", src, MAXLEN);
14686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode);
14696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode);
14706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 3; i < 6; i++) {
14716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        level = ubidi_getLevelAt(bidiLine, i);
14726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (level != 2) {
14736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("\nTrailing char at index %d should get level 2, "
14746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "got %d instead\n", i, level);
14756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#5#");
14786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setReorderingOptions(bidi, UBIDI_OPTION_REMOVE_CONTROLS);
14806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\\u200eabc       def", src, MAXLEN);
14816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode);
14826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode);
14836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_getResultLength(bidiLine);
14846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (destLen != 5) {
14856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong result length, should be 5, got %d\n", destLen);
14866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#6#");
14886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("abcdefghi", src, MAXLEN);
14906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode);
14916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode);
14926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dir = ubidi_getDirection(bidiLine);
14936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (dir != UBIDI_LTR) {
14946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong direction #1, should be %d, got %d\n",
14956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UBIDI_LTR, dir);
14966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#7#");
14986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, 0, UBIDI_LTR, NULL, &errorCode);
15006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    runCount = ubidi_countRuns(bidi, &errorCode);
15016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (runCount != 0) {
15026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong number of runs #1, should be 0, got %d\n", runCount);
15036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#8#");
15056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("          ", src, MAXLEN);
15076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode);
15086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode);
15096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    runCount = ubidi_countRuns(bidiLine, &errorCode);
15106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (runCount != 1) {
15116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong number of runs #2, should be 1, got %d\n", runCount);
15126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#9#");
15146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("a\\u05d0        bc", src, MAXLEN);
15166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode);
15176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode);
15186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dir = ubidi_getDirection(bidi);
15196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (dir != UBIDI_MIXED) {
15206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong direction #2, should be %d, got %d\n",
15216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UBIDI_MIXED, dir);
15226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dir = ubidi_getDirection(bidiLine);
15246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (dir != UBIDI_MIXED) {
15256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong direction #3, should be %d, got %d\n",
15266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UBIDI_MIXED, dir);
15276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    runCount = ubidi_countRuns(bidiLine, &errorCode);
15296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (runCount != 2) {
15306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong number of runs #3, should be 2, got %d\n", runCount);
15316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#10#");
15336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_invertMap(srcMap, map, 5);
15356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (memcmp(dstMap, map, sizeof(dstMap))) {
15366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nUnexpected inverted Map, got ");
15376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i = 0; i < 6; i++) {
15386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("%d ", map[i]);
15396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
15406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\n");
15416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test REMOVE_BIDI_CONTROLS together with DO_MIRRORING */
15446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("abc\\u200e", src, MAXLEN);
15456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode);
15466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(bidi, dest, MAXLEN,
15476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UBIDI_REMOVE_BIDI_CONTROLS | UBIDI_DO_MIRRORING, &errorCode);
15486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (destLen != 3 || memcmp(dest, src, 3 * sizeof(UChar))) {
15496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong result #1, should be 'abc', got '%s'\n",
15506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(dest, destLen));
15516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#11#");
15536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test inverse Bidi with marks and contextual orientation */
15556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setReorderingMode(bidi, UBIDI_REORDER_INVERSE_LIKE_DIRECT);
15566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setReorderingOptions(bidi, UBIDI_OPTION_INSERT_MARKS);
15576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, 0, UBIDI_DEFAULT_RTL, NULL, &errorCode);
15586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
15596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (destLen != 0) {
15606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong result #2, length should be 0, got %d\n", destLen);
15616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#12#");
15636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("   ", src, MAXLEN);
15646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode);
15656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
15666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (destLen != 3 || memcmp(dest, src, destLen * sizeof(UChar))) {
15676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong result #3, should be '   ', got '%s'\n",
15686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(dest, destLen));
15696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#13#");
15716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("abc", src, MAXLEN);
15726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode);
15736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
15746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (destLen != 3 || memcmp(dest, src, destLen * sizeof(UChar))) {
15756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong result #4, should be 'abc', got '%s'\n",
15766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(dest, destLen));
15776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#14#");
15796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\\u05d0\\u05d1", src, MAXLEN);
15806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode);
15816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
15826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\\u05d1\\u05d0", src, MAXLEN);
15836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (destLen != 2 || memcmp(dest, src, destLen * sizeof(UChar))) {
15846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong result #5, should be '%s', got '%s'\n",
15856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
15866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#15#");
15886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("abc \\u05d0\\u05d1", src, MAXLEN);
15896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode);
15906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
15916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\\u05d1\\u05d0 abc", src, MAXLEN);
15926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (destLen != 6 || memcmp(dest, src, destLen * sizeof(UChar))) {
15936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong result #6, should be '%s', got '%s'\n",
15946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
15956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#16#");
15976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\\u05d0\\u05d1 abc", src, MAXLEN);
15986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode);
15996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
16006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\\u200fabc \\u05d1\\u05d0", src, MAXLEN);
16016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (destLen != 7 || memcmp(dest, src, destLen * sizeof(UChar))) {
16026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong result #7, should be '%s', got '%s'\n",
16036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
16046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#17#");
16066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\\u05d0\\u05d1 abc .-=", src, MAXLEN);
16076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode);
16086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
16096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\\u200f=-. abc \\u05d1\\u05d0", src, MAXLEN);
16106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (destLen != 11 || memcmp(dest, src, destLen * sizeof(UChar))) {
16116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong result #8, should be '%s', got '%s'\n",
16126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
16136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#18#");
16156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_orderParagraphsLTR(bidi, TRUE);
16166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\n\r   \n\rabc\n\\u05d0\\u05d1\rabc \\u05d2\\u05d3\n\r"
16176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        "\\u05d4\\u05d5 abc\n\\u05d6\\u05d7 abc .-=\r\n"
16186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        "-* \\u05d8\\u05d9 abc .-=", src, MAXLEN);
16196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode);
16206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
16216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\n\r   \n\rabc\n\\u05d1\\u05d0\r\\u05d3\\u05d2 abc\n\r"
16226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        "\\u200fabc \\u05d5\\u05d4\n\\u200f=-. abc \\u05d7\\u05d6\r\n"
16236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        "\\u200f=-. abc \\u05d9\\u05d8 *-", src, MAXLEN);
16246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (destLen != 57 || memcmp(dest, src, destLen * sizeof(UChar))) {
16256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong result #9, should be '%s', got '%s'\n",
16266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
16276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#19#");
16296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\\u05d0 \t", src, MAXLEN);
16306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode);
16316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
16326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\\u05D0\\u200e \t", src, MAXLEN);
16336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (destLen != 4 || memcmp(dest, src, destLen * sizeof(UChar))) {
16346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong result #10, should be '%s', got '%s'\n",
16356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
16366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#20#");
16386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\\u05d0 123 \t\\u05d1 123 \\u05d2", src, MAXLEN);
16396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode);
16406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
16416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\\u05d0 \\u200e123\\u200e \t\\u05d2 123 \\u05d1", src, MAXLEN);
16426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (destLen != 16 || memcmp(dest, src, destLen * sizeof(UChar))) {
16436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong result #11, should be '%s', got '%s'\n",
16446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
16456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#21#");
16476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\\u05d0 123 \\u0660\\u0661 ab", src, MAXLEN);
16486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode);
16496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
16506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\\u05d0 \\u200e123 \\u200e\\u0660\\u0661 ab", src, MAXLEN);
16516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (destLen != 13 || memcmp(dest, src, destLen * sizeof(UChar))) {
16526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong result #12, should be '%s', got '%s'\n",
16536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
16546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#22#");
16566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("ab \t", src, MAXLEN);
16576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode);
16586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
16596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\\u200f\t ab", src, MAXLEN);
16606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (destLen != 5 || memcmp(dest, src, destLen * sizeof(UChar))) {
16616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong result #13, should be '%s', got '%s'\n",
16626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
16636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#23#");
16656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check exceeding para level */
16676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(bidi);
16686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bidi = ubidi_open();
16696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("A\\u202a\\u05d0\\u202aC\\u202c\\u05d1\\u202cE", src, MAXLEN);
16706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_MAX_EXPLICIT_LEVEL - 1, NULL, &errorCode);
16716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    level = ubidi_getLevelAt(bidi, 2);
16726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (level != UBIDI_MAX_EXPLICIT_LEVEL) {
16736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong level at index 2\n, should be %d, got %d\n", UBIDI_MAX_EXPLICIT_LEVEL, level);
16746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#24#");
16766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check 1-char runs with RUNS_ONLY */
16786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setReorderingMode(bidi, UBIDI_REORDER_RUNS_ONLY);
16796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("a \\u05d0 b \\u05d1 c \\u05d2 d ", src, MAXLEN);
16806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode);
16816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    runCount = ubidi_countRuns(bidi, &errorCode);
16826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (runCount != 14) {
16836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nWrong number of runs #3, should be 14, got %d\n", runCount);
16846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RETURN_IF_BAD_ERRCODE("#25#");
16866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(bidi);
16886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(bidiLine);
16896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
16926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestFailureRecovery(void) {
16936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
16946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDi *bidi, *bidiLine;
16956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar src[MAXLEN];
16966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t srcLen;
16976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDiLevel level;
16986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDiReorderingMode rm;
16996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UBiDiLevel myLevels[3] = {6,5,4};
17006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nEntering TestFailureRecovery\n\n");
17026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode = U_FILE_ACCESS_ERROR;
17036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ubidi_writeReordered(NULL, NULL, 0, 0, &errorCode) != 0) {
17046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubidi_writeReordered did not return 0 when passed a failing UErrorCode\n");
17056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ubidi_writeReverse(NULL, 0, NULL, 0, 0, &errorCode) != 0) {
17076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubidi_writeReverse did not return 0 when passed a failing UErrorCode\n");
17086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode = U_ZERO_ERROR;
17106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ubidi_writeReordered(NULL, NULL, 0, 0, &errorCode) != 0 || errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
17116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubidi_writeReordered did not fail as expected\n");
17126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bidi = ubidi_open();
17156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("abc", src, MAXLEN);
17166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode = U_ZERO_ERROR;
17176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_LTR - 1, NULL, &errorCode);
17186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(errorCode)) {
17196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nubidi_setPara did not fail when passed too big para level\n");
17206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode = U_ZERO_ERROR;
17226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ubidi_writeReverse(NULL, 0, NULL, 0, 0, &errorCode) != 0 || errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
17236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubidi_writeReverse did not fail as expected\n");
17246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bidiLine = ubidi_open();
17266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode = U_ZERO_ERROR;
17276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode);
17286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(errorCode)) {
17296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nubidi_setLine did not fail when called before valid setPara()\n");
17306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode = U_ZERO_ERROR;
17326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("abc", src, MAXLEN);
17336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_LTR + 4, NULL, &errorCode);
17346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    level = ubidi_getLevelAt(bidi, 3);
17356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (level != 0) {
17366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nubidi_getLevelAt did not fail when called with bad argument\n");
17376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode = U_ZERO_ERROR;
17396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(bidi);
17406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bidi = ubidi_openSized(-1, 0, &errorCode);
17416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(errorCode)) {
17426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nubidi_openSized did not fail when called with bad argument\n");
17436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(bidi);
17456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bidi = ubidi_openSized(2, 1, &errorCode);
17466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode = U_ZERO_ERROR;
17476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("abc", src, MAXLEN);
17486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode);
17496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(errorCode)) {
17506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nsetPara did not fail when called with text too long\n");
17516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode = U_ZERO_ERROR;
17536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("=2", src, MAXLEN);
17546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode);
17556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_countRuns(bidi, &errorCode);
17566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(errorCode)) {
17576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nsetPara did not fail when called for too many runs\n");
17586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(bidi);
17606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bidi = ubidi_open();
17616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    rm = ubidi_getReorderingMode(bidi);
17626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setReorderingMode(bidi, UBIDI_REORDER_DEFAULT - 1);
17636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (rm != ubidi_getReorderingMode(bidi)) {
17646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nsetReorderingMode with bad argument #1 should have no effect\n");
17656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setReorderingMode(bidi, 9999);
17676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (rm != ubidi_getReorderingMode(bidi)) {
17686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nsetReorderingMode with bad argument #2 should have no effect\n");
17696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Try a surrogate char */
17726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode = U_ZERO_ERROR;
17736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\\uD800\\uDC00", src, MAXLEN);
17746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode);
17756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ubidi_getDirection(bidi) != UBIDI_MIXED) {
17766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\ngetDirection for 1st surrogate char should be MIXED\n");
17776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode = U_ZERO_ERROR;
17796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("abc", src, MAXLEN);
17806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, srcLen, 5, myLevels, &errorCode);
17816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(errorCode)) {
17826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nsetPara did not fail when called with bad levels\n");
17836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(bidi);
17856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(bidiLine);
17866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nExiting TestFailureRecovery\n\n");
17886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
17896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
17916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestMultipleParagraphs(void) {
17926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const char* const text = "__ABC\\u001c"          /* Para #0 offset 0 */
17936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    "__\\u05d0DE\\u001c"    /*       1        6 */
17946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    "__123\\u001c"          /*       2       12 */
17956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    "\\u000d\\u000a"        /*       3       18 */
17966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    "FG\\u000d"             /*       4       20 */
17976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    "\\u000d"               /*       5       23 */
17986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    "HI\\u000d\\u000a"      /*       6       24 */
17996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    "\\u000d\\u000a"        /*       7       28 */
18006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    "\\u000a"               /*       8       30 */
18016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    "\\u000a"               /*       9       31 */
18026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    "JK\\u001c";            /*      10       32 */
18036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const int32_t paraCount=11;
18046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const int32_t paraBounds[]={0, 6, 12, 18, 20, 23, 24, 28, 30, 31, 32, 35};
18056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UBiDiLevel paraLevels[]={UBIDI_LTR, UBIDI_RTL, UBIDI_DEFAULT_LTR, UBIDI_DEFAULT_RTL, 22, 23};
18066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UBiDiLevel multiLevels[6][11] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
18076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
18086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                  {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
18096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                  {0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0},
18106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                  {22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22},
18116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                  {23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}};
18126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const char* const text2 = "\\u05d0 1-2\\u001c\\u0630 1-2\\u001c1-2";
18136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UBiDiLevel levels2[] = {1,1,2,2,2,0, 1,1,2,1,2,0, 2,2,2};
18146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UBiDiLevel myLevels[10] = {0,0,0,0,0,0,0,0,0,0};
18156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar multiparaTestString[] = {
18166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x5de, 0x5e0, 0x5e1, 0x5d4, 0x20,  0x5e1, 0x5e4, 0x5da,
18176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,  0xa,   0xa,   0x41,  0x72,  0x74,  0x69,  0x73,
18186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x74,  0x3a,  0x20,  0x5de, 0x5e0, 0x5e1, 0x5d4, 0x20,
18196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x5e1, 0x5e4, 0x5da, 0x20,  0xa,   0xa,   0x41,  0x6c,
18206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x62,  0x75,  0x6d,  0x3a,  0x20,  0x5de, 0x5e0, 0x5e1,
18216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x5d4, 0x20,  0x5e1, 0x5e4, 0x5da, 0x20,  0xa,   0xa,
18226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x54,  0x69,  0x6d,  0x65,  0x3a,  0x20,  0x32,  0x3a,
18236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x32,  0x37,  0xa,  0xa
18246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
18256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UBiDiLevel multiparaTestLevels[] = {
18266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        1, 1, 1, 1, 1, 1, 1, 1,
18276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        1, 1, 0, 0, 0, 0, 0, 0,
18286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0, 0, 0, 1, 1, 1, 1, 1,
18296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        1, 1, 1, 0, 0, 0, 0, 0,
18306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0, 0, 0, 0, 0, 1, 1, 1,
18316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        1, 1, 1, 1, 1, 0, 0, 0,
18326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0, 0, 0, 0, 0, 0, 0, 0,
18336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0, 0, 0, 0
18346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
18356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDiLevel gotLevel;
18366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UBiDiLevel* gotLevels;
18376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool orderParagraphsLTR;
18386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar src[MAXLEN], dest[MAXLEN];
18396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode=U_ZERO_ERROR;
18406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDi* pBidi=ubidi_open();
18416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDi* pLine;
18426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t srcSize, count, paraStart, paraLimit, paraIndex, length;
18436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t srcLen, destLen;
18446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i, j, k;
18456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nEntering TestMultipleParagraphs\n\n");
18476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(text, src, MAXLEN);
18486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcSize=u_strlen(src);
18496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(pBidi, src, srcSize, UBIDI_LTR, NULL, &errorCode);
18506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)){
18516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubidi_setPara failed, paraLevel=%d, errorCode %s\n",
18526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UBIDI_LTR, u_errorName(errorCode));
18536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_close(pBidi);
18546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
18556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check paragraph count and boundaries */
18576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (paraCount!=(count=ubidi_countParagraphs(pBidi))) {
18586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubidi_countParagraphs returned %d, should be %d\n",
18596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                count, paraCount);
18606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=0; i<paraCount; i++) {
18626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_getParagraphByIndex(pBidi, i, &paraStart, &paraLimit, NULL, &errorCode);
18636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if ((paraStart!=paraBounds[i]) || (paraLimit!=paraBounds[i+1])) {
18646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Found boundaries of paragraph %d: %d-%d; expected: %d-%d\n",
18656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    i, paraStart, paraLimit, paraBounds[i], paraBounds[i+1]);
18666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
18676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
18696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check with last paragraph not terminated by B */
18706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    src[srcSize-1]='L';
18716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(pBidi, src, srcSize, UBIDI_LTR, NULL, &errorCode);
18726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)){
18736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("2nd ubidi_setPara failed, paraLevel=%d, errorCode %s\n",
18746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UBIDI_LTR, u_errorName(errorCode));
18756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_close(pBidi);
18766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
18776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (paraCount!=(count=ubidi_countParagraphs(pBidi))) {
18796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("2nd ubidi_countParagraphs returned %d, should be %d\n",
18806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                count, paraCount);
18816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    i=paraCount-1;
18836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_getParagraphByIndex(pBidi, i, &paraStart, &paraLimit, NULL, &errorCode);
18846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ((paraStart!=paraBounds[i]) || (paraLimit!=paraBounds[i+1])) {
18856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("2nd Found boundaries of paragraph %d: %d-%d; expected: %d-%d\n",
18866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                i, paraStart, paraLimit, paraBounds[i], paraBounds[i+1]);
18876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
18896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check paraLevel for all paragraphs under various paraLevel specs */
18906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (k=0; k<6; k++) {
18916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setPara(pBidi, src, srcSize, paraLevels[k], NULL, &errorCode);
18926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i=0; i<paraCount; i++) {
18936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            paraIndex=ubidi_getParagraph(pBidi, paraBounds[i], NULL, NULL, &gotLevel, &errorCode);
18946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (paraIndex!=i) {
18956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("For paraLevel=%d paragraph=%d, found paragraph index=%d expected=%d\n",
18966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        paraLevels[k], i, paraIndex, i);
18976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
18986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (gotLevel!=multiLevels[k][i]) {
18996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("For paraLevel=%d paragraph=%d, found level=%d expected %d\n",
19006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        paraLevels[k], i, gotLevel, multiLevels[k][i]);
19016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
19026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
19036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        gotLevel=ubidi_getParaLevel(pBidi);
19046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (gotLevel!=multiLevels[k][0]) {
19056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("For paraLevel=%d getParaLevel=%d, expected %d\n",
19066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    paraLevels[k], gotLevel, multiLevels[k][0]);
19076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
19086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
19106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check that the result of ubidi_getParaLevel changes if the first
19116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * paragraph has a different level
19126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
19136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    src[0]=0x05d2;                      /* Hebrew letter Gimel */
19146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(pBidi, src, srcSize, UBIDI_DEFAULT_LTR, NULL, &errorCode);
19156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gotLevel=ubidi_getParaLevel(pBidi);
19166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (gotLevel!=UBIDI_RTL) {
19176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("For paraLevel=UBIDI_DEFAULT_LTR getParaLevel=%d, expected=%d\n",
19186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        gotLevel, UBIDI_RTL);
19196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
19216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check that line cannot overlap paragraph boundaries */
19226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pLine=ubidi_open();
19236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    i=paraBounds[1];
19246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    k=paraBounds[2]+1;
19256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setLine(pBidi, i, k, pLine, &errorCode);
19266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(errorCode)) {
19276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("For line limits %d-%d got success %s\n",
19286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                i, k, u_errorName(errorCode));
19296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
19316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    i=paraBounds[1];
19326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    k=paraBounds[2];
19336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setLine(pBidi, i, k, pLine, &errorCode);
19346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(errorCode)) {
19356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("For line limits %d-%d got error %s\n",
19366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                i, k, u_errorName(errorCode));
19376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
19386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check level of block separator at end of paragraph when orderParagraphsLTR==FALSE */
19406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(pBidi, src, srcSize, UBIDI_RTL, NULL, &errorCode);
19416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get levels through para Bidi block */
19426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gotLevels=ubidi_getLevels(pBidi, &errorCode);
19436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(errorCode)) {
19446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error on Para getLevels %s\n", u_errorName(errorCode));
19456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_close(pLine);
19466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_close(pBidi);
19476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
19486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=26; i<32; i++) {
19506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (gotLevels[i]!=UBIDI_RTL) {
19516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("For char %d(%04x), level=%d, expected=%d\n",
19526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    i, src[i], gotLevels[i], UBIDI_RTL);
19536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
19546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get levels through para Line block */
19566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    i=paraBounds[1];
19576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    k=paraBounds[2];
19586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setLine(pBidi, i, k, pLine, &errorCode);
19596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(errorCode)) {
19606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("For line limits %d-%d got error %s\n",
19616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                i, k, u_errorName(errorCode));
19626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_close(pLine);
19636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_close(pBidi);
19646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
19656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    paraIndex=ubidi_getParagraph(pLine, i, &paraStart, &paraLimit, &gotLevel, &errorCode);
19676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gotLevels=ubidi_getLevels(pLine, &errorCode);
19686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(errorCode)) {
19696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error on Line getLevels %s\n", u_errorName(errorCode));
19706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_close(pLine);
19716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_close(pBidi);
19726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
19736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=ubidi_getLength(pLine);
19756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ((gotLevel!=UBIDI_RTL) || (gotLevels[length-1]!=UBIDI_RTL)) {
19766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("For paragraph %d with limits %d-%d, paraLevel=%d expected=%d, "
19776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "level of separator=%d expected=%d\n",
19786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                paraIndex, paraStart, paraLimit, gotLevel, UBIDI_RTL, gotLevels[length-1], UBIDI_RTL);
19796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    orderParagraphsLTR=ubidi_isOrderParagraphsLTR(pBidi);
19816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (orderParagraphsLTR) {
19826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Found orderParagraphsLTR=%d expected=%d\n", orderParagraphsLTR, FALSE);
19836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_orderParagraphsLTR(pBidi, TRUE);
19856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    orderParagraphsLTR=ubidi_isOrderParagraphsLTR(pBidi);
19866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!orderParagraphsLTR) {
19876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Found orderParagraphsLTR=%d expected=%d\n", orderParagraphsLTR, TRUE);
19886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check level of block separator at end of paragraph when orderParagraphsLTR==TRUE */
19906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(pBidi, src, srcSize, UBIDI_RTL, NULL, &errorCode);
19916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get levels through para Bidi block */
19926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gotLevels=ubidi_getLevels(pBidi, &errorCode);
19936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=26; i<32; i++) {
19946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (gotLevels[i]!=0) {
19956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("For char %d(%04x), level=%d, expected=%d\n",
19966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    i, src[i], gotLevels[i], 0);
19976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
19986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
20006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* get levels through para Line block */
20016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    i=paraBounds[1];
20026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    k=paraBounds[2];
20036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setLine(pBidi, paraStart, paraLimit, pLine, &errorCode);
20046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    paraIndex=ubidi_getParagraph(pLine, i, &paraStart, &paraLimit, &gotLevel, &errorCode);
20056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gotLevels=ubidi_getLevels(pLine, &errorCode);
20066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=ubidi_getLength(pLine);
20076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ((gotLevel!=UBIDI_RTL) || (gotLevels[length-1]!=0)) {
20086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("For paragraph %d with limits %d-%d, paraLevel=%d expected=%d, "
20096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "level of separator=%d expected=%d\n",
20106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                paraIndex, paraStart, paraLimit, gotLevel, UBIDI_RTL, gotLevels[length-1], 0);
20116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("levels=");
20126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (count=0; count<length; count++) {
20136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose(" %d", gotLevels[count]);
20146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
20156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("\n");
20166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test that the concatenation of separate invocations of the bidi code
20196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * on each individual paragraph in order matches the levels array that
20206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * results from invoking bidi once over the entire multiparagraph tests
20216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * (with orderParagraphsLTR false, of course)
20226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
20236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(text, src, MAXLEN);      /* restore original content */
20246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcSize=u_strlen(src);
20256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_orderParagraphsLTR(pBidi, FALSE);
20266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(pBidi, src, srcSize, UBIDI_DEFAULT_RTL, NULL, &errorCode);
20276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gotLevels=ubidi_getLevels(pBidi, &errorCode);
20286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=0; i<paraCount; i++) {
20296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* use pLine for individual paragraphs */
20306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        paraStart = paraBounds[i];
20316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        length = paraBounds[i+1] - paraStart;
20326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setPara(pLine, src+paraStart, length, UBIDI_DEFAULT_RTL, NULL, &errorCode);
20336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (j=0; j<length; j++) {
20346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if ((k=ubidi_getLevelAt(pLine, j)) != (gotLevel=gotLevels[paraStart+j])) {
20356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Checking paragraph concatenation: for paragraph=%d, "
20366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        "char=%d(%04x), level=%d, expected=%d\n",
20376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        i, j, src[paraStart+j], k, gotLevel);
20386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
20396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
20406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* ensure that leading numerics in a paragraph are not treated as arabic
20436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       numerals because of arabic text in a preceding paragraph
20446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
20456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(text2, src, MAXLEN);
20466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcSize=u_strlen(src);
20476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_orderParagraphsLTR(pBidi, TRUE);
20486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(pBidi, src, srcSize, UBIDI_RTL, NULL, &errorCode);
20496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gotLevels=ubidi_getLevels(pBidi, &errorCode);
20506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(errorCode)) {
20516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Can't get levels. %s\n", u_errorName(errorCode));
20526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
20536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=0; i<srcSize; i++) {
20556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (gotLevels[i]!=levels2[i]) {
20566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Checking leading numerics: for char %d(%04x), level=%d, expected=%d\n",
20576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    i, src[i], gotLevels[i], levels2[i]);
20586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
20596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check handling of whitespace before end of paragraph separator when
20626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * orderParagraphsLTR==TRUE, when last paragraph has, and lacks, a terminating B
20636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
20646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_memset(src, 0x0020, MAXLEN);
20656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcSize = 5;
20666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_orderParagraphsLTR(pBidi, TRUE);
20676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=0x001c; i<=0x0020; i+=(0x0020-0x001c)) {
20686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        src[4]=(UChar)i;                /* with and without terminating B */
20696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (j=0x0041; j<=0x05d0; j+=(0x05d0-0x0041)) {
20706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            src[0]=(UChar)j;            /* leading 'A' or Alef */
20716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (gotLevel=4; gotLevel<=5; gotLevel++) {
20726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* test even and odd paraLevel */
20736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ubidi_setPara(pBidi, src, srcSize, gotLevel, NULL, &errorCode);
20746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                gotLevels=ubidi_getLevels(pBidi, &errorCode);
20756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                for (k=1; k<=3; k++) {
20766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (gotLevels[k]!=gotLevel) {
20776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("Checking trailing spaces: for leading_char=%04x, "
20786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                "last_char=%04x, index=%d, level=%d, expected=%d\n",
20796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                src[0], src[4], k, gotLevels[k], gotLevel);
20806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
20816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
20826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
20836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
20846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check default orientation when inverse bidi and paragraph starts
20876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * with LTR strong char and ends with RTL strong char, with and without
20886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * a terminating B
20896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
20906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setReorderingMode(pBidi, UBIDI_REORDER_INVERSE_LIKE_DIRECT);
20916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("abc \\u05d2\\u05d1\n", src, MAXLEN);
20926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(pBidi, src, srcLen, UBIDI_DEFAULT_LTR, NULL, &errorCode);
20936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(pBidi, dest, MAXLEN, 0, &errorCode);
20946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\\u05d1\\u05d2 abc\n", src, MAXLEN);
20956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (memcmp(src, dest, destLen * sizeof(UChar))) {
20966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nInvalid output #0, should be '%s', got '%s'\n",
20976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
20986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("abc \\u05d2\\u05d1", src, MAXLEN);
21006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(pBidi, src, srcLen, UBIDI_DEFAULT_LTR, NULL, &errorCode);
21016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(pBidi, dest, MAXLEN, 0, &errorCode);
21026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("\\u05d1\\u05d2 abc", src, MAXLEN);
21036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (memcmp(src, dest, destLen * sizeof(UChar))) {
21046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nInvalid output #1, should be '%s', got '%s'\n",
21056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
21066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check multiple paragraphs together with explicit levels
21096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
21106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setReorderingMode(pBidi, UBIDI_REORDER_DEFAULT);
21116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("ab\\u05d1\\u05d2\n\\u05d3\\u05d4123", src, MAXLEN);
21126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(pBidi, src, srcLen, UBIDI_LTR, myLevels, &errorCode);
21136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(pBidi, dest, MAXLEN, 0, &errorCode);
21146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape("ab\\u05d2\\u05d1\\n123\\u05d4\\u05d3", src, MAXLEN);
21156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (memcmp(src, dest, destLen * sizeof(UChar))) {
21166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nInvalid output #2, should be '%s', got '%s'\n",
21176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
21186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count = ubidi_countParagraphs(pBidi);
21206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (count != 2) {
21216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nInvalid number of paras, should be 2, got %d\n", count);
21226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(pLine);
21256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(pBidi);
21266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nExiting TestMultipleParagraphs\n\n");
21276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check levels in multiple paragraphs with default para level
21296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
21306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pBidi = ubidi_open();
21316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode = U_ZERO_ERROR;
21326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(pBidi, multiparaTestString, LENGTHOF(multiparaTestString),
21336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  UBIDI_DEFAULT_LTR, NULL, &errorCode);
21346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(errorCode)) {
21356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubidi_setPara failed for multiparaTestString\n");
21366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_close(pBidi);
21376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
21386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gotLevels = ubidi_getLevels(pBidi, &errorCode);
21406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(errorCode)) {
21416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubidi_getLevels failed for multiparaTestString\n");
21426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_close(pBidi);
21436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
21446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0; i < LENGTHOF(multiparaTestString); i++) {
21466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (gotLevels[i] != multiparaTestLevels[i]) {
21476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error on level for multiparaTestString at index %d, "
21486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "expected=%d, actual=%d\n",
21496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    i, multiparaTestLevels[i], gotLevels[i]);
21506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(pBidi);
21536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
21556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* inverse BiDi ------------------------------------------------------------- */
21586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int countRoundtrips=0, countNonRoundtrips=0;
21606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define STRING_TEST_CASE(s) { (s), LENGTHOF(s) }
21626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
21646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestInverse(void) {
21656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar
21666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        string0[]={ 0x6c, 0x61, 0x28, 0x74, 0x69, 0x6e, 0x20, 0x5d0, 0x5d1, 0x29, 0x5d2, 0x5d3 },
21676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        string1[]={ 0x6c, 0x61, 0x74, 0x20, 0x5d0, 0x5d1, 0x5d2, 0x20, 0x31, 0x32, 0x33 },
21686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        string2[]={ 0x6c, 0x61, 0x74, 0x20, 0x5d0, 0x28, 0x5d1, 0x5d2, 0x20, 0x31, 0x29, 0x32, 0x33 },
21696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        string3[]={ 0x31, 0x32, 0x33, 0x20, 0x5d0, 0x5d1, 0x5d2, 0x20, 0x34, 0x35, 0x36 },
21706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        string4[]={ 0x61, 0x62, 0x20, 0x61, 0x62, 0x20, 0x661, 0x662 };
21716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const struct {
21736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *s;
21746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t length;
21756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } testCases[]={
21766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(string0),
21776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(string1),
21786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(string2),
21796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(string3),
21806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        STRING_TEST_CASE(string4)
21816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
21826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDi *pBiDi;
21846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
21856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i;
21866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nEntering TestInverse\n\n");
21886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pBiDi=ubidi_open();
21896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pBiDi==NULL) {
21906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("unable to open a UBiDi object (out of memory)\n");
21916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
21926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("inverse Bidi: testInverse(L) with %u test cases ---\n", LENGTHOF(testCases));
21956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     for(i=0; i<LENGTHOF(testCases); ++i) {
21966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Testing case %d\n", i);
21976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
21986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        _testInverseBidi(pBiDi, testCases[i].s, testCases[i].length, 0, &errorCode);
21996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("inverse Bidi: testInverse(R) with %u test cases ---\n", LENGTHOF(testCases));
22026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<LENGTHOF(testCases); ++i) {
22036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Testing case %d\n", i);
22046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCode=U_ZERO_ERROR;
22056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        _testInverseBidi(pBiDi, testCases[i].s, testCases[i].length, 1, &errorCode);
22066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    _testManyInverseBidi(pBiDi, 0);
22096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    _testManyInverseBidi(pBiDi, 1);
22106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(pBiDi);
22126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("inverse Bidi: rountrips: %5u\nnon-roundtrips: %5u\n", countRoundtrips, countNonRoundtrips);
22146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    _testWriteReverse();
22166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    _testManyAddedPoints();
22186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    _testMisc();
22206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nExiting TestInverse\n\n");
22226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
22236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define COUNT_REPEAT_SEGMENTS 6
22256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar repeatSegments[COUNT_REPEAT_SEGMENTS][2]={
22276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x61, 0x62 },     /* L */
22286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x5d0, 0x5d1 },   /* R */
22296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x627, 0x628 },   /* AL */
22306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x31, 0x32 },     /* EN */
22316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x661, 0x662 },   /* AN */
22326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0x20, 0x20 }      /* WS (N) */
22336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
22346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
22366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org_testManyInverseBidi(UBiDi *pBiDi, UBiDiLevel direction) {
22376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar text[8]={ 0, 0, 0x20, 0, 0, 0x20, 0, 0 };
22386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i, j, k;
22396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
22406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("inverse Bidi: testManyInverseBidi(%c) - test permutations of text snippets ---\n",
22426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 direction==0 ? 'L' : 'R');
22436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<COUNT_REPEAT_SEGMENTS; ++i) {
22446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        text[0]=repeatSegments[i][0];
22456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        text[1]=repeatSegments[i][1];
22466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(j=0; j<COUNT_REPEAT_SEGMENTS; ++j) {
22476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            text[3]=repeatSegments[j][0];
22486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            text[4]=repeatSegments[j][1];
22496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for(k=0; k<COUNT_REPEAT_SEGMENTS; ++k) {
22506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                text[6]=repeatSegments[k][0];
22516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                text[7]=repeatSegments[k][1];
22526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errorCode=U_ZERO_ERROR;
22546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_verbose("inverse Bidi: testManyInverseBidi()[%u %u %u]\n", i, j, k);
22556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                _testInverseBidi(pBiDi, text, 8, direction, &errorCode);
22566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
22576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
22586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
22606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
22626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org_testInverseBidi(UBiDi *pBiDi, const UChar *src, int32_t srcLength,
22636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UBiDiLevel direction, UErrorCode *pErrorCode) {
22646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar visualLTR[MAXLEN], logicalDest[MAXLEN], visualDest[MAXLEN];
22656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t ltrLength, logicalLength, visualLength;
22666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(direction==0) {
22686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("inverse Bidi: testInverse(L)\n");
22696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* convert visual to logical */
22716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setInverse(pBiDi, TRUE);
22726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!ubidi_isInverse(pBiDi)) {
22736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error while doing ubidi_setInverse(TRUE)\n");
22746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
22756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setPara(pBiDi, src, srcLength, 0, NULL, pErrorCode);
22766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (src != ubidi_getText(pBiDi)) {
22776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Wrong value returned by ubidi_getText\n");
22786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
22796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logicalLength=ubidi_writeReordered(pBiDi, logicalDest, LENGTHOF(logicalDest),
22806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                           UBIDI_DO_MIRRORING|UBIDI_INSERT_LRM_FOR_NUMERIC, pErrorCode);
22816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("  v ");
22826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        printUnicode(src, srcLength, ubidi_getLevels(pBiDi, pErrorCode));
22836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("\n");
22846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* convert back to visual LTR */
22866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setInverse(pBiDi, FALSE);
22876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (ubidi_isInverse(pBiDi)) {
22886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error while doing ubidi_setInverse(FALSE)\n");
22896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
22906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setPara(pBiDi, logicalDest, logicalLength, 0, NULL, pErrorCode);
22916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        visualLength=ubidi_writeReordered(pBiDi, visualDest, LENGTHOF(visualDest),
22926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                          UBIDI_DO_MIRRORING|UBIDI_REMOVE_BIDI_CONTROLS, pErrorCode);
22936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
22946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("inverse Bidi: testInverse(R)\n");
22956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* reverse visual from RTL to LTR */
22976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ltrLength=ubidi_writeReverse(src, srcLength, visualLTR, LENGTHOF(visualLTR), 0, pErrorCode);
22986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("  vr");
22996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        printUnicode(src, srcLength, NULL);
23006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("\n");
23016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* convert visual RTL to logical */
23036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setInverse(pBiDi, TRUE);
23046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setPara(pBiDi, visualLTR, ltrLength, 0, NULL, pErrorCode);
23056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logicalLength=ubidi_writeReordered(pBiDi, logicalDest, LENGTHOF(logicalDest),
23066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                           UBIDI_DO_MIRRORING|UBIDI_INSERT_LRM_FOR_NUMERIC, pErrorCode);
23076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("  vl");
23086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        printUnicode(visualLTR, ltrLength, ubidi_getLevels(pBiDi, pErrorCode));
23096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("\n");
23106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* convert back to visual RTL */
23126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setInverse(pBiDi, FALSE);
23136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setPara(pBiDi, logicalDest, logicalLength, 0, NULL, pErrorCode);
23146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        visualLength=ubidi_writeReordered(pBiDi, visualDest, LENGTHOF(visualDest),
23156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                          UBIDI_DO_MIRRORING|UBIDI_REMOVE_BIDI_CONTROLS|UBIDI_OUTPUT_REVERSE, pErrorCode);
23166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
23176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("  l ");
23186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printUnicode(logicalDest, logicalLength, ubidi_getLevels(pBiDi, pErrorCode));
23196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\n");
23206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("  v ");
23216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printUnicode(visualDest, visualLength, NULL);
23226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\n");
23236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check and print results */
23256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*pErrorCode)) {
23266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("inverse BiDi: *** error %s\n"
23276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "                 turn on verbose mode to see details\n", u_errorName(*pErrorCode));
23286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(srcLength==visualLength && memcmp(src, visualDest, srcLength*U_SIZEOF_UCHAR)==0) {
23296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ++countRoundtrips;
23306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose(" + roundtripped\n");
23316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
23326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ++countNonRoundtrips;
23336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose(" * did not roundtrip\n");
23346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("inverse BiDi: transformation visual->logical->visual did not roundtrip the text;\n"
23356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "                 turn on verbose mode to see details\n");
23366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
23376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
23386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
23406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org_testWriteReverse(void) {
23416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* U+064e and U+0650 are combining marks (Mn) */
23426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar forward[]={
23436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x200f, 0x627, 0x64e, 0x650, 0x20, 0x28, 0x31, 0x29
23446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, reverseKeepCombining[]={
23456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x29, 0x31, 0x28, 0x20, 0x627, 0x64e, 0x650, 0x200f
23466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, reverseRemoveControlsKeepCombiningDoMirror[]={
23476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x28, 0x31, 0x29, 0x20, 0x627, 0x64e, 0x650
23486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
23496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar reverse[10];
23506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
23516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length;
23526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test ubidi_writeReverse() with "interesting" options */
23546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
23556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=ubidi_writeReverse(forward, LENGTHOF(forward),
23566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              reverse, LENGTHOF(reverse),
23576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              UBIDI_KEEP_BASE_COMBINING,
23586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              &errorCode);
23596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(reverseKeepCombining) || memcmp(reverse, reverseKeepCombining, length*U_SIZEOF_UCHAR)!=0) {
23606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in ubidi_writeReverse(UBIDI_KEEP_BASE_COMBINING): length=%d (should be %d), error code %s\n",
23616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                length, LENGTHOF(reverseKeepCombining), u_errorName(errorCode));
23626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
23636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(reverse, 0xa5, LENGTHOF(reverse)*U_SIZEOF_UCHAR);
23656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
23666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=ubidi_writeReverse(forward, LENGTHOF(forward),
23676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              reverse, LENGTHOF(reverse),
23686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              UBIDI_REMOVE_BIDI_CONTROLS|UBIDI_DO_MIRRORING|UBIDI_KEEP_BASE_COMBINING,
23696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              &errorCode);
23706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(reverseRemoveControlsKeepCombiningDoMirror) || memcmp(reverse, reverseRemoveControlsKeepCombiningDoMirror, length*U_SIZEOF_UCHAR)!=0) {
23716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in ubidi_writeReverse(UBIDI_REMOVE_BIDI_CONTROLS|UBIDI_DO_MIRRORING|UBIDI_KEEP_BASE_COMBINING):\n"
23726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "    length=%d (should be %d), error code %s\n",
23736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                length, LENGTHOF(reverseRemoveControlsKeepCombiningDoMirror), u_errorName(errorCode));
23746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
23756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
23766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void _testManyAddedPoints(void) {
23786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode = U_ZERO_ERROR;
23796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDi *bidi = ubidi_open();
23806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar text[90], dest[MAXLEN], expected[120];
23816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int destLen, i;
23826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0; i < LENGTHOF(text); i+=3) {
23836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        text[i] = 0x0061; /* 'a' */
23846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        text[i+1] = 0x05d0;
23856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        text[i+2] = 0x0033; /* '3' */
23866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
23876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setReorderingMode(bidi, UBIDI_REORDER_INVERSE_LIKE_DIRECT);
23886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setReorderingOptions(bidi, UBIDI_OPTION_INSERT_MARKS);
23896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, text, LENGTHOF(text), UBIDI_LTR, NULL, &errorCode);
23906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
23916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0; i < LENGTHOF(expected); i+=4) {
23926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        expected[i] = 0x0061; /* 'a' */
23936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        expected[i+1] = 0x05d0;
23946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        expected[i+2] = 0x200e;
23956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        expected[i+3] = 0x0033; /* '3' */
23966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
23976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (memcmp(dest, expected, destLen * sizeof(UChar))) {
23986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nInvalid output with many added points, "
23996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "expected '%s', got '%s'\n",
24006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(expected, LENGTHOF(expected)),
24016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(dest, destLen));
24026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(bidi);
24046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
24056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void _testMisc(void) {
24076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode = U_ZERO_ERROR;
24086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDi *bidi = ubidi_open();
24096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar src[3], dest[MAXLEN], expected[5];
24106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int destLen;
24116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setInverse(bidi, TRUE);
24126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    src[0] = src[1] = src[2] = 0x0020;
24136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(bidi, src, LENGTHOF(src), UBIDI_RTL, NULL, &errorCode);
24146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(bidi, dest, MAXLEN,
24156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UBIDI_OUTPUT_REVERSE | UBIDI_INSERT_LRM_FOR_NUMERIC,
24166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              &errorCode);
24176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape("\\u200f   \\u200f", expected, 5);
24186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (memcmp(dest, expected, destLen * sizeof(UChar))) {
24196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nInvalid output with RLM at both sides, "
24206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "expected '%s', got '%s'\n",
24216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(expected, LENGTHOF(expected)),
24226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                aescstrdup(dest, destLen));
24236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(bidi);
24256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
24266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* arabic shaping ----------------------------------------------------------- */
24286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
24306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoArabicShapingTest(void) {
24316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar
24326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    source[]={
24336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x31,   /* en:1 */
24346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x627,  /* arabic:alef */
24356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x32,   /* en:2 */
24366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x6f3,  /* an:3 */
24376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x61,   /* latin:a */
24386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x34,   /* en:4 */
24396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0
24406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, en2an[]={
24416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x661, 0x627, 0x662, 0x6f3, 0x61, 0x664, 0
24426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, an2en[]={
24436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x31, 0x627, 0x32, 0x33, 0x61, 0x34, 0
24446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, logical_alen2an_init_lr[]={
24456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x31, 0x627, 0x662, 0x6f3, 0x61, 0x34, 0
24466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, logical_alen2an_init_al[]={
24476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x6f1, 0x627, 0x6f2, 0x6f3, 0x61, 0x34, 0
24486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, reverse_alen2an_init_lr[]={
24496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x661, 0x627, 0x32, 0x6f3, 0x61, 0x34, 0
24506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, reverse_alen2an_init_al[]={
24516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x6f1, 0x627, 0x32, 0x6f3, 0x61, 0x6f4, 0
24526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, lamalef[]={
24536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfefb, 0
24546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
24556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar dest[8];
24566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
24576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length;
24586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test number shaping */
24606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* european->arabic */
24626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
24636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
24646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
24656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN,
24666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
24676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(source) || memcmp(dest, en2an, length*U_SIZEOF_UCHAR)!=0) {
24686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(en2an)\n");
24696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* arabic->european */
24726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
24736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, -1,
24746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
24756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_DIGITS_AN2EN|U_SHAPE_DIGIT_TYPE_AN_EXTENDED,
24766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
24776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=u_strlen(source) || memcmp(dest, an2en, length*U_SIZEOF_UCHAR)!=0) {
24786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(an2en)\n");
24796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* european->arabic with context, logical order, initial state not AL */
24826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
24836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
24846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
24856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_DIGITS_ALEN2AN_INIT_LR|U_SHAPE_DIGIT_TYPE_AN,
24866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
24876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(source) || memcmp(dest, logical_alen2an_init_lr, length*U_SIZEOF_UCHAR)!=0) {
24886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(logical_alen2an_init_lr)\n");
24896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* european->arabic with context, logical order, initial state AL */
24926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
24936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
24946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
24956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_DIGITS_ALEN2AN_INIT_AL|U_SHAPE_DIGIT_TYPE_AN_EXTENDED,
24966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
24976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(source) || memcmp(dest, logical_alen2an_init_al, length*U_SIZEOF_UCHAR)!=0) {
24986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(logical_alen2an_init_al)\n");
24996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* european->arabic with context, reverse order, initial state not AL */
25026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
25036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
25046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
25056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_DIGITS_ALEN2AN_INIT_LR|U_SHAPE_DIGIT_TYPE_AN|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
25066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
25076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(source) || memcmp(dest, reverse_alen2an_init_lr, length*U_SIZEOF_UCHAR)!=0) {
25086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(reverse_alen2an_init_lr)\n");
25096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* european->arabic with context, reverse order, initial state AL */
25126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
25136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
25146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
25156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_DIGITS_ALEN2AN_INIT_AL|U_SHAPE_DIGIT_TYPE_AN_EXTENDED|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
25166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
25176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(source) || memcmp(dest, reverse_alen2an_init_al, length*U_SIZEOF_UCHAR)!=0) {
25186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(reverse_alen2an_init_al)\n");
25196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test noop */
25226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
25236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
25246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
25256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         0,
25266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
25276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(source) || memcmp(dest, source, length*U_SIZEOF_UCHAR)!=0) {
25286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(noop)\n");
25296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
25326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, 0,
25336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
25346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN,
25356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
25366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=0) {
25376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(en2an, sourceLength=0), returned %d/%s\n", u_errorName(errorCode), LENGTHOF(source));
25386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* preflight digit shaping */
25416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
25426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
25436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         NULL, 0,
25446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN,
25456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
25466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=LENGTHOF(source)) {
25476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(en2an preflighting), returned %d/%s instead of %d/U_BUFFER_OVERFLOW_ERROR\n",
25486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                length, u_errorName(errorCode), LENGTHOF(source));
25496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test illegal arguments */
25526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
25536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(NULL, LENGTHOF(source),
25546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
25556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN,
25566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
25576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
25586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(source=NULL), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode));
25596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
25626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, -2,
25636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
25646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN,
25656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
25666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
25676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(sourceLength=-2), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode));
25686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
25716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
25726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         NULL, LENGTHOF(dest),
25736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN,
25746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
25756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
25766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(dest=NULL), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode));
25776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
25806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
25816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, -1,
25826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN,
25836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
25846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
25856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(destSize=-1), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode));
25866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
25896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
25906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
25916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_DIGITS_RESERVED|U_SHAPE_DIGIT_TYPE_AN,
25926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
25936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
25946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(U_SHAPE_DIGITS_RESERVED), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode));
25956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
25986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
25996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
26006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_RESERVED,
26016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
26026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
26036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(U_SHAPE_DIGIT_TYPE_RESERVED), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode));
26046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
26056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
26076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
26086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         (UChar *)(source+2), LENGTHOF(dest), /* overlap source and destination */
26096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN,
26106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
26116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
26126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(U_SHAPE_DIGIT_TYPE_RESERVED), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode));
26136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
26146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
26166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(lamalef, LENGTHOF(lamalef),
26176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
26186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_UNSHAPE | U_SHAPE_LENGTH_GROW_SHRINK | U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
26196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
26206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length == LENGTHOF(lamalef)) {
26216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(U_SHAPE_LETTERS_UNSHAPE | U_SHAPE_LENGTH_GROW_SHRINK | U_SHAPE_TEXT_DIRECTION_VISUAL_LTR)\n");
26226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("returned %s instead of U_ZERO_ERROR or returned length %d instead of 3\n", u_errorName(errorCode), length);
26236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
26246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
26256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
26276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoLamAlefSpecialVLTRArabicShapingTest(void) {
26286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar
26296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    source[]={
26306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*a*/   0x20 ,0x646,0x622,0x644,0x627,0x20,
26316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*b*/   0x646,0x623,0x64E,0x644,0x627,0x20,
26326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*c*/   0x646,0x627,0x670,0x644,0x627,0x20,
26336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*d*/   0x646,0x622,0x653,0x644,0x627,0x20,
26346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*e*/   0x646,0x625,0x655,0x644,0x627,0x20,
26356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*f*/   0x646,0x622,0x654,0x644,0x627,0x20,
26366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*g*/   0xFEFC,0x639
26376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, shape_near[]={
26386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,0xfee5,0x20,0xfef5,0xfe8d,0x20,0xfee5,0x20,0xfe76,0xfef7,0xfe8d,0x20,
26396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfee5,0x20,0x670,0xfefb,0xfe8d,0x20,0xfee5,0x20,0x653,0xfef5,0xfe8d,0x20,
26406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfee5,0x20,0x655,0xfef9,0xfe8d,0x20,0xfee5,0x20,0x654,0xfef5,0xfe8d,0x20,
26416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfefc,0xfecb
26426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, shape_at_end[]={
26436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,0xfef7,0xfe8d,0x20,0xfee5,0x670,
26446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,0x20,0xfee5,0x655,0xfef9,0xfe8d,
26456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb,0x20,0x20,0x20,0x20,0x20,0x20
26466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, shape_at_begin[]={
26476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,
26486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfef7,0xfe8d,0x20,0xfee5,0x670,0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,
26496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,0xfee5,0x655,0xfef9,0xfe8d,0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb
26506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, shape_grow_shrink[]={
26516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,0xfef7,0xfe8d,0x20,0xfee5,
26526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x670,0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,0x20,0xfee5,0x655,0xfef9,
26536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfe8d,0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb
26546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, shape_excepttashkeel_near[]={
26556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,0xfee5,0x20,0xfef5,0xfe8d,0x20,0xfee5,0x20,0xfe76,0xfef7,0xfe8d,0x20,
26566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfee5,0x20,0x670,0xfefb,0xfe8d,0x20,0xfee5,0x20,0x653,0xfef5,0xfe8d,0x20,
26576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfee5,0x20,0x655,0xfef9,0xfe8d,0x20,0xfee5,0x20,0x654,0xfef5,0xfe8d,0x20,
26586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfefc,0xfecb
26596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, shape_excepttashkeel_at_end[]={
26606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,0xfef7,0xfe8d,0x20,0xfee5,
26616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x670,0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,0x20,0xfee5,0x655,0xfef9,
26626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfe8d,0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb,0x20,0x20,0x20,
26636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,0x20,0x20
26646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, shape_excepttashkeel_at_begin[]={
26656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,
26666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfef7,0xfe8d,0x20,0xfee5,0x670,0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,
26676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,0xfee5,0x655,0xfef9,0xfe8d,0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb
26686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, shape_excepttashkeel_grow_shrink[]={
26696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,0xfef7,0xfe8d,0x20,0xfee5,0x670,
26706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,0x20,0xfee5,0x655,0xfef9,0xfe8d,
26716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb
26726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
26736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar dest[38];
26756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
26766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length;
26776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
26796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
26816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
26826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_FIXED_SPACES_NEAR|
26836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
26846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
26856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_near) || memcmp(dest, shape_near, length*U_SIZEOF_UCHAR)!=0) {
26876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(LAMALEF shape_near)\n");
26886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
26896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
26916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
26936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
26946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_FIXED_SPACES_AT_END|
26956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
26966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
26976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_at_end) || memcmp(dest, shape_at_end, length*U_SIZEOF_UCHAR)!=0) {
26996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(LAMALEF shape_at_end)\n");
27006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
27036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
27056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
27066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_FIXED_SPACES_AT_BEGINNING|
27076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
27086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
27096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_at_begin) || memcmp(dest, shape_at_begin, length*U_SIZEOF_UCHAR)!=0) {
27116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(LAMALEF shape_at_begin)\n");
27126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
27156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
27176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
27186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_GROW_SHRINK|
27196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
27206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
27216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || memcmp(dest, shape_grow_shrink, length*U_SIZEOF_UCHAR)!=0) {
27236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(LAMALEF shape_grow_shrink)\n");
27246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* ==================== U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED ==================== */
27276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
27296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
27316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
27326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_FIXED_SPACES_NEAR|
27336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
27346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
27356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_excepttashkeel_near) || memcmp(dest, shape_excepttashkeel_near, length*U_SIZEOF_UCHAR)!=0) {
27376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(LAMALEF shape_excepttashkeel_near)\n");
27386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
27416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
27436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
27446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_FIXED_SPACES_AT_END|
27456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
27466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
27476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_excepttashkeel_at_end) || memcmp(dest,shape_excepttashkeel_at_end , length*U_SIZEOF_UCHAR)!=0) {
27496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(LAMALEF shape_excepttashkeel_at_end)\n");
27506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
27536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
27556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
27566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_FIXED_SPACES_AT_BEGINNING|
27576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
27586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
27596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_excepttashkeel_at_begin) || memcmp(dest, shape_excepttashkeel_at_begin, length*U_SIZEOF_UCHAR)!=0) {
27616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(LAMALEF shape_excepttashkeel_at_begin)\n");
27626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
27656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
27676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
27686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_GROW_SHRINK|
27696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
27706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
27716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || memcmp(dest, shape_excepttashkeel_grow_shrink, length*U_SIZEOF_UCHAR)!=0) {
27736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(LAMALEF shape_excepttashkeel_grow_shrink)\n");
27746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
27766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
27786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoTashkeelSpecialVLTRArabicShapingTest(void) {
27796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar
27806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    source[]={
27816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x64A,0x628,0x631,0x639,0x20,
27826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x64A,0x628,0x651,0x631,0x64E,0x639,0x20,
27836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x64C,0x64A,0x628,0x631,0x64F,0x639,0x20,
27846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x628,0x670,0x631,0x670,0x639,0x20,
27856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x628,0x653,0x631,0x653,0x639,0x20,
27866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x628,0x654,0x631,0x654,0x639,0x20,
27876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x628,0x655,0x631,0x655,0x639,0x20,
27886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, shape_near[]={
27896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfef2,0xfe91,0xfeae,0xfecb,0x20,0xfef2,0xfe91,0xfe7c,0xfeae,0xfe77,0xfecb,
27906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,0xfe72,0xfef2,0xfe91,0xfeae,0xfe79,0xfecb,0x20,0xfe8f,0x670,0xfeae,0x670,
27916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfecb,0x20,0xfe8f,0x653,0xfeae,0x653,0xfecb,0x20,0xfe8f,0x654,0xfeae,0x654,
27926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfecb,0x20,0xfe8f,0x655,0xfeae,0x655,0xfecb,0x20
27936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, shape_excepttashkeel_near[]={
27946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfef2,0xfe91,0xfeae,0xfecb,0x20,0xfef2,0xfe91,0xfe7c,0xfeae,0xfe76,0xfecb,0x20,
27956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfe72,0xfef2,0xfe91,0xfeae,0xfe78,0xfecb,0x20,0xfe8f,0x670,0xfeae,0x670,0xfecb,
27966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,0xfe8f,0x653,0xfeae,0x653,0xfecb,0x20,0xfe8f,0x654,0xfeae,0x654,0xfecb,0x20,
27976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xfe8f,0x655,0xfeae,0x655,0xfecb,0x20
27986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
27996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar dest[43];
28016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
28026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length;
28036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
28056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
28076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
28086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_FIXED_SPACES_NEAR|
28096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
28106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
28116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_near) || memcmp(dest, shape_near, length*U_SIZEOF_UCHAR)!=0) {
28136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(TASHKEEL shape_near)\n");
28146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
28156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
28176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
28196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
28206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_FIXED_SPACES_NEAR|
28216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
28226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
28236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_excepttashkeel_near) || memcmp(dest, shape_excepttashkeel_near, length*U_SIZEOF_UCHAR)!=0) {
28256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(TASHKEEL shape_excepttashkeel_near)\n");
28266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
28276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
28286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
28306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoLOGICALArabicDeShapingTest(void) {
28316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar
28326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    source[]={
28336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0020,0x0020,0x0020,0xFE8D,0xFEF5,0x0020,0xFEE5,0x0020,0xFE8D,0xFEF7,0x0020,
28346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xFED7,0xFEFC,0x0020,0xFEE1,0x0020,0xFE8D,0xFEDF,0xFECC,0xFEAE,0xFE91,0xFEF4,
28356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xFE94,0x0020,0xFE8D,0xFEDF,0xFEA4,0xFEAE,0xFE93,0x0020,0x0020,0x0020,0x0020
28366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, unshape_near[]={
28376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,0x20,0x20,0x627,0x644,0x622,0x646,0x20,0x627,0x644,0x623,0x642,0x644,0x627,
28386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x645,0x20,0x627,0x644,0x639,0x631,0x628,0x64a,0x629,0x20,0x627,0x644,0x62d,0x631,
28396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x629,0x20,0x20,0x20,0x20
28406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, unshape_at_end[]={
28416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,0x20,0x20,0x627,0x644,0x622,0x20,0x646,0x20,0x627,0x644,0x623,0x20,0x642,
28426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x644,0x627,0x20,0x645,0x20,0x627,0x644,0x639,0x631,0x628,0x64a,0x629,0x20,0x627,
28436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x644,0x62d,0x631,0x629,0x20
28446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, unshape_at_begin[]={
28456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x627,0x644,0x622,0x20,0x646,0x20,0x627,0x644,0x623,0x20,0x642,0x644,0x627,0x20,
28466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x645,0x20,0x627,0x644,0x639,0x631,0x628,0x64a,0x629,0x20,0x627,0x644,0x62d,0x631,
28476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x629,0x20,0x20,0x20,0x20
28486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, unshape_grow_shrink[]={
28496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20,0x20,0x20,0x627,0x644,0x622,0x20,0x646,0x20,0x627,0x644,0x623,0x20,0x642,
28506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x644,0x627,0x20,0x645,0x20,0x627,0x644,0x639,0x631,0x628,0x64a,0x629,0x20,0x627,
28516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x644,0x62d,0x631,0x629,0x20,0x20,0x20,0x20
28526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
28536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar dest[36];
28556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
28566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length;
28576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
28596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
28616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
28626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_UNSHAPE|U_SHAPE_LENGTH_FIXED_SPACES_NEAR|
28636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_LOGICAL,
28646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
28656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(unshape_near) || memcmp(dest, unshape_near, length*U_SIZEOF_UCHAR)!=0) {
28676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(unshape_near)\n");
28686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
28696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
28716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
28736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
28746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_UNSHAPE|U_SHAPE_LENGTH_FIXED_SPACES_AT_END|
28756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_LOGICAL,
28766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
28776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(unshape_at_end) || memcmp(dest, unshape_at_end, length*U_SIZEOF_UCHAR)!=0) {
28796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(unshape_at_end)\n");
28806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
28816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
28836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
28856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
28866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_UNSHAPE|U_SHAPE_LENGTH_FIXED_SPACES_AT_BEGINNING|
28876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_LOGICAL,
28886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
28896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(unshape_at_begin) || memcmp(dest, unshape_at_begin, length*U_SIZEOF_UCHAR)!=0) {
28916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(unshape_at_begin)\n");
28926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
28936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
28956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(source, LENGTHOF(source),
28976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
28986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_UNSHAPE|U_SHAPE_LENGTH_GROW_SHRINK|
28996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_LOGICAL,
29006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
29016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || memcmp(dest, unshape_grow_shrink, length*U_SIZEOF_UCHAR)!=0) {
29036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(unshape_grow_shrink)\n");
29046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
29056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
29076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
29096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoTailTest(void) {
29106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  static const UChar src[] = { 0x0020, 0x0633, 0 };
29116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  static const UChar dst_old[] = { 0xFEB1, 0x200B,0 };
29126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  static const UChar dst_new[] = { 0xFEB1, 0xFE73,0 };
29136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UChar dst[3] = { 0x0000, 0x0000,0 };
29146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t length;
29156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UErrorCode status;
29166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  log_verbose("SRC: U+%04X U+%04X\n", src[0],src[1]);
29186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  log_verbose("Trying old tail\n");
29206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  status = U_ZERO_ERROR;
29216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  length = u_shapeArabic(src, -1, dst, LENGTHOF(dst),
29226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_SEEN_TWOCELL_NEAR, &status);
29236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_FAILURE(status)) {
29246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err("Fail: status %s\n", u_errorName(status));
29256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else if(length!=2) {
29266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err("Fail: len %d expected 3\n", length);
29276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else if(u_strncmp(dst,dst_old,LENGTHOF(dst))) {
29286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err("Fail: got U+%04X U+%04X expected U+%04X U+%04X\n",
29296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dst[0],dst[1],dst_old[0],dst_old[1]);
29306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
29316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("OK:  U+%04X U+%04X len %d err %s\n",
29326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dst[0],dst[1],length,u_errorName(status));
29336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
29346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  log_verbose("Trying new tail\n");
29376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  status = U_ZERO_ERROR;
29386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  length = u_shapeArabic(src, -1, dst, LENGTHOF(dst),
29396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_SEEN_TWOCELL_NEAR|U_SHAPE_TAIL_NEW_UNICODE, &status);
29406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_FAILURE(status)) {
29416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err("Fail: status %s\n", u_errorName(status));
29426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else if(length!=2) {
29436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err("Fail: len %d expected 3\n", length);
29446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else if(u_strncmp(dst,dst_new,LENGTHOF(dst))) {
29456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_err("Fail: got U+%04X U+%04X expected U+%04X U+%04X\n",
29466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dst[0],dst[1],dst_new[0],dst_new[1]);
29476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
29486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("OK:  U+%04X U+%04X len %d err %s\n",
29496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dst[0],dst[1],length,u_errorName(status));
29506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
29516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
29526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
29546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoArabicShapingTestForBug5421(void) {
29556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar
29566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    persian_letters_source[]={
29576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0020, 0x0698, 0x067E, 0x0686, 0x06AF, 0x0020
29586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, persian_letters[]={
29596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0020, 0xFB8B, 0xFB59, 0xFB7D, 0xFB94, 0x0020
29606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, tashkeel_aggregation_source[]={
29616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0020, 0x0628, 0x0651, 0x064E, 0x062A, 0x0631, 0x0645, 0x0020,
29626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0628, 0x064E, 0x0651, 0x062A, 0x0631, 0x0645, 0x0020
29636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, tashkeel_aggregation[]={
29646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0020, 0xFE90, 0xFC60, 0xFE97, 0xFEAE, 0xFEE3,
29656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0020, 0xFE90, 0xFC60, 0xFE97, 0xFEAE, 0xFEE3, 0x0020
29666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, untouched_presentation_source[]={
29676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0020 ,0x0627, 0xfe90,0x0020
29686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, untouched_presentation[]={
29696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0020,0xfe8D, 0xfe90,0x0020
29706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, untouched_presentation_r_source[]={
29716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0020 ,0xfe90, 0x0627, 0x0020
29726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, untouched_presentation_r[]={
29736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0020, 0xfe90,0xfe8D,0x0020
29746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
29756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar dest[38];
29776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
29786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length;
29796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
29816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(persian_letters_source, LENGTHOF(persian_letters_source),
29836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
29846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
29856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
29866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(persian_letters) || memcmp(dest, persian_letters, length*U_SIZEOF_UCHAR)!=0) {
29886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(persian_letters)\n");
29896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
29906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
29926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(tashkeel_aggregation_source, LENGTHOF(tashkeel_aggregation_source),
29946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
29956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_AGGREGATE_TASHKEEL|U_SHAPE_PRESERVE_PRESENTATION|
29966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
29976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
29986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(tashkeel_aggregation) || memcmp(dest, tashkeel_aggregation, length*U_SIZEOF_UCHAR)!=0) {
30006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(tashkeel_aggregation)\n");
30016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
30026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
30046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(untouched_presentation_source, LENGTHOF(untouched_presentation_source),
30066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
30076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_PRESERVE_PRESENTATION|
30086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
30096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
30106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(untouched_presentation) || memcmp(dest, untouched_presentation, length*U_SIZEOF_UCHAR)!=0) {
30126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(untouched_presentation)\n");
30136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
30146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
30166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(untouched_presentation_r_source, LENGTHOF(untouched_presentation_r_source),
30186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
30196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_PRESERVE_PRESENTATION|
30206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_TEXT_DIRECTION_LOGICAL,
30216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
30226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(untouched_presentation_r) || memcmp(dest, untouched_presentation_r, length*U_SIZEOF_UCHAR)!=0) {
30246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(untouched_presentation_r)\n");
30256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
30266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
30276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
30296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoArabicShapingTestForBug8703(void) {
30306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar
30316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    letters_source1[]={
30326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0634,0x0651,0x0645,0x0652,0x0633
30336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_source2[]={
30346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0634,0x0651,0x0645,0x0652,0x0633
30356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_source3[]={
30366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       0x0634,0x0651,0x0645,0x0652,0x0633
30376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_source4[]={
30386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0634,0x0651,0x0645,0x0652,0x0633
30396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_source5[]={
30406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0633,0x0652,0x0645,0x0651,0x0634
30416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_source6[]={
30426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0633,0x0652,0x0645,0x0651,0x0634
30436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_source7[]={
30446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0633,0x0652,0x0645,0x0651,0x0634
30456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_source8[]={
30466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0633,0x0652,0x0645,0x0651,0x0634
30476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_dest1[]={
30486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0020,0xFEB7,0xFE7D,0xFEE4,0xFEB2
30496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_dest2[]={
30506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xFEB7,0xFE7D,0xFEE4,0xFEB2,0x0020
30516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_dest3[]={
30526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xFEB7,0xFE7D,0xFEE4,0xFEB2
30536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_dest4[]={
30546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xFEB7,0xFE7D,0xFEE4,0x0640,0xFEB2
30556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_dest5[]={
30566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0020,0xFEB2,0xFEE4,0xFE7D,0xFEB7
30576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_dest6[]={
30586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xFEB2,0xFEE4,0xFE7D,0xFEB7,0x0020
30596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_dest7[]={
30606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xFEB2,0xFEE4,0xFE7D,0xFEB7
30616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_dest8[]={
30626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xFEB2,0x0640,0xFEE4,0xFE7D,0xFEB7
30636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
30646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar dest[20];
30666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
30676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length;
30686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
30706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(letters_source1, LENGTHOF(letters_source1),
30726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
30736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_BEGIN | U_SHAPE_LETTERS_SHAPE,
30746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
30756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest1) || memcmp(dest, letters_dest1, length*U_SIZEOF_UCHAR)!=0) {
30776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(letters_source1)\n");
30786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
30796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
30816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(letters_source2, LENGTHOF(letters_source2),
30836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
30846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_END | U_SHAPE_LETTERS_SHAPE,
30856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
30866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest2) || memcmp(dest, letters_dest2, length*U_SIZEOF_UCHAR)!=0) {
30886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(letters_source2)\n");
30896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
30906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
30926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(letters_source3, LENGTHOF(letters_source3),
30946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
30956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_RESIZE | U_SHAPE_LETTERS_SHAPE,
30966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
30976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest3) || memcmp(dest, letters_dest3, length*U_SIZEOF_UCHAR)!=0) {
30996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(letters_source3)\n");
31006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
31016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
31036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(letters_source4, LENGTHOF(letters_source4),
31056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
31066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_REPLACE_BY_TATWEEL | U_SHAPE_LETTERS_SHAPE,
31076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
31086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest4) || memcmp(dest, letters_dest4, length*U_SIZEOF_UCHAR)!=0) {
31106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(letters_source4)\n");
31116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
31126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
31146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(letters_source5, LENGTHOF(letters_source5),
31166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
31176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_BEGIN | U_SHAPE_LETTERS_SHAPE,
31186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
31196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest5) || memcmp(dest, letters_dest5, length*U_SIZEOF_UCHAR)!=0) {
31216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(letters_source5)\n");
31226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
31236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
31256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(letters_source6, LENGTHOF(letters_source6),
31276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
31286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_END | U_SHAPE_LETTERS_SHAPE,
31296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
31306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest6) || memcmp(dest, letters_dest6, length*U_SIZEOF_UCHAR)!=0) {
31326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(letters_source6)\n");
31336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
31346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
31366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(letters_source7, LENGTHOF(letters_source7),
31386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
31396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_RESIZE | U_SHAPE_LETTERS_SHAPE,
31406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
31416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest7) || memcmp(dest, letters_dest7, length*U_SIZEOF_UCHAR)!=0) {
31436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(letters_source7)\n");
31446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
31456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
31476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(letters_source8, LENGTHOF(letters_source8),
31496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
31506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_REPLACE_BY_TATWEEL | U_SHAPE_LETTERS_SHAPE,
31516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
31526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest8) || memcmp(dest, letters_dest8, length*U_SIZEOF_UCHAR)!=0) {
31546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(letters_source8)\n");
31556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
31566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
31576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
31596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdoArabicShapingTestForBug9024(void) {
31606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar
31616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    letters_source1[]={  /* Arabic mathematical Symbols 0x1EE00 - 0x1EE1B */
31626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE00, 0xD83B, 0xDE01, 0xD83B, 0xDE02, 0xD83B, 0xDE03, 0x20,
31636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE24, 0xD83B, 0xDE05, 0xD83B, 0xDE06, 0x20,
31646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE07, 0xD83B, 0xDE08, 0xD83B, 0xDE09, 0x20,
31656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE0A, 0xD83B, 0xDE0B, 0xD83B, 0xDE0C, 0xD83B, 0xDE0D, 0x20,
31666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE0E, 0xD83B, 0xDE0F, 0xD83B, 0xDE10, 0xD83B, 0xDE11, 0x20,
31676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE12, 0xD83B, 0xDE13, 0xD83B, 0xDE14, 0xD83B, 0xDE15, 0x20,
31686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE16, 0xD83B, 0xDE17, 0xD83B, 0xDE18, 0x20,
31696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE19, 0xD83B, 0xDE1A, 0xD83B, 0xDE1B
31706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_source2[]={/* Arabic mathematical Symbols - Looped Symbols, 0x1EE80 - 0x1EE9B */
31716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE80, 0xD83B, 0xDE81, 0xD83B, 0xDE82, 0xD83B, 0xDE83, 0x20,
31726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE84, 0xD83B, 0xDE85, 0xD83B, 0xDE86, 0x20,
31736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE87, 0xD83B, 0xDE88, 0xD83B, 0xDE89, 0x20,
31746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE8B, 0xD83B, 0xDE8C, 0xD83B, 0xDE8D, 0x20,
31756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE8E, 0xD83B, 0xDE8F, 0xD83B, 0xDE90, 0xD83B, 0xDE91, 0x20,
31766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE92, 0xD83B, 0xDE93, 0xD83B, 0xDE94, 0xD83B, 0xDE95, 0x20,
31776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE96, 0xD83B, 0xDE97, 0xD83B, 0xDE98, 0x20,
31786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE99, 0xD83B, 0xDE9A, 0xD83B, 0xDE9B
31796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_source3[]={/* Arabic mathematical Symbols - Double-struck Symbols, 0x1EEA1 - 0x1EEBB */
31806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEA1, 0xD83B, 0xDEA2, 0xD83B, 0xDEA3, 0x20,
31816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEA5, 0xD83B, 0xDEA6, 0x20,
31826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEA7, 0xD83B, 0xDEA8, 0xD83B, 0xDEA9, 0x20,
31836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEAB, 0xD83B, 0xDEAC, 0xD83B, 0xDEAD, 0x20,
31846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEAE, 0xD83B, 0xDEAF, 0xD83B, 0xDEB0, 0xD83B, 0xDEB1, 0x20,
31856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEB2, 0xD83B, 0xDEB3, 0xD83B, 0xDEB4, 0xD83B, 0xDEB5, 0x20,
31866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEB6, 0xD83B, 0xDEB7, 0xD83B, 0xDEB8, 0x20,
31876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEB9, 0xD83B, 0xDEBA, 0xD83B, 0xDEBB
31886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_source4[]={/* Arabic mathematical Symbols - Initial Symbols, 0x1EE21 - 0x1EE3B */
31896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE21, 0xD83B, 0xDE22, 0x20,
31906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE27, 0xD83B, 0xDE29, 0x20,
31916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE2A, 0xD83B, 0xDE2B, 0xD83B, 0xDE2C, 0xD83B, 0xDE2D, 0x20,
31926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE2E, 0xD83B, 0xDE2F, 0xD83B, 0xDE30, 0xD83B, 0xDE31, 0x20,
31936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE32, 0xD83B, 0xDE34, 0xD83B, 0xDE35, 0x20,
31946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE36, 0xD83B, 0xDE37, 0x20,
31956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE39, 0xD83B, 0xDE3B
31966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_source5[]={/* Arabic mathematical Symbols - Tailed Symbols */
31976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE42, 0xD83B, 0xDE47, 0xD83B, 0xDE49, 0xD83B, 0xDE4B, 0x20,
31986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE4D, 0xD83B, 0xDE4E, 0xD83B, 0xDE4F, 0x20,
31996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE51, 0xD83B, 0xDE52, 0xD83B, 0xDE54, 0xD83B, 0xDE57, 0x20,
32006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE59, 0xD83B, 0xDE5B, 0xD83B, 0xDE5D, 0xD83B, 0xDE5F
32016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_source6[]={/* Arabic mathematical Symbols - Stretched Symbols with 06 range */
32026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE21, 0x0633, 0xD83B, 0xDE62, 0x0647
32036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_dest1[]={
32046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE00, 0xD83B, 0xDE01, 0xD83B, 0xDE02, 0xD83B, 0xDE03, 0x20,
32056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE24, 0xD83B, 0xDE05, 0xD83B, 0xDE06, 0x20,
32066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE07, 0xD83B, 0xDE08, 0xD83B, 0xDE09, 0x20,
32076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE0A, 0xD83B, 0xDE0B, 0xD83B, 0xDE0C, 0xD83B, 0xDE0D, 0x20,
32086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE0E, 0xD83B, 0xDE0F, 0xD83B, 0xDE10, 0xD83B, 0xDE11, 0x20,
32096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE12, 0xD83B, 0xDE13, 0xD83B, 0xDE14, 0xD83B, 0xDE15, 0x20,
32106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE16, 0xD83B, 0xDE17, 0xD83B, 0xDE18, 0x20,
32116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE19, 0xD83B, 0xDE1A, 0xD83B, 0xDE1B
32126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_dest2[]={
32136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE80, 0xD83B, 0xDE81, 0xD83B, 0xDE82, 0xD83B, 0xDE83, 0x20,
32146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE84, 0xD83B, 0xDE85, 0xD83B, 0xDE86, 0x20,
32156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE87, 0xD83B, 0xDE88, 0xD83B, 0xDE89, 0x20,
32166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE8B, 0xD83B, 0xDE8C, 0xD83B, 0xDE8D, 0x20,
32176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE8E, 0xD83B, 0xDE8F, 0xD83B, 0xDE90, 0xD83B, 0xDE91, 0x20,
32186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE92, 0xD83B, 0xDE93, 0xD83B, 0xDE94, 0xD83B, 0xDE95, 0x20,
32196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE96, 0xD83B, 0xDE97, 0xD83B, 0xDE98, 0x20,
32206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE99, 0xD83B, 0xDE9A, 0xD83B, 0xDE9B
32216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_dest3[]={
32226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEA1, 0xD83B, 0xDEA2, 0xD83B, 0xDEA3, 0x20,
32236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEA5, 0xD83B, 0xDEA6, 0x20,
32246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEA7, 0xD83B, 0xDEA8, 0xD83B, 0xDEA9, 0x20,
32256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEAB, 0xD83B, 0xDEAC, 0xD83B, 0xDEAD, 0x20,
32266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEAE, 0xD83B, 0xDEAF, 0xD83B, 0xDEB0, 0xD83B, 0xDEB1, 0x20,
32276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEB2, 0xD83B, 0xDEB3, 0xD83B, 0xDEB4, 0xD83B, 0xDEB5, 0x20,
32286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEB6, 0xD83B, 0xDEB7, 0xD83B, 0xDEB8, 0x20,
32296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDEB9, 0xD83B, 0xDEBA, 0xD83B, 0xDEBB
32306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_dest4[]={
32316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE21, 0xD83B, 0xDE22, 0x20,
32326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE27, 0xD83B, 0xDE29, 0x20,
32336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE2A, 0xD83B, 0xDE2B, 0xD83B, 0xDE2C, 0xD83B, 0xDE2D, 0x20,
32346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE2E, 0xD83B, 0xDE2F, 0xD83B, 0xDE30, 0xD83B, 0xDE31, 0x20,
32356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE32, 0xD83B, 0xDE34, 0xD83B, 0xDE35, 0x20,
32366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE36, 0xD83B, 0xDE37, 0x20,
32376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE39, 0xD83B, 0xDE3B
32386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_dest5[]={
32396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE42, 0xD83B, 0xDE47, 0xD83B, 0xDE49, 0xD83B, 0xDE4B, 0x20,
32406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE4D, 0xD83B, 0xDE4E, 0xD83B, 0xDE4F, 0x20,
32416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE51, 0xD83B, 0xDE52, 0xD83B, 0xDE54, 0xD83B, 0xDE57, 0x20,
32426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE59, 0xD83B, 0xDE5B, 0xD83B, 0xDE5D, 0xD83B, 0xDE5F
32436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }, letters_dest6[]={
32446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0xD83B, 0xDE21, 0xFEB1, 0xD83B, 0xDE62, 0xFEE9
32456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
32466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar dest[MAXLEN];
32486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode;
32496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t length;
32506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
32526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(letters_source1, LENGTHOF(letters_source1),
32546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
32556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_BEGIN | U_SHAPE_LETTERS_SHAPE,
32566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
32576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest1) || memcmp(dest, letters_dest1, length*U_SIZEOF_UCHAR)!=0) {
32596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(letters_source1)\n");
32606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
32616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
32636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(letters_source2, LENGTHOF(letters_source2),
32656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
32666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_END | U_SHAPE_LETTERS_SHAPE,
32676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
32686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest2) || memcmp(dest, letters_dest2, length*U_SIZEOF_UCHAR)!=0) {
32706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(letters_source2)\n");
32716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
32726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
32746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(letters_source3, LENGTHOF(letters_source3),
32766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
32776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_RESIZE | U_SHAPE_LETTERS_SHAPE,
32786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
32796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest3) || memcmp(dest, letters_dest3, length*U_SIZEOF_UCHAR)!=0) {
32816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(letters_source3)\n");
32826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
32836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
32856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(letters_source4, LENGTHOF(letters_source4),
32876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
32886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_REPLACE_BY_TATWEEL | U_SHAPE_LETTERS_SHAPE,
32896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
32906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest4) || memcmp(dest, letters_dest4, length*U_SIZEOF_UCHAR)!=0) {
32926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(letters_source4)\n");
32936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
32946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
32966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(letters_source5, LENGTHOF(letters_source5),
32986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
32996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_BEGIN | U_SHAPE_LETTERS_SHAPE,
33006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
33016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest5) || memcmp(dest, letters_dest5, length*U_SIZEOF_UCHAR)!=0) {
33036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(letters_source5)\n");
33046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
33056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode=U_ZERO_ERROR;
33076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    length=u_shapeArabic(letters_source6, LENGTHOF(letters_source6),
33096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         dest, LENGTHOF(dest),
33106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_END | U_SHAPE_LETTERS_SHAPE,
33116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &errorCode);
33126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest6) || memcmp(dest, letters_dest6, length*U_SIZEOF_UCHAR)!=0) {
33146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("failure in u_shapeArabic(letters_source6)\n");
33156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
33166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
33186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* helpers ------------------------------------------------------------------ */
33206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void initCharFromDirProps(void) {
33226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UVersionInfo ucd401={ 4, 0, 1, 0 };
33236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UVersionInfo ucdVersion={ 0, 0, 0, 0 };
33246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* lazy initialization */
33266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(ucdVersion[0]>0) {
33276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
33286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
33296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_getUnicodeVersion(ucdVersion);
33316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(memcmp(ucdVersion, ucd401, sizeof(UVersionInfo))>=0) {
33326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Unicode 4.0.1 changes bidi classes for +-/ */
33336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        charFromDirProp[U_EUROPEAN_NUMBER_SEPARATOR]=0x2b; /* change ES character from / to + */
33346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
33356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
33366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* return a string with characters according to the desired directional properties */
33386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UChar *
33396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orggetStringFromDirProps(const uint8_t *dirProps, int32_t length, UChar *buffer) {
33406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
33416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    initCharFromDirProps();
33436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* this part would have to be modified for UTF-x */
33456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<length; ++i) {
33466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        buffer[i]=charFromDirProp[dirProps[i]];
33476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
33486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    buffer[length]=0;
33496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return buffer;
33506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
33516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void printUnicode(const UChar *s, int32_t length, const UBiDiLevel *levels) {
33536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
33546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("{ ");
33566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0; i<length; ++i) {
33576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(levels!=NULL) {
33586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("%4x.%u  ", s[i], levels[i]);
33596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
33606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("%4x    ", s[i]);
33616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
33626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
33636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose(" }");
33646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
33656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* new BIDI API */
33676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Reordering Mode BiDi --------------------------------------------------------- */
33696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UBiDiLevel paraLevels[] = { UBIDI_LTR, UBIDI_RTL };
33716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool
33736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgassertSuccessful(const char* message, UErrorCode* rc) {
33746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (rc != NULL && U_FAILURE(*rc)) {
33756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("%s() failed with error %s.\n", message, myErrorName(*rc));
33766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
33776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
33786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return TRUE;
33796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
33806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool
33826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgassertStringsEqual(const char* expected, const char* actual, const char* src,
33836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   const char* mode, const char* option, UBiDi* pBiDi) {
33846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (uprv_strcmp(expected, actual)) {
33856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char formatChars[MAXLEN];
33866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nActual and expected output mismatch.\n"
33876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %d %s\n%20s %u\n%20s %d %s\n",
33886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "Input:", src,
33896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "Actual output:", actual,
33906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "Expected output:", expected,
33916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "Levels:", formatLevels(pBiDi, formatChars),
33926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "Reordering mode:", ubidi_getReorderingMode(pBiDi), mode,
33936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "Paragraph level:", ubidi_getParaLevel(pBiDi),
33946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "Reordering option:", ubidi_getReorderingOptions(pBiDi), option);
33956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
33966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
33976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return TRUE;
33986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
33996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBiDi*
34016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orggetBiDiObject(void) {
34026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDi* pBiDi = ubidi_open();
34036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (pBiDi == NULL) {
34046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Unable to allocate a UBiDi object. Tests are skipped.\n");
34056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
34066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return pBiDi;
34076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
34086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MAKE_ITEMS(val) val, #val
34106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const struct {
34126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDiReorderingMode value;
34136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* description;
34146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
34156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgmodes[] = {
34166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { MAKE_ITEMS(UBIDI_REORDER_GROUP_NUMBERS_WITH_R) },
34176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { MAKE_ITEMS(UBIDI_REORDER_INVERSE_LIKE_DIRECT) },
34186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { MAKE_ITEMS(UBIDI_REORDER_NUMBERS_SPECIAL) },
34196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { MAKE_ITEMS(UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL) },
34206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { MAKE_ITEMS(UBIDI_REORDER_INVERSE_NUMBERS_AS_L) }
34216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
34226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const struct {
34236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t value;
34246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* description;
34256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
34266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgoptions[] = {
34276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { MAKE_ITEMS(UBIDI_OPTION_INSERT_MARKS) },
34286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { MAKE_ITEMS(0) }
34296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
34306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TC_COUNT                LENGTHOF(textIn)
34326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MODES_COUNT             LENGTHOF(modes)
34336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define OPTIONS_COUNT           LENGTHOF(options)
34346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define LEVELS_COUNT            LENGTHOF(paraLevels)
34356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char* const textIn[] = {
34376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (0) 123 */
34386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "123",
34396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (1) .123->4.5 */
34406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ".123->4.5",
34416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (2) 678 */
34426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "678",
34436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (3) .678->8.9 */
34446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ".678->8.9",
34456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (4) JIH1.2,3MLK */
34466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "JIH1.2,3MLK",
34476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (5) FE.>12-> */
34486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "FE.>12->",
34496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (6) JIH.>12->a */
34506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "JIH.>12->a",
34516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (7) CBA.>67->89=a */
34526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "CBA.>67->89=a",
34536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (8) CBA.123->xyz */
34546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "CBA.123->xyz",
34556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (9) .>12->xyz */
34566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ".>12->xyz",
34576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (10) a.>67->xyz */
34586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "a.>67->xyz",
34596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (11) 123JIH */
34606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "123JIH",
34616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* (12) 123 JIH */
34626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "123 JIH"
34636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
34646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char* const textOut[] = {
34666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 0: 123 */
34676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "123",                                                              /* (0) */
34686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 1: .123->4.5 */
34696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ".123->4.5",                                                        /* (1) */
34706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "4.5<-123.",                                                        /* (2) */
34716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 2: 678 */
34726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "678",                                                              /* (3) */
34736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 3: .678->8.9 */
34746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ".8.9<-678",                                                        /* (4) */
34756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "8.9<-678.",                                                        /* (5) */
34766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ".678->8.9",                                                        /* (6) */
34776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 4: MLK1.2,3JIH */
34786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "KLM1.2,3HIJ",                                                      /* (7) */
34796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 5: FE.>12-> */
34806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "12<.EF->",                                                         /* (8) */
34816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "<-12<.EF",                                                         /* (9) */
34826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "EF.>@12->",                                                        /* (10) */
34836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 6: JIH.>12->a */
34846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "12<.HIJ->a",                                                       /* (11) */
34856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "a<-12<.HIJ",                                                       /* (12) */
34866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "HIJ.>@12->a",                                                      /* (13) */
34876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "a&<-12<.HIJ",                                                      /* (14) */
34886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 7: CBA.>67->89=a */
34896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "ABC.>@67->89=a",                                                   /* (15) */
34906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "a=89<-67<.ABC",                                                    /* (16) */
34916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "a&=89<-67<.ABC",                                                   /* (17) */
34926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "89<-67<.ABC=a",                                                    /* (18) */
34936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 8: CBA.123->xyz */
34946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "123.ABC->xyz",                                                     /* (19) */
34956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "xyz<-123.ABC",                                                     /* (20) */
34966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "ABC.@123->xyz",                                                    /* (21) */
34976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "xyz&<-123.ABC",                                                    /* (22) */
34986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 9: .>12->xyz */
34996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ".>12->xyz",                                                        /* (23) */
35006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "xyz<-12<.",                                                        /* (24) */
35016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "xyz&<-12<.",                                                       /* (25) */
35026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 10: a.>67->xyz */
35036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "a.>67->xyz",                                                       /* (26) */
35046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "a.>@67@->xyz",                                                     /* (27) */
35056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "xyz<-67<.a",                                                       /* (28) */
35066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 11: 123JIH */
35076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "123HIJ",                                                           /* (29) */
35086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "HIJ123",                                                           /* (30) */
35096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 12: 123 JIH */
35106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "123 HIJ",                                                          /* (31) */
35116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "HIJ 123",                                                          /* (32) */
35126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
35136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
35146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define NO                  UBIDI_MAP_NOWHERE
35156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MAX_MAP_LENGTH      20
35166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
35176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t forwardMap[][MAX_MAP_LENGTH] = {
35186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 0: 123 */
35196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 1, 2 },                                                        /* (0) */
35206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 1: .123->4.5 */
35216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 1, 2, 3, 4, 5, 6, 7, 8 },                                      /* (1) */
35226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 8, 5, 6, 7, 4, 3, 0, 1, 2 },                                      /* (2) */
35236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 2: 678 */
35246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 1, 2 },                                                        /* (3) */
35256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 3: .678->8.9 */
35266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 6, 7, 8, 5, 4, 1, 2, 3 },                                      /* (4) */
35276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 8, 5, 6, 7, 4, 3, 0, 1, 2 },                                      /* (5) */
35286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 1, 2, 3, 4, 5, 6, 7, 8 },                                      /* (6) */
35296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 4: MLK1.2,3JIH */
35306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 10, 9, 8, 3, 4, 5, 6, 7, 2, 1, 0 },                               /* (7) */
35316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 5: FE.>12-> */
35326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 5, 4, 3, 2, 0, 1, 6, 7 },                                         /* (8) */
35336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 7, 6, 5, 4, 2, 3, 1, 0 },                                         /* (9) */
35346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 1, 0, 2, 3, 5, 6, 7, 8 },                                         /* (10) */
35356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 6: JIH.>12->a */
35366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 6, 5, 4, 3, 2, 0, 1, 7, 8, 9 },                                   /* (11) */
35376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 9, 8, 7, 6, 5, 3, 4, 2, 1, 0 },                                   /* (12) */
35386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2, 1, 0, 3, 4, 6, 7, 8, 9, 10 },                                  /* (13) */
35396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 10, 9, 8, 7, 6, 4, 5, 3, 2, 0 },                                  /* (14) */
35406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 7: CBA.>67->89=a */
35416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2, 1, 0, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13 },                      /* (15) */
35426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 12, 11, 10, 9, 8, 6, 7, 5, 4, 2, 3, 1, 0 },                       /* (16) */
35436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 13, 12, 11, 10, 9, 7, 8, 6, 5, 3, 4, 2, 0 },                      /* (17) */
35446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 10, 9, 8, 7, 6, 4, 5, 3, 2, 0, 1, 11, 12 },                       /* (18) */
35456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 8: CBA.123->xyz */
35466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 6, 5, 4, 3, 0, 1, 2, 7, 8, 9, 10, 11 },                           /* (19) */
35476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 11, 10, 9, 8, 5, 6, 7, 4, 3, 0, 1, 2 },                           /* (20) */
35486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2, 1, 0, 3, 5, 6, 7, 8, 9, 10, 11, 12 },                          /* (21) */
35496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 12, 11, 10, 9, 6, 7, 8, 5, 4, 0, 1, 2 },                          /* (22) */
35506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 9: .>12->xyz */
35516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 1, 2, 3, 4, 5, 6, 7, 8 },                                      /* (23) */
35526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 8, 7, 5, 6, 4, 3, 0, 1, 2 },                                      /* (24) */
35536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 9, 8, 6, 7, 5, 4, 0, 1, 2 },                                      /* (25) */
35546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 10: a.>67->xyz */
35556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },                                   /* (26) */
35566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 1, 2, 4, 5, 7, 8, 9, 10, 11 },                                 /* (27) */
35576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 9, 8, 7, 5, 6, 4, 3, 0, 1, 2 },                                   /* (28) */
35586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 11: 123JIH */
35596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 1, 2, 5, 4, 3 },                                               /* (29) */
35606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 3, 4, 5, 2, 1, 0 },                                               /* (30) */
35616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 12: 123 JIH */
35626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 1, 2, 3, 6, 5, 4 },                                            /* (31) */
35636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 4, 5, 6, 3, 2, 1, 0 },                                            /* (32) */
35646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
35656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
35666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t inverseMap[][MAX_MAP_LENGTH] = {
35676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 0: 123 */
35686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 1, 2 },                                                        /* (0) */
35696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 1: .123->4.5 */
35706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 1, 2, 3, 4, 5, 6, 7, 8 },                                      /* (1) */
35716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 6, 7, 8, 5, 4, 1, 2, 3, 0 },                                      /* (2) */
35726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 2: 678 */
35736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 1, 2 },                                                        /* (3) */
35746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 3: .678->8.9 */
35756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 6, 7, 8, 5, 4, 1, 2, 3 },                                      /* (4) */
35766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 6, 7, 8, 5, 4, 1, 2, 3, 0 },                                      /* (5) */
35776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 1, 2, 3, 4, 5, 6, 7, 8 },                                      /* (6) */
35786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 4: MLK1.2,3JIH */
35796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 10, 9, 8, 3, 4, 5, 6, 7, 2, 1, 0 },                               /* (7) */
35806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 5: FE.>12-> */
35816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 4, 5, 3, 2, 1, 0, 6, 7 },                                         /* (8) */
35826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 7, 6, 4, 5, 3, 2, 1, 0 },                                         /* (9) */
35836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 1, 0, 2, 3, NO, 4, 5, 6, 7 },                                     /* (10) */
35846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 6: JIH.>12->a */
35856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 5, 6, 4, 3, 2, 1, 0, 7, 8, 9 },                                   /* (11) */
35866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 9, 8, 7, 5, 6, 4, 3, 2, 1, 0 },                                   /* (12) */
35876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2, 1, 0, 3, 4, NO, 5, 6, 7, 8, 9 },                               /* (13) */
35886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 9, NO, 8, 7, 5, 6, 4, 3, 2, 1, 0 },                               /* (14) */
35896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 7: CBA.>67->89=a */
35906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2, 1, 0, 3, 4, NO, 5, 6, 7, 8, 9, 10, 11, 12 },                   /* (15) */
35916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 12, 11, 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0 },                       /* (16) */
35926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 12, NO, 11, 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0 },                   /* (17) */
35936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0, 11, 12 },                       /* (18) */
35946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 8: CBA.123->xyz */
35956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 4, 5, 6, 3, 2, 1, 0, 7, 8, 9, 10, 11 },                           /* (19) */
35966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 9, 10, 11, 8, 7, 4, 5, 6, 3, 2, 1, 0 },                           /* (20) */
35976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2, 1, 0, 3, NO, 4, 5, 6, 7, 8, 9, 10, 11 },                       /* (21) */
35986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 9, 10, 11, NO, 8, 7, 4, 5, 6, 3, 2, 1, 0 },                       /* (22) */
35996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 9: .>12->xyz */
36006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 1, 2, 3, 4, 5, 6, 7, 8 },                                      /* (23) */
36016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 6, 7, 8, 5, 4, 2, 3, 1, 0 },                                      /* (24) */
36026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 6, 7, 8, NO, 5, 4, 2, 3, 1, 0 },                                  /* (25) */
36036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 10: a.>67->xyz */
36046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },                                   /* (26) */
36056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 1, 2, NO, 3, 4, NO, 5, 6, 7, 8, 9 },                           /* (27) */
36066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 7, 8, 9, 6, 5, 3, 4, 2, 1, 0 },                                   /* (28) */
36076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 11: 123JIH */
36086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 1, 2, 5, 4, 3 },                                               /* (29) */
36096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 5, 4, 3, 0, 1, 2 },                                               /* (30) */
36106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TC 12: 123 JIH */
36116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 1, 2, 3, 6, 5, 4 },                                            /* (31) */
36126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 6, 5, 4, 3, 0, 1, 2 },                                            /* (32) */
36136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
36146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char outIndices[TC_COUNT][MODES_COUNT - 1][OPTIONS_COUNT]
36166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            [LEVELS_COUNT] = {
36176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { /* TC 0: 123 */
36186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 0,  0}, { 0,  0}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
36196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 0,  0}, { 0,  0}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
36206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 0,  0}, { 0,  0}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
36216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 0,  0}, { 0,  0}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
36226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
36236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { /* TC 1: .123->4.5 */
36246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 1,  2}, { 1,  2}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
36256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 1,  2}, { 1,  2}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
36266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 1,  2}, { 1,  2}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
36276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 1,  2}, { 1,  2}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
36286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
36296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { /* TC 2: 678 */
36306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 3,  3}, { 3,  3}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
36316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 3,  3}, { 3,  3}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
36326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 3,  3}, { 3,  3}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
36336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 3,  3}, { 3,  3}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
36346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
36356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { /* TC 3: .678->8.9 */
36366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 6,  5}, { 6,  5}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
36376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 4,  5}, { 4,  5}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
36386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 6,  5}, { 6,  5}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
36396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 6,  5}, { 6,  5}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
36406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
36416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { /* TC 4: MLK1.2,3JIH */
36426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 7,  7}, { 7,  7}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
36436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 7,  7}, { 7,  7}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
36446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 7,  7}, { 7,  7}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
36456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 7,  7}, { 7,  7}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
36466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
36476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { /* TC 5: FE.>12-> */
36486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 8,  9}, { 8,  9}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
36496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{10,  9}, { 8,  9}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
36506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{ 8,  9}, { 8,  9}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
36516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{10,  9}, { 8,  9}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
36526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
36536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { /* TC 6: JIH.>12->a */
36546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{11, 12}, {11, 12}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
36556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{13, 14}, {11, 12}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
36566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{11, 12}, {11, 12}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
36576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{13, 14}, {11, 12}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
36586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
36596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { /* TC 7: CBA.>67->89=a */
36606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{18, 16}, {18, 16}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
36616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{18, 17}, {18, 16}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
36626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{18, 16}, {18, 16}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
36636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{15, 17}, {18, 16}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
36646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
36656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { /* TC 8: CBA.>124->xyz */
36666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{19, 20}, {19, 20}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
36676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{21, 22}, {19, 20}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
36686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{19, 20}, {19, 20}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
36696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{21, 22}, {19, 20}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
36706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
36716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { /* TC 9: .>12->xyz */
36726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{23, 24}, {23, 24}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
36736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{23, 25}, {23, 24}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
36746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{23, 24}, {23, 24}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
36756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{23, 25}, {23, 24}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
36766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
36776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { /* TC 10: a.>67->xyz */
36786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{26, 26}, {26, 26}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
36796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{26, 27}, {26, 28}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
36806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{26, 28}, {26, 28}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
36816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{26, 27}, {26, 28}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
36826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
36836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { /* TC 11: 124JIH */
36846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{30, 30}, {30, 30}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
36856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{29, 30}, {29, 30}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
36866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{30, 30}, {30, 30}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
36876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{30, 30}, {30, 30}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
36886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    },
36896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { /* TC 12: 124 JIH */
36906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{32, 32}, {32, 32}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
36916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{31, 32}, {31, 32}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
36926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{31, 32}, {31, 32}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
36936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {{31, 32}, {31, 32}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
36946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
36956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
36966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool
36986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgassertRoundTrip(UBiDi *pBiDi, int32_t tc, int32_t outIndex, const char *srcChars,
36996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char *destChars, const UChar *dest, int32_t destLen,
37006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int mode, int option, UBiDiLevel level) {
37016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
37026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const char roundtrip[TC_COUNT][MODES_COUNT][OPTIONS_COUNT]
37036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                [LEVELS_COUNT] = {
37046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* TC 0: 123 */
37056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
37066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
37076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
37086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
37096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
37106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
37116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* TC 1: .123->4.5 */
37126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
37136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
37146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
37156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
37166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
37176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
37186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* TC 2: 678 */
37196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
37206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
37216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
37226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
37236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
37246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
37256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* TC 3: .678->8.9 */
37266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
37276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
37286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
37296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
37306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 0,  0}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
37316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
37326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* TC 4: MLK1.2,3JIH */
37336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
37346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
37356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
37366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
37376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
37386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
37396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* TC 5: FE.>12-> */
37406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
37416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
37426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 0,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
37436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
37446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
37456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
37466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* TC 6: JIH.>12->a */
37476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
37486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
37496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 0,  0}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
37506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
37516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
37526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
37536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* TC 7: CBA.>67->89=a */
37546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
37556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
37566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 0,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
37576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
37586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 0,  0}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
37596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
37606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* TC 8: CBA.>123->xyz */
37616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
37626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
37636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 0,  0}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
37646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
37656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
37666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
37676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* TC 9: .>12->xyz */
37686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
37696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
37706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  0}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
37716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
37726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
37736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
37746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* TC 10: a.>67->xyz */
37756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
37766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
37776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
37786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
37796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  0}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
37806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
37816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* TC 11: 123JIH */
37826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
37836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
37846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
37856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
37866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
37876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
37886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { /* TC 12: 123 JIH */
37896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
37906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
37916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
37926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
37936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
37946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
37956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
37966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
37976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    #define SET_ROUND_TRIP_MODE(mode) \
37986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setReorderingMode(pBiDi, mode); \
37996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        desc = #mode; \
38006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
38016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
38026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode rc = U_ZERO_ERROR;
38036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar dest2[MAXLEN];
38046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t destLen2;
38056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* desc;
38066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char destChars2[MAXLEN];
38076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char destChars3[MAXLEN];
38086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
38096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch (modes[mode].value) {
38106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UBIDI_REORDER_NUMBERS_SPECIAL:
38116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            SET_ROUND_TRIP_MODE(UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL)
38126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UBIDI_REORDER_GROUP_NUMBERS_WITH_R:
38136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            SET_ROUND_TRIP_MODE(UBIDI_REORDER_GROUP_NUMBERS_WITH_R)
38146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UBIDI_REORDER_RUNS_ONLY:
38156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            SET_ROUND_TRIP_MODE(UBIDI_REORDER_RUNS_ONLY)
38166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UBIDI_REORDER_INVERSE_NUMBERS_AS_L:
38176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            SET_ROUND_TRIP_MODE(UBIDI_REORDER_DEFAULT)
38186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UBIDI_REORDER_INVERSE_LIKE_DIRECT:
38196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            SET_ROUND_TRIP_MODE(UBIDI_REORDER_DEFAULT)
38206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL:
38216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            SET_ROUND_TRIP_MODE(UBIDI_REORDER_NUMBERS_SPECIAL)
38226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        default:
38236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            SET_ROUND_TRIP_MODE(UBIDI_REORDER_INVERSE_LIKE_DIRECT)
38246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
38256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setReorderingOptions(pBiDi, UBIDI_OPTION_REMOVE_CONTROLS);
38266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
38276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(pBiDi, dest, destLen, level, NULL, &rc);
38286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    assertSuccessful("ubidi_setPara", &rc);
38296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *dest2 = 0;
38306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen2 = ubidi_writeReordered(pBiDi, dest2, MAXLEN, UBIDI_DO_MIRRORING,
38316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    &rc);
38326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    assertSuccessful("ubidi_writeReordered", &rc);
38336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
38346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u16ToPseudo(destLen, dest, destChars3);
38356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u16ToPseudo(destLen2, dest2, destChars2);
38366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    checkWhatYouCan(pBiDi, destChars3, destChars2);
38376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (strcmp(srcChars, destChars2)) {
38386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (roundtrip[tc][mode][option][level]) {
38396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("\nRound trip failed for case=%d mode=%d option=%d.\n"
38406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %s"
38416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "\n%20s %u\n", tc, mode, option,
38426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "Original text:", srcChars,
38436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "Round-tripped text:", destChars2,
38446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "Intermediate  text:", destChars3,
38456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "Reordering mode:", modes[mode].description,
38466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "Reordering option:", options[option].description,
38476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "Paragraph level:", level);
38486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
38496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else {
38506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("\nExpected round trip failure for case=%d mode=%d option=%d.\n"
38516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %s"
38526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "\n%20s %u\n", tc, mode, option,
38536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "Original text:", srcChars,
38546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "Round-tripped text:", destChars2,
38556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "Intermediate  text:", destChars3,
38566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "Reordering mode:", modes[mode].description,
38576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "Reordering option:", options[option].description,
38586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "Paragraph level:", level);
38596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
38606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
38616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
38626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!checkResultLength(pBiDi, destChars, destChars2, destLen2,
38636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           desc, "UBIDI_OPTION_REMOVE_CONTROLS", level)) {
38646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
38656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
38666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (outIndex > -1 && !checkMaps(pBiDi, outIndex, srcChars, destChars,
38676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    desc, "UBIDI_OPTION_REMOVE_CONTROLS",
38686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    level, FALSE)) {
38696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
38706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
38716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return TRUE;
38726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
38736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
38746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool
38756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgcheckResultLength(UBiDi *pBiDi, const char *srcChars, const char *destChars,
38766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  int32_t destLen, const char* mode,
38776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  const char* option, UBiDiLevel level) {
38786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t actualLen;
38796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (strcmp(mode, "UBIDI_REORDER_INVERSE_NUMBERS_AS_L") == 0)
38806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        actualLen = strlen(destChars);
38816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
38826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        actualLen = ubidi_getResultLength(pBiDi);
38836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (actualLen != destLen) {
38846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nubidi_getResultLength failed.\n%20s %7d\n%20s %7d\n"
38856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %u\n",
38866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Expected:", destLen, "Actual:", actualLen,
38876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Input:", srcChars, "Output:", destChars,
38886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Reordering mode:", mode, "Reordering option:", option,
38896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Paragraph level:", level);
38906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
38916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
38926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return TRUE;
38936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
38946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
38956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
38966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestReorderRunsOnly(void) {
38976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const struct {
38986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char* textIn;
38996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char* textOut[2][2];
39006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char noroundtrip[2];
39016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } testCases[] = {
39026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"ab 234 896 de", {{"de 896 ab 234", "de 896 ab 234"},                   /*0*/
39036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           {"ab 234 @896@ de", "de 896 ab 234"}}, {0, 0}},
39046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"abcGHI", {{"GHIabc", "GHIabc"}, {"GHIabc", "GHIabc"}}, {0, 0}},        /*1*/
39056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"a.>67->", {{"<-67<.a", "<-67<.a"}, {"<-67<.a", "<-67<.a"}}, {0, 0}},   /*2*/
39066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"-=%$123/ *", {{"* /%$123=-", "* /%$123=-"},                            /*3*/
39076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        {"* /%$123=-", "* /%$123=-"}}, {0, 0}},
39086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"abc->12..>JKL", {{"JKL<..12<-abc", "JKL<..abc->12"},                   /*4*/
39096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           {"JKL<..12<-abc", "JKL<..abc->12"}}, {0, 0}},
39106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"JKL->12..>abc", {{"abc<..JKL->12", "abc<..12<-JKL"},                   /*5*/
39116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           {"abc<..JKL->12", "abc<..12<-JKL"}}, {0, 0}},
39126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"123->abc", {{"abc<-123", "abc<-123"},                                  /*6*/
39136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      {"abc&<-123", "abc<-123"}}, {1, 0}},
39146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"123->JKL", {{"JKL<-123", "123->JKL"},                                  /*7*/
39156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      {"JKL<-123", "JKL<-@123"}}, {0, 1}},
39166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"*>12.>34->JKL", {{"JKL<-34<.12<*", "12.>34->JKL<*"},                   /*8*/
39176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           {"JKL<-34<.12<*", "JKL<-@34<.12<*"}}, {0, 1}},
39186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"*>67.>89->JKL", {{"67.>89->JKL<*", "67.>89->JKL<*"},                   /*9*/
39196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           {"67.>89->JKL<*", "67.>89->JKL<*"}}, {0, 0}},
39206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"* /abc-=$%123", {{"$%123=-abc/ *", "abc-=$%123/ *"},                   /*10*/
39216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           {"$%123=-abc/ *", "abc-=$%123/ *"}}, {0, 0}},
39226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"* /$%def-=123", {{"123=-def%$/ *", "def-=123%$/ *"},                   /*11*/
39236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           {"123=-def%$/ *", "def-=123%$/ *"}}, {0, 0}},
39246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"-=GHI* /123%$", {{"GHI* /123%$=-", "123%$/ *GHI=-"},                   /*12*/
39256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           {"GHI* /123%$=-", "123%$/ *GHI=-"}}, {0, 0}},
39266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"-=%$JKL* /123", {{"JKL* /%$123=-", "123/ *JKL$%=-"},                   /*13*/
39276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           {"JKL* /%$123=-", "123/ *JKL$%=-"}}, {0, 0}},
39286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"ab =#CD *?450", {{"CD *?450#= ab", "450?* CD#= ab"},                   /*14*/
39296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           {"CD *?450#= ab", "450?* CD#= ab"}}, {0, 0}},
39306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"ab 234 896 de", {{"de 896 ab 234", "de 896 ab 234"},                   /*15*/
39316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           {"ab 234 @896@ de", "de 896 ab 234"}}, {0, 0}},
39326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"abc-=%$LMN* /123", {{"LMN* /%$123=-abc", "123/ *LMN$%=-abc"},          /*16*/
39336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              {"LMN* /%$123=-abc", "123/ *LMN$%=-abc"}}, {0, 0}},
39346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"123->JKL&MN&P", {{"JKLMNP<-123", "123->JKLMNP"},                       /*17*/
39356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           {"JKLMNP<-123", "JKLMNP<-@123"}}, {0, 1}},
39366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {"123", {{"123", "123"},                /* just one run */               /*18*/
39376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 {"123", "123"}}, {0, 0}}
39386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
39396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDi *pBiDi = getBiDiObject();
39406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDi *pL2VBiDi = getBiDiObject();
39416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar src[MAXLEN], dest[MAXLEN], visual1[MAXLEN], visual2[MAXLEN];
39426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char destChars[MAXLEN], vis1Chars[MAXLEN], vis2Chars[MAXLEN];
39436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t srcLen, destLen, vis1Len, vis2Len, option, i, j, nCases, paras;
39446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode rc = U_ZERO_ERROR;
39456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDiLevel level;
39466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
39476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nEntering TestReorderRunsOnly\n\n");
39486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
39496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!pL2VBiDi) {
39506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_close(pBiDi);             /* in case this one was allocated */
39516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
39526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
39536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setReorderingMode(pBiDi, UBIDI_REORDER_RUNS_ONLY);
39546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setReorderingOptions(pL2VBiDi, UBIDI_OPTION_REMOVE_CONTROLS);
39556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
39566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (option = 0; option < 2; option++) {
39576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setReorderingOptions(pBiDi, option==0 ? UBIDI_OPTION_REMOVE_CONTROLS
39586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                    : UBIDI_OPTION_INSERT_MARKS);
39596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i = 0, nCases = LENGTHOF(testCases); i < nCases; i++) {
39606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            srcLen = strlen(testCases[i].textIn);
39616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            pseudoToU16(srcLen, testCases[i].textIn, src);
39626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for(j = 0; j < 2; j++) {
39636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_verbose("Now doing test for option %d, case %d, level %d\n",
39646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            i, option, j);
39656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                level = paraLevels[j];
39666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ubidi_setPara(pBiDi, src, srcLen, level, NULL, &rc);
39676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                assertSuccessful("ubidi_setPara", &rc);
39686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                *dest = 0;
39696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                destLen = ubidi_writeReordered(pBiDi, dest, MAXLEN, UBIDI_DO_MIRRORING, &rc);
39706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                assertSuccessful("ubidi_writeReordered", &rc);
39716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u16ToPseudo(destLen, dest, destChars);
39726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                checkWhatYouCan(pBiDi, testCases[i].textIn, destChars);
39736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                assertStringsEqual(testCases[i].textOut[option][level], destChars,
39746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        testCases[i].textIn, "UBIDI_REORDER_RUNS_ONLY",
39756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        option==0 ? "0" : "UBIDI_OPTION_INSERT_MARKS",
39766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        pBiDi);
39776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
39786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if((option==0) && testCases[i].noroundtrip[level]) {
39796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    continue;
39806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
39816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ubidi_setPara(pL2VBiDi, src, srcLen, level, NULL, &rc);
39826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                assertSuccessful("ubidi_setPara1", &rc);
39836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                *visual1 = 0;
39846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                vis1Len = ubidi_writeReordered(pL2VBiDi, visual1, MAXLEN, UBIDI_DO_MIRRORING, &rc);
39856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                assertSuccessful("ubidi_writeReordered1", &rc);
39866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u16ToPseudo(vis1Len, visual1, vis1Chars);
39876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                checkWhatYouCan(pL2VBiDi, testCases[i].textIn, vis1Chars);
39886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ubidi_setPara(pL2VBiDi, dest, destLen, level^1, NULL, &rc);
39896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                assertSuccessful("ubidi_setPara2", &rc);
39906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                *visual2 = 0;
39916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                vis2Len = ubidi_writeReordered(pL2VBiDi, visual2, MAXLEN, UBIDI_DO_MIRRORING, &rc);
39926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                assertSuccessful("ubidi_writeReordered2", &rc);
39936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u16ToPseudo(vis2Len, visual2, vis2Chars);
39946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                checkWhatYouCan(pL2VBiDi, destChars, vis2Chars);
39956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                assertStringsEqual(vis1Chars, vis2Chars,
39966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        testCases[i].textIn, "UBIDI_REORDER_RUNS_ONLY (2)",
39976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        option==0 ? "0" : "UBIDI_OPTION_INSERT_MARKS",
39986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        pBiDi);
39996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
40006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
40016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
40026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test with null or empty text */
40046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(pBiDi, src, 0, UBIDI_LTR, NULL, &rc);
40056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    assertSuccessful("ubidi_setPara3", &rc);
40066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    paras = ubidi_countParagraphs(pBiDi);
40076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (paras != 0) {
40086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nInvalid number of paras (should be 0): %d\n", paras);
40096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
40106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(pBiDi);
40126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(pL2VBiDi);
40136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nExiting TestReorderRunsOnly\n\n");
40156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
40166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
40186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestReorderingMode(void) {
40196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar src[MAXLEN], dest[MAXLEN];
40216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char destChars[MAXLEN];
40226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDi *pBiDi = NULL, *pBiDi2 = NULL, *pBiDi3 = NULL;
40236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode rc;
40246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int tc, mode, option, level;
40256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t optionValue, optionBack;
40266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDiReorderingMode modeValue, modeBack;
40276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t srcLen, destLen, idx;
40286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *expectedChars;
40296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool testOK = TRUE;
40306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nEntering TestReorderingMode\n\n");
40326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pBiDi = getBiDiObject();
40346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pBiDi2 = getBiDiObject();
40356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pBiDi3 = getBiDiObject();
40366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!pBiDi3) {
40376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_close(pBiDi);             /* in case this one was allocated */
40386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_close(pBiDi2);            /* in case this one was allocated */
40396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
40406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
40416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setInverse(pBiDi2, TRUE);
40436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (tc = 0; tc < TC_COUNT; tc++) {
40456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char *srcChars = textIn[tc];
40466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        srcLen = strlen(srcChars);
40476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pseudoToU16(srcLen, srcChars, src);
40486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (mode = 0; mode < MODES_COUNT; mode++) {
40506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            modeValue = modes[mode].value;
40516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ubidi_setReorderingMode(pBiDi, modeValue);
40526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            modeBack = ubidi_getReorderingMode(pBiDi);
40536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (modeValue != modeBack) {
40546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Error while setting reordering mode to %d, returned %d\n",
40556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        modeValue, modeBack);
40566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
40576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (option = 0; option < OPTIONS_COUNT; option++) {
40596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                optionValue = options[option].value;
40606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ubidi_setReorderingOptions(pBiDi, optionValue);
40616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                optionBack = ubidi_getReorderingOptions(pBiDi);
40626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (optionValue != optionBack) {
40636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("Error while setting reordering option to %d, returned %d\n",
40646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            optionValue, optionBack);
40656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
40666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                for (level = 0; level < LEVELS_COUNT; level++) {
40686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_verbose("starting test %d mode=%d option=%d level=%d\n",
40696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                tc, modes[mode].value, options[option].value, level);
40706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    rc = U_ZERO_ERROR;
40716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ubidi_setPara(pBiDi, src, srcLen, paraLevels[level], NULL, &rc);
40726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    assertSuccessful("ubidi_setPara", &rc);
40736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    *dest = 0;
40756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    destLen = ubidi_writeReordered(pBiDi, dest, MAXLEN,
40766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                   UBIDI_DO_MIRRORING, &rc);
40776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    assertSuccessful("ubidi_writeReordered", &rc);
40786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    u16ToPseudo(destLen, dest, destChars);
40796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (!((modes[mode].value == UBIDI_REORDER_INVERSE_NUMBERS_AS_L) &&
40806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          (options[option].value == UBIDI_OPTION_INSERT_MARKS))) {
40816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        checkWhatYouCan(pBiDi, srcChars, destChars);
40826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
40836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (modes[mode].value == UBIDI_REORDER_INVERSE_NUMBERS_AS_L) {
40856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        idx = -1;
40866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        expectedChars = inverseBasic(pBiDi2, srcChars, srcLen,
40876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                options[option].value, paraLevels[level], destChars);
40886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
40896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    else {
40906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        idx = outIndices[tc][mode][option][level];
40916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        expectedChars = textOut[idx];
40926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
40936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (!assertStringsEqual(expectedChars, destChars, srcChars,
40946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                modes[mode].description,
40956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                options[option].description,
40966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                pBiDi)) {
40976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        testOK = FALSE;
40986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
40996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (options[option].value == UBIDI_OPTION_INSERT_MARKS &&
41006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             !assertRoundTrip(pBiDi3, tc, idx, srcChars,
41016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                              destChars, dest, destLen,
41026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                              mode, option, paraLevels[level])) {
41036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        testOK = FALSE;
41046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
41056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    else if (!checkResultLength(pBiDi, srcChars, destChars,
41066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                destLen, modes[mode].description,
41076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                options[option].description,
41086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                paraLevels[level])) {
41096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        testOK = FALSE;
41106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
41116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    else if (idx > -1 && !checkMaps(pBiDi, idx, srcChars,
41126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            destChars, modes[mode].description,
41136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            options[option].description, paraLevels[level],
41146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            TRUE)) {
41156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        testOK = FALSE;
41166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
41176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
41186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
41196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
41206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
41216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (testOK == TRUE) {
41226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("\nReordering mode test OK\n");
41236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
41246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(pBiDi3);
41256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(pBiDi2);
41266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(pBiDi);
41276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nExiting TestReorderingMode\n\n");
41296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
41306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char* inverseBasic(UBiDi *pBiDi, const char *srcChars, int32_t srcLen,
41326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                uint32_t option, UBiDiLevel level, char *result) {
41336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode rc = U_ZERO_ERROR;
41346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t destLen;
41356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar src[MAXLEN], dest2[MAXLEN];
41366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (pBiDi == NULL || src == NULL) {
41386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
41396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
41406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setReorderingOptions(pBiDi, option);
41416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pseudoToU16(srcLen, srcChars, src);
41426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(pBiDi, src, srcLen, level, NULL, &rc);
41436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    assertSuccessful("ubidi_setPara", &rc);
41446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *dest2 = 0;
41466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(pBiDi, dest2, MAXLEN,
41476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                   UBIDI_DO_MIRRORING, &rc);
41486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    assertSuccessful("ubidi_writeReordered", &rc);
41496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u16ToPseudo(destLen, dest2, result);
41506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!(option == UBIDI_OPTION_INSERT_MARKS)) {
41516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        checkWhatYouCan(pBiDi, srcChars, result);
41526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
41536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return result;
41546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
41556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define NULL_CHAR '\0'
41576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
41596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestStreaming(void) {
41606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MAXPORTIONS 10
41616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const struct {
41636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char* textIn;
41646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        short int chunk;
41656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        short int nPortions[2];
41666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char  portionLens[2][MAXPORTIONS];
41676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char* message[2];
41686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } testData[] = {
41696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {   "123\\u000A"
41706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "abc45\\u000D"
41716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "67890\\u000A"
41726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "\\u000D"
41736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "02468\\u000D"
41746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "ghi",
41756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            6, { 6, 6 }, {{ 4, 6, 6, 1, 6, 3}, { 4, 6, 6, 1, 6, 3 }},
41766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {"4, 6, 6, 1, 6, 3", "4, 6, 6, 1, 6, 3"}
41776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
41786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {   "abcd\\u000Afgh\\u000D12345\\u000A456",
41796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            6, { 4, 4 }, {{ 5, 4, 6, 3 }, { 5, 4, 6, 3 }},
41806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {"5, 4, 6, 3", "5, 4, 6, 3"}
41816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
41826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {   "abcd\\u000Afgh\\u000D12345\\u000A45\\u000D",
41836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            6, { 4, 4 }, {{ 5, 4, 6, 3 }, { 5, 4, 6, 3 }},
41846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {"5, 4, 6, 3", "5, 4, 6, 3"}
41856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        },
41866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {   "abcde\\u000Afghi",
41876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            10, { 2, 2 }, {{ 6, 4 }, { 6, 4 }},
41886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {"6, 4", "6, 4"}
41896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
41906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
41916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar src[MAXLEN];
41926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDi *pBiDi = NULL;
41936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar *pSrc;
41946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode rc = U_ZERO_ERROR;
41956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t srcLen, processedLen, chunk, len, nPortions;
41966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i, j, levelIndex;
41976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDiLevel level;
41986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int nTests = LENGTHOF(testData), nLevels = LENGTHOF(paraLevels);
41996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool mismatch, testOK = TRUE;
42006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   char processedLenStr[MAXPORTIONS * 5];
42016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nEntering TestStreaming\n\n");
42036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pBiDi = getBiDiObject();
42056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_orderParagraphsLTR(pBiDi, TRUE);
42076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (levelIndex = 0; levelIndex < nLevels; levelIndex++) {
42096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i = 0; i < nTests; i++) {
42106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            srcLen = u_unescape(testData[i].textIn, src, MAXLEN);
42116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            chunk = testData[i].chunk;
42126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            nPortions = testData[i].nPortions[levelIndex];
42136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            level = paraLevels[levelIndex];
42146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            processedLenStr[0] = NULL_CHAR;
42156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("Testing level %d, case %d\n", level, i);
42166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            mismatch = FALSE;
42186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ubidi_setReorderingOptions(pBiDi, UBIDI_OPTION_STREAMING);
42206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (j = 0, pSrc = src; j < MAXPORTIONS && srcLen > 0; j++) {
42216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                len = chunk < srcLen ? chunk : srcLen;
42236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ubidi_setPara(pBiDi, pSrc, len, level, NULL, &rc);
42246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (!assertSuccessful("ubidi_setPara", &rc)) {
42256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    break;
42266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
42276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                processedLen = ubidi_getProcessedLength(pBiDi);
42296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (processedLen == 0) {
42306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ubidi_setReorderingOptions(pBiDi, UBIDI_OPTION_DEFAULT);
42316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    j--;
42326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    continue;
42336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
42346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ubidi_setReorderingOptions(pBiDi, UBIDI_OPTION_STREAMING);
42356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                mismatch |= (UBool)(j >= nPortions ||
42376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           processedLen != testData[i].portionLens[levelIndex][j]);
42386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                sprintf(processedLenStr + j * 4, "%4d", processedLen);
42406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                srcLen -= processedLen, pSrc += processedLen;
42416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
42426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (mismatch || j != nPortions) {
42446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                testOK = FALSE;
42456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("\nProcessed lengths mismatch.\n"
42466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "\tParagraph level: %u\n"
42476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "\tInput string: %s\n"
42486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "\tActually processed portion lengths: { %s }\n"
42496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    "\tExpected portion lengths          : { %s }\n",
42506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    paraLevels[levelIndex], testData[i].textIn,
42516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    processedLenStr, testData[i].message[levelIndex]);
42526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
42536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
42546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
42556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(pBiDi);
42566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (testOK == TRUE) {
42576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("\nBiDi streaming test OK\n");
42586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
42596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nExiting TestStreaming\n\n");
42606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
42616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_BEGIN
42636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UCharDirection U_CALLCONV
42656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgoverrideBidiClass(const void *context, UChar32 c) {
42666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DEF U_BIDI_CLASS_DEFAULT
42686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UCharDirection customClasses[] = {
42706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       /* 0/8    1/9    2/A    3/B    4/C    5/D    6/E    7/F  */
42716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, /* 00-07 */
42726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, /* 08-0F */
42736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, /* 10-17 */
42746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, /* 18-1F */
42756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          DEF,   DEF,   DEF,   DEF,   DEF,   DEF,     R,   DEF, /* 20-27 */
42766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, /* 28-2F */
42776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           EN,    EN,    EN,    EN,    EN,    EN,    AN,    AN, /* 30-37 */
42786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           AN,    AN,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, /* 38-3F */
42796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            L,    AL,    AL,    AL,    AL,    AL,    AL,     R, /* 40-47 */
42806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            R,     R,     R,     R,     R,     R,     R,     R, /* 48-4F */
42816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            R,     R,     R,     R,     R,     R,     R,     R, /* 50-57 */
42826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            R,     R,     R,   LRE,   DEF,   RLE,   PDF,     S, /* 58-5F */
42836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          NSM,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, /* 60-67 */
42846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, /* 68-6F */
42856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, /* 70-77 */
42866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          DEF,   DEF,   DEF,   LRO,     B,   RLO,    BN,   DEF  /* 78-7F */
42876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
42886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const int nEntries = LENGTHOF(customClasses);
42896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *dummy = context;        /* just to avoid a compiler warning */
42906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dummy++;
42916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return c >= nEntries ? U_BIDI_CLASS_DEFAULT : customClasses[c];
42936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
42946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_END
42966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void verifyCallbackParams(UBiDiClassCallback* fn, const void* context,
42986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 UBiDiClassCallback* expectedFn,
42996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 const void* expectedContext,
43006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 int32_t sizeOfContext) {
43016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (fn != expectedFn) {
43026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Class callback pointer is not set properly.\n");
43036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
43046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (context != expectedContext) {
43056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Class callback context is not set properly.\n");
43066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
43076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else if (context != NULL &&
43086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            memcmp(context, expectedContext, sizeOfContext)) {
43096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Callback context content doesn't match the expected one.\n");
43106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
43116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
43126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
43146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestClassOverride(void) {
43156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const char* const textSrc  = "JIH.>12->a \\u05D0\\u05D1 6 ABC78";
43166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const char* const textResult = "12<.HIJ->a 78CBA 6 \\u05D1\\u05D0";
43176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar src[MAXLEN], dest[MAXLEN];
43196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode rc = U_ZERO_ERROR;
43206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDi *pBiDi = NULL;
43216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDiClassCallback* oldFn = NULL;
43226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDiClassCallback* newFn = overrideBidiClass;
43236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const void* oldContext = NULL;
43246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t srcLen, destLen, textSrcSize = (int32_t)uprv_strlen(textSrc);
43256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char* destChars = NULL;
43266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nEntering TestClassOverride\n\n");
43286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pBiDi = getBiDiObject();
43306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!pBiDi) {
43316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
43326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
43336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_getClassCallback(pBiDi, &oldFn, &oldContext);
43356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verifyCallbackParams(oldFn, oldContext, NULL, NULL, 0);
43366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setClassCallback(pBiDi, newFn, textSrc, &oldFn, &oldContext, &rc);
43386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertSuccessful("ubidi_setClassCallback", &rc)) {
43396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_close(pBiDi);
43406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
43416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
43426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verifyCallbackParams(oldFn, oldContext, NULL, NULL, 0);
43436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_getClassCallback(pBiDi, &oldFn, &oldContext);
43456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verifyCallbackParams(oldFn, oldContext, newFn, textSrc, textSrcSize);
43466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setClassCallback(pBiDi, newFn, textSrc, &oldFn, &oldContext, &rc);
43486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertSuccessful("ubidi_setClassCallback", &rc)) {
43496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_close(pBiDi);
43506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
43516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
43526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verifyCallbackParams(oldFn, oldContext, newFn, textSrc, textSrcSize);
43536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = u_unescape(textSrc, src, MAXLEN);
43556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setPara(pBiDi, src, srcLen, UBIDI_LTR, NULL, &rc);
43566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    assertSuccessful("ubidi_setPara", &rc);
43576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destLen = ubidi_writeReordered(pBiDi, dest, MAXLEN,
43596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                   UBIDI_DO_MIRRORING, &rc);
43606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    assertSuccessful("ubidi_writeReordered", &rc);
43616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destChars = aescstrdup(dest, destLen);
43636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (uprv_strcmp(textResult, destChars)) {
43646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nActual and expected output mismatch.\n"
43656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "%20s %s\n%20s %s\n%20s %s\n",
43666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "Input:", textSrc, "Actual output:", destChars,
43676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "Expected output:", textResult);
43686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
43696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
43706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("\nClass override test OK\n");
43716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
43726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(pBiDi);
43736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nExiting TestClassOverride\n\n");
43746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
43756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic char * formatMap(const int32_t * map, int len, char * buffer)
43776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
43786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i, k;
43796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char c;
43806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0; i < len; i++) {
43816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        k = map[i];
43826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (k < 0)
43836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            c = '-';
43846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (k >= sizeof(columns))
43856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            c = '+';
43866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else
43876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            c = columns[k];
43886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        buffer[i] = c;
43896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
43906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    buffer[len] = '\0';
43916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return buffer;
43926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
43936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool
43956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgcheckMaps(UBiDi *pBiDi, int32_t stringIndex, const char *src, const char *dest,
43966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          const char *mode, const char* option, UBiDiLevel level, UBool forward)
43976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
43986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t actualLogicalMap[MAX_MAP_LENGTH];
43996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t actualVisualMap[MAX_MAP_LENGTH];
44006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t getIndexMap[MAX_MAP_LENGTH];
44016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i, srcLen, resLen, idx;
44026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const int32_t *expectedLogicalMap, *expectedVisualMap;
44036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode rc = U_ZERO_ERROR;
44046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool testOK = TRUE;
44056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
44066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (forward) {
44076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        expectedLogicalMap = forwardMap[stringIndex];
44086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        expectedVisualMap  = inverseMap[stringIndex];
44096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
44106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
44116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        expectedLogicalMap = inverseMap[stringIndex];
44126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        expectedVisualMap  = forwardMap[stringIndex];
44136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
44146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_getLogicalMap(pBiDi, actualLogicalMap, &rc);
44156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertSuccessful("ubidi_getLogicalMap", &rc)) {
44166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testOK = FALSE;
44176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
44186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLen = ubidi_getProcessedLength(pBiDi);
44196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (memcmp(expectedLogicalMap, actualLogicalMap, srcLen * sizeof(int32_t))) {
44206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char expChars[MAX_MAP_LENGTH];
44216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char actChars[MAX_MAP_LENGTH];
44226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nubidi_getLogicalMap() returns unexpected map for output string "
44236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "index %d\n"
44246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "source: %s\n"
44256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "dest  : %s\n"
44266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Scale : %s\n"
44276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "ExpMap: %s\n"
44286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Actual: %s\n"
44296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Paragraph level  : %d == %d\n"
44306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Reordering mode  : %s == %d\n"
44316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Reordering option: %s == %d\n"
44326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Forward flag     : %d\n",
44336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                stringIndex, src, dest, columns,
44346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                formatMap(expectedLogicalMap, srcLen, expChars),
44356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                formatMap(actualLogicalMap, srcLen, actChars),
44366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                level, ubidi_getParaLevel(pBiDi),
44376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                mode, ubidi_getReorderingMode(pBiDi),
44386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                option, ubidi_getReorderingOptions(pBiDi),
44396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                forward
44406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                );
44416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testOK = FALSE;
44426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
44436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    resLen = ubidi_getResultLength(pBiDi);
44446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_getVisualMap(pBiDi, actualVisualMap, &rc);
44456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    assertSuccessful("ubidi_getVisualMap", &rc);
44466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (memcmp(expectedVisualMap, actualVisualMap, resLen * sizeof(int32_t))) {
44476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char expChars[MAX_MAP_LENGTH];
44486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char actChars[MAX_MAP_LENGTH];
44496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nubidi_getVisualMap() returns unexpected map for output string "
44506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "index %d\n"
44516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "source: %s\n"
44526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "dest  : %s\n"
44536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Scale : %s\n"
44546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "ExpMap: %s\n"
44556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Actual: %s\n"
44566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Paragraph level  : %d == %d\n"
44576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Reordering mode  : %s == %d\n"
44586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Reordering option: %s == %d\n"
44596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Forward flag     : %d\n",
44606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                stringIndex, src, dest, columns,
44616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                formatMap(expectedVisualMap, resLen, expChars),
44626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                formatMap(actualVisualMap, resLen, actChars),
44636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                level, ubidi_getParaLevel(pBiDi),
44646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                mode, ubidi_getReorderingMode(pBiDi),
44656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                option, ubidi_getReorderingOptions(pBiDi),
44666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                forward
44676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                );
44686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testOK = FALSE;
44696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
44706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0; i < srcLen; i++) {
44716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        idx = ubidi_getVisualIndex(pBiDi, i, &rc);
44726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        assertSuccessful("ubidi_getVisualIndex", &rc);
44736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        getIndexMap[i] = idx;
44746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
44756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (memcmp(actualLogicalMap, getIndexMap, srcLen * sizeof(int32_t))) {
44766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char actChars[MAX_MAP_LENGTH];
44776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char gotChars[MAX_MAP_LENGTH];
44786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nMismatch between ubidi_getLogicalMap and ubidi_getVisualIndex for output string "
44796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "index %d\n"
44806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "source: %s\n"
44816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "dest  : %s\n"
44826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Scale : %s\n"
44836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "ActMap: %s\n"
44846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "IdxMap: %s\n"
44856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Paragraph level  : %d == %d\n"
44866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Reordering mode  : %s == %d\n"
44876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Reordering option: %s == %d\n"
44886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Forward flag     : %d\n",
44896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                stringIndex, src, dest, columns,
44906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                formatMap(actualLogicalMap, srcLen, actChars),
44916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                formatMap(getIndexMap, srcLen, gotChars),
44926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                level, ubidi_getParaLevel(pBiDi),
44936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                mode, ubidi_getReorderingMode(pBiDi),
44946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                option, ubidi_getReorderingOptions(pBiDi),
44956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                forward
44966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                );
44976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testOK = FALSE;
44986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
44996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0; i < resLen; i++) {
45006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        idx = ubidi_getLogicalIndex(pBiDi, i, &rc);
45016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        assertSuccessful("ubidi_getLogicalIndex", &rc);
45026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        getIndexMap[i] = idx;
45036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
45046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (memcmp(actualVisualMap, getIndexMap, resLen * sizeof(int32_t))) {
45056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char actChars[MAX_MAP_LENGTH];
45066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char gotChars[MAX_MAP_LENGTH];
45076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\nMismatch between ubidi_getVisualMap and ubidi_getLogicalIndex for output string "
45086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "index %d\n"
45096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "source: %s\n"
45106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "dest  : %s\n"
45116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Scale : %s\n"
45126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "ActMap: %s\n"
45136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "IdxMap: %s\n"
45146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Paragraph level  : %d == %d\n"
45156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Reordering mode  : %s == %d\n"
45166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Reordering option: %s == %d\n"
45176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Forward flag     : %d\n",
45186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                stringIndex, src, dest, columns,
45196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                formatMap(actualVisualMap, resLen, actChars),
45206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                formatMap(getIndexMap, resLen, gotChars),
45216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                level, ubidi_getParaLevel(pBiDi),
45226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                mode, ubidi_getReorderingMode(pBiDi),
45236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                option, ubidi_getReorderingOptions(pBiDi),
45246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                forward
45256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                );
45266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testOK = FALSE;
45276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
45286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return testOK;
45296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
45306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
45316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool
45326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgassertIllegalArgument(const char* message, UErrorCode* rc) {
45336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (*rc != U_ILLEGAL_ARGUMENT_ERROR) {
45346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("%s() failed with error %s.\n", message, myErrorName(*rc));
45356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
45366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
45376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return TRUE;
45386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
45396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
45406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct {
45416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* prologue;
45426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* source;
45436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* epilogue;
45446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* expected;
45456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDiLevel paraLevel;
45466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} contextCase;
45476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
45486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const contextCase contextData[] = {
45496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*00*/  {"", "", "", "", UBIDI_LTR},
45506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*01*/  {"", ".-=JKL-+*", "", ".-=LKJ-+*", UBIDI_LTR},
45516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*02*/  {" ", ".-=JKL-+*", " ", ".-=LKJ-+*", UBIDI_LTR},
45526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*03*/  {"a", ".-=JKL-+*", "b", ".-=LKJ-+*", UBIDI_LTR},
45536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*04*/  {"D", ".-=JKL-+*", "", "LKJ=-.-+*", UBIDI_LTR},
45546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*05*/  {"", ".-=JKL-+*", " D", ".-=*+-LKJ", UBIDI_LTR},
45556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*06*/  {"", ".-=JKL-+*", " 2", ".-=*+-LKJ", UBIDI_LTR},
45566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*07*/  {"", ".-=JKL-+*", " 7", ".-=*+-LKJ", UBIDI_LTR},
45576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*08*/  {" G 1", ".-=JKL-+*", " H", "*+-LKJ=-.", UBIDI_LTR},
45586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*09*/  {"7", ".-=JKL-+*", " H", ".-=*+-LKJ", UBIDI_LTR},
45596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*10*/  {"", ".-=abc-+*", "", "*+-abc=-.", UBIDI_RTL},
45606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*11*/  {" ", ".-=abc-+*", " ", "*+-abc=-.", UBIDI_RTL},
45616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*12*/  {"D", ".-=abc-+*", "G", "*+-abc=-.", UBIDI_RTL},
45626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*13*/  {"x", ".-=abc-+*", "", "*+-.-=abc", UBIDI_RTL},
45636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*14*/  {"", ".-=abc-+*", " y", "abc-+*=-.", UBIDI_RTL},
45646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*15*/  {"", ".-=abc-+*", " 2", "abc-+*=-.", UBIDI_RTL},
45656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*16*/  {" x 1", ".-=abc-+*", " 2", ".-=abc-+*", UBIDI_RTL},
45666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*17*/  {" x 7", ".-=abc-+*", " 8", "*+-.-=abc", UBIDI_RTL},
45676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*18*/  {"x|", ".-=abc-+*", " 8", "*+-abc=-.", UBIDI_RTL},
45686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*19*/  {"G|y", ".-=abc-+*", " 8", "*+-.-=abc", UBIDI_RTL},
45696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*20*/  {"", ".-=", "", ".-=", UBIDI_DEFAULT_LTR},
45706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*21*/  {"D", ".-=", "", "=-.", UBIDI_DEFAULT_LTR},
45716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*22*/  {"G", ".-=", "", "=-.", UBIDI_DEFAULT_LTR},
45726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*23*/  {"xG", ".-=", "", ".-=", UBIDI_DEFAULT_LTR},
45736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*24*/  {"x|G", ".-=", "", "=-.", UBIDI_DEFAULT_LTR},
45746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*25*/  {"x|G", ".-=|-+*", "", "=-.|-+*", UBIDI_DEFAULT_LTR},
45756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
45766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define CONTEXT_COUNT       LENGTHOF(contextData)
45776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
45786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void
45796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestContext(void) {
45806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
45816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar prologue[MAXLEN], epilogue[MAXLEN], src[MAXLEN], dest[MAXLEN];
45826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char destChars[MAXLEN];
45836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBiDi *pBiDi = NULL;
45846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode rc;
45856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t proLength, epiLength, srcLen, destLen, tc;
45866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    contextCase cc;
45876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool testOK = TRUE;
45886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
45896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nEntering TestContext \n\n");
45906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
45916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test null BiDi object */
45926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    rc = U_ZERO_ERROR;
45936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setContext(pBiDi, NULL, 0, NULL, 0, &rc);
45946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testOK &= assertIllegalArgument("Error when BiDi object is null", &rc);
45956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
45966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pBiDi = getBiDiObject();
45976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_orderParagraphsLTR(pBiDi, TRUE);
45986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
45996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test proLength < -1 */
46006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    rc = U_ZERO_ERROR;
46016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setContext(pBiDi, NULL, -2, NULL, 0, &rc);
46026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testOK &= assertIllegalArgument("Error when proLength < -1", &rc);
46036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test epiLength < -1 */
46046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    rc = U_ZERO_ERROR;
46056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setContext(pBiDi, NULL, 0, NULL, -2, &rc);
46066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testOK &= assertIllegalArgument("Error when epiLength < -1", &rc);
46076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test prologue == NULL */
46086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    rc = U_ZERO_ERROR;
46096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setContext(pBiDi, NULL, 3, NULL, 0, &rc);
46106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testOK &= assertIllegalArgument("Prologue is NULL", &rc);
46116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test epilogue == NULL */
46126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    rc = U_ZERO_ERROR;
46136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_setContext(pBiDi, NULL, 0, NULL, 4, &rc);
46146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testOK &= assertIllegalArgument("Epilogue is NULL", &rc);
46156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
46166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (tc = 0; tc < CONTEXT_COUNT; tc++) {
46176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cc = contextData[tc];
46186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        proLength = strlen(cc.prologue);
46196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pseudoToU16(proLength, cc.prologue, prologue);
46206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        epiLength = strlen(cc.epilogue);
46216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pseudoToU16(epiLength, cc.epilogue, epilogue);
46226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* in the call below, prologue and epilogue are swapped to show
46236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           that the next call will override this call */
46246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        rc = U_ZERO_ERROR;
46256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setContext(pBiDi, epilogue, epiLength, prologue, proLength, &rc);
46266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testOK &= assertSuccessful("swapped ubidi_setContext", &rc);
46276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setContext(pBiDi, prologue, -1, epilogue, -1, &rc);
46286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testOK &= assertSuccessful("regular ubidi_setContext", &rc);
46296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        srcLen = strlen(cc.source);
46306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pseudoToU16(srcLen, cc.source, src);
46316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubidi_setPara(pBiDi, src, srcLen, cc.paraLevel, NULL, &rc);
46326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testOK &= assertSuccessful("ubidi_setPara", &rc);
46336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destLen = ubidi_writeReordered(pBiDi, dest, MAXLEN, UBIDI_DO_MIRRORING, &rc);
46346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        assertSuccessful("ubidi_writeReordered", &rc);
46356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u16ToPseudo(destLen, dest, destChars);
46366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (uprv_strcmp(cc.expected, destChars)) {
46376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            char formatChars[MAXLEN];
46386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("\nActual and expected output mismatch on case %d.\n"
46396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %d\n%20s %u\n%20s %d\n",
46406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                tc,
46416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Prologue:", cc.prologue,
46426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Input:", cc.source,
46436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Epilogue:", cc.epilogue,
46446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Expected output:", cc.expected,
46456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Actual output:", destChars,
46466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Levels:", formatLevels(pBiDi, formatChars),
46476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Reordering mode:", ubidi_getReorderingMode(pBiDi),
46486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Paragraph level:", ubidi_getParaLevel(pBiDi),
46496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                "Reordering option:", ubidi_getReorderingOptions(pBiDi));
46506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testOK = FALSE;
46516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
46526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
46536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (testOK == TRUE) {
46546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("\nContext test OK\n");
46556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
46566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubidi_close(pBiDi);
46576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
46586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nExiting TestContext \n\n");
46596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4660d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org
4661d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org/* Ticket#11054 ubidi_setPara crash with heavily nested brackets */
4662d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.orgstatic void
4663d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.orgtestBracketOverflow(void) {
4664d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org    static const char* TEXT = "(((((((((((((((((((((((((((((((((((((((((a)(A)))))))))))))))))))))))))))))))))))))))))";
4665d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
4666d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org    UBiDi* bidi;
4667d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org    UChar src[100];
4668d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org    UChar dest[100];
4669d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org    int32_t len;
4670d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org
4671d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org    bidi = ubidi_open();
4672d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org    len = uprv_strlen(TEXT);
4673d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org    pseudoToU16(len, TEXT, src);
4674d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org    ubidi_setPara(bidi, src, len, UBIDI_DEFAULT_LTR , NULL, &status);
4675d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org    if (U_FAILURE(status)) {
4676d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org        log_err("setPara failed with heavily nested brackets - %s", u_errorName(status));
4677d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org    }
4678d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org
4679d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org    ubidi_close(bidi);
4680d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org}
4681d2abf6c1e1f986f4a8db0341b8a8c55c55ec1174jshin@chromium.org
4682