1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * Copyright (c) 1997-2014, International Business Machines Corporation and
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
659d709d503bab6e2b61931737e662dd293b40578ccornelius/*   file name:  cbiditst.c
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   encoding:   US-ASCII
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   tab size:   8 (not used)
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   indentation:4
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   created on: 1999sep27
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   created by: Markus W. Scherer, updated by Matitiahu Allouche
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ubidi.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ushape.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cbiditst.h"
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* the following include is needed for sprintf */
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h>
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define MAXLEN      MAX_STRING_LENGTH
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LENGTHOF(array) (sizeof(array)/sizeof((array)[0]))
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* prototypes ---------------------------------------------------------------*/
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addComplexTest(TestNode** root);
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testCharFromDirProp(void);
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testBidi(void);
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doTests(UBiDi *pBiDi, UBiDi *pLine, UBool countRunsFirst);
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doMisc(void);
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doTest(UBiDi *pBiDi, int testNumber, const BiDiTestData *test,
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   int32_t lineStart, UBool countRunsFirst);
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _testReordering(UBiDi *pBiDi, int testNumber);
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testInverse(void);
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _testManyInverseBidi(UBiDi *pBiDi, UBiDiLevel direction);
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _testInverseBidi(UBiDi *pBiDi, const UChar *src, int32_t srcLength,
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             UBiDiLevel direction, UErrorCode *pErrorCode);
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _testWriteReverse(void);
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _testManyAddedPoints(void);
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _testMisc(void);
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doArabicShapingTest(void);
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doLamAlefSpecialVLTRArabicShapingTest(void);
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doTashkeelSpecialVLTRArabicShapingTest(void);
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doLOGICALArabicDeShapingTest(void);
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doArabicShapingTestForBug5421(void);
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
6954dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void doArabicShapingTestForBug8703(void);
7054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
7154dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void doArabicShapingTestForBug9024(void);
7254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
7359d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void _testPresentationForms(const UChar *in);
7459d709d503bab6e2b61931737e662dd293b40578ccornelius
7559d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void doArabicShapingTestForNewCharacters(void);
7659d709d503bab6e2b61931737e662dd293b40578ccornelius
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testReorder(void);
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7954dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void testReorderArabicMathSymbols(void);
8054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testFailureRecovery(void);
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testMultipleParagraphs(void);
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
8527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void testGetBaseDirection(void);
8627f654740f2a26ad62a5c155af9199af9e69b889claireho
87b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void testContext(void);
88b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
89b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void doTailTest(void);
90b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* new BIDI API */
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testReorderingMode(void);
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testReorderRunsOnly(void);
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testStreaming(void);
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testClassOverride(void);
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* inverseBasic(UBiDi *pBiDi, const char *src, int32_t srcLen,
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                uint32_t option, UBiDiLevel level, char *result);
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool assertRoundTrip(UBiDi *pBiDi, int32_t tc, int32_t outIndex,
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char *srcChars, const char *destChars,
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const UChar *dest, int32_t destLen, int mode,
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             int option, UBiDiLevel level);
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool checkResultLength(UBiDi *pBiDi, const char *srcChars,
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               const char *destChars,
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               int32_t destLen, const char *mode,
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               const char *option, UBiDiLevel level);
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool checkMaps(UBiDi *pBiDi, int32_t stringIndex, const char *src,
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       const char *dest, const char *mode, const char* option,
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       UBiDiLevel level, UBool forward);
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* helpers ------------------------------------------------------------------ */
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char *levelString="...............................................................";
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void initCharFromDirProps(void);
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UChar *
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerugetStringFromDirProps(const uint8_t *dirProps, int32_t length, UChar *buffer);
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void printUnicode(const UChar *s, int32_t length, const UBiDiLevel *levels);
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* regression tests ---------------------------------------------------------*/
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruaddComplexTest(TestNode** root) {
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, testCharFromDirProp, "complex/bidi/TestCharFromDirProp");
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, testBidi, "complex/bidi/TestBidi");
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, testInverse, "complex/bidi/TestInverse");
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, testReorder,"complex/bidi/TestReorder");
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, testFailureRecovery,"complex/bidi/TestFailureRecovery");
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, testMultipleParagraphs,"complex/bidi/TestMultipleParagraphs");
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, testReorderingMode, "complex/bidi/TestReorderingMode");
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, testReorderRunsOnly, "complex/bidi/TestReorderRunsOnly");
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, testStreaming, "complex/bidi/TestStreaming");
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, testClassOverride, "complex/bidi/TestClassOverride");
135b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    addTest(root, testGetBaseDirection, "complex/bidi/testGetBaseDirection");
136b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    addTest(root, testContext, "complex/bidi/testContext");
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, doArabicShapingTest, "complex/arabic-shaping/ArabicShapingTest");
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, doLamAlefSpecialVLTRArabicShapingTest, "complex/arabic-shaping/lamalef");
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, doTashkeelSpecialVLTRArabicShapingTest, "complex/arabic-shaping/tashkeel");
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, doLOGICALArabicDeShapingTest, "complex/arabic-shaping/unshaping");
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, doArabicShapingTestForBug5421, "complex/arabic-shaping/bug-5421");
143b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    addTest(root, doTailTest, "complex/arabic-shaping/tailtest");
14454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    addTest(root, doArabicShapingTestForBug8703, "complex/arabic-shaping/bug-8703");
14554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    addTest(root, testReorderArabicMathSymbols, "complex/bidi/bug-9024");
14654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    addTest(root, doArabicShapingTestForBug9024, "complex/arabic-shaping/bug-9024");
14759d709d503bab6e2b61931737e662dd293b40578ccornelius    addTest(root, doArabicShapingTestForNewCharacters, "complex/arabic-shaping/shaping2");
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestCharFromDirProp(void) {
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* verify that the exemplar characters have the expected bidi classes */
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nEntering TestCharFromDirProp\n\n");
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    initCharFromDirProps();
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<U_CHAR_DIRECTION_COUNT; ++i) {
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(u_charDirection(charFromDirProp[i])!=(UCharDirection)i) {
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\nu_charDirection(charFromDirProp[%d]=U+%04x)==%d!=%d\n",
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    i, charFromDirProp[i], u_charDirection(charFromDirProp[i]), i);
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nExiting TestCharFromDirProp\n\n");
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestBidi(void) {
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDi *pBiDi, *pLine=NULL;
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nEntering TestBidi\n\n");
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pBiDi=ubidi_openSized(MAXLEN, 0, &errorCode);
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pBiDi!=NULL) {
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pLine=ubidi_open();
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(pLine!=NULL) {
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            doTests(pBiDi, pLine, FALSE);
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            doTests(pBiDi, pLine, TRUE);
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_open() returned NULL, out of memory\n");
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ubidi_openSized() returned NULL, errorCode %s\n", myErrorName(errorCode));
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doMisc();
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pLine!=NULL) {
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_close(pLine);
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pBiDi!=NULL) {
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_close(pBiDi);
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nExiting TestBidi\n\n");
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoTests(UBiDi *pBiDi, UBiDi *pLine, UBool countRunsFirst) {
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int testNumber;
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar string[MAXLEN];
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t lineStart;
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDiLevel paraLevel;
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(testNumber=0; testNumber<bidiTestCount; ++testNumber) {
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        getStringFromDirProps(tests[testNumber].text, tests[testNumber].length, string);
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        paraLevel=tests[testNumber].paraLevel;
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setPara(pBiDi, string, -1, paraLevel, NULL, &errorCode);
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_SUCCESS(errorCode)) {
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("ubidi_setPara(tests[%d], paraLevel %d) ok, direction %d paraLevel=%d\n",
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    testNumber, paraLevel, ubidi_getDirection(pBiDi), paraLevel);
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            lineStart=tests[testNumber].lineStart;
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(lineStart==-1) {
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                doTest(pBiDi, testNumber, tests+testNumber, 0, countRunsFirst);
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ubidi_setLine(pBiDi, lineStart, tests[testNumber].lineLimit, pLine, &errorCode);
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(U_SUCCESS(errorCode)) {
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_verbose("ubidi_setLine(%d, %d) ok, direction %d paraLevel=%d\n",
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            lineStart, tests[testNumber].lineLimit, ubidi_getDirection(pLine), ubidi_getParaLevel(pLine));
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    doTest(pLine, testNumber, tests+testNumber, lineStart, countRunsFirst);
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else {
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("ubidi_setLine(tests[%d], %d, %d) failed with errorCode %s\n",
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            testNumber, lineStart, tests[testNumber].lineLimit, myErrorName(errorCode));
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n",
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    testNumber, paraLevel, myErrorName(errorCode));
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char columns[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TABLE_SIZE  256
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool   tablesInitialized = FALSE;
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UChar   pseudoToUChar[TABLE_SIZE];
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic uint8_t UCharToPseudo[TABLE_SIZE];    /* used for Unicode chars < 0x0100 */
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic uint8_t UCharToPseud2[TABLE_SIZE];    /* used for Unicode chars >=0x0100 */
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void buildPseudoTables(void)
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    The rules for pseudo-Bidi are as follows:
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    - [ == LRE
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    - ] == RLE
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    - { == LRO
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    - } == RLO
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    - ^ == PDF
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    - @ == LRM
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    - & == RLM
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    - A-F == Arabic Letters 0631-0636
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    - G-V == Hebrew letters 05d7-05e6
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    - W-Z == Unassigned RTL 08d0-08d3
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    - 0-5 == western digits 0030-0035
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    - 6-9 == Arabic-Indic digits 0666-0669
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    - ` == Combining Grave Accent 0300 (NSM)
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    - ~ == Delete 007f (BN)
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    - | == Paragraph Separator 2029 (B)
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    - _ == Info Separator 1 001f (S)
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    All other characters represent themselves as Latin-1, with the corresponding
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Bidi properties.
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int             i;
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           uchar;
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t         c;
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* initialize all tables to unknown */
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i < TABLE_SIZE; i++) {
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pseudoToUChar[i] = 0xFFFD;
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCharToPseudo[i] = '?';
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCharToPseud2[i] = '?';
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* initialize non letters or digits */
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t) 0 ] = 0x0000;    UCharToPseudo[0x00] = (uint8_t) 0 ;
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)' '] = 0x0020;    UCharToPseudo[0x20] = (uint8_t)' ';
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'!'] = 0x0021;    UCharToPseudo[0x21] = (uint8_t)'!';
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'"'] = 0x0022;    UCharToPseudo[0x22] = (uint8_t)'"';
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'#'] = 0x0023;    UCharToPseudo[0x23] = (uint8_t)'#';
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'$'] = 0x0024;    UCharToPseudo[0x24] = (uint8_t)'$';
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'%'] = 0x0025;    UCharToPseudo[0x25] = (uint8_t)'%';
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'\'']= 0x0027;    UCharToPseudo[0x27] = (uint8_t)'\'';
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'('] = 0x0028;    UCharToPseudo[0x28] = (uint8_t)'(';
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)')'] = 0x0029;    UCharToPseudo[0x29] = (uint8_t)')';
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'*'] = 0x002A;    UCharToPseudo[0x2A] = (uint8_t)'*';
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'+'] = 0x002B;    UCharToPseudo[0x2B] = (uint8_t)'+';
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)','] = 0x002C;    UCharToPseudo[0x2C] = (uint8_t)',';
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'-'] = 0x002D;    UCharToPseudo[0x2D] = (uint8_t)'-';
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'.'] = 0x002E;    UCharToPseudo[0x2E] = (uint8_t)'.';
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'/'] = 0x002F;    UCharToPseudo[0x2F] = (uint8_t)'/';
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)':'] = 0x003A;    UCharToPseudo[0x3A] = (uint8_t)':';
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)';'] = 0x003B;    UCharToPseudo[0x3B] = (uint8_t)';';
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'<'] = 0x003C;    UCharToPseudo[0x3C] = (uint8_t)'<';
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'='] = 0x003D;    UCharToPseudo[0x3D] = (uint8_t)'=';
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'>'] = 0x003E;    UCharToPseudo[0x3E] = (uint8_t)'>';
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'?'] = 0x003F;    UCharToPseudo[0x3F] = (uint8_t)'?';
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'\\']= 0x005C;    UCharToPseudo[0x5C] = (uint8_t)'\\';
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* initialize specially used characters */
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'`'] = 0x0300;    UCharToPseud2[0x00] = (uint8_t)'`';  /* NSM */
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'@'] = 0x200E;    UCharToPseud2[0x0E] = (uint8_t)'@';  /* LRM */
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'&'] = 0x200F;    UCharToPseud2[0x0F] = (uint8_t)'&';  /* RLM */
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'_'] = 0x001F;    UCharToPseudo[0x1F] = (uint8_t)'_';  /* S   */
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'|'] = 0x2029;    UCharToPseud2[0x29] = (uint8_t)'|';  /* B   */
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'['] = 0x202A;    UCharToPseud2[0x2A] = (uint8_t)'[';  /* LRE */
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)']'] = 0x202B;    UCharToPseud2[0x2B] = (uint8_t)']';  /* RLE */
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'^'] = 0x202C;    UCharToPseud2[0x2C] = (uint8_t)'^';  /* PDF */
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'{'] = 0x202D;    UCharToPseud2[0x2D] = (uint8_t)'{';  /* LRO */
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'}'] = 0x202E;    UCharToPseud2[0x2E] = (uint8_t)'}';  /* RLO */
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToUChar[(uint8_t)'~'] = 0x007F;    UCharToPseudo[0x7F] = (uint8_t)'~';  /* BN  */
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* initialize western digits */
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0, uchar = 0x0030; i < 6; i++, uchar++) {
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c = (uint8_t)columns[i];
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pseudoToUChar[c] = uchar;
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCharToPseudo[uchar & 0x00ff] = c;
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* initialize Hindi digits */
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 6, uchar = 0x0666; i < 10; i++, uchar++) {
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c = (uint8_t)columns[i];
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pseudoToUChar[c] = uchar;
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCharToPseud2[uchar & 0x00ff] = c;
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* initialize Arabic letters */
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 10, uchar = 0x0631; i < 16; i++, uchar++) {
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c = (uint8_t)columns[i];
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pseudoToUChar[c] = uchar;
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCharToPseud2[uchar & 0x00ff] = c;
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* initialize Hebrew letters */
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 16, uchar = 0x05D7; i < 32; i++, uchar++) {
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c = (uint8_t)columns[i];
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pseudoToUChar[c] = uchar;
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCharToPseud2[uchar & 0x00ff] = c;
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* initialize Unassigned code points */
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 32, uchar=0x08D0; i < 36; i++, uchar++) {
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c = (uint8_t)columns[i];
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pseudoToUChar[c] = uchar;
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCharToPseud2[uchar & 0x00ff] = c;
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* initialize Latin lower case letters */
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 36, uchar = 0x0061; i < 62; i++, uchar++) {
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c = (uint8_t)columns[i];
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pseudoToUChar[c] = uchar;
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCharToPseudo[uchar & 0x00ff] = c;
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tablesInitialized = TRUE;
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*----------------------------------------------------------------------*/
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int pseudoToU16(const int length, const char * input, UChar * output)
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*  This function converts a pseudo-Bidi string into a UChar string.
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    It returns the length of the UChar string.
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int             i;
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!tablesInitialized) {
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buildPseudoTables();
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < length; i++)
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        output[i] = pseudoToUChar[(uint8_t)input[i]];
363b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    output[length] = 0;
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return length;
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*----------------------------------------------------------------------*/
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int u16ToPseudo(const int length, const UChar * input, char * output)
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*  This function converts a UChar string into a pseudo-Bidi string.
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    It returns the length of the pseudo-Bidi string.
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int             i;
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           uchar;
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!tablesInitialized) {
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buildPseudoTables();
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < length; i++)
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uchar = input[i];
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        output[i] = uchar < 0x0100 ? UCharToPseudo[uchar] :
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                        UCharToPseud2[uchar & 0x00ff];
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    output[length] = '\0';
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return length;
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char * formatLevels(UBiDi *bidi, char *buffer) {
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UBiDiLevel* gotLevels = ubidi_getLevels(bidi, &ec);
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int len = ubidi_getLength(bidi);
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char c;
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i, k;
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(ec)) {
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(buffer, "BAD LEVELS");
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return buffer;
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<len; i++) {
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        k = gotLevels[i];
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (k >= sizeof(columns))
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            c = '+';
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            c = columns[k];
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffer[i] = c;
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[len] = '\0';
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return buffer;
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char *reorderingModeNames[] = {
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UBIDI_REORDER_DEFAULT",
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UBIDI_REORDER_NUMBERS_SPECIAL",
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UBIDI_REORDER_GROUP_NUMBERS_WITH_R",
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UBIDI_REORDER_RUNS_ONLY",
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UBIDI_REORDER_INVERSE_NUMBERS_AS_L",
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UBIDI_REORDER_INVERSE_LIKE_DIRECT",
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL"};
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char *reorderingOptionNames(char *buffer, int options) {
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[0] = 0;
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (options & UBIDI_OPTION_INSERT_MARKS) {
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcat(buffer, " UBIDI_OPTION_INSERT_MARKS");
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (options & UBIDI_OPTION_REMOVE_CONTROLS) {
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcat(buffer, " UBIDI_OPTION_REMOVE_CONTROLS");
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (options & UBIDI_OPTION_STREAMING) {
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcat(buffer, " UBIDI_OPTION_STREAMING");
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return buffer;
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void printCaseInfo(UBiDi *bidi, const char *src, const char *dst)
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* src and dst are char arrays encoded as pseudo Bidi */
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Since calls to log_err with a \n within the pattern increment the
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * error count, new lines are issued via fputs, except when we want the
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * increment to happen.
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, length = ubidi_getProcessedLength(bidi);
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UBiDiLevel *levels;
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char levelChars[MAXLEN];
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDiLevel lev;
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t runCount;
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[100];
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("========================================"); fputs("\n", stderr);
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    levels = ubidi_getLevels(bidi, &errorCode);
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(levelChars, "BAD LEVELS");
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Processed length: %d", length); fputs("\n", stderr);
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < length; i++) {
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            lev = levels[i];
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (lev < sizeof(columns)) {
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                levelChars[i] = columns[lev];
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                levelChars[i] = '+';
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        levelChars[length] = 0;
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("Levels: %s", levelChars); fputs("\n", stderr);
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("Source: %s", src); fputs("\n", stderr);
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("Result: %s", dst); fputs("\n", stderr);
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("Direction: %d", ubidi_getDirection(bidi)); fputs("\n", stderr);
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("paraLevel: %d", ubidi_getParaLevel(bidi)); fputs("\n", stderr);
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = ubidi_getReorderingMode(bidi);
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("reorderingMode: %d = %s", i, reorderingModeNames[i]);
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fputs("\n", stderr);
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = ubidi_getReorderingOptions(bidi);
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("reorderingOptions: %d = %s", i, reorderingOptionNames(buffer, i));
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fputs("\n", stderr);
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    runCount = ubidi_countRuns(bidi, &errorCode);
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err( "BAD RUNS");
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Runs: %d => logicalStart.length/level: ", runCount);
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < runCount; i++) {
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UBiDiDirection dir;
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t start, len;
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dir = ubidi_getVisualRun(bidi, i, &start, &len);
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err(" %d.%d/%d", start, len, dir);
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fputs("\n", stderr);
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool matchingPair(UBiDi *bidi, int32_t i, char c1, char c2)
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* No test for []{} since they have special meaning for pseudo Bidi */
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static char mates1Chars[] = "<>()";
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static char mates2Chars[] = "><)(";
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDiLevel level;
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int k, len;
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c1 == c2) {
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return TRUE;
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* For UBIDI_REORDER_RUNS_ONLY, it would not be correct to check levels[i],
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       so we use the appropriate run's level, which is good for all cases.
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_getLogicalRun(bidi, i, NULL, &level);
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ((level & 1) == 0) {
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    len = strlen(mates1Chars);
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (k = 0; k < len; k++) {
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ((c1 == mates1Chars[k]) && (c2 == mates2Chars[k])) {
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return TRUE;
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return FALSE;
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool checkWhatYouCan(UBiDi *bidi, const char *srcChars, const char *dstChars)
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* srcChars and dstChars are char arrays encoded as pseudo Bidi */
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, idx, logLimit, visLimit;
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool testOK, errMap, errDst;
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t visMap[MAXLEN];
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t logMap[MAXLEN];
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char accumSrc[MAXLEN];
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char accumDst[MAXLEN];
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_getVisualMap(bidi, visMap, &errorCode);
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_getLogicalMap(bidi, logMap, &errorCode);
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error #1 invoking ICU within checkWhatYouCan\n");
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testOK = TRUE;
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errMap = errDst = FALSE;
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logLimit = ubidi_getProcessedLength(bidi);
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    visLimit = ubidi_getResultLength(bidi);
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(accumSrc, '?', logLimit);
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(accumDst, '?', visLimit);
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < logLimit; i++) {
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        idx = ubidi_getVisualIndex(bidi, i, &errorCode);
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (idx != logMap[i]) {
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errMap = TRUE;
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (idx == UBIDI_MAP_NOWHERE) {
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (idx >= visLimit) {
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        accumDst[idx] = srcChars[i];
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!matchingPair(bidi, i, srcChars[i], dstChars[idx])) {
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errDst = TRUE;
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    accumDst[visLimit] = 0;
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error #2 invoking ICU within checkWhatYouCan\n");
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (errMap) {
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testOK) {
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            printCaseInfo(bidi, srcChars, dstChars);
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testOK = FALSE;
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Mismatch between getLogicalMap() and getVisualIndex()\n");
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Map    :");
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < logLimit; i++) {
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err(" %d", logMap[i]);
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fputs("\n", stderr);
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Indexes:");
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < logLimit; i++) {
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err(" %d", ubidi_getVisualIndex(bidi, i, &errorCode));
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fputs("\n", stderr);
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (errDst) {
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testOK) {
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            printCaseInfo(bidi, srcChars, dstChars);
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testOK = FALSE;
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Source does not map to Result\n");
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("We got: %s", accumDst); fputs("\n", stderr);
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errMap = errDst = FALSE;
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < visLimit; i++) {
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        idx = ubidi_getLogicalIndex(bidi, i, &errorCode);
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (idx != visMap[i]) {
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errMap = TRUE;
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (idx == UBIDI_MAP_NOWHERE) {
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (idx >= logLimit) {
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        accumSrc[idx] = dstChars[i];
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!matchingPair(bidi, idx, srcChars[idx], dstChars[i])) {
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errDst = TRUE;
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    accumSrc[logLimit] = 0;
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error #3 invoking ICU within checkWhatYouCan\n");
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (errMap) {
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testOK) {
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            printCaseInfo(bidi, srcChars, dstChars);
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testOK = FALSE;
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Mismatch between getVisualMap() and getLogicalIndex()\n");
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Map    :");
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < visLimit; i++) {
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err(" %d", visMap[i]);
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fputs("\n", stderr);
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Indexes:");
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < visLimit; i++) {
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err(" %d", ubidi_getLogicalIndex(bidi, i, &errorCode));
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fputs("\n", stderr);
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (errDst) {
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (testOK) {
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            printCaseInfo(bidi, srcChars, dstChars);
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testOK = FALSE;
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Result does not map to Source\n");
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("We got: %s", accumSrc);
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fputs("\n", stderr);
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return testOK;
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestReorder(void) {
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* const logicalOrder[] ={
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "del(KC)add(K.C.&)",
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "del(QDVT) add(BVDL)",
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "del(PQ)add(R.S.)T)U.&",
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "del(LV)add(L.V.) L.V.&",
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "day  0  R  DPDHRVR dayabbr",
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "day  1  H  DPHPDHDA dayabbr",
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "day  2   L  DPBLENDA dayabbr",
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "day  3  J  DPJQVM  dayabbr",
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "day  4   I  DPIQNF    dayabbr",
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "day  5  M  DPMEG  dayabbr",
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "helloDPMEG",
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "hello WXYZ"
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* const visualOrder[]={
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "del(CK)add(&.C.K)",
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "del(TVDQ) add(LDVB)",
65859d709d503bab6e2b61931737e662dd293b40578ccornelius            "del(QP)add(S.R.)&.U(T",            /* updated for Unicode 6.3 matching brackets */
65959d709d503bab6e2b61931737e662dd293b40578ccornelius            "del(VL)add(V.L.) &.V.L",           /* updated for Unicode 6.3 matching brackets */
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "day  0  RVRHDPD  R dayabbr",
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "day  1  ADHDPHPD  H dayabbr",
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "day  2   ADNELBPD  L dayabbr",
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "day  3  MVQJPD  J  dayabbr",
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "day  4   FNQIPD  I    dayabbr",
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "day  5  GEMPD  M  dayabbr",
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "helloGEMPD",
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "hello ZYXW"
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* const visualOrder1[]={
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ")K.C.&(dda)KC(led",
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ")BVDL(dda )QDVT(led",
67259d709d503bab6e2b61931737e662dd293b40578ccornelius            "T(U.&).R.S(dda)PQ(led",            /* updated for Unicode 6.3 matching brackets */
67359d709d503bab6e2b61931737e662dd293b40578ccornelius            "L.V.& ).L.V(dda)LV(led",           /* updated for Unicode 6.3 matching brackets */
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "rbbayad R  DPDHRVR  0  yad",
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "rbbayad H  DPHPDHDA  1  yad",
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "rbbayad L  DPBLENDA   2  yad",
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "rbbayad  J  DPJQVM  3  yad",
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "rbbayad    I  DPIQNF   4  yad",
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "rbbayad  M  DPMEG  5  yad",
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "DPMEGolleh",
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "WXYZ olleh"
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* const visualOrder2[]={
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "@)@K.C.&@(dda)@KC@(led",
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "@)@BVDL@(dda )@QDVT@(led",
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "R.S.)T)U.&@(dda)@PQ@(led",
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "L.V.) L.V.&@(dda)@LV@(led",
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "rbbayad @R  DPDHRVR@  0  yad",
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "rbbayad @H  DPHPDHDA@  1  yad",
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "rbbayad @L  DPBLENDA@   2  yad",
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "rbbayad  @J  DPJQVM@  3  yad",
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "rbbayad    @I  DPIQNF@   4  yad",
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "rbbayad  @M  DPMEG@  5  yad",
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "DPMEGolleh",
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "WXYZ@ olleh"
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* const visualOrder3[]={
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ")K.C.&(KC)dda(led",
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ")BVDL(ddaQDVT) (led",
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "R.S.)T)U.&(PQ)dda(led",
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "L.V.) L.V.&(LV)dda(led",
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "rbbayad DPDHRVR   R  0 yad",
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "rbbayad DPHPDHDA   H  1 yad",
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "rbbayad DPBLENDA     L 2 yad",
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "rbbayad  DPJQVM   J  3 yad",
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "rbbayad    DPIQNF     I 4 yad",
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "rbbayad  DPMEG   M  5 yad",
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "DPMEGolleh",
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "WXYZ olleh"
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* const visualOrder4[]={
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "del(add(CK(.C.K)",
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "del( (TVDQadd(LDVB)",
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "del(add(QP(.U(T(.S.R",
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "del(add(VL(.V.L (.V.L",
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "day 0  R   RVRHDPD dayabbr",
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "day 1  H   ADHDPHPD dayabbr",
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "day 2 L     ADNELBPD dayabbr",
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "day 3  J   MVQJPD  dayabbr",
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "day 4 I     FNQIPD    dayabbr",
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "day 5  M   GEMPD  dayabbr",
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "helloGEMPD",
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "hello ZYXW"
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char formatChars[MAXLEN];
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDi* bidi = ubidi_open();
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nEntering TestReorder\n\n");
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;i<LENGTHOF(logicalOrder);i++){
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t srcSize = (int32_t)strlen(logicalOrder[i]);
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t destSize = srcSize*2;
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar src[MAXLEN];
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar dest[MAXLEN];
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char chars[MAXLEN];
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Testing L2V #1 for case %d\n", i);
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pseudoToU16(srcSize,logicalOrder[i],src);
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ec = U_ZERO_ERROR;
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR ,NULL,&ec);
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(ec)){
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n",
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    i, UBIDI_DEFAULT_LTR, u_errorName(ec));
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* try pre-flighting */
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_DO_MIRRORING,&ec);
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(ec!=U_BUFFER_OVERFLOW_ERROR){
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec));
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else if(destSize!=srcSize){
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Pre-flighting did not give expected size: Expected: %d. Got: %d \n",srcSize,destSize);
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else{
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ec= U_ZERO_ERROR;
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_DO_MIRRORING,&ec);
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u16ToPseudo(destSize,dest,chars);
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(destSize!=srcSize){
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_writeReordered() destSize and srcSize do not match\n");
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else if(strcmp(visualOrder[i],chars)!=0){
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_writeReordered() did not give expected results for UBIDI_DO_MIRRORING.\n"
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "Input   : %s\nExpected: %s\nGot     : %s\nLevels  : %s\nAt Index: %d\n",
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    logicalOrder[i],visualOrder[i],chars,formatLevels(bidi, formatChars),i);
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        checkWhatYouCan(bidi, logicalOrder[i], chars);
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;i<LENGTHOF(logicalOrder);i++){
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t srcSize = (int32_t)strlen(logicalOrder[i]);
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t destSize = srcSize*2;
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar src[MAXLEN];
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar dest[MAXLEN];
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char chars[MAXLEN];
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Testing L2V #2 for case %d\n", i);
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pseudoToU16(srcSize,logicalOrder[i],src);
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ec = U_ZERO_ERROR;
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR ,NULL,&ec);
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(ec)){
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n",
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    i, UBIDI_DEFAULT_LTR, u_errorName(ec));
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* try pre-flighting */
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_DO_MIRRORING+UBIDI_OUTPUT_REVERSE,&ec);
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(ec!=U_BUFFER_OVERFLOW_ERROR){
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec));
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else if(destSize!=srcSize){
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Pre-flighting did not give expected size: Expected: %d. Got: %d \n",srcSize,destSize);
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else{
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ec= U_ZERO_ERROR;
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_DO_MIRRORING+UBIDI_OUTPUT_REVERSE,&ec);
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u16ToPseudo(destSize,dest,chars);
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(destSize!=srcSize){
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_writeReordered() destSize and srcSize do not match\n");
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else if(strcmp(visualOrder1[i],chars)!=0){
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_writeReordered() did not give expected results for UBIDI_DO_MIRRORING+UBIDI_OUTPUT_REVERSE.\n"
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "Input   : %s\nExpected: %s\nGot     : %s\nLevels  : %s\nAt Index: %d\n",
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    logicalOrder[i],visualOrder1[i],chars,formatLevels(bidi, formatChars),i);
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;i<LENGTHOF(logicalOrder);i++){
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t srcSize = (int32_t)strlen(logicalOrder[i]);
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t destSize = srcSize*2;
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar src[MAXLEN];
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar dest[MAXLEN];
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char chars[MAXLEN];
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Testing V2L #3 for case %d\n", i);
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pseudoToU16(srcSize,logicalOrder[i],src);
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ec = U_ZERO_ERROR;
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setInverse(bidi,TRUE);
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR ,NULL,&ec);
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(ec)){
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n",
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    i, UBIDI_DEFAULT_LTR, u_errorName(ec));
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                /* try pre-flighting */
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_INSERT_LRM_FOR_NUMERIC+UBIDI_OUTPUT_REVERSE,&ec);
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(ec!=U_BUFFER_OVERFLOW_ERROR){
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec));
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else{
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ec= U_ZERO_ERROR;
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_INSERT_LRM_FOR_NUMERIC+UBIDI_OUTPUT_REVERSE,&ec);
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u16ToPseudo(destSize,dest,chars);
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strcmp(visualOrder2[i],chars)!=0){
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_writeReordered() did not give expected results for UBIDI_INSERT_LRM_FOR_NUMERIC+UBIDI_OUTPUT_REVERSE.\n"
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "Input   : %s\nExpected: %s\nGot     : %s\nLevels  : %s\nAt Index: %d\n",
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    logicalOrder[i],visualOrder2[i],chars,formatLevels(bidi, formatChars),i);
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Max Explicit level */
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;i<LENGTHOF(logicalOrder);i++){
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t srcSize = (int32_t)strlen(logicalOrder[i]);
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t destSize = srcSize*2;
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar src[MAXLEN];
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar dest[MAXLEN];
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char chars[MAXLEN];
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBiDiLevel levels[UBIDI_MAX_EXPLICIT_LEVEL]={1,2,3,4,5,6,7,8,9,10};
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Testing V2L #4 for case %d\n", i);
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pseudoToU16(srcSize,logicalOrder[i],src);
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ec = U_ZERO_ERROR;
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR,levels,&ec);
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(ec)){
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n",
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    i, UBIDI_MAX_EXPLICIT_LEVEL, u_errorName(ec));
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                /* try pre-flighting */
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_OUTPUT_REVERSE,&ec);
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(ec!=U_BUFFER_OVERFLOW_ERROR){
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec));
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else if(destSize!=srcSize){
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Pre-flighting did not give expected size: Expected: %d. Got: %d \n",srcSize,destSize);
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else{
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ec = U_ZERO_ERROR;
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_OUTPUT_REVERSE,&ec);
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u16ToPseudo(destSize,dest,chars);
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(destSize!=srcSize){
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_writeReordered() destSize and srcSize do not match. Dest Size = %d Source Size = %d\n",destSize,srcSize );
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else if(strcmp(visualOrder3[i],chars)!=0){
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_writeReordered() did not give expected results for UBIDI_OUTPUT_REVERSE.\n"
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "Input   : %s\nExpected: %s\nGot     : %s\nLevels  : %s\nAt Index: %d\n",
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    logicalOrder[i],visualOrder3[i],chars,formatLevels(bidi, formatChars),i);
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;i<LENGTHOF(logicalOrder);i++){
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t srcSize = (int32_t)strlen(logicalOrder[i]);
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t destSize = srcSize*2;
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar src[MAXLEN];
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar dest[MAXLEN];
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char chars[MAXLEN];
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBiDiLevel levels[UBIDI_MAX_EXPLICIT_LEVEL]={1,2,3,4,5,6,7,8,9,10};
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Testing V2L #5 for case %d\n", i);
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pseudoToU16(srcSize,logicalOrder[i],src);
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ec = U_ZERO_ERROR;
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setPara(bidi,src,srcSize,UBIDI_DEFAULT_LTR,levels,&ec);
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(ec)){
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n",
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    i, UBIDI_MAX_EXPLICIT_LEVEL, u_errorName(ec));
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* try pre-flighting */
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_DO_MIRRORING+UBIDI_REMOVE_BIDI_CONTROLS,&ec);
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(ec!=U_BUFFER_OVERFLOW_ERROR){
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec));
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else{
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ec= U_ZERO_ERROR;
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_DO_MIRRORING+UBIDI_REMOVE_BIDI_CONTROLS,&ec);
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u16ToPseudo(destSize,dest,chars);
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strcmp(visualOrder4[i],chars)!=0){
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_writeReordered() did not give expected results for UBIDI_DO_MIRRORING+UBIDI_REMOVE_BIDI_CONTROLS.\n"
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "Input   : %s\nExpected: %s\nGot     : %s\nLevels  : %s\nAt Index: %d\n",
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    logicalOrder[i],visualOrder4[i],chars,formatLevels(bidi, formatChars),i);
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(bidi);
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nExiting TestReorder\n\n");
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
90354dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliustestReorderArabicMathSymbols(void) {
90454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    static const UChar logicalOrder[][MAXLEN]={
90554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        /* Arabic mathematical Symbols 0x1EE00 - 0x1EE1B */
90659d709d503bab6e2b61931737e662dd293b40578ccornelius        {0xD83B, 0xDE00, 0xD83B, 0xDE01, 0xD83B, 0xDE02, 0xD83B, 0xDE03, 0x20,
90759d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE24, 0xD83B, 0xDE05, 0xD83B, 0xDE06, 0x20,
90859d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE07, 0xD83B, 0xDE08, 0xD83B, 0xDE09, 0x20,
90959d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE0A, 0xD83B, 0xDE0B, 0xD83B, 0xDE0C, 0xD83B, 0xDE0D, 0x20,
91059d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE0E, 0xD83B, 0xDE0F, 0xD83B, 0xDE10, 0xD83B, 0xDE11, 0x20,
91159d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE12, 0xD83B, 0xDE13, 0xD83B, 0xDE14, 0xD83B, 0xDE15, 0x20,
91259d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE16, 0xD83B, 0xDE17, 0xD83B, 0xDE18, 0x20,
91354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE19, 0xD83B, 0xDE1A, 0xD83B, 0xDE1B},
91454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        /* Arabic mathematical Symbols - Looped Symbols, 0x1EE80 - 0x1EE9B */
91559d709d503bab6e2b61931737e662dd293b40578ccornelius        {0xD83B, 0xDE80, 0xD83B, 0xDE81, 0xD83B, 0xDE82, 0xD83B, 0xDE83, 0x20,
91659d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE84, 0xD83B, 0xDE85, 0xD83B, 0xDE86, 0x20,
91759d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE87, 0xD83B, 0xDE88, 0xD83B, 0xDE89, 0x20,
91859d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE8B, 0xD83B, 0xDE8C, 0xD83B, 0xDE8D, 0x20,
91959d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE8E, 0xD83B, 0xDE8F, 0xD83B, 0xDE90, 0xD83B, 0xDE91, 0x20,
92059d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE92, 0xD83B, 0xDE93, 0xD83B, 0xDE94, 0xD83B, 0xDE95, 0x20,
92159d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE96, 0xD83B, 0xDE97, 0xD83B, 0xDE98, 0x20,
92254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE99, 0xD83B, 0xDE9A, 0xD83B, 0xDE9B},
92354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        /* Arabic mathematical Symbols - Double-struck Symbols, 0x1EEA1 - 0x1EEBB */
92459d709d503bab6e2b61931737e662dd293b40578ccornelius        {0xD83B, 0xDEA1, 0xD83B, 0xDEA2, 0xD83B, 0xDEA3, 0x20,
92559d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDEA5, 0xD83B, 0xDEA6, 0x20,
92659d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDEA7, 0xD83B, 0xDEA8, 0xD83B, 0xDEA9, 0x20,
92759d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDEAB, 0xD83B, 0xDEAC, 0xD83B, 0xDEAD, 0x20,
92859d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDEAE, 0xD83B, 0xDEAF, 0xD83B, 0xDEB0, 0xD83B, 0xDEB1, 0x20,
92959d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDEB2, 0xD83B, 0xDEB3, 0xD83B, 0xDEB4, 0xD83B, 0xDEB5, 0x20,
93059d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDEB6, 0xD83B, 0xDEB7, 0xD83B, 0xDEB8, 0x20,
93154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDEB9, 0xD83B, 0xDEBA, 0xD83B, 0xDEBB},
93254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        /* Arabic mathematical Symbols - Initial Symbols, 0x1EE21 - 0x1EE3B */
93359d709d503bab6e2b61931737e662dd293b40578ccornelius        {0xD83B, 0xDE21, 0xD83B, 0xDE22, 0x20,
93459d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE27, 0xD83B, 0xDE29, 0x20,
93559d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE2A, 0xD83B, 0xDE2B, 0xD83B, 0xDE2C, 0xD83B, 0xDE2D, 0x20,
93659d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE2E, 0xD83B, 0xDE2F, 0xD83B, 0xDE30, 0xD83B, 0xDE31, 0x20,
93759d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE32, 0xD83B, 0xDE34, 0xD83B, 0xDE35, 0x20,
93859d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE36, 0xD83B, 0xDE37, 0x20,
93954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE39, 0xD83B, 0xDE3B},
94054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        /* Arabic mathematical Symbols - Tailed Symbols */
94159d709d503bab6e2b61931737e662dd293b40578ccornelius        {0xD83B, 0xDE42, 0xD83B, 0xDE47, 0xD83B, 0xDE49, 0xD83B, 0xDE4B, 0x20,
94259d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE4D, 0xD83B, 0xDE4E, 0xD83B, 0xDE4F, 0x20,
94359d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE51, 0xD83B, 0xDE52, 0xD83B, 0xDE54, 0xD83B, 0xDE57, 0x20,
94454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE59, 0xD83B, 0xDE5B, 0xD83B, 0xDE5D, 0xD83B, 0xDE5F}
94554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    };
94654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    static const UChar visualOrder[][MAXLEN]={
94754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        /* Arabic mathematical Symbols 0x1EE00 - 0x1EE1B */
94859d709d503bab6e2b61931737e662dd293b40578ccornelius        {0xD83B, 0xDE1B, 0xD83B, 0xDE1A, 0xD83B, 0xDE19, 0x20,
94959d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE18, 0xD83B, 0xDE17, 0xD83B, 0xDE16, 0x20,
95054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE15, 0xD83B, 0xDE14, 0xD83B, 0xDE13, 0xD83B, 0xDE12, 0x20,
95154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE11, 0xD83B, 0xDE10, 0xD83B, 0xDE0F, 0xD83B, 0xDE0E, 0x20,
95254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE0D, 0xD83B, 0xDE0C, 0xD83B, 0xDE0B, 0xD83B, 0xDE0A, 0x20,
95359d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE09, 0xD83B, 0xDE08, 0xD83B, 0xDE07, 0x20,
95459d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE06, 0xD83B, 0xDE05, 0xD83B, 0xDE24, 0x20,
95554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE03, 0xD83B, 0xDE02, 0xD83B, 0xDE01, 0xD83B, 0xDE00},
95654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        /* Arabic mathematical Symbols - Looped Symbols, 0x1EE80 - 0x1EE9B */
95759d709d503bab6e2b61931737e662dd293b40578ccornelius        {0xD83B, 0xDE9B, 0xD83B, 0xDE9A, 0xD83B, 0xDE99, 0x20,
95859d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE98, 0xD83B, 0xDE97, 0xD83B, 0xDE96, 0x20,
95954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE95, 0xD83B, 0xDE94, 0xD83B, 0xDE93, 0xD83B, 0xDE92, 0x20,
96054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE91, 0xD83B, 0xDE90, 0xD83B, 0xDE8F, 0xD83B, 0xDE8E, 0x20,
96159d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE8D, 0xD83B, 0xDE8C, 0xD83B, 0xDE8B, 0x20,
96259d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE89, 0xD83B, 0xDE88, 0xD83B, 0xDE87, 0x20,
96359d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE86, 0xD83B, 0xDE85, 0xD83B, 0xDE84, 0x20,
96454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE83, 0xD83B, 0xDE82, 0xD83B, 0xDE81, 0xD83B, 0xDE80},
96554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        /* Arabic mathematical Symbols - Double-struck Symbols, 0x1EEA1 - 0x1EEBB */
96659d709d503bab6e2b61931737e662dd293b40578ccornelius        {0xD83B, 0xDEBB, 0xD83B, 0xDEBA, 0xD83B, 0xDEB9, 0x20,
96759d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDEB8, 0xD83B, 0xDEB7, 0xD83B, 0xDEB6, 0x20,
96854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDEB5, 0xD83B, 0xDEB4, 0xD83B, 0xDEB3, 0xD83B, 0xDEB2, 0x20,
96954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDEB1, 0xD83B, 0xDEB0, 0xD83B, 0xDEAF, 0xD83B, 0xDEAE, 0x20,
97059d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDEAD, 0xD83B, 0xDEAC, 0xD83B, 0xDEAB, 0x20,
97159d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDEA9, 0xD83B, 0xDEA8, 0xD83B, 0xDEA7, 0x20,
97259d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDEA6, 0xD83B, 0xDEA5, 0x20,
97354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDEA3, 0xD83B, 0xDEA2, 0xD83B, 0xDEA1},
97454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        /* Arabic mathematical Symbols - Initial Symbols, 0x1EE21 - 0x1EE3B */
97559d709d503bab6e2b61931737e662dd293b40578ccornelius        {0xD83B, 0xDE3B, 0xD83B, 0xDE39, 0x20,
97659d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE37, 0xD83B, 0xDE36, 0x20,
97759d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE35, 0xD83B, 0xDE34, 0xD83B, 0xDE32, 0x20,
97854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE31, 0xD83B, 0xDE30, 0xD83B, 0xDE2F, 0xD83B, 0xDE2E, 0x20,
97954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE2D, 0xD83B, 0xDE2C, 0xD83B, 0xDE2B, 0xD83B, 0xDE2A, 0x20,
98059d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE29, 0xD83B, 0xDE27, 0x20,
98154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE22, 0xD83B, 0xDE21},
98254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        /* Arabic mathematical Symbols - Tailed Symbols */
98354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        {0xD83B, 0xDE5F, 0xD83B, 0xDE5D, 0xD83B, 0xDE5B, 0xD83B, 0xDE59, 0x20,
98454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE57, 0xD83B, 0xDE54, 0xD83B, 0xDE52, 0xD83B, 0xDE51, 0x20,
98559d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE4F, 0xD83B, 0xDE4E, 0xD83B, 0xDE4D, 0x20,
98654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE4B, 0xD83B, 0xDE49, 0xD83B, 0xDE47, 0xD83B, 0xDE42}
98754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    };
98854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    char formatChars[MAXLEN];
98954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UErrorCode ec = U_ZERO_ERROR;
99054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UBiDi* bidi = ubidi_open();
99154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    int i;
99254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
99354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    log_verbose("\nEntering TestReorderArabicMathSymbols\n\n");
99454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
99554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    for(i=0;i<LENGTHOF(logicalOrder);i++){
99654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        int32_t srcSize = u_strlen(logicalOrder[i]);
99754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        int32_t destSize = srcSize*2;
99854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UChar dest[MAXLEN];
99954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_verbose("Testing L2V #1 for case %d\n", i);
100054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        ec = U_ZERO_ERROR;
100154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        ubidi_setPara(bidi,logicalOrder[i],srcSize,UBIDI_DEFAULT_LTR ,NULL,&ec);
100254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        if(U_FAILURE(ec)){
100354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            log_err("ubidi_setPara(tests[%d], paraLevel %d) failed with errorCode %s\n",
100454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                    i, UBIDI_DEFAULT_LTR, u_errorName(ec));
100554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
100654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        /* try pre-flighting */
100754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        destSize = ubidi_writeReordered(bidi,dest,0,UBIDI_DO_MIRRORING,&ec);
100854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        if(ec!=U_BUFFER_OVERFLOW_ERROR){
100954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            log_err("Pre-flighting did not give expected error: Expected: U_BUFFER_OVERFLOW_ERROR. Got: %s \n",u_errorName(ec));
101054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }else if(destSize!=srcSize){
101154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            log_err("Pre-flighting did not give expected size: Expected: %d. Got: %d \n",srcSize,destSize);
101254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }else{
101354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            ec= U_ZERO_ERROR;
101454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
101554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        destSize=ubidi_writeReordered(bidi,dest,destSize+1,UBIDI_DO_MIRRORING,&ec);
101654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        if(destSize!=srcSize){
101754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            log_err("ubidi_writeReordered() destSize and srcSize do not match\n");
101854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }else if(memcmp(dest, visualOrder[i], destSize*U_SIZEOF_UCHAR)!=0){
101954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            log_err("ubidi_writeReordered() did not give expected results for UBIDI_DO_MIRRORING.\n"
102054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                    "Input   : %s\nExpected: %s\nGot     : %s\nLevels  : %s\nAt Index: %d\n",
102154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                    logicalOrder[i],visualOrder[i],dest,formatLevels(bidi, formatChars),i);
102254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
102354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
102454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
102554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ubidi_close(bidi);
102654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
102754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    log_verbose("\nExiting TestReorderArabicMathSymbols\n\n");
102854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
102954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
103054dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoTest(UBiDi *pBiDi, int testNumber, const BiDiTestData *test, int32_t lineStart, UBool countRunsFirst) {
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const uint8_t *dirProps=test->text+lineStart;
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UBiDiLevel *levels=test->levels;
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const uint8_t *visualMap=test->visualMap;
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, len=ubidi_getLength(pBiDi), logicalIndex, runCount = 0;
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDiLevel level, level2;
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (countRunsFirst) {
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Calling ubidi_countRuns() first.\n");
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        runCount = ubidi_countRuns(pBiDi, &errorCode);
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(errorCode)) {
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_countRuns(tests[%d]): error %s\n", testNumber, myErrorName(errorCode));
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Calling ubidi_getLogicalMap() first.\n");
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testReordering(pBiDi, testNumber);
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<len; ++i) {
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("%3d %3d %.*s%-3s @%d\n",
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                i, ubidi_getLevelAt(pBiDi, i), ubidi_getLevelAt(pBiDi, i), levelString,
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                dirPropNames[dirProps[i]],
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ubidi_getVisualIndex(pBiDi, i, &errorCode));
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n-----levels:");
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<len; ++i) {
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(i>0) {
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose(",");
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose(" %d", ubidi_getLevelAt(pBiDi, i));
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n--reordered:");
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<len; ++i) {
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(i>0) {
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose(",");
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose(" %d", ubidi_getVisualIndex(pBiDi, i, &errorCode));
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n");
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(test->direction!=ubidi_getDirection(pBiDi)) {
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ubidi_getDirection(tests[%d]): wrong direction %d\n", testNumber, ubidi_getDirection(pBiDi));
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(test->resultLevel!=ubidi_getParaLevel(pBiDi)) {
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ubidi_getParaLevel(tests[%d]): wrong paragraph level %d\n", testNumber, ubidi_getParaLevel(pBiDi));
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<len; ++i) {
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(levels[i]!=ubidi_getLevelAt(pBiDi, i)) {
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_getLevelAt(tests[%d], %d): wrong level %d, expected %d\n", testNumber, i, ubidi_getLevelAt(pBiDi, i), levels[i]);
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<len; ++i) {
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logicalIndex=ubidi_getVisualIndex(pBiDi, i, &errorCode);
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(errorCode)) {
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_getVisualIndex(tests[%d], %d): error %s\n", testNumber, i, myErrorName(errorCode));
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(visualMap[i]!=logicalIndex) {
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_getVisualIndex(tests[%d], %d): wrong index %d\n", testNumber, i, logicalIndex);
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (! countRunsFirst) {
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        runCount=ubidi_countRuns(pBiDi, &errorCode);
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(errorCode)) {
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_countRuns(tests[%d]): error %s\n", testNumber, myErrorName(errorCode));
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(logicalIndex=0; logicalIndex<len;) {
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        level=ubidi_getLevelAt(pBiDi, logicalIndex);
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_getLogicalRun(pBiDi, logicalIndex, &logicalIndex, &level2);
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(level!=level2) {
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_getLogicalRun(tests[%d], run ending at index %d): "
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "wrong level %d instead of %d\n",
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    testNumber, logicalIndex, level, level2);
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(--runCount<0) {
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\nubidi_getLogicalRun(tests[%d]): wrong number of runs "
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "compared to %d=ubidi_countRuns()\n",
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    testNumber, ubidi_countRuns(pBiDi, &errorCode));
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(runCount!=0) {
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nubidi_getLogicalRun(tests[%d]): wrong number of runs "
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "compared to %d=ubidi_getRunCount()\n",
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                testNumber, ubidi_countRuns(pBiDi, &errorCode));
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n\n");
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_testReordering(UBiDi *pBiDi, int testNumber) {
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logicalMap1[MAXLEN], logicalMap2[MAXLEN], logicalMap3[MAXLEN],
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        visualMap1[MAXLEN], visualMap2[MAXLEN], visualMap3[MAXLEN], visualMap4[MAXLEN];
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UBiDiLevel *levels;
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, length=ubidi_getLength(pBiDi),
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               destLength=ubidi_getResultLength(pBiDi);
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t runCount, visualIndex, logicalStart, runLength;
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool odd;
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(length<=0) {
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* get the logical and visual maps from the object */
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_getLogicalMap(pBiDi, logicalMap1, &errorCode);
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ubidi_getLogicalMap(tests[%d]): error %s\n", testNumber, myErrorName(errorCode));
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_getVisualMap(pBiDi, visualMap1, &errorCode);
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ubidi_getVisualMap(tests[%d]): error %s\n", testNumber, myErrorName(errorCode));
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* invert them both */
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_invertMap(logicalMap1, visualMap2, length);
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_invertMap(visualMap1, logicalMap2, destLength);
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* get them from the levels array, too */
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    levels=ubidi_getLevels(pBiDi, &errorCode);
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ubidi_getLevels(tests[%d]): error %s\n", testNumber, myErrorName(errorCode));
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_reorderLogical(levels, length, logicalMap3);
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_reorderVisual(levels, length, visualMap3);
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* get the visual map from the runs, too */
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    runCount=ubidi_countRuns(pBiDi, &errorCode);
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ubidi_countRuns(tests[%d]): error %s\n", testNumber, myErrorName(errorCode));
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n----%2d runs:", runCount);
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    visualIndex=0;
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<runCount; ++i) {
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        odd=(UBool)ubidi_getVisualRun(pBiDi, i, &logicalStart, &runLength);
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose(" (%c @%d[%d])", odd ? 'R' : 'L', logicalStart, runLength);
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(UBIDI_LTR==odd) {
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            do { /* LTR */
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                visualMap4[visualIndex++]=logicalStart++;
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } while(--runLength>0);
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logicalStart+=runLength;   /* logicalLimit */
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            do { /* RTL */
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                visualMap4[visualIndex++]=--logicalStart;
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } while(--runLength>0);
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n");
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* print all the maps */
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("logical maps:\n");
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<length; ++i) {
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("%4d", logicalMap1[i]);
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n");
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<length; ++i) {
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("%4d", logicalMap2[i]);
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n");
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<length; ++i) {
1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("%4d", logicalMap3[i]);
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nvisual maps:\n");
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<destLength; ++i) {
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("%4d", visualMap1[i]);
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n");
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<destLength; ++i) {
1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("%4d", visualMap2[i]);
1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n");
1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<length; ++i) {
1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("%4d", visualMap3[i]);
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n");
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<length; ++i) {
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("%4d", visualMap4[i]);
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n");
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* check that the indexes are the same between these and ubidi_getLogical/VisualIndex() */
1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<length; ++i) {
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(logicalMap1[i]!=logicalMap2[i]) {
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("bidi reordering error in tests[%d]: logicalMap1[i]!=logicalMap2[i] at i=%d\n", testNumber, i);
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(logicalMap1[i]!=logicalMap3[i]) {
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("bidi reordering error in tests[%d]: logicalMap1[i]!=logicalMap3[i] at i=%d\n", testNumber, i);
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(visualMap1[i]!=visualMap2[i]) {
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("bidi reordering error in tests[%d]: visualMap1[i]!=visualMap2[i] at i=%d\n", testNumber, i);
1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(visualMap1[i]!=visualMap3[i]) {
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("bidi reordering error in tests[%d]: visualMap1[i]!=visualMap3[i] at i=%d\n", testNumber, i);
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(visualMap1[i]!=visualMap4[i]) {
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("bidi reordering error in tests[%d]: visualMap1[i]!=visualMap4[i] at i=%d\n", testNumber, i);
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(logicalMap1[i]!=ubidi_getVisualIndex(pBiDi, i, &errorCode)) {
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("bidi reordering error in tests[%d]: logicalMap1[i]!=ubidi_getVisualIndex(i) at i=%d\n", testNumber, i);
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(errorCode)) {
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_getVisualIndex(tests[%d], %d): error %s\n", testNumber, i, myErrorName(errorCode));
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(visualMap1[i]!=ubidi_getLogicalIndex(pBiDi, i, &errorCode)) {
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("bidi reordering error in tests[%d]: visualMap1[i]!=ubidi_getLogicalIndex(i) at i=%d\n", testNumber, i);
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(errorCode)) {
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ubidi_getLogicalIndex(tests[%d], %d): error %s\n", testNumber, i, myErrorName(errorCode));
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define RETURN_IF_BAD_ERRCODE(x)    \
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {      \
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nbad errorCode %d at %s\n", errorCode, (x));  \
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;     \
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }               \
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
128727f654740f2a26ad62a5c155af9199af9e69b889claireho#define STRING_TEST_CASE(s) { (s), LENGTHOF(s) }
128827f654740f2a26ad62a5c155af9199af9e69b889claireho
128927f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void testGetBaseDirection(void) {
129027f654740f2a26ad62a5c155af9199af9e69b889claireho    UBiDiDirection dir;
129127f654740f2a26ad62a5c155af9199af9e69b889claireho    int i;
129227f654740f2a26ad62a5c155af9199af9e69b889claireho
129327f654740f2a26ad62a5c155af9199af9e69b889claireho/* Test Data */
129427f654740f2a26ad62a5c155af9199af9e69b889claireho    static const UChar
129527f654740f2a26ad62a5c155af9199af9e69b889claireho/*Mixed Start with L*/
129627f654740f2a26ad62a5c155af9199af9e69b889claireho    stringMixedEnglishFirst[]={ 0x61, 0x627, 0x32, 0x6f3, 0x61, 0x34, 0 },
129727f654740f2a26ad62a5c155af9199af9e69b889claireho/*Mixed Start with AL*/
129827f654740f2a26ad62a5c155af9199af9e69b889claireho    stringMixedArabicFirst[]={ 0x661, 0x627, 0x662, 0x6f3, 0x61, 0x664, 0 },
129927f654740f2a26ad62a5c155af9199af9e69b889claireho/*Mixed Start with R*/
130027f654740f2a26ad62a5c155af9199af9e69b889claireho    stringMixedHebrewFirst[]={ 0x05EA, 0x627, 0x662, 0x6f3, 0x61, 0x664, 0 },
130127f654740f2a26ad62a5c155af9199af9e69b889claireho/*All AL (Arabic. Persian)*/
130227f654740f2a26ad62a5c155af9199af9e69b889claireho    stringPersian[]={0x0698, 0x067E, 0x0686, 0x06AF, 0},
130327f654740f2a26ad62a5c155af9199af9e69b889claireho/*All R (Hebrew etc.)*/
130427f654740f2a26ad62a5c155af9199af9e69b889claireho    stringHebrew[]={0x0590, 0x05D5, 0x05EA, 0x05F1, 0},
130527f654740f2a26ad62a5c155af9199af9e69b889claireho/*All L (English)*/
130627f654740f2a26ad62a5c155af9199af9e69b889claireho    stringEnglish[]={0x71, 0x61, 0x66, 0},
130727f654740f2a26ad62a5c155af9199af9e69b889claireho/*Mixed Start with weak AL an then L*/
130827f654740f2a26ad62a5c155af9199af9e69b889claireho    stringStartWeakAL[]={ 0x0663, 0x71, 0x61, 0x66, 0},
130927f654740f2a26ad62a5c155af9199af9e69b889claireho/*Mixed Start with weak L and then AL*/
131027f654740f2a26ad62a5c155af9199af9e69b889claireho    stringStartWeakL[]={0x31, 0x0698, 0x067E, 0x0686, 0x06AF, 0},
131127f654740f2a26ad62a5c155af9199af9e69b889claireho/*Empty*/
131227f654740f2a26ad62a5c155af9199af9e69b889claireho    stringEmpty[]={0},
131327f654740f2a26ad62a5c155af9199af9e69b889claireho/*Surrogate Char.*/
131427f654740f2a26ad62a5c155af9199af9e69b889claireho    stringSurrogateChar[]={0xD800, 0xDC00, 0},
131527f654740f2a26ad62a5c155af9199af9e69b889claireho/*Invalid UChar*/
131627f654740f2a26ad62a5c155af9199af9e69b889claireho    stringInvalidUchar[]={-1},
131727f654740f2a26ad62a5c155af9199af9e69b889claireho/*All weak L (English Digits)*/
131827f654740f2a26ad62a5c155af9199af9e69b889claireho    stringAllEnglishDigits[]={0x31, 0x32, 0x33, 0},
131927f654740f2a26ad62a5c155af9199af9e69b889claireho/*All weak AL (Arabic Digits)*/
132027f654740f2a26ad62a5c155af9199af9e69b889claireho    stringAllArabicDigits[]={0x0663, 0x0664, 0x0665, 0},
132127f654740f2a26ad62a5c155af9199af9e69b889claireho/*First L (English) others are R (Hebrew etc.) */
132227f654740f2a26ad62a5c155af9199af9e69b889claireho    stringFirstL[] = {0x71, 0x0590, 0x05D5, 0x05EA, 0x05F1, 0},
132327f654740f2a26ad62a5c155af9199af9e69b889claireho/*Last R (Hebrew etc.) others are weak L (English Digits)*/
132427f654740f2a26ad62a5c155af9199af9e69b889claireho    stringLastR[] = {0x31, 0x32, 0x33, 0x05F1, 0};
132527f654740f2a26ad62a5c155af9199af9e69b889claireho
132627f654740f2a26ad62a5c155af9199af9e69b889claireho    static const struct {
132727f654740f2a26ad62a5c155af9199af9e69b889claireho        const UChar *s;
132827f654740f2a26ad62a5c155af9199af9e69b889claireho        int32_t length;
132927f654740f2a26ad62a5c155af9199af9e69b889claireho    } testCases[]={
133027f654740f2a26ad62a5c155af9199af9e69b889claireho        STRING_TEST_CASE(stringMixedEnglishFirst),
133127f654740f2a26ad62a5c155af9199af9e69b889claireho        STRING_TEST_CASE(stringMixedArabicFirst),
133227f654740f2a26ad62a5c155af9199af9e69b889claireho        STRING_TEST_CASE(stringMixedHebrewFirst),
133327f654740f2a26ad62a5c155af9199af9e69b889claireho        STRING_TEST_CASE(stringPersian),
133427f654740f2a26ad62a5c155af9199af9e69b889claireho        STRING_TEST_CASE(stringHebrew),
133527f654740f2a26ad62a5c155af9199af9e69b889claireho        STRING_TEST_CASE(stringEnglish),
133627f654740f2a26ad62a5c155af9199af9e69b889claireho        STRING_TEST_CASE(stringStartWeakAL),
133727f654740f2a26ad62a5c155af9199af9e69b889claireho        STRING_TEST_CASE(stringStartWeakL),
133827f654740f2a26ad62a5c155af9199af9e69b889claireho        STRING_TEST_CASE(stringEmpty),
133927f654740f2a26ad62a5c155af9199af9e69b889claireho        STRING_TEST_CASE(stringSurrogateChar),
134027f654740f2a26ad62a5c155af9199af9e69b889claireho        STRING_TEST_CASE(stringInvalidUchar),
134127f654740f2a26ad62a5c155af9199af9e69b889claireho        STRING_TEST_CASE(stringAllEnglishDigits),
134227f654740f2a26ad62a5c155af9199af9e69b889claireho        STRING_TEST_CASE(stringAllArabicDigits),
134327f654740f2a26ad62a5c155af9199af9e69b889claireho        STRING_TEST_CASE(stringFirstL),
134427f654740f2a26ad62a5c155af9199af9e69b889claireho        STRING_TEST_CASE(stringLastR),
134527f654740f2a26ad62a5c155af9199af9e69b889claireho    };
134627f654740f2a26ad62a5c155af9199af9e69b889claireho
134727f654740f2a26ad62a5c155af9199af9e69b889claireho/* Expected results */
134827f654740f2a26ad62a5c155af9199af9e69b889claireho    static const UBiDiDirection expectedDir[] ={
134927f654740f2a26ad62a5c155af9199af9e69b889claireho        UBIDI_LTR, UBIDI_RTL, UBIDI_RTL,
135027f654740f2a26ad62a5c155af9199af9e69b889claireho        UBIDI_RTL, UBIDI_RTL, UBIDI_LTR,
135127f654740f2a26ad62a5c155af9199af9e69b889claireho        UBIDI_LTR, UBIDI_RTL, UBIDI_NEUTRAL,
135227f654740f2a26ad62a5c155af9199af9e69b889claireho        UBIDI_LTR, UBIDI_NEUTRAL, UBIDI_NEUTRAL,
135327f654740f2a26ad62a5c155af9199af9e69b889claireho        UBIDI_NEUTRAL, UBIDI_LTR, UBIDI_RTL
135427f654740f2a26ad62a5c155af9199af9e69b889claireho    };
135527f654740f2a26ad62a5c155af9199af9e69b889claireho
135627f654740f2a26ad62a5c155af9199af9e69b889claireho    log_verbose("testGetBaseDirection() with %u test cases ---\n",
135727f654740f2a26ad62a5c155af9199af9e69b889claireho    LENGTHOF(testCases));
135827f654740f2a26ad62a5c155af9199af9e69b889claireho/* Run Tests */
135927f654740f2a26ad62a5c155af9199af9e69b889claireho     for(i=0; i<LENGTHOF(testCases); ++i) {
136027f654740f2a26ad62a5c155af9199af9e69b889claireho        dir = ubidi_getBaseDirection(testCases[i].s, testCases[i].length );
136127f654740f2a26ad62a5c155af9199af9e69b889claireho        log_verbose("Testing case %d\tReceived dir %d\n", i, dir);
1362b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (dir != expectedDir[i])
1363b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("\nFailed getBaseDirection case %d Expected  %d \tReceived %d\n",
136427f654740f2a26ad62a5c155af9199af9e69b889claireho            i, expectedDir[i], dir);
136527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
136627f654740f2a26ad62a5c155af9199af9e69b889claireho
136727f654740f2a26ad62a5c155af9199af9e69b889claireho/* Misc. tests */
136827f654740f2a26ad62a5c155af9199af9e69b889claireho/* NULL string */
136927f654740f2a26ad62a5c155af9199af9e69b889claireho    dir = ubidi_getBaseDirection(NULL, 3);
137027f654740f2a26ad62a5c155af9199af9e69b889claireho    if (dir != UBIDI_NEUTRAL )
137127f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("\nFailed getBaseDirection for NULL string " ,
137227f654740f2a26ad62a5c155af9199af9e69b889claireho        "\nExpected  %d \nReceived %d", UBIDI_NEUTRAL, dir);
137327f654740f2a26ad62a5c155af9199af9e69b889claireho/*All L- English string and length=-3 */
137427f654740f2a26ad62a5c155af9199af9e69b889claireho    dir = ubidi_getBaseDirection( stringEnglish, -3);
137527f654740f2a26ad62a5c155af9199af9e69b889claireho    if (dir != UBIDI_NEUTRAL )
137627f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("\nFailed getBaseDirection for string w length= -3 ",
137727f654740f2a26ad62a5c155af9199af9e69b889claireho        "\nExpected  %d \nReceived %d", UBIDI_NEUTRAL, dir);
137827f654740f2a26ad62a5c155af9199af9e69b889claireho/*All L- English string and length=-1 */
137927f654740f2a26ad62a5c155af9199af9e69b889claireho    dir = ubidi_getBaseDirection( stringEnglish, -1);
138027f654740f2a26ad62a5c155af9199af9e69b889claireho    if (dir != UBIDI_LTR )
138127f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("\nFailed getBaseDirection for English string w length= -1 ",
138227f654740f2a26ad62a5c155af9199af9e69b889claireho        "\nExpected  %d \nReceived %d", UBIDI_LTR, dir);
138327f654740f2a26ad62a5c155af9199af9e69b889claireho/*All AL- Persian string and length=-1 */
138427f654740f2a26ad62a5c155af9199af9e69b889claireho    dir = ubidi_getBaseDirection( stringPersian, -1);
138527f654740f2a26ad62a5c155af9199af9e69b889claireho    if (dir != UBIDI_RTL )
138627f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("\nFailed getBaseDirection for Persian string w length= -1 ",
138727f654740f2a26ad62a5c155af9199af9e69b889claireho        "\nExpected  %d \nReceived %d", UBIDI_RTL, dir);
138827f654740f2a26ad62a5c155af9199af9e69b889claireho/*All R- Hebrew string and length=-1 */
138927f654740f2a26ad62a5c155af9199af9e69b889claireho    dir = ubidi_getBaseDirection( stringHebrew, -1);
139027f654740f2a26ad62a5c155af9199af9e69b889claireho    if (dir != UBIDI_RTL )
139127f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("\nFailed getBaseDirection for Hebrew string w length= -1 ",
139227f654740f2a26ad62a5c155af9199af9e69b889claireho        "\nExpected  %d \nReceived %d", UBIDI_RTL, dir);
139327f654740f2a26ad62a5c155af9199af9e69b889claireho/*All weak L- English digits string and length=-1 */
139427f654740f2a26ad62a5c155af9199af9e69b889claireho    dir = ubidi_getBaseDirection(stringAllEnglishDigits, -1);
139527f654740f2a26ad62a5c155af9199af9e69b889claireho    if (dir != UBIDI_NEUTRAL )
139627f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("\nFailed getBaseDirection for English digits string w length= -1 ",
139727f654740f2a26ad62a5c155af9199af9e69b889claireho        "\nExpected  %d \nReceived %d", UBIDI_NEUTRAL, dir);
139827f654740f2a26ad62a5c155af9199af9e69b889claireho/*All weak AL- Arabic digits string and length=-1 */
139927f654740f2a26ad62a5c155af9199af9e69b889claireho    dir = ubidi_getBaseDirection(stringAllArabicDigits, -1);
140027f654740f2a26ad62a5c155af9199af9e69b889claireho    if (dir != UBIDI_NEUTRAL )
140127f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("\nFailed getBaseDirection for Arabic string w length= -1 ",
140227f654740f2a26ad62a5c155af9199af9e69b889claireho        "\nExpected  %d \nReceived %d", UBIDI_NEUTRAL, dir);
140327f654740f2a26ad62a5c155af9199af9e69b889claireho
140427f654740f2a26ad62a5c155af9199af9e69b889claireho}
140527f654740f2a26ad62a5c155af9199af9e69b889claireho
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doMisc(void) {
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Miscellaneous tests to exercize less popular code paths */
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDi *bidi, *bidiLine;
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar src[MAXLEN], dest[MAXLEN];
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t srcLen, destLen, runCount, i;
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDiLevel level;
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDiDirection dir;
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t map[MAXLEN];
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const int32_t srcMap[6] = {0,1,-1,5,4};
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const int32_t dstMap[6] = {0,1,-1,-1,4,3};
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bidi = ubidi_openSized(120, 66, &errorCode);
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (bidi == NULL) {
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error with openSized(120, 66)\n");
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bidiLine = ubidi_open();
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (bidi == NULL) {
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error with open()\n");
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReverse(src, 0, dest, MAXLEN, 0, &errorCode);
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (destLen != 0) {
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nwriteReverse should return zero length, ",
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "returned %d instead\n", destLen);
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#1#");
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, 0, UBIDI_LTR, NULL, &errorCode);
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (destLen != 0) {
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nwriteReordered should return zero length, ",
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "returned %d instead\n", destLen);
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#2#");
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("abc       ", src, MAXLEN);
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode);
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode);
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 3; i < 6; i++) {
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        level = ubidi_getLevelAt(bidiLine, i);
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (level != UBIDI_RTL) {
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\nTrailing space at index %d should get paragraph level"
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "%d, got %d instead\n", i, UBIDI_RTL, level);
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#3#");
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("abc       def", src, MAXLEN);
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode);
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode);
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 3; i < 6; i++) {
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        level = ubidi_getLevelAt(bidiLine, i);
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (level != UBIDI_RTL) {
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\nTrailing space at index %d should get paragraph level"
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "%d, got %d instead\n", i, UBIDI_RTL, level);
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#4#");
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("abcdefghi    ", src, MAXLEN);
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode);
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode);
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 3; i < 6; i++) {
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        level = ubidi_getLevelAt(bidiLine, i);
1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (level != 2) {
1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\nTrailing char at index %d should get level 2, "
1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "got %d instead\n", i, level);
1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#5#");
1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setReorderingOptions(bidi, UBIDI_OPTION_REMOVE_CONTROLS);
1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\\u200eabc       def", src, MAXLEN);
1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode);
1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode);
1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_getResultLength(bidiLine);
1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (destLen != 5) {
1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong result length, should be 5, got %d\n", destLen);
1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#6#");
1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("abcdefghi", src, MAXLEN);
1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode);
1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode);
1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dir = ubidi_getDirection(bidiLine);
1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (dir != UBIDI_LTR) {
1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong direction #1, should be %d, got %d\n",
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UBIDI_LTR, dir);
1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#7#");
1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, 0, UBIDI_LTR, NULL, &errorCode);
1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    runCount = ubidi_countRuns(bidi, &errorCode);
1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (runCount != 0) {
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong number of runs #1, should be 0, got %d\n", runCount);
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#8#");
1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("          ", src, MAXLEN);
1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode);
1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode);
1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    runCount = ubidi_countRuns(bidiLine, &errorCode);
1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (runCount != 1) {
1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong number of runs #2, should be 1, got %d\n", runCount);
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#9#");
1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("a\\u05d0        bc", src, MAXLEN);
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode);
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode);
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dir = ubidi_getDirection(bidi);
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (dir != UBIDI_MIXED) {
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong direction #2, should be %d, got %d\n",
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UBIDI_MIXED, dir);
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dir = ubidi_getDirection(bidiLine);
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (dir != UBIDI_MIXED) {
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong direction #3, should be %d, got %d\n",
1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UBIDI_MIXED, dir);
1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    runCount = ubidi_countRuns(bidiLine, &errorCode);
1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (runCount != 2) {
1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong number of runs #3, should be 2, got %d\n", runCount);
1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#10#");
1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_invertMap(srcMap, map, 5);
1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (memcmp(dstMap, map, sizeof(dstMap))) {
1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nUnexpected inverted Map, got ");
1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < 6; i++) {
1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("%d ", map[i]);
1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\n");
1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test REMOVE_BIDI_CONTROLS together with DO_MIRRORING */
1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("abc\\u200e", src, MAXLEN);
1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode);
1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(bidi, dest, MAXLEN,
1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UBIDI_REMOVE_BIDI_CONTROLS | UBIDI_DO_MIRRORING, &errorCode);
1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (destLen != 3 || memcmp(dest, src, 3 * sizeof(UChar))) {
1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong result #1, should be 'abc', got '%s'\n",
1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(dest, destLen));
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#11#");
1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test inverse Bidi with marks and contextual orientation */
1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setReorderingMode(bidi, UBIDI_REORDER_INVERSE_LIKE_DIRECT);
1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setReorderingOptions(bidi, UBIDI_OPTION_INSERT_MARKS);
1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, 0, UBIDI_DEFAULT_RTL, NULL, &errorCode);
1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (destLen != 0) {
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong result #2, length should be 0, got %d\n", destLen);
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#12#");
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("   ", src, MAXLEN);
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode);
1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (destLen != 3 || memcmp(dest, src, destLen * sizeof(UChar))) {
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong result #3, should be '   ', got '%s'\n",
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(dest, destLen));
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#13#");
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("abc", src, MAXLEN);
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode);
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (destLen != 3 || memcmp(dest, src, destLen * sizeof(UChar))) {
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong result #4, should be 'abc', got '%s'\n",
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(dest, destLen));
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#14#");
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\\u05d0\\u05d1", src, MAXLEN);
1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode);
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\\u05d1\\u05d0", src, MAXLEN);
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (destLen != 2 || memcmp(dest, src, destLen * sizeof(UChar))) {
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong result #5, should be '%s', got '%s'\n",
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#15#");
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("abc \\u05d0\\u05d1", src, MAXLEN);
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode);
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\\u05d1\\u05d0 abc", src, MAXLEN);
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (destLen != 6 || memcmp(dest, src, destLen * sizeof(UChar))) {
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong result #6, should be '%s', got '%s'\n",
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#16#");
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\\u05d0\\u05d1 abc", src, MAXLEN);
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode);
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\\u200fabc \\u05d1\\u05d0", src, MAXLEN);
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (destLen != 7 || memcmp(dest, src, destLen * sizeof(UChar))) {
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong result #7, should be '%s', got '%s'\n",
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#17#");
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\\u05d0\\u05d1 abc .-=", src, MAXLEN);
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode);
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\\u200f=-. abc \\u05d1\\u05d0", src, MAXLEN);
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (destLen != 11 || memcmp(dest, src, destLen * sizeof(UChar))) {
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong result #8, should be '%s', got '%s'\n",
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#18#");
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_orderParagraphsLTR(bidi, TRUE);
1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\n\r   \n\rabc\n\\u05d0\\u05d1\rabc \\u05d2\\u05d3\n\r"
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        "\\u05d4\\u05d5 abc\n\\u05d6\\u05d7 abc .-=\r\n"
1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        "-* \\u05d8\\u05d9 abc .-=", src, MAXLEN);
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_RTL, NULL, &errorCode);
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\n\r   \n\rabc\n\\u05d1\\u05d0\r\\u05d3\\u05d2 abc\n\r"
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        "\\u200fabc \\u05d5\\u05d4\n\\u200f=-. abc \\u05d7\\u05d6\r\n"
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        "\\u200f=-. abc \\u05d9\\u05d8 *-", src, MAXLEN);
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (destLen != 57 || memcmp(dest, src, destLen * sizeof(UChar))) {
1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong result #9, should be '%s', got '%s'\n",
1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#19#");
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\\u05d0 \t", src, MAXLEN);
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode);
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\\u05D0\\u200e \t", src, MAXLEN);
1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (destLen != 4 || memcmp(dest, src, destLen * sizeof(UChar))) {
1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong result #10, should be '%s', got '%s'\n",
1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#20#");
1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\\u05d0 123 \t\\u05d1 123 \\u05d2", src, MAXLEN);
1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode);
1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\\u05d0 \\u200e123\\u200e \t\\u05d2 123 \\u05d1", src, MAXLEN);
1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (destLen != 16 || memcmp(dest, src, destLen * sizeof(UChar))) {
1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong result #11, should be '%s', got '%s'\n",
1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#21#");
1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\\u05d0 123 \\u0660\\u0661 ab", src, MAXLEN);
1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode);
1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\\u05d0 \\u200e123 \\u200e\\u0660\\u0661 ab", src, MAXLEN);
1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (destLen != 13 || memcmp(dest, src, destLen * sizeof(UChar))) {
1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong result #12, should be '%s', got '%s'\n",
1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#22#");
1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("ab \t", src, MAXLEN);
1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode);
1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\\u200f\t ab", src, MAXLEN);
1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (destLen != 5 || memcmp(dest, src, destLen * sizeof(UChar))) {
1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong result #13, should be '%s', got '%s'\n",
1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#23#");
1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* check exceeding para level */
1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(bidi);
1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bidi = ubidi_open();
1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("A\\u202a\\u05d0\\u202aC\\u202c\\u05d1\\u202cE", src, MAXLEN);
1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_MAX_EXPLICIT_LEVEL - 1, NULL, &errorCode);
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    level = ubidi_getLevelAt(bidi, 2);
167459d709d503bab6e2b61931737e662dd293b40578ccornelius    if (level != UBIDI_MAX_EXPLICIT_LEVEL) {
167559d709d503bab6e2b61931737e662dd293b40578ccornelius        log_err("\nWrong level at index 2\n, should be %d, got %d\n", UBIDI_MAX_EXPLICIT_LEVEL, level);
1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#24#");
1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* check 1-char runs with RUNS_ONLY */
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setReorderingMode(bidi, UBIDI_REORDER_RUNS_ONLY);
1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("a \\u05d0 b \\u05d1 c \\u05d2 d ", src, MAXLEN);
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode);
1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    runCount = ubidi_countRuns(bidi, &errorCode);
1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (runCount != 14) {
1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nWrong number of runs #3, should be 14, got %d\n", runCount);
1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RETURN_IF_BAD_ERRCODE("#25#");
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(bidi);
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(bidiLine);
1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestFailureRecovery(void) {
1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDi *bidi, *bidiLine;
1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar src[MAXLEN];
1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t srcLen;
1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDiLevel level;
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDiReorderingMode rm;
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static UBiDiLevel myLevels[3] = {6,5,4};
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nEntering TestFailureRecovery\n\n");
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_FILE_ACCESS_ERROR;
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ubidi_writeReordered(NULL, NULL, 0, 0, &errorCode) != 0) {
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ubidi_writeReordered did not return 0 when passed a failing UErrorCode\n");
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ubidi_writeReverse(NULL, 0, NULL, 0, 0, &errorCode) != 0) {
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ubidi_writeReverse did not return 0 when passed a failing UErrorCode\n");
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ubidi_writeReordered(NULL, NULL, 0, 0, &errorCode) != 0 || errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ubidi_writeReordered did not fail as expected\n");
1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bidi = ubidi_open();
1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("abc", src, MAXLEN);
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_DEFAULT_LTR - 1, NULL, &errorCode);
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(errorCode)) {
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nubidi_setPara did not fail when passed too big para level\n");
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ubidi_writeReverse(NULL, 0, NULL, 0, 0, &errorCode) != 0 || errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ubidi_writeReverse did not fail as expected\n");
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bidiLine = ubidi_open();
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setLine(bidi, 0, 6, bidiLine, &errorCode);
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(errorCode)) {
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nubidi_setLine did not fail when called before valid setPara()\n");
1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("abc", src, MAXLEN);
1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_LTR + 4, NULL, &errorCode);
1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    level = ubidi_getLevelAt(bidi, 3);
1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (level != 0) {
1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nubidi_getLevelAt did not fail when called with bad argument\n");
1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(bidi);
1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bidi = ubidi_openSized(-1, 0, &errorCode);
1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(errorCode)) {
1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nubidi_openSized did not fail when called with bad argument\n");
1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(bidi);
1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bidi = ubidi_openSized(2, 1, &errorCode);
1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("abc", src, MAXLEN);
1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_LTR, NULL, &errorCode);
1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(errorCode)) {
1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nsetPara did not fail when called with text too long\n");
1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("=2", src, MAXLEN);
1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode);
1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_countRuns(bidi, &errorCode);
1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(errorCode)) {
1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nsetPara did not fail when called for too many runs\n");
1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(bidi);
1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bidi = ubidi_open();
1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rm = ubidi_getReorderingMode(bidi);
1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setReorderingMode(bidi, UBIDI_REORDER_DEFAULT - 1);
1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (rm != ubidi_getReorderingMode(bidi)) {
1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nsetReorderingMode with bad argument #1 should have no effect\n");
1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setReorderingMode(bidi, 9999);
1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (rm != ubidi_getReorderingMode(bidi)) {
1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nsetReorderingMode with bad argument #2 should have no effect\n");
1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Try a surrogate char */
1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\\uD800\\uDC00", src, MAXLEN);
1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, UBIDI_RTL, NULL, &errorCode);
1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ubidi_getDirection(bidi) != UBIDI_MIXED) {
1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\ngetDirection for 1st surrogate char should be MIXED\n");
1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("abc", src, MAXLEN);
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, srcLen, 5, myLevels, &errorCode);
1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(errorCode)) {
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nsetPara did not fail when called with bad levels\n");
1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(bidi);
1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(bidiLine);
1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nExiting TestFailureRecovery\n\n");
1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestMultipleParagraphs(void) {
1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* const text = "__ABC\\u001c"          /* Para #0 offset 0 */
1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "__\\u05d0DE\\u001c"    /*       1        6 */
1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "__123\\u001c"          /*       2       12 */
1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "\\u000d\\u000a"        /*       3       18 */
1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "FG\\u000d"             /*       4       20 */
1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "\\u000d"               /*       5       23 */
1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "HI\\u000d\\u000a"      /*       6       24 */
1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "\\u000d\\u000a"        /*       7       28 */
1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "\\u000a"               /*       8       30 */
1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "\\u000a"               /*       9       31 */
1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "JK\\u001c";            /*      10       32 */
1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const int32_t paraCount=11;
1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const int32_t paraBounds[]={0, 6, 12, 18, 20, 23, 24, 28, 30, 31, 32, 35};
1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UBiDiLevel paraLevels[]={UBIDI_LTR, UBIDI_RTL, UBIDI_DEFAULT_LTR, UBIDI_DEFAULT_RTL, 22, 23};
1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UBiDiLevel multiLevels[6][11] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                  {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                  {0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0},
1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                  {22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22},
1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                  {23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}};
1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* const text2 = "\\u05d0 1-2\\u001c\\u0630 1-2\\u001c1-2";
1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UBiDiLevel levels2[] = {1,1,2,2,2,0, 1,1,2,1,2,0, 2,2,2};
1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static UBiDiLevel myLevels[10] = {0,0,0,0,0,0,0,0,0,0};
1817c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    static const UChar multiparaTestString[] = {
1818c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        0x5de, 0x5e0, 0x5e1, 0x5d4, 0x20,  0x5e1, 0x5e4, 0x5da,
1819c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        0x20,  0xa,   0xa,   0x41,  0x72,  0x74,  0x69,  0x73,
1820c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        0x74,  0x3a,  0x20,  0x5de, 0x5e0, 0x5e1, 0x5d4, 0x20,
1821c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        0x5e1, 0x5e4, 0x5da, 0x20,  0xa,   0xa,   0x41,  0x6c,
1822c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        0x62,  0x75,  0x6d,  0x3a,  0x20,  0x5de, 0x5e0, 0x5e1,
1823c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        0x5d4, 0x20,  0x5e1, 0x5e4, 0x5da, 0x20,  0xa,   0xa,
1824c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        0x54,  0x69,  0x6d,  0x65,  0x3a,  0x20,  0x32,  0x3a,
1825c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        0x32,  0x37,  0xa,  0xa
1826c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    };
1827c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    static const UBiDiLevel multiparaTestLevels[] = {
1828c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        1, 1, 1, 1, 1, 1, 1, 1,
1829c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        1, 1, 0, 0, 0, 0, 0, 0,
1830c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        0, 0, 0, 1, 1, 1, 1, 1,
1831c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        1, 1, 1, 0, 0, 0, 0, 0,
1832c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        0, 0, 0, 0, 0, 1, 1, 1,
1833c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        1, 1, 1, 1, 1, 0, 0, 0,
1834c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        0, 0, 0, 0, 0, 0, 0, 0,
1835c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        0, 0, 0, 0
1836c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    };
1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDiLevel gotLevel;
1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UBiDiLevel* gotLevels;
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool orderParagraphsLTR;
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar src[MAXLEN], dest[MAXLEN];
1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDi* pBidi=ubidi_open();
1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDi* pLine;
1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t srcSize, count, paraStart, paraLimit, paraIndex, length;
1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t srcLen, destLen;
1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i, j, k;
1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nEntering TestMultipleParagraphs\n\n");
1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(text, src, MAXLEN);
1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcSize=u_strlen(src);
1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(pBidi, src, srcSize, UBIDI_LTR, NULL, &errorCode);
1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ubidi_setPara failed, paraLevel=%d, errorCode %s\n",
1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UBIDI_LTR, u_errorName(errorCode));
1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_close(pBidi);
1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* check paragraph count and boundaries */
1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (paraCount!=(count=ubidi_countParagraphs(pBidi))) {
1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ubidi_countParagraphs returned %d, should be %d\n",
1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                count, paraCount);
1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<paraCount; i++) {
1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_getParagraphByIndex(pBidi, i, &paraStart, &paraLimit, NULL, &errorCode);
1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ((paraStart!=paraBounds[i]) || (paraLimit!=paraBounds[i+1])) {
1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Found boundaries of paragraph %d: %d-%d; expected: %d-%d\n",
1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    i, paraStart, paraLimit, paraBounds[i], paraBounds[i+1]);
1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* check with last paragraph not terminated by B */
1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    src[srcSize-1]='L';
1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(pBidi, src, srcSize, UBIDI_LTR, NULL, &errorCode);
1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("2nd ubidi_setPara failed, paraLevel=%d, errorCode %s\n",
1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UBIDI_LTR, u_errorName(errorCode));
1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_close(pBidi);
1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (paraCount!=(count=ubidi_countParagraphs(pBidi))) {
1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("2nd ubidi_countParagraphs returned %d, should be %d\n",
1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                count, paraCount);
1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i=paraCount-1;
1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_getParagraphByIndex(pBidi, i, &paraStart, &paraLimit, NULL, &errorCode);
1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ((paraStart!=paraBounds[i]) || (paraLimit!=paraBounds[i+1])) {
1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("2nd Found boundaries of paragraph %d: %d-%d; expected: %d-%d\n",
1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                i, paraStart, paraLimit, paraBounds[i], paraBounds[i+1]);
1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* check paraLevel for all paragraphs under various paraLevel specs */
1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (k=0; k<6; k++) {
1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setPara(pBidi, src, srcSize, paraLevels[k], NULL, &errorCode);
1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i=0; i<paraCount; i++) {
1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            paraIndex=ubidi_getParagraph(pBidi, paraBounds[i], NULL, NULL, &gotLevel, &errorCode);
1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (paraIndex!=i) {
1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("For paraLevel=%d paragraph=%d, found paragraph index=%d expected=%d\n",
1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        paraLevels[k], i, paraIndex, i);
1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (gotLevel!=multiLevels[k][i]) {
1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("For paraLevel=%d paragraph=%d, found level=%d expected %d\n",
1902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        paraLevels[k], i, gotLevel, multiLevels[k][i]);
1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        gotLevel=ubidi_getParaLevel(pBidi);
1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (gotLevel!=multiLevels[k][0]) {
1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("For paraLevel=%d getParaLevel=%d, expected %d\n",
1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    paraLevels[k], gotLevel, multiLevels[k][0]);
1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* check that the result of ubidi_getParaLevel changes if the first
1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * paragraph has a different level
1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    src[0]=0x05d2;                      /* Hebrew letter Gimel */
1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(pBidi, src, srcSize, UBIDI_DEFAULT_LTR, NULL, &errorCode);
1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gotLevel=ubidi_getParaLevel(pBidi);
1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (gotLevel!=UBIDI_RTL) {
1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("For paraLevel=UBIDI_DEFAULT_LTR getParaLevel=%d, expected=%d\n",
1920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        gotLevel, UBIDI_RTL);
1921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* check that line cannot overlap paragraph boundaries */
1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pLine=ubidi_open();
1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i=paraBounds[1];
1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    k=paraBounds[2]+1;
1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setLine(pBidi, i, k, pLine, &errorCode);
1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(errorCode)) {
1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("For line limits %d-%d got success %s\n",
1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                i, k, u_errorName(errorCode));
1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i=paraBounds[1];
1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    k=paraBounds[2];
1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setLine(pBidi, i, k, pLine, &errorCode);
1936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("For line limits %d-%d got error %s\n",
1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                i, k, u_errorName(errorCode));
1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* check level of block separator at end of paragraph when orderParagraphsLTR==FALSE */
1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(pBidi, src, srcSize, UBIDI_RTL, NULL, &errorCode);
1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* get levels through para Bidi block */
1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gotLevels=ubidi_getLevels(pBidi, &errorCode);
1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
1946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error on Para getLevels %s\n", u_errorName(errorCode));
1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_close(pLine);
1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_close(pBidi);
1949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=26; i<32; i++) {
1952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (gotLevels[i]!=UBIDI_RTL) {
1953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("For char %d(%04x), level=%d, expected=%d\n",
1954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    i, src[i], gotLevels[i], UBIDI_RTL);
1955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* get levels through para Line block */
1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i=paraBounds[1];
1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    k=paraBounds[2];
1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setLine(pBidi, i, k, pLine, &errorCode);
1961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("For line limits %d-%d got error %s\n",
1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                i, k, u_errorName(errorCode));
1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_close(pLine);
1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_close(pBidi);
1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    paraIndex=ubidi_getParagraph(pLine, i, &paraStart, &paraLimit, &gotLevel, &errorCode);
1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gotLevels=ubidi_getLevels(pLine, &errorCode);
1970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
1971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error on Line getLevels %s\n", u_errorName(errorCode));
1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_close(pLine);
1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_close(pBidi);
1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ubidi_getLength(pLine);
1977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ((gotLevel!=UBIDI_RTL) || (gotLevels[length-1]!=UBIDI_RTL)) {
1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("For paragraph %d with limits %d-%d, paraLevel=%d expected=%d, "
1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "level of separator=%d expected=%d\n",
1980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                paraIndex, paraStart, paraLimit, gotLevel, UBIDI_RTL, gotLevels[length-1], UBIDI_RTL);
1981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    orderParagraphsLTR=ubidi_isOrderParagraphsLTR(pBidi);
1983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (orderParagraphsLTR) {
1984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Found orderParagraphsLTR=%d expected=%d\n", orderParagraphsLTR, FALSE);
1985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_orderParagraphsLTR(pBidi, TRUE);
1987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    orderParagraphsLTR=ubidi_isOrderParagraphsLTR(pBidi);
1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!orderParagraphsLTR) {
1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Found orderParagraphsLTR=%d expected=%d\n", orderParagraphsLTR, TRUE);
1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* check level of block separator at end of paragraph when orderParagraphsLTR==TRUE */
1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(pBidi, src, srcSize, UBIDI_RTL, NULL, &errorCode);
1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* get levels through para Bidi block */
1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gotLevels=ubidi_getLevels(pBidi, &errorCode);
1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=26; i<32; i++) {
1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (gotLevels[i]!=0) {
1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("For char %d(%04x), level=%d, expected=%d\n",
1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    i, src[i], gotLevels[i], 0);
1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* get levels through para Line block */
2003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i=paraBounds[1];
2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    k=paraBounds[2];
2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setLine(pBidi, paraStart, paraLimit, pLine, &errorCode);
2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    paraIndex=ubidi_getParagraph(pLine, i, &paraStart, &paraLimit, &gotLevel, &errorCode);
2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gotLevels=ubidi_getLevels(pLine, &errorCode);
2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ubidi_getLength(pLine);
2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ((gotLevel!=UBIDI_RTL) || (gotLevels[length-1]!=0)) {
2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("For paragraph %d with limits %d-%d, paraLevel=%d expected=%d, "
2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "level of separator=%d expected=%d\n",
2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                paraIndex, paraStart, paraLimit, gotLevel, UBIDI_RTL, gotLevels[length-1], 0);
2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("levels=");
2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (count=0; count<length; count++) {
2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose(" %d", gotLevels[count]);
2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n");
2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test that the concatenation of separate invocations of the bidi code
2021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * on each individual paragraph in order matches the levels array that
2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * results from invoking bidi once over the entire multiparagraph tests
2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * (with orderParagraphsLTR false, of course)
2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(text, src, MAXLEN);      /* restore original content */
2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcSize=u_strlen(src);
2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_orderParagraphsLTR(pBidi, FALSE);
2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(pBidi, src, srcSize, UBIDI_DEFAULT_RTL, NULL, &errorCode);
2029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gotLevels=ubidi_getLevels(pBidi, &errorCode);
2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<paraCount; i++) {
2031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* use pLine for individual paragraphs */
2032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        paraStart = paraBounds[i];
2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length = paraBounds[i+1] - paraStart;
2034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setPara(pLine, src+paraStart, length, UBIDI_DEFAULT_RTL, NULL, &errorCode);
2035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (j=0; j<length; j++) {
2036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if ((k=ubidi_getLevelAt(pLine, j)) != (gotLevel=gotLevels[paraStart+j])) {
2037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Checking paragraph concatenation: for paragraph=%d, "
2038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        "char=%d(%04x), level=%d, expected=%d\n",
2039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        i, j, src[paraStart+j], k, gotLevel);
2040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* ensure that leading numerics in a paragraph are not treated as arabic
2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       numerals because of arabic text in a preceding paragraph
2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(text2, src, MAXLEN);
2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcSize=u_strlen(src);
2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_orderParagraphsLTR(pBidi, TRUE);
2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(pBidi, src, srcSize, UBIDI_RTL, NULL, &errorCode);
2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gotLevels=ubidi_getLevels(pBidi, &errorCode);
2052c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
2053c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_err("Can't get levels. %s\n", u_errorName(errorCode));
2054c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
2055c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<srcSize; i++) {
2057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (gotLevels[i]!=levels2[i]) {
2058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Checking leading numerics: for char %d(%04x), level=%d, expected=%d\n",
2059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    i, src[i], gotLevels[i], levels2[i]);
2060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* check handling of whitespace before end of paragraph separator when
2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * orderParagraphsLTR==TRUE, when last paragraph has, and lacks, a terminating B
2065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_memset(src, 0x0020, MAXLEN);
2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcSize = 5;
2068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_orderParagraphsLTR(pBidi, TRUE);
2069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0x001c; i<=0x0020; i+=(0x0020-0x001c)) {
2070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        src[4]=(UChar)i;                /* with and without terminating B */
2071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (j=0x0041; j<=0x05d0; j+=(0x05d0-0x0041)) {
2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            src[0]=(UChar)j;            /* leading 'A' or Alef */
2073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (gotLevel=4; gotLevel<=5; gotLevel++) {
2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                /* test even and odd paraLevel */
2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ubidi_setPara(pBidi, src, srcSize, gotLevel, NULL, &errorCode);
2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                gotLevels=ubidi_getLevels(pBidi, &errorCode);
2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for (k=1; k<=3; k++) {
2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (gotLevels[k]!=gotLevel) {
2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        log_err("Checking trailing spaces: for leading_char=%04x, "
2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                "last_char=%04x, index=%d, level=%d, expected=%d\n",
2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                src[0], src[4], k, gotLevels[k], gotLevel);
2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
2083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* check default orientation when inverse bidi and paragraph starts
2089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * with LTR strong char and ends with RTL strong char, with and without
2090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * a terminating B
2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
2092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setReorderingMode(pBidi, UBIDI_REORDER_INVERSE_LIKE_DIRECT);
2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("abc \\u05d2\\u05d1\n", src, MAXLEN);
2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(pBidi, src, srcLen, UBIDI_DEFAULT_LTR, NULL, &errorCode);
2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(pBidi, dest, MAXLEN, 0, &errorCode);
2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\\u05d1\\u05d2 abc\n", src, MAXLEN);
2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (memcmp(src, dest, destLen * sizeof(UChar))) {
2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nInvalid output #0, should be '%s', got '%s'\n",
2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("abc \\u05d2\\u05d1", src, MAXLEN);
2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(pBidi, src, srcLen, UBIDI_DEFAULT_LTR, NULL, &errorCode);
2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(pBidi, dest, MAXLEN, 0, &errorCode);
2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("\\u05d1\\u05d2 abc", src, MAXLEN);
2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (memcmp(src, dest, destLen * sizeof(UChar))) {
2106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nInvalid output #1, should be '%s', got '%s'\n",
2107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
2108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* check multiple paragraphs together with explicit levels
2111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
2112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setReorderingMode(pBidi, UBIDI_REORDER_DEFAULT);
2113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("ab\\u05d1\\u05d2\n\\u05d3\\u05d4123", src, MAXLEN);
2114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(pBidi, src, srcLen, UBIDI_LTR, myLevels, &errorCode);
2115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(pBidi, dest, MAXLEN, 0, &errorCode);
2116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape("ab\\u05d2\\u05d1\\n123\\u05d4\\u05d3", src, MAXLEN);
2117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (memcmp(src, dest, destLen * sizeof(UChar))) {
2118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nInvalid output #2, should be '%s', got '%s'\n",
2119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(src, srcLen), aescstrdup(dest, destLen));
2120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = ubidi_countParagraphs(pBidi);
2122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (count != 2) {
2123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nInvalid number of paras, should be 2, got %d\n", count);
2124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(pLine);
2127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(pBidi);
2128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nExiting TestMultipleParagraphs\n\n");
2129c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2130c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /* check levels in multiple paragraphs with default para level
2131c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     */
2132c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    pBidi = ubidi_open();
2133c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
2134c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ubidi_setPara(pBidi, multiparaTestString, LENGTHOF(multiparaTestString),
2135c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                  UBIDI_DEFAULT_LTR, NULL, &errorCode);
2136c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
2137c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_err("ubidi_setPara failed for multiparaTestString\n");
2138c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        ubidi_close(pBidi);
2139c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
2140c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2141c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    gotLevels = ubidi_getLevels(pBidi, &errorCode);
2142c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
2143c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_err("ubidi_getLevels failed for multiparaTestString\n");
2144c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        ubidi_close(pBidi);
2145c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
2146c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2147c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    for (i = 0; i < LENGTHOF(multiparaTestString); i++) {
2148c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (gotLevels[i] != multiparaTestLevels[i]) {
2149c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err("Error on level for multiparaTestString at index %d, "
2150c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    "expected=%d, actual=%d\n",
2151c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    i, multiparaTestLevels[i], gotLevels[i]);
2152c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
2153c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2154c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ubidi_close(pBidi);
2155c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* inverse BiDi ------------------------------------------------------------- */
2160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int countRoundtrips=0, countNonRoundtrips=0;
2162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define STRING_TEST_CASE(s) { (s), LENGTHOF(s) }
2164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestInverse(void) {
2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar
2168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        string0[]={ 0x6c, 0x61, 0x28, 0x74, 0x69, 0x6e, 0x20, 0x5d0, 0x5d1, 0x29, 0x5d2, 0x5d3 },
2169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        string1[]={ 0x6c, 0x61, 0x74, 0x20, 0x5d0, 0x5d1, 0x5d2, 0x20, 0x31, 0x32, 0x33 },
2170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        string2[]={ 0x6c, 0x61, 0x74, 0x20, 0x5d0, 0x28, 0x5d1, 0x5d2, 0x20, 0x31, 0x29, 0x32, 0x33 },
2171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        string3[]={ 0x31, 0x32, 0x33, 0x20, 0x5d0, 0x5d1, 0x5d2, 0x20, 0x34, 0x35, 0x36 },
2172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        string4[]={ 0x61, 0x62, 0x20, 0x61, 0x62, 0x20, 0x661, 0x662 };
2173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
2175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UChar *s;
2176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t length;
2177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } testCases[]={
2178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        STRING_TEST_CASE(string0),
2179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        STRING_TEST_CASE(string1),
2180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        STRING_TEST_CASE(string2),
2181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        STRING_TEST_CASE(string3),
2182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        STRING_TEST_CASE(string4)
2183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDi *pBiDi;
2186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
2187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
2188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nEntering TestInverse\n\n");
2190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pBiDi=ubidi_open();
2191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pBiDi==NULL) {
2192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("unable to open a UBiDi object (out of memory)\n");
2193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("inverse Bidi: testInverse(L) with %u test cases ---\n", LENGTHOF(testCases));
2197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     for(i=0; i<LENGTHOF(testCases); ++i) {
2198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Testing case %d\n", i);
2199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
2200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        _testInverseBidi(pBiDi, testCases[i].s, testCases[i].length, 0, &errorCode);
2201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("inverse Bidi: testInverse(R) with %u test cases ---\n", LENGTHOF(testCases));
2204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<LENGTHOF(testCases); ++i) {
2205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Testing case %d\n", i);
2206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
2207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        _testInverseBidi(pBiDi, testCases[i].s, testCases[i].length, 1, &errorCode);
2208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testManyInverseBidi(pBiDi, 0);
2211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testManyInverseBidi(pBiDi, 1);
2212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(pBiDi);
2214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("inverse Bidi: rountrips: %5u\nnon-roundtrips: %5u\n", countRoundtrips, countNonRoundtrips);
2216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testWriteReverse();
2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testManyAddedPoints();
2220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testMisc();
2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nExiting TestInverse\n\n");
2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define COUNT_REPEAT_SEGMENTS 6
2227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar repeatSegments[COUNT_REPEAT_SEGMENTS][2]={
2229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0x61, 0x62 },     /* L */
2230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0x5d0, 0x5d1 },   /* R */
2231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0x627, 0x628 },   /* AL */
2232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0x31, 0x32 },     /* EN */
2233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0x661, 0x662 },   /* AN */
2234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0x20, 0x20 }      /* WS (N) */
2235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
2236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_testManyInverseBidi(UBiDi *pBiDi, UBiDiLevel direction) {
2239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar text[8]={ 0, 0, 0x20, 0, 0, 0x20, 0, 0 };
2240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i, j, k;
2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
2242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("inverse Bidi: testManyInverseBidi(%c) - test permutations of text snippets ---\n",
2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 direction==0 ? 'L' : 'R');
2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<COUNT_REPEAT_SEGMENTS; ++i) {
2246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        text[0]=repeatSegments[i][0];
2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        text[1]=repeatSegments[i][1];
2248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(j=0; j<COUNT_REPEAT_SEGMENTS; ++j) {
2249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            text[3]=repeatSegments[j][0];
2250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            text[4]=repeatSegments[j][1];
2251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for(k=0; k<COUNT_REPEAT_SEGMENTS; ++k) {
2252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                text[6]=repeatSegments[k][0];
2253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                text[7]=repeatSegments[k][1];
2254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errorCode=U_ZERO_ERROR;
2256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("inverse Bidi: testManyInverseBidi()[%u %u %u]\n", i, j, k);
2257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                _testInverseBidi(pBiDi, text, 8, direction, &errorCode);
2258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
2264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_testInverseBidi(UBiDi *pBiDi, const UChar *src, int32_t srcLength,
2265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UBiDiLevel direction, UErrorCode *pErrorCode) {
2266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar visualLTR[MAXLEN], logicalDest[MAXLEN], visualDest[MAXLEN];
2267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t ltrLength, logicalLength, visualLength;
2268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(direction==0) {
2270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("inverse Bidi: testInverse(L)\n");
2271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* convert visual to logical */
2273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setInverse(pBiDi, TRUE);
2274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!ubidi_isInverse(pBiDi)) {
2275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error while doing ubidi_setInverse(TRUE)\n");
2276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setPara(pBiDi, src, srcLength, 0, NULL, pErrorCode);
2278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (src != ubidi_getText(pBiDi)) {
2279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Wrong value returned by ubidi_getText\n");
2280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logicalLength=ubidi_writeReordered(pBiDi, logicalDest, LENGTHOF(logicalDest),
2282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                           UBIDI_DO_MIRRORING|UBIDI_INSERT_LRM_FOR_NUMERIC, pErrorCode);
2283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("  v ");
2284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        printUnicode(src, srcLength, ubidi_getLevels(pBiDi, pErrorCode));
2285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n");
2286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* convert back to visual LTR */
2288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setInverse(pBiDi, FALSE);
2289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (ubidi_isInverse(pBiDi)) {
2290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error while doing ubidi_setInverse(FALSE)\n");
2291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setPara(pBiDi, logicalDest, logicalLength, 0, NULL, pErrorCode);
2293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        visualLength=ubidi_writeReordered(pBiDi, visualDest, LENGTHOF(visualDest),
2294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                          UBIDI_DO_MIRRORING|UBIDI_REMOVE_BIDI_CONTROLS, pErrorCode);
2295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
2296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("inverse Bidi: testInverse(R)\n");
2297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* reverse visual from RTL to LTR */
2299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ltrLength=ubidi_writeReverse(src, srcLength, visualLTR, LENGTHOF(visualLTR), 0, pErrorCode);
2300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("  vr");
2301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        printUnicode(src, srcLength, NULL);
2302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n");
2303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* convert visual RTL to logical */
2305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setInverse(pBiDi, TRUE);
2306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setPara(pBiDi, visualLTR, ltrLength, 0, NULL, pErrorCode);
2307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logicalLength=ubidi_writeReordered(pBiDi, logicalDest, LENGTHOF(logicalDest),
2308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                           UBIDI_DO_MIRRORING|UBIDI_INSERT_LRM_FOR_NUMERIC, pErrorCode);
2309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("  vl");
2310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        printUnicode(visualLTR, ltrLength, ubidi_getLevels(pBiDi, pErrorCode));
2311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n");
2312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* convert back to visual RTL */
2314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setInverse(pBiDi, FALSE);
2315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setPara(pBiDi, logicalDest, logicalLength, 0, NULL, pErrorCode);
2316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        visualLength=ubidi_writeReordered(pBiDi, visualDest, LENGTHOF(visualDest),
2317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                          UBIDI_DO_MIRRORING|UBIDI_REMOVE_BIDI_CONTROLS|UBIDI_OUTPUT_REVERSE, pErrorCode);
2318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("  l ");
2320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    printUnicode(logicalDest, logicalLength, ubidi_getLevels(pBiDi, pErrorCode));
2321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n");
2322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("  v ");
2323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    printUnicode(visualDest, visualLength, NULL);
2324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n");
2325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* check and print results */
2327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*pErrorCode)) {
2328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("inverse BiDi: *** error %s\n"
2329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "                 turn on verbose mode to see details\n", u_errorName(*pErrorCode));
2330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(srcLength==visualLength && memcmp(src, visualDest, srcLength*U_SIZEOF_UCHAR)==0) {
2331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ++countRoundtrips;
2332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose(" + roundtripped\n");
2333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
2334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ++countNonRoundtrips;
2335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose(" * did not roundtrip\n");
2336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("inverse BiDi: transformation visual->logical->visual did not roundtrip the text;\n"
2337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "                 turn on verbose mode to see details\n");
2338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
2342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_testWriteReverse(void) {
2343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* U+064e and U+0650 are combining marks (Mn) */
2344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar forward[]={
2345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x200f, 0x627, 0x64e, 0x650, 0x20, 0x28, 0x31, 0x29
2346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, reverseKeepCombining[]={
2347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x29, 0x31, 0x28, 0x20, 0x627, 0x64e, 0x650, 0x200f
2348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, reverseRemoveControlsKeepCombiningDoMirror[]={
2349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x28, 0x31, 0x29, 0x20, 0x627, 0x64e, 0x650
2350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar reverse[10];
2352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
2353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
2354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test ubidi_writeReverse() with "interesting" options */
2356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ubidi_writeReverse(forward, LENGTHOF(forward),
2358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              reverse, LENGTHOF(reverse),
2359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              UBIDI_KEEP_BASE_COMBINING,
2360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              &errorCode);
2361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(reverseKeepCombining) || memcmp(reverse, reverseKeepCombining, length*U_SIZEOF_UCHAR)!=0) {
2362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in ubidi_writeReverse(UBIDI_KEEP_BASE_COMBINING): length=%d (should be %d), error code %s\n",
2363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                length, LENGTHOF(reverseKeepCombining), u_errorName(errorCode));
2364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(reverse, 0xa5, LENGTHOF(reverse)*U_SIZEOF_UCHAR);
2367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ubidi_writeReverse(forward, LENGTHOF(forward),
2369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              reverse, LENGTHOF(reverse),
2370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              UBIDI_REMOVE_BIDI_CONTROLS|UBIDI_DO_MIRRORING|UBIDI_KEEP_BASE_COMBINING,
2371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              &errorCode);
2372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(reverseRemoveControlsKeepCombiningDoMirror) || memcmp(reverse, reverseRemoveControlsKeepCombiningDoMirror, length*U_SIZEOF_UCHAR)!=0) {
2373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in ubidi_writeReverse(UBIDI_REMOVE_BIDI_CONTROLS|UBIDI_DO_MIRRORING|UBIDI_KEEP_BASE_COMBINING):\n"
2374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "    length=%d (should be %d), error code %s\n",
2375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                length, LENGTHOF(reverseRemoveControlsKeepCombiningDoMirror), u_errorName(errorCode));
2376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _testManyAddedPoints(void) {
2380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode = U_ZERO_ERROR;
2381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDi *bidi = ubidi_open();
2382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar text[90], dest[MAXLEN], expected[120];
2383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int destLen, i;
2384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < LENGTHOF(text); i+=3) {
2385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        text[i] = 0x0061; /* 'a' */
2386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        text[i+1] = 0x05d0;
2387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        text[i+2] = 0x0033; /* '3' */
2388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setReorderingMode(bidi, UBIDI_REORDER_INVERSE_LIKE_DIRECT);
2390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setReorderingOptions(bidi, UBIDI_OPTION_INSERT_MARKS);
2391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, text, LENGTHOF(text), UBIDI_LTR, NULL, &errorCode);
2392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(bidi, dest, MAXLEN, 0, &errorCode);
2393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < LENGTHOF(expected); i+=4) {
2394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expected[i] = 0x0061; /* 'a' */
2395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expected[i+1] = 0x05d0;
2396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expected[i+2] = 0x200e;
2397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expected[i+3] = 0x0033; /* '3' */
2398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (memcmp(dest, expected, destLen * sizeof(UChar))) {
2400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nInvalid output with many added points, "
2401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "expected '%s', got '%s'\n",
2402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(expected, LENGTHOF(expected)),
2403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(dest, destLen));
2404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(bidi);
2406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _testMisc(void) {
2409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode = U_ZERO_ERROR;
2410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDi *bidi = ubidi_open();
2411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar src[3], dest[MAXLEN], expected[5];
2412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int destLen;
2413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setInverse(bidi, TRUE);
2414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    src[0] = src[1] = src[2] = 0x0020;
2415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(bidi, src, LENGTHOF(src), UBIDI_RTL, NULL, &errorCode);
2416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(bidi, dest, MAXLEN,
2417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UBIDI_OUTPUT_REVERSE | UBIDI_INSERT_LRM_FOR_NUMERIC,
2418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              &errorCode);
2419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape("\\u200f   \\u200f", expected, 5);
2420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (memcmp(dest, expected, destLen * sizeof(UChar))) {
2421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nInvalid output with RLM at both sides, "
2422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "expected '%s', got '%s'\n",
2423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(expected, LENGTHOF(expected)),
2424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aescstrdup(dest, destLen));
2425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(bidi);
2427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* arabic shaping ----------------------------------------------------------- */
2430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
2432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoArabicShapingTest(void) {
2433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar
2434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    source[]={
2435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x31,   /* en:1 */
2436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x627,  /* arabic:alef */
2437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x32,   /* en:2 */
2438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x6f3,  /* an:3 */
2439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x61,   /* latin:a */
2440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x34,   /* en:4 */
2441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0
2442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, en2an[]={
2443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x661, 0x627, 0x662, 0x6f3, 0x61, 0x664, 0
2444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, an2en[]={
2445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x31, 0x627, 0x32, 0x33, 0x61, 0x34, 0
2446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, logical_alen2an_init_lr[]={
2447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x31, 0x627, 0x662, 0x6f3, 0x61, 0x34, 0
2448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, logical_alen2an_init_al[]={
2449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x6f1, 0x627, 0x6f2, 0x6f3, 0x61, 0x34, 0
2450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, reverse_alen2an_init_lr[]={
2451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x661, 0x627, 0x32, 0x6f3, 0x61, 0x34, 0
2452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, reverse_alen2an_init_al[]={
2453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x6f1, 0x627, 0x32, 0x6f3, 0x61, 0x6f4, 0
245450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }, lamalef[]={
245550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        0xfefb, 0
2456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar dest[8];
2458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
2459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
2460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test number shaping */
2462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* european->arabic */
2464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN,
2468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(source) || memcmp(dest, en2an, length*U_SIZEOF_UCHAR)!=0) {
2470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(en2an)\n");
2471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* arabic->european */
2474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, -1,
2476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_DIGITS_AN2EN|U_SHAPE_DIGIT_TYPE_AN_EXTENDED,
2478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=u_strlen(source) || memcmp(dest, an2en, length*U_SIZEOF_UCHAR)!=0) {
2480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(an2en)\n");
2481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* european->arabic with context, logical order, initial state not AL */
2484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_DIGITS_ALEN2AN_INIT_LR|U_SHAPE_DIGIT_TYPE_AN,
2488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(source) || memcmp(dest, logical_alen2an_init_lr, length*U_SIZEOF_UCHAR)!=0) {
2490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(logical_alen2an_init_lr)\n");
2491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* european->arabic with context, logical order, initial state AL */
2494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_DIGITS_ALEN2AN_INIT_AL|U_SHAPE_DIGIT_TYPE_AN_EXTENDED,
2498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(source) || memcmp(dest, logical_alen2an_init_al, length*U_SIZEOF_UCHAR)!=0) {
2500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(logical_alen2an_init_al)\n");
2501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* european->arabic with context, reverse order, initial state not AL */
2504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_DIGITS_ALEN2AN_INIT_LR|U_SHAPE_DIGIT_TYPE_AN|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
2508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(source) || memcmp(dest, reverse_alen2an_init_lr, length*U_SIZEOF_UCHAR)!=0) {
2510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(reverse_alen2an_init_lr)\n");
2511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* european->arabic with context, reverse order, initial state AL */
2514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_DIGITS_ALEN2AN_INIT_AL|U_SHAPE_DIGIT_TYPE_AN_EXTENDED|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
2518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(source) || memcmp(dest, reverse_alen2an_init_al, length*U_SIZEOF_UCHAR)!=0) {
2520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(reverse_alen2an_init_al)\n");
2521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test noop */
2524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         0,
2528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(source) || memcmp(dest, source, length*U_SIZEOF_UCHAR)!=0) {
2530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(noop)\n");
2531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, 0,
2535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN,
2537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=0) {
2539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(en2an, sourceLength=0), returned %d/%s\n", u_errorName(errorCode), LENGTHOF(source));
2540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* preflight digit shaping */
2543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         NULL, 0,
2546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN,
2547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=LENGTHOF(source)) {
2549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(en2an preflighting), returned %d/%s instead of %d/U_BUFFER_OVERFLOW_ERROR\n",
2550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                length, u_errorName(errorCode), LENGTHOF(source));
2551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test illegal arguments */
2554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(NULL, LENGTHOF(source),
2556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN,
2558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
2560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(source=NULL), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode));
2561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, -2,
2565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN,
2567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
2569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(sourceLength=-2), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode));
2570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         NULL, LENGTHOF(dest),
2575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN,
2576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
2578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(dest=NULL), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode));
2579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, -1,
2584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN,
2585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
2587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(destSize=-1), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode));
2588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_DIGITS_RESERVED|U_SHAPE_DIGIT_TYPE_AN,
2594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
2596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(U_SHAPE_DIGITS_RESERVED), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode));
2597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_RESERVED,
2603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
2605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(U_SHAPE_DIGIT_TYPE_RESERVED), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode));
2606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         (UChar *)(source+2), LENGTHOF(dest), /* overlap source and destination */
2611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_DIGITS_EN2AN|U_SHAPE_DIGIT_TYPE_AN,
2612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
2614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(U_SHAPE_DIGIT_TYPE_RESERVED), returned %s instead of U_ILLEGAL_ARGUMENT_ERROR\n", u_errorName(errorCode));
2615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
261650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
261750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    errorCode=U_ZERO_ERROR;
261850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    length=u_shapeArabic(lamalef, LENGTHOF(lamalef),
261950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                         dest, LENGTHOF(dest),
262050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                         U_SHAPE_LETTERS_UNSHAPE | U_SHAPE_LENGTH_GROW_SHRINK | U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
262150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                         &errorCode);
262250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(U_FAILURE(errorCode) || length == LENGTHOF(lamalef)) {
262350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_err("failure in u_shapeArabic(U_SHAPE_LETTERS_UNSHAPE | U_SHAPE_LENGTH_GROW_SHRINK | U_SHAPE_TEXT_DIRECTION_VISUAL_LTR)\n");
262450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_err("returned %s instead of U_ZERO_ERROR or returned length %d instead of 3\n", u_errorName(errorCode), length);
262550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
2626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
2629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoLamAlefSpecialVLTRArabicShapingTest(void) {
2630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar
2631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    source[]={
2632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*a*/   0x20 ,0x646,0x622,0x644,0x627,0x20,
2633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*b*/   0x646,0x623,0x64E,0x644,0x627,0x20,
2634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*c*/   0x646,0x627,0x670,0x644,0x627,0x20,
2635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*d*/   0x646,0x622,0x653,0x644,0x627,0x20,
2636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*e*/   0x646,0x625,0x655,0x644,0x627,0x20,
2637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*f*/   0x646,0x622,0x654,0x644,0x627,0x20,
2638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*g*/   0xFEFC,0x639
2639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, shape_near[]={
2640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20,0xfee5,0x20,0xfef5,0xfe8d,0x20,0xfee5,0x20,0xfe76,0xfef7,0xfe8d,0x20,
2641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfee5,0x20,0x670,0xfefb,0xfe8d,0x20,0xfee5,0x20,0x653,0xfef5,0xfe8d,0x20,
2642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfee5,0x20,0x655,0xfef9,0xfe8d,0x20,0xfee5,0x20,0x654,0xfef5,0xfe8d,0x20,
2643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfefc,0xfecb
2644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, shape_at_end[]={
2645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,0xfef7,0xfe8d,0x20,0xfee5,0x670,
2646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,0x20,0xfee5,0x655,0xfef9,0xfe8d,
2647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb,0x20,0x20,0x20,0x20,0x20,0x20
2648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, shape_at_begin[]={
2649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,
2650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfef7,0xfe8d,0x20,0xfee5,0x670,0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,
2651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20,0xfee5,0x655,0xfef9,0xfe8d,0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb
2652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, shape_grow_shrink[]={
2653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,0xfef7,0xfe8d,0x20,0xfee5,
2654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x670,0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,0x20,0xfee5,0x655,0xfef9,
2655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfe8d,0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb
2656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, shape_excepttashkeel_near[]={
2657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20,0xfee5,0x20,0xfef5,0xfe8d,0x20,0xfee5,0x20,0xfe76,0xfef7,0xfe8d,0x20,
2658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfee5,0x20,0x670,0xfefb,0xfe8d,0x20,0xfee5,0x20,0x653,0xfef5,0xfe8d,0x20,
2659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfee5,0x20,0x655,0xfef9,0xfe8d,0x20,0xfee5,0x20,0x654,0xfef5,0xfe8d,0x20,
2660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfefc,0xfecb
2661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, shape_excepttashkeel_at_end[]={
2662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,0xfef7,0xfe8d,0x20,0xfee5,
2663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x670,0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,0x20,0xfee5,0x655,0xfef9,
2664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfe8d,0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb,0x20,0x20,0x20,
2665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20,0x20,0x20
2666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, shape_excepttashkeel_at_begin[]={
2667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,
2668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfef7,0xfe8d,0x20,0xfee5,0x670,0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,
2669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20,0xfee5,0x655,0xfef9,0xfe8d,0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb
2670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, shape_excepttashkeel_grow_shrink[]={
2671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20,0xfee5,0xfef5,0xfe8d,0x20,0xfee5,0xfe76,0xfef7,0xfe8d,0x20,0xfee5,0x670,
2672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfefb,0xfe8d,0x20,0xfee5,0x653,0xfef5,0xfe8d,0x20,0xfee5,0x655,0xfef9,0xfe8d,
2673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20,0xfee5,0x654,0xfef5,0xfe8d,0x20,0xfefc,0xfecb
2674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar dest[38];
2677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
2678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
2679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_FIXED_SPACES_NEAR|
2685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
2686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_near) || memcmp(dest, shape_near, length*U_SIZEOF_UCHAR)!=0) {
2689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(LAMALEF shape_near)\n");
2690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_FIXED_SPACES_AT_END|
2697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
2698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_at_end) || memcmp(dest, shape_at_end, length*U_SIZEOF_UCHAR)!=0) {
2701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(LAMALEF shape_at_end)\n");
2702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_FIXED_SPACES_AT_BEGINNING|
2709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
2710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_at_begin) || memcmp(dest, shape_at_begin, length*U_SIZEOF_UCHAR)!=0) {
2713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(LAMALEF shape_at_begin)\n");
2714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_GROW_SHRINK|
2721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
2722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || memcmp(dest, shape_grow_shrink, length*U_SIZEOF_UCHAR)!=0) {
2725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(LAMALEF shape_grow_shrink)\n");
2726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* ==================== U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED ==================== */
2729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_FIXED_SPACES_NEAR|
2735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
2736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_excepttashkeel_near) || memcmp(dest, shape_excepttashkeel_near, length*U_SIZEOF_UCHAR)!=0) {
2739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(LAMALEF shape_excepttashkeel_near)\n");
2740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_FIXED_SPACES_AT_END|
2747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
2748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_excepttashkeel_at_end) || memcmp(dest,shape_excepttashkeel_at_end , length*U_SIZEOF_UCHAR)!=0) {
2751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(LAMALEF shape_excepttashkeel_at_end)\n");
2752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_FIXED_SPACES_AT_BEGINNING|
2759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
2760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_excepttashkeel_at_begin) || memcmp(dest, shape_excepttashkeel_at_begin, length*U_SIZEOF_UCHAR)!=0) {
2763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(LAMALEF shape_excepttashkeel_at_begin)\n");
2764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_GROW_SHRINK|
2771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
2772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || memcmp(dest, shape_excepttashkeel_grow_shrink, length*U_SIZEOF_UCHAR)!=0) {
2775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(LAMALEF shape_excepttashkeel_grow_shrink)\n");
2776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
2780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoTashkeelSpecialVLTRArabicShapingTest(void) {
2781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar
2782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    source[]={
2783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x64A,0x628,0x631,0x639,0x20,
2784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x64A,0x628,0x651,0x631,0x64E,0x639,0x20,
2785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x64C,0x64A,0x628,0x631,0x64F,0x639,0x20,
2786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x628,0x670,0x631,0x670,0x639,0x20,
2787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x628,0x653,0x631,0x653,0x639,0x20,
2788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x628,0x654,0x631,0x654,0x639,0x20,
2789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x628,0x655,0x631,0x655,0x639,0x20,
2790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, shape_near[]={
2791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfef2,0xfe91,0xfeae,0xfecb,0x20,0xfef2,0xfe91,0xfe7c,0xfeae,0xfe77,0xfecb,
2792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20,0xfe72,0xfef2,0xfe91,0xfeae,0xfe79,0xfecb,0x20,0xfe8f,0x670,0xfeae,0x670,
2793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfecb,0x20,0xfe8f,0x653,0xfeae,0x653,0xfecb,0x20,0xfe8f,0x654,0xfeae,0x654,
2794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfecb,0x20,0xfe8f,0x655,0xfeae,0x655,0xfecb,0x20
2795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, shape_excepttashkeel_near[]={
2796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfef2,0xfe91,0xfeae,0xfecb,0x20,0xfef2,0xfe91,0xfe7c,0xfeae,0xfe76,0xfecb,0x20,
2797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfe72,0xfef2,0xfe91,0xfeae,0xfe78,0xfecb,0x20,0xfe8f,0x670,0xfeae,0x670,0xfecb,
2798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20,0xfe8f,0x653,0xfeae,0x653,0xfecb,0x20,0xfe8f,0x654,0xfeae,0x654,0xfecb,0x20,
2799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfe8f,0x655,0xfeae,0x655,0xfecb,0x20
2800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar dest[43];
2803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
2804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
2805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_LENGTH_FIXED_SPACES_NEAR|
2811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
2812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_near) || memcmp(dest, shape_near, length*U_SIZEOF_UCHAR)!=0) {
2815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(TASHKEEL shape_near)\n");
2816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_LENGTH_FIXED_SPACES_NEAR|
2823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
2824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(shape_excepttashkeel_near) || memcmp(dest, shape_excepttashkeel_near, length*U_SIZEOF_UCHAR)!=0) {
2827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(TASHKEEL shape_excepttashkeel_near)\n");
2828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
2832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoLOGICALArabicDeShapingTest(void) {
2833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar
2834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    source[]={
2835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x0020,0x0020,0x0020,0xFE8D,0xFEF5,0x0020,0xFEE5,0x0020,0xFE8D,0xFEF7,0x0020,
2836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xFED7,0xFEFC,0x0020,0xFEE1,0x0020,0xFE8D,0xFEDF,0xFECC,0xFEAE,0xFE91,0xFEF4,
2837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xFE94,0x0020,0xFE8D,0xFEDF,0xFEA4,0xFEAE,0xFE93,0x0020,0x0020,0x0020,0x0020
2838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, unshape_near[]={
2839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20,0x20,0x20,0x627,0x644,0x622,0x646,0x20,0x627,0x644,0x623,0x642,0x644,0x627,
2840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x645,0x20,0x627,0x644,0x639,0x631,0x628,0x64a,0x629,0x20,0x627,0x644,0x62d,0x631,
2841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x629,0x20,0x20,0x20,0x20
2842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, unshape_at_end[]={
2843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20,0x20,0x20,0x627,0x644,0x622,0x20,0x646,0x20,0x627,0x644,0x623,0x20,0x642,
2844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x644,0x627,0x20,0x645,0x20,0x627,0x644,0x639,0x631,0x628,0x64a,0x629,0x20,0x627,
2845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x644,0x62d,0x631,0x629,0x20
2846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, unshape_at_begin[]={
2847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x627,0x644,0x622,0x20,0x646,0x20,0x627,0x644,0x623,0x20,0x642,0x644,0x627,0x20,
2848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x645,0x20,0x627,0x644,0x639,0x631,0x628,0x64a,0x629,0x20,0x627,0x644,0x62d,0x631,
2849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x629,0x20,0x20,0x20,0x20
2850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, unshape_grow_shrink[]={
2851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20,0x20,0x20,0x627,0x644,0x622,0x20,0x646,0x20,0x627,0x644,0x623,0x20,0x642,
2852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x644,0x627,0x20,0x645,0x20,0x627,0x644,0x639,0x631,0x628,0x64a,0x629,0x20,0x627,
2853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x644,0x62d,0x631,0x629,0x20,0x20,0x20,0x20
2854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar dest[36];
2857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
2858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
2859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_LETTERS_UNSHAPE|U_SHAPE_LENGTH_FIXED_SPACES_NEAR|
2865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_TEXT_DIRECTION_LOGICAL,
2866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(unshape_near) || memcmp(dest, unshape_near, length*U_SIZEOF_UCHAR)!=0) {
2869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(unshape_near)\n");
2870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_LETTERS_UNSHAPE|U_SHAPE_LENGTH_FIXED_SPACES_AT_END|
2877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_TEXT_DIRECTION_LOGICAL,
2878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(unshape_at_end) || memcmp(dest, unshape_at_end, length*U_SIZEOF_UCHAR)!=0) {
2881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(unshape_at_end)\n");
2882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_LETTERS_UNSHAPE|U_SHAPE_LENGTH_FIXED_SPACES_AT_BEGINNING|
2889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_TEXT_DIRECTION_LOGICAL,
2890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(unshape_at_begin) || memcmp(dest, unshape_at_begin, length*U_SIZEOF_UCHAR)!=0) {
2893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(unshape_at_begin)\n");
2894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(source, LENGTHOF(source),
2899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_LETTERS_UNSHAPE|U_SHAPE_LENGTH_GROW_SHRINK|
2901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_TEXT_DIRECTION_LOGICAL,
2902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || memcmp(dest, unshape_grow_shrink, length*U_SIZEOF_UCHAR)!=0) {
2905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(unshape_grow_shrink)\n");
2906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
2911b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehodoTailTest(void) {
2912b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  static const UChar src[] = { 0x0020, 0x0633, 0 };
2913b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  static const UChar dst_old[] = { 0xFEB1, 0x200B,0 };
2914b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  static const UChar dst_new[] = { 0xFEB1, 0xFE73,0 };
2915b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  UChar dst[3] = { 0x0000, 0x0000,0 };
2916b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  int32_t length;
2917b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  UErrorCode status;
291859d709d503bab6e2b61931737e662dd293b40578ccornelius
2919b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  log_verbose("SRC: U+%04X U+%04X\n", src[0],src[1]);
2920b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2921b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  log_verbose("Trying old tail\n");
2922b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  status = U_ZERO_ERROR;
2923b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  length = u_shapeArabic(src, -1, dst, LENGTHOF(dst),
2924b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_SEEN_TWOCELL_NEAR, &status);
2925b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  if(U_FAILURE(status)) {
292659d709d503bab6e2b61931737e662dd293b40578ccornelius    log_err("Fail: status %s\n", u_errorName(status));
2927b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  } else if(length!=2) {
2928b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    log_err("Fail: len %d expected 3\n", length);
2929b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  } else if(u_strncmp(dst,dst_old,LENGTHOF(dst))) {
2930b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    log_err("Fail: got U+%04X U+%04X expected U+%04X U+%04X\n",
2931b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            dst[0],dst[1],dst_old[0],dst_old[1]);
2932b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  } else {
2933b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    log_verbose("OK:  U+%04X U+%04X len %d err %s\n",
2934b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            dst[0],dst[1],length,u_errorName(status));
2935b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  }
2936b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2937b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2938b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  log_verbose("Trying new tail\n");
2939b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  status = U_ZERO_ERROR;
2940b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  length = u_shapeArabic(src, -1, dst, LENGTHOF(dst),
2941b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_SEEN_TWOCELL_NEAR|U_SHAPE_TAIL_NEW_UNICODE, &status);
2942b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  if(U_FAILURE(status)) {
294359d709d503bab6e2b61931737e662dd293b40578ccornelius    log_err("Fail: status %s\n", u_errorName(status));
2944b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  } else if(length!=2) {
2945b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    log_err("Fail: len %d expected 3\n", length);
2946b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  } else if(u_strncmp(dst,dst_new,LENGTHOF(dst))) {
2947b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    log_err("Fail: got U+%04X U+%04X expected U+%04X U+%04X\n",
2948b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            dst[0],dst[1],dst_new[0],dst_new[1]);
2949b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  } else {
2950b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    log_verbose("OK:  U+%04X U+%04X len %d err %s\n",
2951b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            dst[0],dst[1],length,u_errorName(status));
2952b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  }
2953b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
2954b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2955b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void
2956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoArabicShapingTestForBug5421(void) {
2957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar
2958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    persian_letters_source[]={
2959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x0020, 0x0698, 0x067E, 0x0686, 0x06AF, 0x0020
2960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, persian_letters[]={
2961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x0020, 0xFB8B, 0xFB59, 0xFB7D, 0xFB94, 0x0020
2962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, tashkeel_aggregation_source[]={
2963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x0020, 0x0628, 0x0651, 0x064E, 0x062A, 0x0631, 0x0645, 0x0020,
2964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x0628, 0x064E, 0x0651, 0x062A, 0x0631, 0x0645, 0x0020
2965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, tashkeel_aggregation[]={
2966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x0020, 0xFE90, 0xFC60, 0xFE97, 0xFEAE, 0xFEE3,
2967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x0020, 0xFE90, 0xFC60, 0xFE97, 0xFEAE, 0xFEE3, 0x0020
2968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, untouched_presentation_source[]={
2969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x0020 ,0x0627, 0xfe90,0x0020
2970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, untouched_presentation[]={
2971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x0020,0xfe8D, 0xfe90,0x0020
2972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, untouched_presentation_r_source[]={
2973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x0020 ,0xfe90, 0x0627, 0x0020
2974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }, untouched_presentation_r[]={
2975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x0020, 0xfe90,0xfe8D,0x0020
2976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar dest[38];
2979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
2980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
2981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(persian_letters_source, LENGTHOF(persian_letters_source),
2985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
2987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
2988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(persian_letters) || memcmp(dest, persian_letters, length*U_SIZEOF_UCHAR)!=0) {
2990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(persian_letters)\n");
2991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(tashkeel_aggregation_source, LENGTHOF(tashkeel_aggregation_source),
2996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
2997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_AGGREGATE_TASHKEEL|U_SHAPE_PRESERVE_PRESENTATION|
2998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_LETTERS_SHAPE_TASHKEEL_ISOLATED|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
2999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
3000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(tashkeel_aggregation) || memcmp(dest, tashkeel_aggregation, length*U_SIZEOF_UCHAR)!=0) {
3002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(tashkeel_aggregation)\n");
3003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
3006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(untouched_presentation_source, LENGTHOF(untouched_presentation_source),
3008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
3009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_PRESERVE_PRESENTATION|
3010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_TEXT_DIRECTION_VISUAL_LTR,
3011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
3012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(untouched_presentation) || memcmp(dest, untouched_presentation, length*U_SIZEOF_UCHAR)!=0) {
3014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(untouched_presentation)\n");
3015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
3018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_shapeArabic(untouched_presentation_r_source, LENGTHOF(untouched_presentation_r_source),
3020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         dest, LENGTHOF(dest),
3021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_PRESERVE_PRESENTATION|
3022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         U_SHAPE_LETTERS_SHAPE|U_SHAPE_TEXT_DIRECTION_LOGICAL,
3023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &errorCode);
3024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=LENGTHOF(untouched_presentation_r) || memcmp(dest, untouched_presentation_r, length*U_SIZEOF_UCHAR)!=0) {
3026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("failure in u_shapeArabic(untouched_presentation_r)\n");
3027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
303054dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void
303154dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusdoArabicShapingTestForBug8703(void) {
303254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    static const UChar
303354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    letters_source1[]={
303454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0x0634,0x0651,0x0645,0x0652,0x0633
303554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_source2[]={
303659d709d503bab6e2b61931737e662dd293b40578ccornelius        0x0634,0x0651,0x0645,0x0652,0x0633
303754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_source3[]={
303854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius       0x0634,0x0651,0x0645,0x0652,0x0633
303954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_source4[]={
304059d709d503bab6e2b61931737e662dd293b40578ccornelius        0x0634,0x0651,0x0645,0x0652,0x0633
304154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_source5[]={
304254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0x0633,0x0652,0x0645,0x0651,0x0634
304354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_source6[]={
304459d709d503bab6e2b61931737e662dd293b40578ccornelius        0x0633,0x0652,0x0645,0x0651,0x0634
304554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_source7[]={
304654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0x0633,0x0652,0x0645,0x0651,0x0634
304754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_source8[]={
304854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0x0633,0x0652,0x0645,0x0651,0x0634
304954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_dest1[]={
305059d709d503bab6e2b61931737e662dd293b40578ccornelius        0x0020,0xFEB7,0xFE7D,0xFEE4,0xFEB2
305154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_dest2[]={
305254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xFEB7,0xFE7D,0xFEE4,0xFEB2,0x0020
305354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_dest3[]={
305454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xFEB7,0xFE7D,0xFEE4,0xFEB2
305554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_dest4[]={
305654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xFEB7,0xFE7D,0xFEE4,0x0640,0xFEB2
305754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_dest5[]={
305859d709d503bab6e2b61931737e662dd293b40578ccornelius        0x0020,0xFEB2,0xFEE4,0xFE7D,0xFEB7
305954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_dest6[]={
306054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xFEB2,0xFEE4,0xFE7D,0xFEB7,0x0020
306154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_dest7[]={
306254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xFEB2,0xFEE4,0xFE7D,0xFEB7
306354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_dest8[]={
306454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xFEB2,0x0640,0xFEE4,0xFE7D,0xFEB7
306554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    };
306654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
306754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UChar dest[20];
306854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UErrorCode errorCode;
306954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    int32_t length;
307054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
307154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    errorCode=U_ZERO_ERROR;
307254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
307354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    length=u_shapeArabic(letters_source1, LENGTHOF(letters_source1),
307454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         dest, LENGTHOF(dest),
307554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_BEGIN | U_SHAPE_LETTERS_SHAPE,
307654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         &errorCode);
307754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
307854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest1) || memcmp(dest, letters_dest1, length*U_SIZEOF_UCHAR)!=0) {
307954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("failure in u_shapeArabic(letters_source1)\n");
308054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
308154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
308254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    errorCode=U_ZERO_ERROR;
308354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
308454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    length=u_shapeArabic(letters_source2, LENGTHOF(letters_source2),
308554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         dest, LENGTHOF(dest),
308654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_END | U_SHAPE_LETTERS_SHAPE,
308754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         &errorCode);
308854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
308954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest2) || memcmp(dest, letters_dest2, length*U_SIZEOF_UCHAR)!=0) {
309054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("failure in u_shapeArabic(letters_source2)\n");
309154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
309254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
309354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    errorCode=U_ZERO_ERROR;
309454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
309554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    length=u_shapeArabic(letters_source3, LENGTHOF(letters_source3),
309654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         dest, LENGTHOF(dest),
309754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_RESIZE | U_SHAPE_LETTERS_SHAPE,
309854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         &errorCode);
309954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
310054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest3) || memcmp(dest, letters_dest3, length*U_SIZEOF_UCHAR)!=0) {
310154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("failure in u_shapeArabic(letters_source3)\n");
310254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
310354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
310454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    errorCode=U_ZERO_ERROR;
310554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
310654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    length=u_shapeArabic(letters_source4, LENGTHOF(letters_source4),
310754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         dest, LENGTHOF(dest),
310854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_REPLACE_BY_TATWEEL | U_SHAPE_LETTERS_SHAPE,
310954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         &errorCode);
311054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
311154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest4) || memcmp(dest, letters_dest4, length*U_SIZEOF_UCHAR)!=0) {
311254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("failure in u_shapeArabic(letters_source4)\n");
311354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
311454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
311554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    errorCode=U_ZERO_ERROR;
311654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
311754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    length=u_shapeArabic(letters_source5, LENGTHOF(letters_source5),
311854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         dest, LENGTHOF(dest),
311954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_BEGIN | U_SHAPE_LETTERS_SHAPE,
312054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         &errorCode);
312154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
312254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest5) || memcmp(dest, letters_dest5, length*U_SIZEOF_UCHAR)!=0) {
312354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("failure in u_shapeArabic(letters_source5)\n");
312454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
312554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
312654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    errorCode=U_ZERO_ERROR;
312754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
312854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    length=u_shapeArabic(letters_source6, LENGTHOF(letters_source6),
312954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         dest, LENGTHOF(dest),
313054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_END | U_SHAPE_LETTERS_SHAPE,
313154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         &errorCode);
313254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
313354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest6) || memcmp(dest, letters_dest6, length*U_SIZEOF_UCHAR)!=0) {
313454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("failure in u_shapeArabic(letters_source6)\n");
313554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
313654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
313754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    errorCode=U_ZERO_ERROR;
313854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
313954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    length=u_shapeArabic(letters_source7, LENGTHOF(letters_source7),
314054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         dest, LENGTHOF(dest),
314154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_RESIZE | U_SHAPE_LETTERS_SHAPE,
314254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         &errorCode);
314354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
314454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest7) || memcmp(dest, letters_dest7, length*U_SIZEOF_UCHAR)!=0) {
314554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("failure in u_shapeArabic(letters_source7)\n");
314654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
314754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
314854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    errorCode=U_ZERO_ERROR;
314954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
315054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    length=u_shapeArabic(letters_source8, LENGTHOF(letters_source8),
315154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         dest, LENGTHOF(dest),
315254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_REPLACE_BY_TATWEEL | U_SHAPE_LETTERS_SHAPE,
315354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         &errorCode);
315454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
315554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest8) || memcmp(dest, letters_dest8, length*U_SIZEOF_UCHAR)!=0) {
315654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("failure in u_shapeArabic(letters_source8)\n");
315754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
315854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
315954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
316054dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void
316154dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusdoArabicShapingTestForBug9024(void) {
316254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    static const UChar
316354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    letters_source1[]={  /* Arabic mathematical Symbols 0x1EE00 - 0x1EE1B */
316459d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE00, 0xD83B, 0xDE01, 0xD83B, 0xDE02, 0xD83B, 0xDE03, 0x20,
316554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE24, 0xD83B, 0xDE05, 0xD83B, 0xDE06, 0x20,
316654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE07, 0xD83B, 0xDE08, 0xD83B, 0xDE09, 0x20,
316754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE0A, 0xD83B, 0xDE0B, 0xD83B, 0xDE0C, 0xD83B, 0xDE0D, 0x20,
316854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE0E, 0xD83B, 0xDE0F, 0xD83B, 0xDE10, 0xD83B, 0xDE11, 0x20,
316954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE12, 0xD83B, 0xDE13, 0xD83B, 0xDE14, 0xD83B, 0xDE15, 0x20,
317054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE16, 0xD83B, 0xDE17, 0xD83B, 0xDE18, 0x20,
317154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE19, 0xD83B, 0xDE1A, 0xD83B, 0xDE1B
317254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_source2[]={/* Arabic mathematical Symbols - Looped Symbols, 0x1EE80 - 0x1EE9B */
317359d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE80, 0xD83B, 0xDE81, 0xD83B, 0xDE82, 0xD83B, 0xDE83, 0x20,
317454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE84, 0xD83B, 0xDE85, 0xD83B, 0xDE86, 0x20,
317554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE87, 0xD83B, 0xDE88, 0xD83B, 0xDE89, 0x20,
317654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE8B, 0xD83B, 0xDE8C, 0xD83B, 0xDE8D, 0x20,
317754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE8E, 0xD83B, 0xDE8F, 0xD83B, 0xDE90, 0xD83B, 0xDE91, 0x20,
317854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE92, 0xD83B, 0xDE93, 0xD83B, 0xDE94, 0xD83B, 0xDE95, 0x20,
317954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE96, 0xD83B, 0xDE97, 0xD83B, 0xDE98, 0x20,
318054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE99, 0xD83B, 0xDE9A, 0xD83B, 0xDE9B
318154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_source3[]={/* Arabic mathematical Symbols - Double-struck Symbols, 0x1EEA1 - 0x1EEBB */
318259d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDEA1, 0xD83B, 0xDEA2, 0xD83B, 0xDEA3, 0x20,
318354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDEA5, 0xD83B, 0xDEA6, 0x20,
318454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDEA7, 0xD83B, 0xDEA8, 0xD83B, 0xDEA9, 0x20,
318554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDEAB, 0xD83B, 0xDEAC, 0xD83B, 0xDEAD, 0x20,
318654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDEAE, 0xD83B, 0xDEAF, 0xD83B, 0xDEB0, 0xD83B, 0xDEB1, 0x20,
318754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDEB2, 0xD83B, 0xDEB3, 0xD83B, 0xDEB4, 0xD83B, 0xDEB5, 0x20,
318854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDEB6, 0xD83B, 0xDEB7, 0xD83B, 0xDEB8, 0x20,
318954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDEB9, 0xD83B, 0xDEBA, 0xD83B, 0xDEBB
319054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_source4[]={/* Arabic mathematical Symbols - Initial Symbols, 0x1EE21 - 0x1EE3B */
319159d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE21, 0xD83B, 0xDE22, 0x20,
319254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE27, 0xD83B, 0xDE29, 0x20,
319354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE2A, 0xD83B, 0xDE2B, 0xD83B, 0xDE2C, 0xD83B, 0xDE2D, 0x20,
319454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE2E, 0xD83B, 0xDE2F, 0xD83B, 0xDE30, 0xD83B, 0xDE31, 0x20,
319554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE32, 0xD83B, 0xDE34, 0xD83B, 0xDE35, 0x20,
319654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE36, 0xD83B, 0xDE37, 0x20,
319754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE39, 0xD83B, 0xDE3B
319854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_source5[]={/* Arabic mathematical Symbols - Tailed Symbols */
319959d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE42, 0xD83B, 0xDE47, 0xD83B, 0xDE49, 0xD83B, 0xDE4B, 0x20,
320054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE4D, 0xD83B, 0xDE4E, 0xD83B, 0xDE4F, 0x20,
320154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE51, 0xD83B, 0xDE52, 0xD83B, 0xDE54, 0xD83B, 0xDE57, 0x20,
320254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE59, 0xD83B, 0xDE5B, 0xD83B, 0xDE5D, 0xD83B, 0xDE5F
320354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_source6[]={/* Arabic mathematical Symbols - Stretched Symbols with 06 range */
320454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE21, 0x0633, 0xD83B, 0xDE62, 0x0647
320554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_dest1[]={
320659d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE00, 0xD83B, 0xDE01, 0xD83B, 0xDE02, 0xD83B, 0xDE03, 0x20,
320754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE24, 0xD83B, 0xDE05, 0xD83B, 0xDE06, 0x20,
320854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE07, 0xD83B, 0xDE08, 0xD83B, 0xDE09, 0x20,
320954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE0A, 0xD83B, 0xDE0B, 0xD83B, 0xDE0C, 0xD83B, 0xDE0D, 0x20,
321054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE0E, 0xD83B, 0xDE0F, 0xD83B, 0xDE10, 0xD83B, 0xDE11, 0x20,
321154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE12, 0xD83B, 0xDE13, 0xD83B, 0xDE14, 0xD83B, 0xDE15, 0x20,
321254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE16, 0xD83B, 0xDE17, 0xD83B, 0xDE18, 0x20,
321354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE19, 0xD83B, 0xDE1A, 0xD83B, 0xDE1B
321454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_dest2[]={
321559d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE80, 0xD83B, 0xDE81, 0xD83B, 0xDE82, 0xD83B, 0xDE83, 0x20,
321654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE84, 0xD83B, 0xDE85, 0xD83B, 0xDE86, 0x20,
321754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE87, 0xD83B, 0xDE88, 0xD83B, 0xDE89, 0x20,
321854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE8B, 0xD83B, 0xDE8C, 0xD83B, 0xDE8D, 0x20,
321954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE8E, 0xD83B, 0xDE8F, 0xD83B, 0xDE90, 0xD83B, 0xDE91, 0x20,
322054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE92, 0xD83B, 0xDE93, 0xD83B, 0xDE94, 0xD83B, 0xDE95, 0x20,
322154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE96, 0xD83B, 0xDE97, 0xD83B, 0xDE98, 0x20,
322254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE99, 0xD83B, 0xDE9A, 0xD83B, 0xDE9B
322354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_dest3[]={
322459d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDEA1, 0xD83B, 0xDEA2, 0xD83B, 0xDEA3, 0x20,
322554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDEA5, 0xD83B, 0xDEA6, 0x20,
322654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDEA7, 0xD83B, 0xDEA8, 0xD83B, 0xDEA9, 0x20,
322754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDEAB, 0xD83B, 0xDEAC, 0xD83B, 0xDEAD, 0x20,
322854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDEAE, 0xD83B, 0xDEAF, 0xD83B, 0xDEB0, 0xD83B, 0xDEB1, 0x20,
322954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDEB2, 0xD83B, 0xDEB3, 0xD83B, 0xDEB4, 0xD83B, 0xDEB5, 0x20,
323054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDEB6, 0xD83B, 0xDEB7, 0xD83B, 0xDEB8, 0x20,
323154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDEB9, 0xD83B, 0xDEBA, 0xD83B, 0xDEBB
323254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_dest4[]={
323359d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE21, 0xD83B, 0xDE22, 0x20,
323454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE27, 0xD83B, 0xDE29, 0x20,
323554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE2A, 0xD83B, 0xDE2B, 0xD83B, 0xDE2C, 0xD83B, 0xDE2D, 0x20,
323654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE2E, 0xD83B, 0xDE2F, 0xD83B, 0xDE30, 0xD83B, 0xDE31, 0x20,
323754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE32, 0xD83B, 0xDE34, 0xD83B, 0xDE35, 0x20,
323854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE36, 0xD83B, 0xDE37, 0x20,
323954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE39, 0xD83B, 0xDE3B
324054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_dest5[]={
324159d709d503bab6e2b61931737e662dd293b40578ccornelius        0xD83B, 0xDE42, 0xD83B, 0xDE47, 0xD83B, 0xDE49, 0xD83B, 0xDE4B, 0x20,
324254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE4D, 0xD83B, 0xDE4E, 0xD83B, 0xDE4F, 0x20,
324354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE51, 0xD83B, 0xDE52, 0xD83B, 0xDE54, 0xD83B, 0xDE57, 0x20,
324454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE59, 0xD83B, 0xDE5B, 0xD83B, 0xDE5D, 0xD83B, 0xDE5F
324554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }, letters_dest6[]={
324654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        0xD83B, 0xDE21, 0xFEB1, 0xD83B, 0xDE62, 0xFEE9
324754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    };
324854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
324954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UChar dest[MAXLEN];
325054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UErrorCode errorCode;
325154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    int32_t length;
325254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
325354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    errorCode=U_ZERO_ERROR;
325454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
325554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    length=u_shapeArabic(letters_source1, LENGTHOF(letters_source1),
325654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         dest, LENGTHOF(dest),
325754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_BEGIN | U_SHAPE_LETTERS_SHAPE,
325854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         &errorCode);
325954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
326054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest1) || memcmp(dest, letters_dest1, length*U_SIZEOF_UCHAR)!=0) {
326154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("failure in u_shapeArabic(letters_source1)\n");
326254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
326354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
326454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    errorCode=U_ZERO_ERROR;
326554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
326654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    length=u_shapeArabic(letters_source2, LENGTHOF(letters_source2),
326754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         dest, LENGTHOF(dest),
326854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_END | U_SHAPE_LETTERS_SHAPE,
326954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         &errorCode);
327054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
327154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest2) || memcmp(dest, letters_dest2, length*U_SIZEOF_UCHAR)!=0) {
327254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("failure in u_shapeArabic(letters_source2)\n");
327354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
327454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
327554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    errorCode=U_ZERO_ERROR;
327654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
327754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    length=u_shapeArabic(letters_source3, LENGTHOF(letters_source3),
327854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         dest, LENGTHOF(dest),
327954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_RESIZE | U_SHAPE_LETTERS_SHAPE,
328054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         &errorCode);
328154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
328254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest3) || memcmp(dest, letters_dest3, length*U_SIZEOF_UCHAR)!=0) {
328354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("failure in u_shapeArabic(letters_source3)\n");
328454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
328554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
328654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    errorCode=U_ZERO_ERROR;
328754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
328854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    length=u_shapeArabic(letters_source4, LENGTHOF(letters_source4),
328954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         dest, LENGTHOF(dest),
329054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         U_SHAPE_TEXT_DIRECTION_VISUAL_RTL | U_SHAPE_TASHKEEL_REPLACE_BY_TATWEEL | U_SHAPE_LETTERS_SHAPE,
329154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         &errorCode);
329254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
329354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest4) || memcmp(dest, letters_dest4, length*U_SIZEOF_UCHAR)!=0) {
329454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("failure in u_shapeArabic(letters_source4)\n");
329554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
329654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
329754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    errorCode=U_ZERO_ERROR;
329854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
329954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    length=u_shapeArabic(letters_source5, LENGTHOF(letters_source5),
330054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         dest, LENGTHOF(dest),
330154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_BEGIN | U_SHAPE_LETTERS_SHAPE,
330254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         &errorCode);
330354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
330454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest5) || memcmp(dest, letters_dest5, length*U_SIZEOF_UCHAR)!=0) {
330554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("failure in u_shapeArabic(letters_source5)\n");
330654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
330754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
330854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    errorCode=U_ZERO_ERROR;
330954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
331054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    length=u_shapeArabic(letters_source6, LENGTHOF(letters_source6),
331154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         dest, LENGTHOF(dest),
331254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         U_SHAPE_TEXT_DIRECTION_VISUAL_LTR | U_SHAPE_TASHKEEL_END | U_SHAPE_LETTERS_SHAPE,
331354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                         &errorCode);
331454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
331554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(errorCode) || length!=LENGTHOF(letters_dest6) || memcmp(dest, letters_dest6, length*U_SIZEOF_UCHAR)!=0) {
331654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("failure in u_shapeArabic(letters_source6)\n");
331754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
331854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
331954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
332054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
332159d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void _testPresentationForms(const UChar* in) {
332259d709d503bab6e2b61931737e662dd293b40578ccornelius  enum Forms { GENERIC, ISOLATED, FINAL, INITIAL, MEDIAL };
332359d709d503bab6e2b61931737e662dd293b40578ccornelius  /* This character is used to check whether the in-character is rewritten correctly
332459d709d503bab6e2b61931737e662dd293b40578ccornelius     and whether the surrounding characters are shaped correctly as well. */
332559d709d503bab6e2b61931737e662dd293b40578ccornelius  UChar otherChar[] = {0x0628, 0xfe8f, 0xfe90, 0xfe91, 0xfe92};
332659d709d503bab6e2b61931737e662dd293b40578ccornelius  UChar src[3];
332759d709d503bab6e2b61931737e662dd293b40578ccornelius  UChar dst[3];
332859d709d503bab6e2b61931737e662dd293b40578ccornelius  UErrorCode errorCode;
332959d709d503bab6e2b61931737e662dd293b40578ccornelius  int32_t length;
333059d709d503bab6e2b61931737e662dd293b40578ccornelius
333159d709d503bab6e2b61931737e662dd293b40578ccornelius  /* Testing isolated shaping */
333259d709d503bab6e2b61931737e662dd293b40578ccornelius  src[0] = in[GENERIC];
333359d709d503bab6e2b61931737e662dd293b40578ccornelius  errorCode=U_ZERO_ERROR;
333459d709d503bab6e2b61931737e662dd293b40578ccornelius  length=u_shapeArabic(src, 1,
333559d709d503bab6e2b61931737e662dd293b40578ccornelius                       dst, 1,
333659d709d503bab6e2b61931737e662dd293b40578ccornelius                       U_SHAPE_LETTERS_SHAPE,
333759d709d503bab6e2b61931737e662dd293b40578ccornelius                       &errorCode);
333859d709d503bab6e2b61931737e662dd293b40578ccornelius  if(U_FAILURE(errorCode) || length!=1 || dst[0] != in[ISOLATED]) {
333959d709d503bab6e2b61931737e662dd293b40578ccornelius      log_err("failure in u_shapeArabic(_testAllForms: shaping isolated): %x\n", in[GENERIC]);
334059d709d503bab6e2b61931737e662dd293b40578ccornelius  }
334159d709d503bab6e2b61931737e662dd293b40578ccornelius  errorCode=U_ZERO_ERROR;
334259d709d503bab6e2b61931737e662dd293b40578ccornelius  length=u_shapeArabic(dst, 1,
334359d709d503bab6e2b61931737e662dd293b40578ccornelius                       src, 1,
334459d709d503bab6e2b61931737e662dd293b40578ccornelius                       U_SHAPE_LETTERS_UNSHAPE,
334559d709d503bab6e2b61931737e662dd293b40578ccornelius                       &errorCode);
334659d709d503bab6e2b61931737e662dd293b40578ccornelius  if(U_FAILURE(errorCode) || length!=1 || src[0] != in[GENERIC]) {
334759d709d503bab6e2b61931737e662dd293b40578ccornelius      log_err("failure in u_shapeArabic(_testAllForms: unshaping isolated): %x\n", in[GENERIC]);
334859d709d503bab6e2b61931737e662dd293b40578ccornelius  }
334959d709d503bab6e2b61931737e662dd293b40578ccornelius
335059d709d503bab6e2b61931737e662dd293b40578ccornelius  /* Testing final shaping */
335159d709d503bab6e2b61931737e662dd293b40578ccornelius  src[0] = otherChar[GENERIC];
335259d709d503bab6e2b61931737e662dd293b40578ccornelius  src[1] = in[GENERIC];
335359d709d503bab6e2b61931737e662dd293b40578ccornelius  if (in[FINAL] != 0) {
335459d709d503bab6e2b61931737e662dd293b40578ccornelius    errorCode=U_ZERO_ERROR;
335559d709d503bab6e2b61931737e662dd293b40578ccornelius    length=u_shapeArabic(src, 2,
335659d709d503bab6e2b61931737e662dd293b40578ccornelius                         dst, 2,
335759d709d503bab6e2b61931737e662dd293b40578ccornelius                         U_SHAPE_LETTERS_SHAPE,
335859d709d503bab6e2b61931737e662dd293b40578ccornelius                         &errorCode);
335959d709d503bab6e2b61931737e662dd293b40578ccornelius    if(U_FAILURE(errorCode) || length!=2 || dst[0] != otherChar[INITIAL] || dst[1] != in[FINAL]) {
336059d709d503bab6e2b61931737e662dd293b40578ccornelius      log_err("failure in u_shapeArabic(_testAllForms: shaping final): %x\n", in[GENERIC]);
336159d709d503bab6e2b61931737e662dd293b40578ccornelius    }
336259d709d503bab6e2b61931737e662dd293b40578ccornelius    errorCode=U_ZERO_ERROR;
336359d709d503bab6e2b61931737e662dd293b40578ccornelius    length=u_shapeArabic(dst, 2,
336459d709d503bab6e2b61931737e662dd293b40578ccornelius                         src, 2,
336559d709d503bab6e2b61931737e662dd293b40578ccornelius                         U_SHAPE_LETTERS_UNSHAPE,
336659d709d503bab6e2b61931737e662dd293b40578ccornelius                         &errorCode);
336759d709d503bab6e2b61931737e662dd293b40578ccornelius    if(U_FAILURE(errorCode) || length!=2 || src[0] != otherChar[GENERIC] || src[1] != in[GENERIC]) {
336859d709d503bab6e2b61931737e662dd293b40578ccornelius      log_err("failure in u_shapeArabic(_testAllForms: unshaping final): %x\n", in[GENERIC]);
336959d709d503bab6e2b61931737e662dd293b40578ccornelius    }
337059d709d503bab6e2b61931737e662dd293b40578ccornelius  } else {
337159d709d503bab6e2b61931737e662dd293b40578ccornelius    errorCode=U_ZERO_ERROR;
337259d709d503bab6e2b61931737e662dd293b40578ccornelius    length=u_shapeArabic(src, 2,
337359d709d503bab6e2b61931737e662dd293b40578ccornelius                         dst, 2,
337459d709d503bab6e2b61931737e662dd293b40578ccornelius                         U_SHAPE_LETTERS_SHAPE,
337559d709d503bab6e2b61931737e662dd293b40578ccornelius                         &errorCode);
337659d709d503bab6e2b61931737e662dd293b40578ccornelius    if(U_FAILURE(errorCode) || length!=2 || dst[0] != otherChar[ISOLATED] || dst[1] != in[ISOLATED]) {
337759d709d503bab6e2b61931737e662dd293b40578ccornelius      log_err("failure in u_shapeArabic(_testAllForms: shaping final): %x\n", in[GENERIC]);
337859d709d503bab6e2b61931737e662dd293b40578ccornelius    }
337959d709d503bab6e2b61931737e662dd293b40578ccornelius    errorCode=U_ZERO_ERROR;
338059d709d503bab6e2b61931737e662dd293b40578ccornelius    length=u_shapeArabic(dst, 2,
338159d709d503bab6e2b61931737e662dd293b40578ccornelius                         src, 2,
338259d709d503bab6e2b61931737e662dd293b40578ccornelius                         U_SHAPE_LETTERS_UNSHAPE,
338359d709d503bab6e2b61931737e662dd293b40578ccornelius                         &errorCode);
338459d709d503bab6e2b61931737e662dd293b40578ccornelius    if(U_FAILURE(errorCode) || length!=2 || src[0] != otherChar[GENERIC] || src[1] != in[GENERIC]) {
338559d709d503bab6e2b61931737e662dd293b40578ccornelius      log_err("failure in u_shapeArabic(_testAllForms: unshaping final): %x\n", in[GENERIC]);
338659d709d503bab6e2b61931737e662dd293b40578ccornelius    }
338759d709d503bab6e2b61931737e662dd293b40578ccornelius  }
338859d709d503bab6e2b61931737e662dd293b40578ccornelius
338959d709d503bab6e2b61931737e662dd293b40578ccornelius  /* Testing initial shaping */
339059d709d503bab6e2b61931737e662dd293b40578ccornelius  src[0] = in[GENERIC];
339159d709d503bab6e2b61931737e662dd293b40578ccornelius  src[1] = otherChar[GENERIC];
339259d709d503bab6e2b61931737e662dd293b40578ccornelius  if (in[INITIAL] != 0) {
339359d709d503bab6e2b61931737e662dd293b40578ccornelius    /* Testing characters that have an initial form */
339459d709d503bab6e2b61931737e662dd293b40578ccornelius    errorCode=U_ZERO_ERROR;
339559d709d503bab6e2b61931737e662dd293b40578ccornelius    length=u_shapeArabic(src, 2,
339659d709d503bab6e2b61931737e662dd293b40578ccornelius                         dst, 2,
339759d709d503bab6e2b61931737e662dd293b40578ccornelius                         U_SHAPE_LETTERS_SHAPE,
339859d709d503bab6e2b61931737e662dd293b40578ccornelius                         &errorCode);
339959d709d503bab6e2b61931737e662dd293b40578ccornelius    if(U_FAILURE(errorCode) || length!=2 || dst[0] != in[INITIAL] || dst[1] != otherChar[FINAL]) {
340059d709d503bab6e2b61931737e662dd293b40578ccornelius      log_err("failure in u_shapeArabic(_testAllForms: shaping initial): %x\n", in[GENERIC]);
340159d709d503bab6e2b61931737e662dd293b40578ccornelius    }
340259d709d503bab6e2b61931737e662dd293b40578ccornelius    errorCode=U_ZERO_ERROR;
340359d709d503bab6e2b61931737e662dd293b40578ccornelius    length=u_shapeArabic(dst, 2,
340459d709d503bab6e2b61931737e662dd293b40578ccornelius                         src, 2,
340559d709d503bab6e2b61931737e662dd293b40578ccornelius                         U_SHAPE_LETTERS_UNSHAPE,
340659d709d503bab6e2b61931737e662dd293b40578ccornelius                         &errorCode);
340759d709d503bab6e2b61931737e662dd293b40578ccornelius    if(U_FAILURE(errorCode) || length!=2 || src[0] != in[GENERIC] || src[1] != otherChar[GENERIC]) {
340859d709d503bab6e2b61931737e662dd293b40578ccornelius      log_err("failure in u_shapeArabic(_testAllForms: unshaping initial): %x\n", in[GENERIC]);
340959d709d503bab6e2b61931737e662dd293b40578ccornelius    }
341059d709d503bab6e2b61931737e662dd293b40578ccornelius  } else {
341159d709d503bab6e2b61931737e662dd293b40578ccornelius    /* Testing characters that do not have an initial form */
341259d709d503bab6e2b61931737e662dd293b40578ccornelius    errorCode=U_ZERO_ERROR;
341359d709d503bab6e2b61931737e662dd293b40578ccornelius    length=u_shapeArabic(src, 2,
341459d709d503bab6e2b61931737e662dd293b40578ccornelius                         dst, 2,
341559d709d503bab6e2b61931737e662dd293b40578ccornelius                         U_SHAPE_LETTERS_SHAPE,
341659d709d503bab6e2b61931737e662dd293b40578ccornelius                         &errorCode);
341759d709d503bab6e2b61931737e662dd293b40578ccornelius    if(U_FAILURE(errorCode) || length!=2 || dst[0] != in[ISOLATED] || dst[1] != otherChar[ISOLATED]) {
341859d709d503bab6e2b61931737e662dd293b40578ccornelius      log_err("failure in u_shapeArabic(_testTwoForms: shaping initial): %x\n", in[GENERIC]);
341959d709d503bab6e2b61931737e662dd293b40578ccornelius    }
342059d709d503bab6e2b61931737e662dd293b40578ccornelius    errorCode=U_ZERO_ERROR;
342159d709d503bab6e2b61931737e662dd293b40578ccornelius    length=u_shapeArabic(dst, 2,
342259d709d503bab6e2b61931737e662dd293b40578ccornelius                         src, 2,
342359d709d503bab6e2b61931737e662dd293b40578ccornelius                         U_SHAPE_LETTERS_UNSHAPE,
342459d709d503bab6e2b61931737e662dd293b40578ccornelius                         &errorCode);
342559d709d503bab6e2b61931737e662dd293b40578ccornelius    if(U_FAILURE(errorCode) || length!=2 || src[0] != in[GENERIC] || src[1] != otherChar[GENERIC]) {
342659d709d503bab6e2b61931737e662dd293b40578ccornelius      log_err("failure in u_shapeArabic(_testTwoForms: unshaping initial): %x\n", in[GENERIC]);
342759d709d503bab6e2b61931737e662dd293b40578ccornelius    }
342859d709d503bab6e2b61931737e662dd293b40578ccornelius  }
342959d709d503bab6e2b61931737e662dd293b40578ccornelius
343059d709d503bab6e2b61931737e662dd293b40578ccornelius  /* Testing medial shaping */
343159d709d503bab6e2b61931737e662dd293b40578ccornelius  src[0] = otherChar[0];
343259d709d503bab6e2b61931737e662dd293b40578ccornelius  src[1] = in[GENERIC];
343359d709d503bab6e2b61931737e662dd293b40578ccornelius  src[2] = otherChar[0];
343459d709d503bab6e2b61931737e662dd293b40578ccornelius  errorCode=U_ZERO_ERROR;
343559d709d503bab6e2b61931737e662dd293b40578ccornelius  if (in[MEDIAL] != 0) {
343659d709d503bab6e2b61931737e662dd293b40578ccornelius    /* Testing characters that have an medial form */
343759d709d503bab6e2b61931737e662dd293b40578ccornelius    length=u_shapeArabic(src, 3,
343859d709d503bab6e2b61931737e662dd293b40578ccornelius                         dst, 3,
343959d709d503bab6e2b61931737e662dd293b40578ccornelius                         U_SHAPE_LETTERS_SHAPE,
344059d709d503bab6e2b61931737e662dd293b40578ccornelius                         &errorCode);
344159d709d503bab6e2b61931737e662dd293b40578ccornelius    if(U_FAILURE(errorCode) || length!=3 || dst[0] != otherChar[INITIAL] || dst[1] != in[MEDIAL] || dst[2] != otherChar[FINAL]) {
344259d709d503bab6e2b61931737e662dd293b40578ccornelius      log_err("failure in u_shapeArabic(_testAllForms: shaping medial): %x\n", in[GENERIC]);
344359d709d503bab6e2b61931737e662dd293b40578ccornelius    }
344459d709d503bab6e2b61931737e662dd293b40578ccornelius    errorCode=U_ZERO_ERROR;
344559d709d503bab6e2b61931737e662dd293b40578ccornelius    length=u_shapeArabic(dst, 3,
344659d709d503bab6e2b61931737e662dd293b40578ccornelius                         src, 3,
344759d709d503bab6e2b61931737e662dd293b40578ccornelius                         U_SHAPE_LETTERS_UNSHAPE,
344859d709d503bab6e2b61931737e662dd293b40578ccornelius                         &errorCode);
344959d709d503bab6e2b61931737e662dd293b40578ccornelius    if(U_FAILURE(errorCode) || length!=3 || src[0] != otherChar[GENERIC] || src[1] != in[GENERIC] || src[2] != otherChar[GENERIC]) {
345059d709d503bab6e2b61931737e662dd293b40578ccornelius      log_err("failure in u_shapeArabic(_testAllForms: unshaping medial): %x\n", in[GENERIC]);
345159d709d503bab6e2b61931737e662dd293b40578ccornelius    }
345259d709d503bab6e2b61931737e662dd293b40578ccornelius  } else {
345359d709d503bab6e2b61931737e662dd293b40578ccornelius    /* Testing characters that do not have an medial form */
345459d709d503bab6e2b61931737e662dd293b40578ccornelius    errorCode=U_ZERO_ERROR;
345559d709d503bab6e2b61931737e662dd293b40578ccornelius    length=u_shapeArabic(src, 3,
345659d709d503bab6e2b61931737e662dd293b40578ccornelius                         dst, 3,
345759d709d503bab6e2b61931737e662dd293b40578ccornelius                         U_SHAPE_LETTERS_SHAPE,
345859d709d503bab6e2b61931737e662dd293b40578ccornelius                         &errorCode);
345959d709d503bab6e2b61931737e662dd293b40578ccornelius    if(U_FAILURE(errorCode) || length!=3 || dst[0] != otherChar[INITIAL] || dst[1] != in[FINAL] || dst[2] != otherChar[ISOLATED]) {
346059d709d503bab6e2b61931737e662dd293b40578ccornelius      log_err("failure in u_shapeArabic(_testTwoForms: shaping medial): %x\n", in[GENERIC]);
346159d709d503bab6e2b61931737e662dd293b40578ccornelius    }
346259d709d503bab6e2b61931737e662dd293b40578ccornelius    errorCode=U_ZERO_ERROR;
346359d709d503bab6e2b61931737e662dd293b40578ccornelius    length=u_shapeArabic(dst, 3,
346459d709d503bab6e2b61931737e662dd293b40578ccornelius                         src, 3,
346559d709d503bab6e2b61931737e662dd293b40578ccornelius                         U_SHAPE_LETTERS_UNSHAPE,
346659d709d503bab6e2b61931737e662dd293b40578ccornelius                         &errorCode);
346759d709d503bab6e2b61931737e662dd293b40578ccornelius    if(U_FAILURE(errorCode) || length!=3 || src[0] != otherChar[GENERIC] || src[1] != in[GENERIC] || src[2] != otherChar[GENERIC]) {
346859d709d503bab6e2b61931737e662dd293b40578ccornelius      log_err("failure in u_shapeArabic(_testTwoForms: unshaping medial): %x\n", in[GENERIC]);
346959d709d503bab6e2b61931737e662dd293b40578ccornelius    }
347059d709d503bab6e2b61931737e662dd293b40578ccornelius  }
347159d709d503bab6e2b61931737e662dd293b40578ccornelius}
347259d709d503bab6e2b61931737e662dd293b40578ccornelius
347359d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void
347459d709d503bab6e2b61931737e662dd293b40578ccorneliusdoArabicShapingTestForNewCharacters(void) {
347559d709d503bab6e2b61931737e662dd293b40578ccornelius  static const UChar letterForms[][5]={
347659d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0679, 0xFB66, 0xFB67, 0xFB68, 0xFB69 },  /* TTEH */
347759d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x067A, 0xFB5E, 0xFB5F, 0xFB60, 0xFB61 },  /* TTEHEH */
347859d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x067B, 0xFB52, 0xFB53, 0xFB54, 0xFB55 },  /* BEEH */
347959d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0688, 0xFB88, 0xFB89, 0, 0 },            /* DDAL */
348059d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x068C, 0xFB84, 0xFB85, 0, 0 },            /* DAHAL */
348159d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x068D, 0xFB82, 0xFB83, 0, 0 },            /* DDAHAL */
348259d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x068E, 0xFB86, 0xFB87, 0, 0 },            /* DUL */
348359d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0691, 0xFB8C, 0xFB8D, 0, 0 },            /* RREH */
348459d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06BA, 0xFB9E, 0xFB9F, 0, 0 },            /* NOON GHUNNA */
348559d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06BB, 0xFBA0, 0xFBA1, 0xFBA2, 0xFBA3 },  /* RNOON */
348659d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06BE, 0xFBAA, 0xFBAB, 0xFBAC, 0xFBAD },  /* HEH DOACHASHMEE */
348759d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06C0, 0xFBA4, 0xFBA5, 0, 0 },            /* HEH WITH YEH ABOVE */
348859d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06C1, 0xFBA6, 0xFBA7, 0xFBA8, 0xFBA9 },  /* HEH GOAL */
348959d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06C5, 0xFBE0, 0xFBE1, 0, 0 },            /* KIRGIHIZ OE */
349059d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06C6, 0xFBD9, 0xFBDA, 0, 0 },            /* OE */
349159d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06C7, 0xFBD7, 0xFBD8, 0, 0 },            /* U */
349259d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06C8, 0xFBDB, 0xFBDC, 0, 0 },            /* YU */
349359d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06C9, 0xFBE2, 0xFBE3, 0, 0 },            /* KIRGIZ YU */
349459d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06CB, 0xFBDE, 0xFBDF, 0, 0},             /* VE */
349559d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06D0, 0xFBE4, 0xFBE5, 0xFBE6, 0xFBE7 },  /* E */
349659d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06D2, 0xFBAE, 0xFBAF, 0, 0 },            /* YEH BARREE */
349759d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06D3, 0xFBB0, 0xFBB1, 0, 0 },            /* YEH BARREE WITH HAMZA ABOVE */
349859d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0622, 0xFE81, 0xFE82, 0, 0, },           /* ALEF WITH MADDA ABOVE */
349959d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0623, 0xFE83, 0xFE84, 0, 0, },           /* ALEF WITH HAMZA ABOVE */
350059d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0624, 0xFE85, 0xFE86, 0, 0, },           /* WAW WITH HAMZA ABOVE */
350159d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0625, 0xFE87, 0xFE88, 0, 0, },           /* ALEF WITH HAMZA BELOW */
350259d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0626, 0xFE89, 0xFE8A, 0xFE8B, 0xFE8C, }, /* YEH WITH HAMZA ABOVE */
350359d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0627, 0xFE8D, 0xFE8E, 0, 0, },           /* ALEF */
350459d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0628, 0xFE8F, 0xFE90, 0xFE91, 0xFE92, }, /* BEH */
350559d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0629, 0xFE93, 0xFE94, 0, 0, },           /* TEH MARBUTA */
350659d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x062A, 0xFE95, 0xFE96, 0xFE97, 0xFE98, }, /* TEH */
350759d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x062B, 0xFE99, 0xFE9A, 0xFE9B, 0xFE9C, }, /* THEH */
350859d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x062C, 0xFE9D, 0xFE9E, 0xFE9F, 0xFEA0, }, /* JEEM */
350959d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x062D, 0xFEA1, 0xFEA2, 0xFEA3, 0xFEA4, }, /* HAH */
351059d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x062E, 0xFEA5, 0xFEA6, 0xFEA7, 0xFEA8, }, /* KHAH */
351159d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x062F, 0xFEA9, 0xFEAA, 0, 0, },           /* DAL */
351259d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0630, 0xFEAB, 0xFEAC, 0, 0, },           /* THAL */
351359d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0631, 0xFEAD, 0xFEAE, 0, 0, },           /* REH */
351459d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0632, 0xFEAF, 0xFEB0, 0, 0, },           /* ZAIN */
351559d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0633, 0xFEB1, 0xFEB2, 0xFEB3, 0xFEB4, }, /* SEEN */
351659d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0634, 0xFEB5, 0xFEB6, 0xFEB7, 0xFEB8, }, /* SHEEN */
351759d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0635, 0xFEB9, 0xFEBA, 0xFEBB, 0xFEBC, }, /* SAD */
351859d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0636, 0xFEBD, 0xFEBE, 0xFEBF, 0xFEC0, }, /* DAD */
351959d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0637, 0xFEC1, 0xFEC2, 0xFEC3, 0xFEC4, }, /* TAH */
352059d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0638, 0xFEC5, 0xFEC6, 0xFEC7, 0xFEC8, }, /* ZAH */
352159d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0639, 0xFEC9, 0xFECA, 0xFECB, 0xFECC, }, /* AIN */
352259d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x063A, 0xFECD, 0xFECE, 0xFECF, 0xFED0, }, /* GHAIN */
352359d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0641, 0xFED1, 0xFED2, 0xFED3, 0xFED4, }, /* FEH */
352459d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0642, 0xFED5, 0xFED6, 0xFED7, 0xFED8, }, /* QAF */
352559d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0643, 0xFED9, 0xFEDA, 0xFEDB, 0xFEDC, }, /* KAF */
352659d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0644, 0xFEDD, 0xFEDE, 0xFEDF, 0xFEE0, }, /* LAM */
352759d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0645, 0xFEE1, 0xFEE2, 0xFEE3, 0xFEE4, }, /* MEEM */
352859d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0646, 0xFEE5, 0xFEE6, 0xFEE7, 0xFEE8, }, /* NOON */
352959d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0647, 0xFEE9, 0xFEEA, 0xFEEB, 0xFEEC, }, /* HEH */
353059d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0648, 0xFEED, 0xFEEE, 0, 0, },           /* WAW */
353159d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0649, 0xFEEF, 0xFEF0, 0, 0, },           /* ALEF MAKSURA */
353259d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x064A, 0xFEF1, 0xFEF2, 0xFEF3, 0xFEF4, }, /* YEH */
353359d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x064E, 0xFE76, 0, 0, 0xFE77, },           /* FATHA */
353459d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x064F, 0xFE78, 0, 0, 0xFE79, },           /* DAMMA */
353559d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0650, 0xFE7A, 0, 0, 0xFE7B, },           /* KASRA */
353659d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0651, 0xFE7C, 0, 0, 0xFE7D, },           /* SHADDA */
353759d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0652, 0xFE7E, 0, 0, 0xFE7F, },           /* SUKUN */
353859d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0679, 0xFB66, 0xFB67, 0xFB68, 0xFB69, }, /* TTEH */
353959d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x067E, 0xFB56, 0xFB57, 0xFB58, 0xFB59, }, /* PEH */
354059d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0686, 0xFB7A, 0xFB7B, 0xFB7C, 0xFB7D, }, /* TCHEH */
354159d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0688, 0xFB88, 0xFB89, 0, 0, },           /* DDAL */
354259d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0691, 0xFB8C, 0xFB8D, 0, 0, },           /* RREH */
354359d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x0698, 0xFB8A, 0xFB8B, 0, 0, },           /* JEH */
354459d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06A9, 0xFB8E, 0xFB8F, 0xFB90, 0xFB91, }, /* KEHEH */
354559d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06AF, 0xFB92, 0xFB93, 0xFB94, 0xFB95, }, /* GAF */
354659d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06BA, 0xFB9E, 0xFB9F, 0, 0, },           /* NOON GHUNNA */
354759d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06BE, 0xFBAA, 0xFBAB, 0xFBAC, 0xFBAD, }, /* HEH DOACHASHMEE */
354859d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06C0, 0xFBA4, 0xFBA5, 0, 0, },           /* HEH WITH YEH ABOVE */
354959d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06C1, 0xFBA6, 0xFBA7, 0xFBA8, 0xFBA9, }, /* HEH GOAL */
355059d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06CC, 0xFBFC, 0xFBFD, 0xFBFE, 0xFBFF, }, /* FARSI YEH */
355159d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06D2, 0xFBAE, 0xFBAF, 0, 0, },           /* YEH BARREE */
355259d709d503bab6e2b61931737e662dd293b40578ccornelius    { 0x06D3, 0xFBB0, 0xFBB1, 0, 0, }};          /* YEH BARREE WITH HAMZA ABOVE */
3553fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  int32_t i;
3554fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  for (i = 0; i < LENGTHOF(letterForms); ++i) {
355559d709d503bab6e2b61931737e662dd293b40578ccornelius    _testPresentationForms(letterForms[i]);
355659d709d503bab6e2b61931737e662dd293b40578ccornelius  }
355759d709d503bab6e2b61931737e662dd293b40578ccornelius}
355859d709d503bab6e2b61931737e662dd293b40578ccornelius
3559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* helpers ------------------------------------------------------------------ */
3560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void initCharFromDirProps(void) {
3562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UVersionInfo ucd401={ 4, 0, 1, 0 };
3563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static UVersionInfo ucdVersion={ 0, 0, 0, 0 };
3564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* lazy initialization */
3566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(ucdVersion[0]>0) {
3567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
3568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_getUnicodeVersion(ucdVersion);
3571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(memcmp(ucdVersion, ucd401, sizeof(UVersionInfo))>=0) {
3572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Unicode 4.0.1 changes bidi classes for +-/ */
3573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        charFromDirProp[U_EUROPEAN_NUMBER_SEPARATOR]=0x2b; /* change ES character from / to + */
3574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* return a string with characters according to the desired directional properties */
3578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UChar *
3579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerugetStringFromDirProps(const uint8_t *dirProps, int32_t length, UChar *buffer) {
3580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
3581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    initCharFromDirProps();
3583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* this part would have to be modified for UTF-x */
3585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<length; ++i) {
3586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffer[i]=charFromDirProp[dirProps[i]];
3587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[length]=0;
3589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return buffer;
3590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void printUnicode(const UChar *s, int32_t length, const UBiDiLevel *levels) {
3593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
3594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("{ ");
3596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<length; ++i) {
3597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(levels!=NULL) {
3598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("%4x.%u  ", s[i], levels[i]);
3599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
3600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("%4x    ", s[i]);
3601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose(" }");
3604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* new BIDI API */
3607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Reordering Mode BiDi --------------------------------------------------------- */
3609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UBiDiLevel paraLevels[] = { UBIDI_LTR, UBIDI_RTL };
3611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool
3613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruassertSuccessful(const char* message, UErrorCode* rc) {
3614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (rc != NULL && U_FAILURE(*rc)) {
3615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("%s() failed with error %s.\n", message, myErrorName(*rc));
3616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
3617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
3619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool
3622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruassertStringsEqual(const char* expected, const char* actual, const char* src,
3623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   const char* mode, const char* option, UBiDi* pBiDi) {
3624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (uprv_strcmp(expected, actual)) {
3625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char formatChars[MAXLEN];
3626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nActual and expected output mismatch.\n"
3627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %d %s\n%20s %u\n%20s %d %s\n",
3628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "Input:", src,
3629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "Actual output:", actual,
3630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "Expected output:", expected,
3631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "Levels:", formatLevels(pBiDi, formatChars),
3632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "Reordering mode:", ubidi_getReorderingMode(pBiDi), mode,
3633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "Paragraph level:", ubidi_getParaLevel(pBiDi),
3634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "Reordering option:", ubidi_getReorderingOptions(pBiDi), option);
3635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
3636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
3638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBiDi*
3641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerugetBiDiObject(void) {
3642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDi* pBiDi = ubidi_open();
3643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pBiDi == NULL) {
3644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Unable to allocate a UBiDi object. Tests are skipped.\n");
3645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return pBiDi;
3647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define MAKE_ITEMS(val) val, #val
3650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const struct {
3652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDiReorderingMode value;
3653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* description;
3654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querumodes[] = {
3656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { MAKE_ITEMS(UBIDI_REORDER_GROUP_NUMBERS_WITH_R) },
3657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { MAKE_ITEMS(UBIDI_REORDER_INVERSE_LIKE_DIRECT) },
3658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { MAKE_ITEMS(UBIDI_REORDER_NUMBERS_SPECIAL) },
3659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { MAKE_ITEMS(UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL) },
3660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { MAKE_ITEMS(UBIDI_REORDER_INVERSE_NUMBERS_AS_L) }
3661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
3662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const struct {
3663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t value;
3664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* description;
3665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruoptions[] = {
3667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { MAKE_ITEMS(UBIDI_OPTION_INSERT_MARKS) },
3668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { MAKE_ITEMS(0) }
3669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
3670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TC_COUNT                LENGTHOF(textIn)
3672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define MODES_COUNT             LENGTHOF(modes)
3673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define OPTIONS_COUNT           LENGTHOF(options)
3674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LEVELS_COUNT            LENGTHOF(paraLevels)
3675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* const textIn[] = {
3677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (0) 123 */
3678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "123",
3679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (1) .123->4.5 */
3680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ".123->4.5",
3681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (2) 678 */
3682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "678",
3683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (3) .678->8.9 */
3684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ".678->8.9",
3685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (4) JIH1.2,3MLK */
3686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "JIH1.2,3MLK",
3687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (5) FE.>12-> */
3688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "FE.>12->",
3689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (6) JIH.>12->a */
3690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "JIH.>12->a",
3691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (7) CBA.>67->89=a */
3692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "CBA.>67->89=a",
3693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (8) CBA.123->xyz */
3694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "CBA.123->xyz",
3695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (9) .>12->xyz */
3696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ".>12->xyz",
3697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (10) a.>67->xyz */
3698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "a.>67->xyz",
3699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (11) 123JIH */
3700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "123JIH",
3701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* (12) 123 JIH */
3702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "123 JIH"
3703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
3704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* const textOut[] = {
3706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 0: 123 */
3707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "123",                                                              /* (0) */
3708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 1: .123->4.5 */
3709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ".123->4.5",                                                        /* (1) */
3710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "4.5<-123.",                                                        /* (2) */
3711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 2: 678 */
3712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "678",                                                              /* (3) */
3713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 3: .678->8.9 */
3714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ".8.9<-678",                                                        /* (4) */
3715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "8.9<-678.",                                                        /* (5) */
3716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ".678->8.9",                                                        /* (6) */
3717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 4: MLK1.2,3JIH */
3718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "KLM1.2,3HIJ",                                                      /* (7) */
3719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 5: FE.>12-> */
3720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "12<.EF->",                                                         /* (8) */
3721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "<-12<.EF",                                                         /* (9) */
3722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "EF.>@12->",                                                        /* (10) */
3723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 6: JIH.>12->a */
3724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "12<.HIJ->a",                                                       /* (11) */
3725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "a<-12<.HIJ",                                                       /* (12) */
3726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "HIJ.>@12->a",                                                      /* (13) */
3727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "a&<-12<.HIJ",                                                      /* (14) */
3728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 7: CBA.>67->89=a */
3729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "ABC.>@67->89=a",                                                   /* (15) */
3730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "a=89<-67<.ABC",                                                    /* (16) */
3731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "a&=89<-67<.ABC",                                                   /* (17) */
3732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "89<-67<.ABC=a",                                                    /* (18) */
3733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 8: CBA.123->xyz */
3734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "123.ABC->xyz",                                                     /* (19) */
3735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "xyz<-123.ABC",                                                     /* (20) */
3736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "ABC.@123->xyz",                                                    /* (21) */
3737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "xyz&<-123.ABC",                                                    /* (22) */
3738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 9: .>12->xyz */
3739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ".>12->xyz",                                                        /* (23) */
3740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "xyz<-12<.",                                                        /* (24) */
3741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "xyz&<-12<.",                                                       /* (25) */
3742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 10: a.>67->xyz */
3743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "a.>67->xyz",                                                       /* (26) */
3744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "a.>@67@->xyz",                                                     /* (27) */
3745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "xyz<-67<.a",                                                       /* (28) */
3746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 11: 123JIH */
3747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "123HIJ",                                                           /* (29) */
3748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "HIJ123",                                                           /* (30) */
3749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 12: 123 JIH */
3750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "123 HIJ",                                                          /* (31) */
3751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "HIJ 123",                                                          /* (32) */
3752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
3753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define NO                  UBIDI_MAP_NOWHERE
3755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define MAX_MAP_LENGTH      20
3756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const int32_t forwardMap[][MAX_MAP_LENGTH] = {
3758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 0: 123 */
3759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 1, 2 },                                                        /* (0) */
3760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 1: .123->4.5 */
3761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 1, 2, 3, 4, 5, 6, 7, 8 },                                      /* (1) */
3762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 8, 5, 6, 7, 4, 3, 0, 1, 2 },                                      /* (2) */
3763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 2: 678 */
3764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 1, 2 },                                                        /* (3) */
3765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 3: .678->8.9 */
3766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 6, 7, 8, 5, 4, 1, 2, 3 },                                      /* (4) */
3767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 8, 5, 6, 7, 4, 3, 0, 1, 2 },                                      /* (5) */
3768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 1, 2, 3, 4, 5, 6, 7, 8 },                                      /* (6) */
3769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 4: MLK1.2,3JIH */
3770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 10, 9, 8, 3, 4, 5, 6, 7, 2, 1, 0 },                               /* (7) */
3771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 5: FE.>12-> */
3772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 5, 4, 3, 2, 0, 1, 6, 7 },                                         /* (8) */
3773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 7, 6, 5, 4, 2, 3, 1, 0 },                                         /* (9) */
3774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 1, 0, 2, 3, 5, 6, 7, 8 },                                         /* (10) */
3775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 6: JIH.>12->a */
3776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 6, 5, 4, 3, 2, 0, 1, 7, 8, 9 },                                   /* (11) */
3777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 9, 8, 7, 6, 5, 3, 4, 2, 1, 0 },                                   /* (12) */
3778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 2, 1, 0, 3, 4, 6, 7, 8, 9, 10 },                                  /* (13) */
3779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 10, 9, 8, 7, 6, 4, 5, 3, 2, 0 },                                  /* (14) */
3780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 7: CBA.>67->89=a */
3781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 2, 1, 0, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13 },                      /* (15) */
3782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 12, 11, 10, 9, 8, 6, 7, 5, 4, 2, 3, 1, 0 },                       /* (16) */
3783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 13, 12, 11, 10, 9, 7, 8, 6, 5, 3, 4, 2, 0 },                      /* (17) */
3784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 10, 9, 8, 7, 6, 4, 5, 3, 2, 0, 1, 11, 12 },                       /* (18) */
3785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 8: CBA.123->xyz */
3786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 6, 5, 4, 3, 0, 1, 2, 7, 8, 9, 10, 11 },                           /* (19) */
3787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 11, 10, 9, 8, 5, 6, 7, 4, 3, 0, 1, 2 },                           /* (20) */
3788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 2, 1, 0, 3, 5, 6, 7, 8, 9, 10, 11, 12 },                          /* (21) */
3789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 12, 11, 10, 9, 6, 7, 8, 5, 4, 0, 1, 2 },                          /* (22) */
3790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 9: .>12->xyz */
3791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 1, 2, 3, 4, 5, 6, 7, 8 },                                      /* (23) */
3792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 8, 7, 5, 6, 4, 3, 0, 1, 2 },                                      /* (24) */
3793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 9, 8, 6, 7, 5, 4, 0, 1, 2 },                                      /* (25) */
3794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 10: a.>67->xyz */
3795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },                                   /* (26) */
3796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 1, 2, 4, 5, 7, 8, 9, 10, 11 },                                 /* (27) */
3797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 9, 8, 7, 5, 6, 4, 3, 0, 1, 2 },                                   /* (28) */
3798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 11: 123JIH */
3799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 1, 2, 5, 4, 3 },                                               /* (29) */
3800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 3, 4, 5, 2, 1, 0 },                                               /* (30) */
3801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 12: 123 JIH */
3802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 1, 2, 3, 6, 5, 4 },                                            /* (31) */
3803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 4, 5, 6, 3, 2, 1, 0 },                                            /* (32) */
3804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
3805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const int32_t inverseMap[][MAX_MAP_LENGTH] = {
3807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 0: 123 */
3808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 1, 2 },                                                        /* (0) */
3809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 1: .123->4.5 */
3810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 1, 2, 3, 4, 5, 6, 7, 8 },                                      /* (1) */
3811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 6, 7, 8, 5, 4, 1, 2, 3, 0 },                                      /* (2) */
3812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 2: 678 */
3813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 1, 2 },                                                        /* (3) */
3814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 3: .678->8.9 */
3815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 6, 7, 8, 5, 4, 1, 2, 3 },                                      /* (4) */
3816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 6, 7, 8, 5, 4, 1, 2, 3, 0 },                                      /* (5) */
3817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 1, 2, 3, 4, 5, 6, 7, 8 },                                      /* (6) */
3818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 4: MLK1.2,3JIH */
3819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 10, 9, 8, 3, 4, 5, 6, 7, 2, 1, 0 },                               /* (7) */
3820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 5: FE.>12-> */
3821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 4, 5, 3, 2, 1, 0, 6, 7 },                                         /* (8) */
3822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 7, 6, 4, 5, 3, 2, 1, 0 },                                         /* (9) */
3823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 1, 0, 2, 3, NO, 4, 5, 6, 7 },                                     /* (10) */
3824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 6: JIH.>12->a */
3825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 5, 6, 4, 3, 2, 1, 0, 7, 8, 9 },                                   /* (11) */
3826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 9, 8, 7, 5, 6, 4, 3, 2, 1, 0 },                                   /* (12) */
3827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 2, 1, 0, 3, 4, NO, 5, 6, 7, 8, 9 },                               /* (13) */
3828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 9, NO, 8, 7, 5, 6, 4, 3, 2, 1, 0 },                               /* (14) */
3829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 7: CBA.>67->89=a */
3830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 2, 1, 0, 3, 4, NO, 5, 6, 7, 8, 9, 10, 11, 12 },                   /* (15) */
3831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 12, 11, 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0 },                       /* (16) */
3832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 12, NO, 11, 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0 },                   /* (17) */
3833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0, 11, 12 },                       /* (18) */
3834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 8: CBA.123->xyz */
3835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 4, 5, 6, 3, 2, 1, 0, 7, 8, 9, 10, 11 },                           /* (19) */
3836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 9, 10, 11, 8, 7, 4, 5, 6, 3, 2, 1, 0 },                           /* (20) */
3837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 2, 1, 0, 3, NO, 4, 5, 6, 7, 8, 9, 10, 11 },                       /* (21) */
3838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 9, 10, 11, NO, 8, 7, 4, 5, 6, 3, 2, 1, 0 },                       /* (22) */
3839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 9: .>12->xyz */
3840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 1, 2, 3, 4, 5, 6, 7, 8 },                                      /* (23) */
3841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 6, 7, 8, 5, 4, 2, 3, 1, 0 },                                      /* (24) */
3842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 6, 7, 8, NO, 5, 4, 2, 3, 1, 0 },                                  /* (25) */
3843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 10: a.>67->xyz */
3844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },                                   /* (26) */
3845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 1, 2, NO, 3, 4, NO, 5, 6, 7, 8, 9 },                           /* (27) */
3846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 7, 8, 9, 6, 5, 3, 4, 2, 1, 0 },                                   /* (28) */
3847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 11: 123JIH */
3848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 1, 2, 5, 4, 3 },                                               /* (29) */
3849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 5, 4, 3, 0, 1, 2 },                                               /* (30) */
3850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* TC 12: 123 JIH */
3851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 0, 1, 2, 3, 6, 5, 4 },                                            /* (31) */
3852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 6, 5, 4, 3, 0, 1, 2 },                                            /* (32) */
3853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
3854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char outIndices[TC_COUNT][MODES_COUNT - 1][OPTIONS_COUNT]
3856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            [LEVELS_COUNT] = {
3857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { /* TC 0: 123 */
3858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 0,  0}, { 0,  0}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 0,  0}, { 0,  0}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 0,  0}, { 0,  0}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 0,  0}, { 0,  0}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { /* TC 1: .123->4.5 */
3864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 1,  2}, { 1,  2}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 1,  2}, { 1,  2}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 1,  2}, { 1,  2}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 1,  2}, { 1,  2}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { /* TC 2: 678 */
3870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 3,  3}, { 3,  3}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 3,  3}, { 3,  3}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 3,  3}, { 3,  3}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 3,  3}, { 3,  3}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { /* TC 3: .678->8.9 */
3876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 6,  5}, { 6,  5}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 4,  5}, { 4,  5}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 6,  5}, { 6,  5}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 6,  5}, { 6,  5}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { /* TC 4: MLK1.2,3JIH */
3882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 7,  7}, { 7,  7}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 7,  7}, { 7,  7}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 7,  7}, { 7,  7}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 7,  7}, { 7,  7}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { /* TC 5: FE.>12-> */
3888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 8,  9}, { 8,  9}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{10,  9}, { 8,  9}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 8,  9}, { 8,  9}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{10,  9}, { 8,  9}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { /* TC 6: JIH.>12->a */
3894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{11, 12}, {11, 12}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{13, 14}, {11, 12}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{11, 12}, {11, 12}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{13, 14}, {11, 12}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { /* TC 7: CBA.>67->89=a */
3900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{18, 16}, {18, 16}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{18, 17}, {18, 16}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{18, 16}, {18, 16}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{15, 17}, {18, 16}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { /* TC 8: CBA.>124->xyz */
3906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{19, 20}, {19, 20}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{21, 22}, {19, 20}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{19, 20}, {19, 20}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{21, 22}, {19, 20}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { /* TC 9: .>12->xyz */
3912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{23, 24}, {23, 24}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{23, 25}, {23, 24}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{23, 24}, {23, 24}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{23, 25}, {23, 24}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { /* TC 10: a.>67->xyz */
3918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{26, 26}, {26, 26}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{26, 27}, {26, 28}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{26, 28}, {26, 28}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{26, 27}, {26, 28}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { /* TC 11: 124JIH */
3924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{30, 30}, {30, 30}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{29, 30}, {29, 30}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{30, 30}, {30, 30}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{30, 30}, {30, 30}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
3929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { /* TC 12: 124 JIH */
3930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{32, 32}, {32, 32}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{31, 32}, {31, 32}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{31, 32}, {31, 32}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{31, 32}, {31, 32}}  /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
3936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool
3938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruassertRoundTrip(UBiDi *pBiDi, int32_t tc, int32_t outIndex, const char *srcChars,
3939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                const char *destChars, const UChar *dest, int32_t destLen,
3940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                int mode, int option, UBiDiLevel level) {
3941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char roundtrip[TC_COUNT][MODES_COUNT][OPTIONS_COUNT]
3943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                [LEVELS_COUNT] = {
3944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { /* TC 0: 123 */
3945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
3950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
3951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { /* TC 1: .123->4.5 */
3952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
3957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
3958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { /* TC 2: 678 */
3959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
3964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
3965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { /* TC 3: .678->8.9 */
3966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 0,  0}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
3971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
3972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { /* TC 4: MLK1.2,3JIH */
3973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
3978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
3979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { /* TC 5: FE.>12-> */
3980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 0,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
3985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
3986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { /* TC 6: JIH.>12->a */
3987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 0,  0}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
3992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
3993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { /* TC 7: CBA.>67->89=a */
3994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
3995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
3996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 0,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
3997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
3998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 0,  0}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
3999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
4000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { /* TC 8: CBA.>123->xyz */
4001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
4002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
4003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 0,  0}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
4004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
4005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
4006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
4007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { /* TC 9: .>12->xyz */
4008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
4009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
4010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  0}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
4011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
4012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
4013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
4014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { /* TC 10: a.>67->xyz */
4015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
4016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
4017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
4018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
4019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  0}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
4020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
4021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { /* TC 11: 123JIH */
4022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
4023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
4024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
4025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
4026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
4027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
4028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { /* TC 12: 123 JIH */
4029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_GROUP_NUMBERS_WITH_R */
4030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_LIKE_DIRECT */
4031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_NUMBERS_SPECIAL */
4032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}, /* UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
4033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {{ 1,  1}, { 1,  1}}  /* UBIDI_REORDER_INVERSE_NUMBERS_AS_L */
4034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
4035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
4036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    #define SET_ROUND_TRIP_MODE(mode) \
4038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setReorderingMode(pBiDi, mode); \
4039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        desc = #mode; \
4040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
4041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode rc = U_ZERO_ERROR;
4043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar dest2[MAXLEN];
4044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t destLen2;
4045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* desc;
4046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char destChars2[MAXLEN];
4047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char destChars3[MAXLEN];
4048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (modes[mode].value) {
4050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case UBIDI_REORDER_NUMBERS_SPECIAL:
4051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            SET_ROUND_TRIP_MODE(UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL)
4052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case UBIDI_REORDER_GROUP_NUMBERS_WITH_R:
4053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            SET_ROUND_TRIP_MODE(UBIDI_REORDER_GROUP_NUMBERS_WITH_R)
4054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case UBIDI_REORDER_RUNS_ONLY:
4055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            SET_ROUND_TRIP_MODE(UBIDI_REORDER_RUNS_ONLY)
4056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case UBIDI_REORDER_INVERSE_NUMBERS_AS_L:
4057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            SET_ROUND_TRIP_MODE(UBIDI_REORDER_DEFAULT)
4058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case UBIDI_REORDER_INVERSE_LIKE_DIRECT:
4059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            SET_ROUND_TRIP_MODE(UBIDI_REORDER_DEFAULT)
4060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL:
4061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            SET_ROUND_TRIP_MODE(UBIDI_REORDER_NUMBERS_SPECIAL)
4062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default:
4063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            SET_ROUND_TRIP_MODE(UBIDI_REORDER_INVERSE_LIKE_DIRECT)
4064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setReorderingOptions(pBiDi, UBIDI_OPTION_REMOVE_CONTROLS);
4066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(pBiDi, dest, destLen, level, NULL, &rc);
4068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertSuccessful("ubidi_setPara", &rc);
4069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *dest2 = 0;
4070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen2 = ubidi_writeReordered(pBiDi, dest2, MAXLEN, UBIDI_DO_MIRRORING,
4071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    &rc);
4072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertSuccessful("ubidi_writeReordered", &rc);
4073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u16ToPseudo(destLen, dest, destChars3);
4075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u16ToPseudo(destLen2, dest2, destChars2);
4076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    checkWhatYouCan(pBiDi, destChars3, destChars2);
4077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(srcChars, destChars2)) {
4078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (roundtrip[tc][mode][option][level]) {
4079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\nRound trip failed for case=%d mode=%d option=%d.\n"
4080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %s"
4081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "\n%20s %u\n", tc, mode, option,
4082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "Original text:", srcChars,
4083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "Round-tripped text:", destChars2,
4084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "Intermediate  text:", destChars3,
4085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "Reordering mode:", modes[mode].description,
4086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "Reordering option:", options[option].description,
4087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "Paragraph level:", level);
4088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
4089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
4090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("\nExpected round trip failure for case=%d mode=%d option=%d.\n"
4091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %s"
4092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "\n%20s %u\n", tc, mode, option,
4093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "Original text:", srcChars,
4094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "Round-tripped text:", destChars2,
4095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "Intermediate  text:", destChars3,
4096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "Reordering mode:", modes[mode].description,
4097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "Reordering option:", options[option].description,
4098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "Paragraph level:", level);
4099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
4100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
4101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!checkResultLength(pBiDi, destChars, destChars2, destLen2,
4103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           desc, "UBIDI_OPTION_REMOVE_CONTROLS", level)) {
4104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
4105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (outIndex > -1 && !checkMaps(pBiDi, outIndex, srcChars, destChars,
4107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    desc, "UBIDI_OPTION_REMOVE_CONTROLS",
4108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    level, FALSE)) {
4109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
4110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
4112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool
4115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerucheckResultLength(UBiDi *pBiDi, const char *srcChars, const char *destChars,
4116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  int32_t destLen, const char* mode,
4117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  const char* option, UBiDiLevel level) {
4118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t actualLen;
4119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(mode, "UBIDI_REORDER_INVERSE_NUMBERS_AS_L") == 0)
4120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        actualLen = strlen(destChars);
4121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
4122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        actualLen = ubidi_getResultLength(pBiDi);
4123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (actualLen != destLen) {
4124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nubidi_getResultLength failed.\n%20s %7d\n%20s %7d\n"
4125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "%20s %s\n%20s %s\n%20s %s\n%20s %s\n%20s %u\n",
4126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Expected:", destLen, "Actual:", actualLen,
4127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Input:", srcChars, "Output:", destChars,
4128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Reordering mode:", mode, "Reordering option:", option,
4129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Paragraph level:", level);
4130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
4131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
4133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
4136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestReorderRunsOnly(void) {
4137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
4138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* textIn;
4139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* textOut[2][2];
4140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char noroundtrip[2];
4141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } testCases[] = {
4142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"ab 234 896 de", {{"de 896 ab 234", "de 896 ab 234"},                   /*0*/
4143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           {"ab 234 @896@ de", "de 896 ab 234"}}, {0, 0}},
4144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"abcGHI", {{"GHIabc", "GHIabc"}, {"GHIabc", "GHIabc"}}, {0, 0}},        /*1*/
4145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"a.>67->", {{"<-67<.a", "<-67<.a"}, {"<-67<.a", "<-67<.a"}}, {0, 0}},   /*2*/
4146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"-=%$123/ *", {{"* /%$123=-", "* /%$123=-"},                            /*3*/
4147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        {"* /%$123=-", "* /%$123=-"}}, {0, 0}},
4148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"abc->12..>JKL", {{"JKL<..12<-abc", "JKL<..abc->12"},                   /*4*/
4149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           {"JKL<..12<-abc", "JKL<..abc->12"}}, {0, 0}},
4150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"JKL->12..>abc", {{"abc<..JKL->12", "abc<..12<-JKL"},                   /*5*/
4151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           {"abc<..JKL->12", "abc<..12<-JKL"}}, {0, 0}},
4152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"123->abc", {{"abc<-123", "abc<-123"},                                  /*6*/
4153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      {"abc&<-123", "abc<-123"}}, {1, 0}},
4154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"123->JKL", {{"JKL<-123", "123->JKL"},                                  /*7*/
4155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      {"JKL<-123", "JKL<-@123"}}, {0, 1}},
4156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"*>12.>34->JKL", {{"JKL<-34<.12<*", "12.>34->JKL<*"},                   /*8*/
4157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           {"JKL<-34<.12<*", "JKL<-@34<.12<*"}}, {0, 1}},
4158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"*>67.>89->JKL", {{"67.>89->JKL<*", "67.>89->JKL<*"},                   /*9*/
4159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           {"67.>89->JKL<*", "67.>89->JKL<*"}}, {0, 0}},
4160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"* /abc-=$%123", {{"$%123=-abc/ *", "abc-=$%123/ *"},                   /*10*/
4161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           {"$%123=-abc/ *", "abc-=$%123/ *"}}, {0, 0}},
4162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"* /$%def-=123", {{"123=-def%$/ *", "def-=123%$/ *"},                   /*11*/
4163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           {"123=-def%$/ *", "def-=123%$/ *"}}, {0, 0}},
4164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"-=GHI* /123%$", {{"GHI* /123%$=-", "123%$/ *GHI=-"},                   /*12*/
4165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           {"GHI* /123%$=-", "123%$/ *GHI=-"}}, {0, 0}},
4166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"-=%$JKL* /123", {{"JKL* /%$123=-", "123/ *JKL$%=-"},                   /*13*/
4167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           {"JKL* /%$123=-", "123/ *JKL$%=-"}}, {0, 0}},
4168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"ab =#CD *?450", {{"CD *?450#= ab", "450?* CD#= ab"},                   /*14*/
4169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           {"CD *?450#= ab", "450?* CD#= ab"}}, {0, 0}},
4170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"ab 234 896 de", {{"de 896 ab 234", "de 896 ab 234"},                   /*15*/
4171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           {"ab 234 @896@ de", "de 896 ab 234"}}, {0, 0}},
4172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"abc-=%$LMN* /123", {{"LMN* /%$123=-abc", "123/ *LMN$%=-abc"},          /*16*/
4173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              {"LMN* /%$123=-abc", "123/ *LMN$%=-abc"}}, {0, 0}},
4174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"123->JKL&MN&P", {{"JKLMNP<-123", "123->JKLMNP"},                       /*17*/
4175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           {"JKLMNP<-123", "JKLMNP<-@123"}}, {0, 1}},
4176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"123", {{"123", "123"},                /* just one run */               /*18*/
4177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 {"123", "123"}}, {0, 0}}
4178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
4179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDi *pBiDi = getBiDiObject();
4180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDi *pL2VBiDi = getBiDiObject();
4181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar src[MAXLEN], dest[MAXLEN], visual1[MAXLEN], visual2[MAXLEN];
4182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char destChars[MAXLEN], vis1Chars[MAXLEN], vis2Chars[MAXLEN];
4183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t srcLen, destLen, vis1Len, vis2Len, option, i, j, nCases, paras;
4184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode rc = U_ZERO_ERROR;
4185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDiLevel level;
4186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nEntering TestReorderRunsOnly\n\n");
4188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!pL2VBiDi) {
4190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_close(pBiDi);             /* in case this one was allocated */
4191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
4192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setReorderingMode(pBiDi, UBIDI_REORDER_RUNS_ONLY);
4194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setReorderingOptions(pL2VBiDi, UBIDI_OPTION_REMOVE_CONTROLS);
4195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (option = 0; option < 2; option++) {
4197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_setReorderingOptions(pBiDi, option==0 ? UBIDI_OPTION_REMOVE_CONTROLS
4198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                    : UBIDI_OPTION_INSERT_MARKS);
4199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0, nCases = LENGTHOF(testCases); i < nCases; i++) {
4200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            srcLen = strlen(testCases[i].textIn);
4201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pseudoToU16(srcLen, testCases[i].textIn, src);
4202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for(j = 0; j < 2; j++) {
4203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("Now doing test for option %d, case %d, level %d\n",
4204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            i, option, j);
4205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                level = paraLevels[j];
4206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ubidi_setPara(pBiDi, src, srcLen, level, NULL, &rc);
4207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                assertSuccessful("ubidi_setPara", &rc);
4208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                *dest = 0;
4209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                destLen = ubidi_writeReordered(pBiDi, dest, MAXLEN, UBIDI_DO_MIRRORING, &rc);
4210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                assertSuccessful("ubidi_writeReordered", &rc);
4211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u16ToPseudo(destLen, dest, destChars);
4212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                checkWhatYouCan(pBiDi, testCases[i].textIn, destChars);
4213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                assertStringsEqual(testCases[i].textOut[option][level], destChars,
4214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        testCases[i].textIn, "UBIDI_REORDER_RUNS_ONLY",
4215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        option==0 ? "0" : "UBIDI_OPTION_INSERT_MARKS",
4216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        pBiDi);
4217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if((option==0) && testCases[i].noroundtrip[level]) {
4219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    continue;
4220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
4221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ubidi_setPara(pL2VBiDi, src, srcLen, level, NULL, &rc);
4222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                assertSuccessful("ubidi_setPara1", &rc);
4223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                *visual1 = 0;
4224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                vis1Len = ubidi_writeReordered(pL2VBiDi, visual1, MAXLEN, UBIDI_DO_MIRRORING, &rc);
4225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                assertSuccessful("ubidi_writeReordered1", &rc);
4226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u16ToPseudo(vis1Len, visual1, vis1Chars);
4227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                checkWhatYouCan(pL2VBiDi, testCases[i].textIn, vis1Chars);
4228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ubidi_setPara(pL2VBiDi, dest, destLen, level^1, NULL, &rc);
4229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                assertSuccessful("ubidi_setPara2", &rc);
4230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                *visual2 = 0;
4231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                vis2Len = ubidi_writeReordered(pL2VBiDi, visual2, MAXLEN, UBIDI_DO_MIRRORING, &rc);
4232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                assertSuccessful("ubidi_writeReordered2", &rc);
4233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u16ToPseudo(vis2Len, visual2, vis2Chars);
4234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                checkWhatYouCan(pL2VBiDi, destChars, vis2Chars);
4235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                assertStringsEqual(vis1Chars, vis2Chars,
4236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        testCases[i].textIn, "UBIDI_REORDER_RUNS_ONLY (2)",
4237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        option==0 ? "0" : "UBIDI_OPTION_INSERT_MARKS",
4238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        pBiDi);
4239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
4240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
4241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test with null or empty text */
4244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(pBiDi, src, 0, UBIDI_LTR, NULL, &rc);
4245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertSuccessful("ubidi_setPara3", &rc);
4246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    paras = ubidi_countParagraphs(pBiDi);
4247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (paras != 0) {
4248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nInvalid number of paras (should be 0): %d\n", paras);
4249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(pBiDi);
4252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(pL2VBiDi);
4253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nExiting TestReorderRunsOnly\n\n");
4255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
4258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestReorderingMode(void) {
4259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar src[MAXLEN], dest[MAXLEN];
4261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char destChars[MAXLEN];
4262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDi *pBiDi = NULL, *pBiDi2 = NULL, *pBiDi3 = NULL;
4263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode rc;
4264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int tc, mode, option, level;
4265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t optionValue, optionBack;
4266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDiReorderingMode modeValue, modeBack;
426754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    int32_t srcLen, destLen, idx;
4268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *expectedChars;
4269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool testOK = TRUE;
4270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nEntering TestReorderingMode\n\n");
4272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pBiDi = getBiDiObject();
4274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pBiDi2 = getBiDiObject();
4275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pBiDi3 = getBiDiObject();
4276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!pBiDi3) {
4277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_close(pBiDi);             /* in case this one was allocated */
4278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_close(pBiDi2);            /* in case this one was allocated */
4279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
4280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setInverse(pBiDi2, TRUE);
4283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (tc = 0; tc < TC_COUNT; tc++) {
4285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *srcChars = textIn[tc];
4286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        srcLen = strlen(srcChars);
4287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pseudoToU16(srcLen, srcChars, src);
4288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (mode = 0; mode < MODES_COUNT; mode++) {
4290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            modeValue = modes[mode].value;
4291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ubidi_setReorderingMode(pBiDi, modeValue);
4292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            modeBack = ubidi_getReorderingMode(pBiDi);
4293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (modeValue != modeBack) {
4294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Error while setting reordering mode to %d, returned %d\n",
4295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        modeValue, modeBack);
4296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
4297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (option = 0; option < OPTIONS_COUNT; option++) {
4299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                optionValue = options[option].value;
4300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ubidi_setReorderingOptions(pBiDi, optionValue);
4301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                optionBack = ubidi_getReorderingOptions(pBiDi);
4302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (optionValue != optionBack) {
4303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("Error while setting reordering option to %d, returned %d\n",
4304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            optionValue, optionBack);
4305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
4306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for (level = 0; level < LEVELS_COUNT; level++) {
4308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_verbose("starting test %d mode=%d option=%d level=%d\n",
4309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                tc, modes[mode].value, options[option].value, level);
4310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    rc = U_ZERO_ERROR;
4311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    ubidi_setPara(pBiDi, src, srcLen, paraLevels[level], NULL, &rc);
4312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    assertSuccessful("ubidi_setPara", &rc);
4313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    *dest = 0;
4315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    destLen = ubidi_writeReordered(pBiDi, dest, MAXLEN,
4316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                   UBIDI_DO_MIRRORING, &rc);
4317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    assertSuccessful("ubidi_writeReordered", &rc);
4318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    u16ToPseudo(destLen, dest, destChars);
4319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (!((modes[mode].value == UBIDI_REORDER_INVERSE_NUMBERS_AS_L) &&
4320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          (options[option].value == UBIDI_OPTION_INSERT_MARKS))) {
4321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        checkWhatYouCan(pBiDi, srcChars, destChars);
4322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
4323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (modes[mode].value == UBIDI_REORDER_INVERSE_NUMBERS_AS_L) {
432554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                        idx = -1;
4326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        expectedChars = inverseBasic(pBiDi2, srcChars, srcLen,
4327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                options[option].value, paraLevels[level], destChars);
4328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
4329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    else {
433054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                        idx = outIndices[tc][mode][option][level];
433154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                        expectedChars = textOut[idx];
4332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
4333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (!assertStringsEqual(expectedChars, destChars, srcChars,
4334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                modes[mode].description,
4335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                options[option].description,
4336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                pBiDi)) {
4337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        testOK = FALSE;
4338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
4339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (options[option].value == UBIDI_OPTION_INSERT_MARKS &&
434054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                             !assertRoundTrip(pBiDi3, tc, idx, srcChars,
4341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                              destChars, dest, destLen,
4342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                              mode, option, paraLevels[level])) {
4343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        testOK = FALSE;
4344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
4345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    else if (!checkResultLength(pBiDi, srcChars, destChars,
4346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                destLen, modes[mode].description,
4347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                options[option].description,
4348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                paraLevels[level])) {
4349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        testOK = FALSE;
4350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
435154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                    else if (idx > -1 && !checkMaps(pBiDi, idx, srcChars,
4352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            destChars, modes[mode].description,
4353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            options[option].description, paraLevels[level],
4354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            TRUE)) {
4355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        testOK = FALSE;
4356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
4357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
4358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
4359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
4360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (testOK == TRUE) {
4362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\nReordering mode test OK\n");
4363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(pBiDi3);
4365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(pBiDi2);
4366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(pBiDi);
4367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nExiting TestReorderingMode\n\n");
4369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* inverseBasic(UBiDi *pBiDi, const char *srcChars, int32_t srcLen,
4372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                uint32_t option, UBiDiLevel level, char *result) {
4373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode rc = U_ZERO_ERROR;
4374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t destLen;
4375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar src[MAXLEN], dest2[MAXLEN];
4376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pBiDi == NULL || src == NULL) {
4378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
4379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setReorderingOptions(pBiDi, option);
4381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pseudoToU16(srcLen, srcChars, src);
4382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(pBiDi, src, srcLen, level, NULL, &rc);
4383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertSuccessful("ubidi_setPara", &rc);
4384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *dest2 = 0;
4386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(pBiDi, dest2, MAXLEN,
4387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   UBIDI_DO_MIRRORING, &rc);
4388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertSuccessful("ubidi_writeReordered", &rc);
4389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u16ToPseudo(destLen, dest2, result);
4390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!(option == UBIDI_OPTION_INSERT_MARKS)) {
4391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        checkWhatYouCan(pBiDi, srcChars, result);
4392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return result;
4394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define NULL_CHAR '\0'
4397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
4399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestStreaming(void) {
4400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define MAXPORTIONS 10
4401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
4403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* textIn;
4404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        short int chunk;
4405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        short int nPortions[2];
4406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char  portionLens[2][MAXPORTIONS];
4407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* message[2];
4408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } testData[] = {
4409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "123\\u000A"
4410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "abc45\\u000D"
4411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "67890\\u000A"
4412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "\\u000D"
4413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "02468\\u000D"
4414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "ghi",
441559d709d503bab6e2b61931737e662dd293b40578ccornelius            6, { 6, 6 }, {{ 4, 6, 6, 1, 6, 3}, { 4, 6, 6, 1, 6, 3 }},
441659d709d503bab6e2b61931737e662dd293b40578ccornelius            {"4, 6, 6, 1, 6, 3", "4, 6, 6, 1, 6, 3"}
4417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
4418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "abcd\\u000Afgh\\u000D12345\\u000A456",
441959d709d503bab6e2b61931737e662dd293b40578ccornelius            6, { 4, 4 }, {{ 5, 4, 6, 3 }, { 5, 4, 6, 3 }},
442059d709d503bab6e2b61931737e662dd293b40578ccornelius            {"5, 4, 6, 3", "5, 4, 6, 3"}
4421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
4422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "abcd\\u000Afgh\\u000D12345\\u000A45\\u000D",
442359d709d503bab6e2b61931737e662dd293b40578ccornelius            6, { 4, 4 }, {{ 5, 4, 6, 3 }, { 5, 4, 6, 3 }},
442459d709d503bab6e2b61931737e662dd293b40578ccornelius            {"5, 4, 6, 3", "5, 4, 6, 3"}
4425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        },
4426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {   "abcde\\u000Afghi",
442759d709d503bab6e2b61931737e662dd293b40578ccornelius            10, { 2, 2 }, {{ 6, 4 }, { 6, 4 }},
442859d709d503bab6e2b61931737e662dd293b40578ccornelius            {"6, 4", "6, 4"}
4429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
4430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
4431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar src[MAXLEN];
4432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDi *pBiDi = NULL;
4433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *pSrc;
4434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode rc = U_ZERO_ERROR;
4435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t srcLen, processedLen, chunk, len, nPortions;
4436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i, j, levelIndex;
4437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDiLevel level;
4438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int nTests = LENGTHOF(testData), nLevels = LENGTHOF(paraLevels);
4439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool mismatch, testOK = TRUE;
444059d709d503bab6e2b61931737e662dd293b40578ccornelius   char processedLenStr[MAXPORTIONS * 5];
4441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nEntering TestStreaming\n\n");
4443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pBiDi = getBiDiObject();
4445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_orderParagraphsLTR(pBiDi, TRUE);
4447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (levelIndex = 0; levelIndex < nLevels; levelIndex++) {
4449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < nTests; i++) {
4450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            srcLen = u_unescape(testData[i].textIn, src, MAXLEN);
4451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            chunk = testData[i].chunk;
4452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            nPortions = testData[i].nPortions[levelIndex];
4453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            level = paraLevels[levelIndex];
445459d709d503bab6e2b61931737e662dd293b40578ccornelius            processedLenStr[0] = NULL_CHAR;
4455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Testing level %d, case %d\n", level, i);
4456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            mismatch = FALSE;
4458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ubidi_setReorderingOptions(pBiDi, UBIDI_OPTION_STREAMING);
4460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (j = 0, pSrc = src; j < MAXPORTIONS && srcLen > 0; j++) {
4461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                len = chunk < srcLen ? chunk : srcLen;
4463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ubidi_setPara(pBiDi, pSrc, len, level, NULL, &rc);
4464c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                if (!assertSuccessful("ubidi_setPara", &rc)) {
4465c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    break;
4466c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                }
4467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                processedLen = ubidi_getProcessedLength(pBiDi);
4469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (processedLen == 0) {
4470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    ubidi_setReorderingOptions(pBiDi, UBIDI_OPTION_DEFAULT);
4471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    j--;
4472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    continue;
4473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
4474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ubidi_setReorderingOptions(pBiDi, UBIDI_OPTION_STREAMING);
4475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
447659d709d503bab6e2b61931737e662dd293b40578ccornelius                mismatch |= (UBool)(j >= nPortions ||
4477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           processedLen != testData[i].portionLens[levelIndex][j]);
4478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                sprintf(processedLenStr + j * 4, "%4d", processedLen);
4480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                srcLen -= processedLen, pSrc += processedLen;
4481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
4482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (mismatch || j != nPortions) {
4484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                testOK = FALSE;
4485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("\nProcessed lengths mismatch.\n"
4486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "\tParagraph level: %u\n"
4487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "\tInput string: %s\n"
4488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "\tActually processed portion lengths: { %s }\n"
4489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "\tExpected portion lengths          : { %s }\n",
4490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    paraLevels[levelIndex], testData[i].textIn,
4491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    processedLenStr, testData[i].message[levelIndex]);
4492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
4493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
4494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(pBiDi);
4496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (testOK == TRUE) {
4497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\nBiDi streaming test OK\n");
4498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nExiting TestStreaming\n\n");
4500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN
4503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UCharDirection U_CALLCONV
4505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruoverrideBidiClass(const void *context, UChar32 c) {
4506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define DEF U_BIDI_CLASS_DEFAULT
4508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UCharDirection customClasses[] = {
4510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       /* 0/8    1/9    2/A    3/B    4/C    5/D    6/E    7/F  */
4511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, /* 00-07 */
4512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, /* 08-0F */
4513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, /* 10-17 */
4514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, /* 18-1F */
4515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          DEF,   DEF,   DEF,   DEF,   DEF,   DEF,     R,   DEF, /* 20-27 */
4516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, /* 28-2F */
4517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           EN,    EN,    EN,    EN,    EN,    EN,    AN,    AN, /* 30-37 */
4518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           AN,    AN,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, /* 38-3F */
4519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            L,    AL,    AL,    AL,    AL,    AL,    AL,     R, /* 40-47 */
4520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            R,     R,     R,     R,     R,     R,     R,     R, /* 48-4F */
4521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            R,     R,     R,     R,     R,     R,     R,     R, /* 50-57 */
4522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            R,     R,     R,   LRE,   DEF,   RLE,   PDF,     S, /* 58-5F */
4523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          NSM,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, /* 60-67 */
4524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, /* 68-6F */
4525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF,   DEF, /* 70-77 */
4526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          DEF,   DEF,   DEF,   LRO,     B,   RLO,    BN,   DEF  /* 78-7F */
4527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
4528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const int nEntries = LENGTHOF(customClasses);
4529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *dummy = context;        /* just to avoid a compiler warning */
4530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dummy++;
4531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return c >= nEntries ? U_BIDI_CLASS_DEFAULT : customClasses[c];
4533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END
4536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void verifyCallbackParams(UBiDiClassCallback* fn, const void* context,
4538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 UBiDiClassCallback* expectedFn,
4539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 const void* expectedContext,
4540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 int32_t sizeOfContext) {
4541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fn != expectedFn) {
4542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Class callback pointer is not set properly.\n");
4543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (context != expectedContext) {
4545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Class callback context is not set properly.\n");
4546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else if (context != NULL &&
4548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            memcmp(context, expectedContext, sizeOfContext)) {
4549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Callback context content doesn't match the expected one.\n");
4550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
4554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestClassOverride(void) {
4555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* const textSrc  = "JIH.>12->a \\u05D0\\u05D1 6 ABC78";
4556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* const textResult = "12<.HIJ->a 78CBA 6 \\u05D1\\u05D0";
4557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar src[MAXLEN], dest[MAXLEN];
4559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode rc = U_ZERO_ERROR;
4560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDi *pBiDi = NULL;
4561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDiClassCallback* oldFn = NULL;
4562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBiDiClassCallback* newFn = overrideBidiClass;
4563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const void* oldContext = NULL;
4564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t srcLen, destLen, textSrcSize = (int32_t)uprv_strlen(textSrc);
4565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char* destChars = NULL;
4566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nEntering TestClassOverride\n\n");
4568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pBiDi = getBiDiObject();
4570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!pBiDi) {
4571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
4572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_getClassCallback(pBiDi, &oldFn, &oldContext);
4575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    verifyCallbackParams(oldFn, oldContext, NULL, NULL, 0);
4576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setClassCallback(pBiDi, newFn, textSrc, &oldFn, &oldContext, &rc);
4578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertSuccessful("ubidi_setClassCallback", &rc)) {
4579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_close(pBiDi);
4580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
4581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    verifyCallbackParams(oldFn, oldContext, NULL, NULL, 0);
4583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_getClassCallback(pBiDi, &oldFn, &oldContext);
4585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    verifyCallbackParams(oldFn, oldContext, newFn, textSrc, textSrcSize);
4586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setClassCallback(pBiDi, newFn, textSrc, &oldFn, &oldContext, &rc);
4588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertSuccessful("ubidi_setClassCallback", &rc)) {
4589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubidi_close(pBiDi);
4590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
4591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    verifyCallbackParams(oldFn, oldContext, newFn, textSrc, textSrcSize);
4593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = u_unescape(textSrc, src, MAXLEN);
4595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_setPara(pBiDi, src, srcLen, UBIDI_LTR, NULL, &rc);
4596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertSuccessful("ubidi_setPara", &rc);
4597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destLen = ubidi_writeReordered(pBiDi, dest, MAXLEN,
4599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   UBIDI_DO_MIRRORING, &rc);
4600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertSuccessful("ubidi_writeReordered", &rc);
4601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destChars = aescstrdup(dest, destLen);
4603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (uprv_strcmp(textResult, destChars)) {
4604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nActual and expected output mismatch.\n"
4605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "%20s %s\n%20s %s\n%20s %s\n",
4606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "Input:", textSrc, "Actual output:", destChars,
4607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "Expected output:", textResult);
4608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
4610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\nClass override test OK\n");
4611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_close(pBiDi);
4613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nExiting TestClassOverride\n\n");
4614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char * formatMap(const int32_t * map, int len, char * buffer)
4617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
4618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, k;
4619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char c;
4620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < len; i++) {
4621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        k = map[i];
4622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (k < 0)
4623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            c = '-';
4624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else if (k >= sizeof(columns))
4625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            c = '+';
4626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
4627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            c = columns[k];
4628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffer[i] = c;
4629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[len] = '\0';
4631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return buffer;
4632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool
4635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerucheckMaps(UBiDi *pBiDi, int32_t stringIndex, const char *src, const char *dest,
4636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          const char *mode, const char* option, UBiDiLevel level, UBool forward)
4637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
4638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t actualLogicalMap[MAX_MAP_LENGTH];
4639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t actualVisualMap[MAX_MAP_LENGTH];
4640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t getIndexMap[MAX_MAP_LENGTH];
464154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    int32_t i, srcLen, resLen, idx;
4642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t *expectedLogicalMap, *expectedVisualMap;
4643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode rc = U_ZERO_ERROR;
4644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool testOK = TRUE;
4645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (forward) {
4647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedLogicalMap = forwardMap[stringIndex];
4648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedVisualMap  = inverseMap[stringIndex];
4649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
4651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedLogicalMap = inverseMap[stringIndex];
4652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectedVisualMap  = forwardMap[stringIndex];
4653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_getLogicalMap(pBiDi, actualLogicalMap, &rc);
4655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertSuccessful("ubidi_getLogicalMap", &rc)) {
4656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testOK = FALSE;
4657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcLen = ubidi_getProcessedLength(pBiDi);
4659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (memcmp(expectedLogicalMap, actualLogicalMap, srcLen * sizeof(int32_t))) {
4660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char expChars[MAX_MAP_LENGTH];
4661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char actChars[MAX_MAP_LENGTH];
4662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nubidi_getLogicalMap() returns unexpected map for output string "
4663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "index %d\n"
4664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "source: %s\n"
4665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "dest  : %s\n"
4666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Scale : %s\n"
4667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "ExpMap: %s\n"
4668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Actual: %s\n"
4669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Paragraph level  : %d == %d\n"
4670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Reordering mode  : %s == %d\n"
4671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Reordering option: %s == %d\n"
4672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Forward flag     : %d\n",
4673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                stringIndex, src, dest, columns,
4674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                formatMap(expectedLogicalMap, srcLen, expChars),
4675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                formatMap(actualLogicalMap, srcLen, actChars),
4676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                level, ubidi_getParaLevel(pBiDi),
4677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                mode, ubidi_getReorderingMode(pBiDi),
4678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                option, ubidi_getReorderingOptions(pBiDi),
4679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                forward
4680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                );
4681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testOK = FALSE;
4682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resLen = ubidi_getResultLength(pBiDi);
4684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubidi_getVisualMap(pBiDi, actualVisualMap, &rc);
4685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assertSuccessful("ubidi_getVisualMap", &rc);
4686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (memcmp(expectedVisualMap, actualVisualMap, resLen * sizeof(int32_t))) {
4687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char expChars[MAX_MAP_LENGTH];
4688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char actChars[MAX_MAP_LENGTH];
4689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nubidi_getVisualMap() returns unexpected map for output string "
4690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "index %d\n"
4691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "source: %s\n"
4692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "dest  : %s\n"
4693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Scale : %s\n"
4694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "ExpMap: %s\n"
4695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Actual: %s\n"
4696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Paragraph level  : %d == %d\n"
4697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Reordering mode  : %s == %d\n"
4698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Reordering option: %s == %d\n"
4699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Forward flag     : %d\n",
4700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                stringIndex, src, dest, columns,
4701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                formatMap(expectedVisualMap, resLen, expChars),
4702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                formatMap(actualVisualMap, resLen, actChars),
4703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                level, ubidi_getParaLevel(pBiDi),
4704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                mode, ubidi_getReorderingMode(pBiDi),
4705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                option, ubidi_getReorderingOptions(pBiDi),
4706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                forward
4707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                );
4708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testOK = FALSE;
4709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < srcLen; i++) {
471154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        idx = ubidi_getVisualIndex(pBiDi, i, &rc);
4712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        assertSuccessful("ubidi_getVisualIndex", &rc);
471354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        getIndexMap[i] = idx;
4714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (memcmp(actualLogicalMap, getIndexMap, srcLen * sizeof(int32_t))) {
4716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char actChars[MAX_MAP_LENGTH];
4717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char gotChars[MAX_MAP_LENGTH];
4718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nMismatch between ubidi_getLogicalMap and ubidi_getVisualIndex for output string "
4719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "index %d\n"
4720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "source: %s\n"
4721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "dest  : %s\n"
4722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Scale : %s\n"
4723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "ActMap: %s\n"
4724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "IdxMap: %s\n"
4725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Paragraph level  : %d == %d\n"
4726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Reordering mode  : %s == %d\n"
4727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Reordering option: %s == %d\n"
4728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Forward flag     : %d\n",
4729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                stringIndex, src, dest, columns,
4730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                formatMap(actualLogicalMap, srcLen, actChars),
4731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                formatMap(getIndexMap, srcLen, gotChars),
4732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                level, ubidi_getParaLevel(pBiDi),
4733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                mode, ubidi_getReorderingMode(pBiDi),
4734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                option, ubidi_getReorderingOptions(pBiDi),
4735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                forward
4736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                );
4737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testOK = FALSE;
4738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < resLen; i++) {
474054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        idx = ubidi_getLogicalIndex(pBiDi, i, &rc);
4741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        assertSuccessful("ubidi_getLogicalIndex", &rc);
474254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        getIndexMap[i] = idx;
4743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (memcmp(actualVisualMap, getIndexMap, resLen * sizeof(int32_t))) {
4745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char actChars[MAX_MAP_LENGTH];
4746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char gotChars[MAX_MAP_LENGTH];
4747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("\nMismatch between ubidi_getVisualMap and ubidi_getLogicalIndex for output string "
4748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "index %d\n"
4749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "source: %s\n"
4750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "dest  : %s\n"
4751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Scale : %s\n"
4752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "ActMap: %s\n"
4753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "IdxMap: %s\n"
4754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Paragraph level  : %d == %d\n"
4755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Reordering mode  : %s == %d\n"
4756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Reordering option: %s == %d\n"
4757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "Forward flag     : %d\n",
4758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                stringIndex, src, dest, columns,
4759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                formatMap(actualVisualMap, resLen, actChars),
4760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                formatMap(getIndexMap, resLen, gotChars),
4761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                level, ubidi_getParaLevel(pBiDi),
4762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                mode, ubidi_getReorderingMode(pBiDi),
4763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                option, ubidi_getReorderingOptions(pBiDi),
4764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                forward
4765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                );
4766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testOK = FALSE;
4767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
4768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return testOK;
4769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
4770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4771b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic UBool
4772b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoassertIllegalArgument(const char* message, UErrorCode* rc) {
4773b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (*rc != U_ILLEGAL_ARGUMENT_ERROR) {
4774b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err("%s() failed with error %s.\n", message, myErrorName(*rc));
4775b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return FALSE;
4776b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
4777b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return TRUE;
4778b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
4779b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
4780b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef struct {
4781b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char* prologue;
4782b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char* source;
4783b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char* epilogue;
4784b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char* expected;
4785b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBiDiLevel paraLevel;
4786b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} contextCase;
4787b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
4788b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const contextCase contextData[] = {
4789b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*00*/  {"", "", "", "", UBIDI_LTR},
4790b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*01*/  {"", ".-=JKL-+*", "", ".-=LKJ-+*", UBIDI_LTR},
4791b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*02*/  {" ", ".-=JKL-+*", " ", ".-=LKJ-+*", UBIDI_LTR},
4792b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*03*/  {"a", ".-=JKL-+*", "b", ".-=LKJ-+*", UBIDI_LTR},
4793b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*04*/  {"D", ".-=JKL-+*", "", "LKJ=-.-+*", UBIDI_LTR},
4794b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*05*/  {"", ".-=JKL-+*", " D", ".-=*+-LKJ", UBIDI_LTR},
4795b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*06*/  {"", ".-=JKL-+*", " 2", ".-=*+-LKJ", UBIDI_LTR},
4796b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*07*/  {"", ".-=JKL-+*", " 7", ".-=*+-LKJ", UBIDI_LTR},
4797b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*08*/  {" G 1", ".-=JKL-+*", " H", "*+-LKJ=-.", UBIDI_LTR},
4798b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*09*/  {"7", ".-=JKL-+*", " H", ".-=*+-LKJ", UBIDI_LTR},
4799b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*10*/  {"", ".-=abc-+*", "", "*+-abc=-.", UBIDI_RTL},
4800b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*11*/  {" ", ".-=abc-+*", " ", "*+-abc=-.", UBIDI_RTL},
4801b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*12*/  {"D", ".-=abc-+*", "G", "*+-abc=-.", UBIDI_RTL},
4802b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*13*/  {"x", ".-=abc-+*", "", "*+-.-=abc", UBIDI_RTL},
4803b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*14*/  {"", ".-=abc-+*", " y", "abc-+*=-.", UBIDI_RTL},
4804b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*15*/  {"", ".-=abc-+*", " 2", "abc-+*=-.", UBIDI_RTL},
4805b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*16*/  {" x 1", ".-=abc-+*", " 2", ".-=abc-+*", UBIDI_RTL},
4806b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*17*/  {" x 7", ".-=abc-+*", " 8", "*+-.-=abc", UBIDI_RTL},
4807b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*18*/  {"x|", ".-=abc-+*", " 8", "*+-abc=-.", UBIDI_RTL},
4808b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*19*/  {"G|y", ".-=abc-+*", " 8", "*+-.-=abc", UBIDI_RTL},
4809b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*20*/  {"", ".-=", "", ".-=", UBIDI_DEFAULT_LTR},
4810b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*21*/  {"D", ".-=", "", "=-.", UBIDI_DEFAULT_LTR},
4811b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*22*/  {"G", ".-=", "", "=-.", UBIDI_DEFAULT_LTR},
4812b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*23*/  {"xG", ".-=", "", ".-=", UBIDI_DEFAULT_LTR},
4813b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*24*/  {"x|G", ".-=", "", "=-.", UBIDI_DEFAULT_LTR},
4814b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*25*/  {"x|G", ".-=|-+*", "", "=-.|-+*", UBIDI_DEFAULT_LTR},
4815b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
4816b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define CONTEXT_COUNT       LENGTHOF(contextData)
4817b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
4818b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void
4819b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotestContext(void) {
4820b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
4821b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UChar prologue[MAXLEN], epilogue[MAXLEN], src[MAXLEN], dest[MAXLEN];
4822b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    char destChars[MAXLEN];
4823b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBiDi *pBiDi = NULL;
4824b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode rc;
4825b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t proLength, epiLength, srcLen, destLen, tc;
4826b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    contextCase cc;
4827b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool testOK = TRUE;
4828b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
4829b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    log_verbose("\nEntering TestContext \n\n");
4830b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
4831b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* test null BiDi object */
4832b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    rc = U_ZERO_ERROR;
4833b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ubidi_setContext(pBiDi, NULL, 0, NULL, 0, &rc);
4834b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    testOK &= assertIllegalArgument("Error when BiDi object is null", &rc);
4835b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
4836b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    pBiDi = getBiDiObject();
4837b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ubidi_orderParagraphsLTR(pBiDi, TRUE);
4838b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
4839b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* test proLength < -1 */
4840b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    rc = U_ZERO_ERROR;
4841b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ubidi_setContext(pBiDi, NULL, -2, NULL, 0, &rc);
4842b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    testOK &= assertIllegalArgument("Error when proLength < -1", &rc);
4843b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* test epiLength < -1 */
4844b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    rc = U_ZERO_ERROR;
4845b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ubidi_setContext(pBiDi, NULL, 0, NULL, -2, &rc);
4846b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    testOK &= assertIllegalArgument("Error when epiLength < -1", &rc);
4847b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* test prologue == NULL */
4848b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    rc = U_ZERO_ERROR;
4849b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ubidi_setContext(pBiDi, NULL, 3, NULL, 0, &rc);
4850b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    testOK &= assertIllegalArgument("Prologue is NULL", &rc);
4851b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* test epilogue == NULL */
4852b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    rc = U_ZERO_ERROR;
4853b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ubidi_setContext(pBiDi, NULL, 0, NULL, 4, &rc);
4854b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    testOK &= assertIllegalArgument("Epilogue is NULL", &rc);
4855b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
4856b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (tc = 0; tc < CONTEXT_COUNT; tc++) {
4857b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        cc = contextData[tc];
4858b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        proLength = strlen(cc.prologue);
4859b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        pseudoToU16(proLength, cc.prologue, prologue);
4860b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        epiLength = strlen(cc.epilogue);
4861b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        pseudoToU16(epiLength, cc.epilogue, epilogue);
4862b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /* in the call below, prologue and epilogue are swapped to show
4863b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho           that the next call will override this call */
4864b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        rc = U_ZERO_ERROR;
4865b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        ubidi_setContext(pBiDi, epilogue, epiLength, prologue, proLength, &rc);
4866b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        testOK &= assertSuccessful("swapped ubidi_setContext", &rc);
4867b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        ubidi_setContext(pBiDi, prologue, -1, epilogue, -1, &rc);
4868b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        testOK &= assertSuccessful("regular ubidi_setContext", &rc);
4869b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        srcLen = strlen(cc.source);
4870b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        pseudoToU16(srcLen, cc.source, src);
4871b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        ubidi_setPara(pBiDi, src, srcLen, cc.paraLevel, NULL, &rc);
4872b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        testOK &= assertSuccessful("ubidi_setPara", &rc);
4873b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        destLen = ubidi_writeReordered(pBiDi, dest, MAXLEN, UBIDI_DO_MIRRORING, &rc);
4874b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        assertSuccessful("ubidi_writeReordered", &rc);
4875b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        u16ToPseudo(destLen, dest, destChars);
4876b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (uprv_strcmp(cc.expected, destChars)) {
4877b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            char formatChars[MAXLEN];
4878b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("\nActual and expected output mismatch on case %d.\n"
4879b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                "%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",
4880b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                tc,
4881b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                "Prologue:", cc.prologue,
4882b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                "Input:", cc.source,
4883b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                "Epilogue:", cc.epilogue,
4884b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                "Expected output:", cc.expected,
4885b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                "Actual output:", destChars,
4886b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                "Levels:", formatLevels(pBiDi, formatChars),
4887b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                "Reordering mode:", ubidi_getReorderingMode(pBiDi),
4888b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                "Paragraph level:", ubidi_getParaLevel(pBiDi),
4889b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                "Reordering option:", ubidi_getReorderingOptions(pBiDi));
4890b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            testOK = FALSE;
4891b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
4892b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
4893b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (testOK == TRUE) {
4894b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_verbose("\nContext test OK\n");
4895b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
4896b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ubidi_close(pBiDi);
4897b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
4898b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    log_verbose("\nExiting TestContext \n\n");
4899b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
4900