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