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