+};
+//-----------------------------------------------------------------------------------
+//
+// TestArabicShapeThreads -- see if calls to u_shapeArabic in many threads works successfully
+//
+// Set up N threads pointing at N chars. When they are started, they will make calls to doTailTest which tests
+// u_shapeArabic, if the calls are successful it will the set * chars.
+// At the end we make sure all threads managed to run u_shapeArabic successfully.
+// This is a unit test for ticket 9473
+//
+//-----------------------------------------------------------------------------------
+class TestArabicShapeThreads : public SimpleThread
+{
+public:
+ TestArabicShapeThreads(char* whatToChange) { fWhatToChange = whatToChange;}
+ virtual void run() {
+ if(doTailTest()==TRUE)
+ *fWhatToChange = '*';
+ }
+private:
+ char *fWhatToChange;
+
+ UBool doTailTest(void) {
+ static const UChar src[] = { 0x0020, 0x0633, 0 };
+ static const UChar dst_old[] = { 0xFEB1, 0x200B,0 };
+ static const UChar dst_new[] = { 0xFEB1, 0xFE73,0 };
+ UChar dst[3] = { 0x0000, 0x0000,0 };
+ int32_t length;
+ UErrorCode status;
+ IntlTest inteltst = IntlTest();
+
+ status = U_ZERO_ERROR;
+ length = u_shapeArabic(src, -1, dst, LENGTHOF(dst),
+ U_SHAPE_LETTERS_SHAPE|U_SHAPE_SEEN_TWOCELL_NEAR, &status);
+ if(U_FAILURE(status)) {
+ inteltst.errln("Fail: status %s\n", u_errorName(status));
+ return FALSE;
+ } else if(length!=2) {
+ inteltst.errln("Fail: len %d expected 3\n", length);
+ return FALSE;
+ } else if(u_strncmp(dst,dst_old,LENGTHOF(dst))) {
+ inteltst.errln("Fail: got U+%04X U+%04X expected U+%04X U+%04X\n",
+ dst[0],dst[1],dst_old[0],dst_old[1]);
+ return FALSE;
+ }
+
+
+ //"Trying new tail
+ status = U_ZERO_ERROR;
+ length = u_shapeArabic(src, -1, dst, LENGTHOF(dst),
+ U_SHAPE_LETTERS_SHAPE|U_SHAPE_SEEN_TWOCELL_NEAR|U_SHAPE_TAIL_NEW_UNICODE, &status);
+ if(U_FAILURE(status)) {
+ inteltst.errln("Fail: status %s\n", u_errorName(status));
+ return FALSE;
+ } else if(length!=2) {
+ inteltst.errln("Fail: len %d expected 3\n", length);
+ return FALSE;
+ } else if(u_strncmp(dst,dst_new,LENGTHOF(dst))) {
+ inteltst.errln("Fail: got U+%04X U+%04X expected U+%04X U+%04X\n",
+ dst[0],dst[1],dst_new[0],dst_new[1]);
+ return FALSE;
+ }
+
+
+ return TRUE;
+
+}
+
+