X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/b331163bffd790ced0e88b73f44f86d49ccc48a5..4f1e1a09ce4daed860e35d359ce2fceccb0764e8:/icuSources/test/intltest/bidiconf.cpp diff --git a/icuSources/test/intltest/bidiconf.cpp b/icuSources/test/intltest/bidiconf.cpp index c989bd50..b91416f4 100644 --- a/icuSources/test/intltest/bidiconf.cpp +++ b/icuSources/test/intltest/bidiconf.cpp @@ -1,3 +1,5 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -6,7 +8,7 @@ * ******************************************************************************* * file name: bidiconf.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -258,7 +260,7 @@ UBool BiDiConformanceTest::parseInputStringFromBiDiClasses(const char *&start) { void BiDiConformanceTest::TestBidiTest() { IcuTestErrorCode errorCode(*this, "TestBidiTest"); const char *sourceTestDataPath=getSourceTestData(errorCode); - if(errorCode.logIfFailureAndReset("unable to find the source/test/testdata " + if(errorCode.errIfFailureAndReset("unable to find the source/test/testdata " "folder (getSourceTestData())")) { return; } @@ -273,7 +275,7 @@ void BiDiConformanceTest::TestBidiTest() { LocalUBiDiPointer ubidi(ubidi_open()); ubidi_setClassCallback(ubidi.getAlias(), biDiConfUBiDiClassCallback, NULL, NULL, NULL, errorCode); - if(errorCode.logIfFailureAndReset("ubidi_setClassCallback()")) { + if(errorCode.errIfFailureAndReset("ubidi_setClassCallback()")) { return; } lineNumber=0; @@ -331,7 +333,7 @@ void BiDiConformanceTest::TestBidiTest() { ubidi_setPara(ubidi.getAlias(), inputString.getBuffer(), inputString.length(), paraLevels[i], NULL, errorCode); const UBiDiLevel *actualLevels=ubidi_getLevels(ubidi.getAlias(), errorCode); - if(errorCode.logIfFailureAndReset("ubidi_setPara() or ubidi_getLevels()")) { + if(errorCode.errIfFailureAndReset("ubidi_setPara() or ubidi_getLevels()")) { errln("Input line %d: %s", (int)lineNumber, line); return; } @@ -424,10 +426,12 @@ L L R R R B R R L L L B ON ON ; 3 ; 0 ; 0 0 1 1 1 0 1 1 2 2 2 1 1 1 * ******************************************************************************* */ +enum { kMaxUtxt = 32, kMaxUctl = 16 }; + void BiDiConformanceTest::TestBidiCharacterTest() { IcuTestErrorCode errorCode(*this, "TestBidiCharacterTest"); const char *sourceTestDataPath=getSourceTestData(errorCode); - if(errorCode.logIfFailureAndReset("unable to find the source/test/testdata " + if(errorCode.errIfFailureAndReset("unable to find the source/test/testdata " "folder (getSourceTestData())")) { return; } @@ -461,7 +465,7 @@ void BiDiConformanceTest::TestBidiCharacterTest() { // Parse the code point string in field 0. UChar *buffer=inputString.getBuffer(200); int32_t length=u_parseString(start, buffer, inputString.getCapacity(), NULL, errorCode); - if(errorCode.logIfFailureAndReset("Invalid string in field 0")) { + if(errorCode.errIfFailureAndReset("Invalid string in field 0")) { errln("Input line %d: %s", (int)lineNumber, line); inputString.remove(); continue; @@ -540,7 +544,7 @@ void BiDiConformanceTest::TestBidiCharacterTest() { ubidi_setPara(ubidi.getAlias(), inputString.getBuffer(), inputString.length(), paraLevel, NULL, errorCode); const UBiDiLevel *actualLevels=ubidi_getLevels(ubidi.getAlias(), errorCode); - if(errorCode.logIfFailureAndReset("ubidi_setPara() or ubidi_getLevels()")) { + if(errorCode.errIfFailureAndReset("ubidi_setPara() or ubidi_getLevels()")) { errln("Input line %d: %s", (int)lineNumber, line); continue; } @@ -557,6 +561,81 @@ void BiDiConformanceTest::TestBidiCharacterTest() { if(orderingCount>=0 && !checkOrdering(ubidi.getAlias())) { continue; } + + // tests for ubidi_setParaWithControls + // skip 2 tests known not to work (out of 91678 cases, though + // only 86 of those tests use controls so 2.3% of those failing), + // still investigating these + if (lineNumber>=212 && lineNumber<=213) { + continue; + } + + const UChar* ubufPtr = inputString.getBuffer(); + int32_t ubufIdx; + UChar utxt[kMaxUtxt]; + UBiDiLevel ulev[kMaxUtxt]; + int32_t offsets[kMaxUctl]; + UChar* uctlPtrs[kMaxUctl]; + UChar uctl[kMaxUctl][5]; + UChar *uctlPtr; + int32_t utxtLen = 0, offsetsLen = 0, ctlLen = 0; + UBool fail = FALSE; + for (ubufIdx = 0; ubufIdx < inputString.length(); ubufIdx++) { + UChar uc = ubufPtr[ubufIdx]; + if ( (uc >=0x202A && uc<=0x202E) || (uc >=0x2066 && uc<=0x2069) ) { + // have a bidi control + if (ctlLen >= 4) { + fail = TRUE; break; + } + if (ctlLen == 0) { + // starting a new control sequence + if (offsetsLen >= kMaxUctl) { + fail = TRUE; break; + } + offsets[offsetsLen] = utxtLen; + uctlPtr = &uctl[offsetsLen][0]; + uctlPtrs[offsetsLen] = uctlPtr; + offsetsLen++; + } + uctlPtr[ctlLen++] = uc; + uctlPtr[ctlLen] = 0; + } else { + if (utxtLen >= kMaxUtxt) { + fail = TRUE; break; + } + ctlLen = 0; + utxt[utxtLen] = uc; + levels[utxtLen] = levels[ubufIdx]; // will always have ubufIdx >= utxtLen so this is OK + utxtLen++; + } + } + levelsCount = utxtLen; + if (fail) { + logln("Skipping BidiCharacterTest unsuitable for ubidi_setParaWithControls: %d: %s", (int)lineNumber, line); + continue; // can't use this test + } + if (offsetsLen > 0 && offsets[offsetsLen-1] >= utxtLen) { + --offsetsLen; + ubidi_setContext(ubidi.getAlias(), NULL, 0, uctlPtrs[offsetsLen], -1, errorCode); + } else { + ubidi_setContext(ubidi.getAlias(), NULL, 0, NULL, 0, errorCode); + } + ubidi_setParaWithControls(ubidi.getAlias(), utxt, utxtLen, paraLevel, + offsets, offsetsLen, NULL, uctlPtrs, errorCode); + actualLevels=ubidi_getLevels(ubidi.getAlias(), errorCode); + if(errorCode.errIfFailureAndReset("ubidi_setContext()/ubidi_setParaWithControls()/ubidi_getLevels()")) { + errln("Input line %d: %s", (int)lineNumber, line); + continue; + } + if((actualLevel=ubidi_getParaLevel(ubidi.getAlias()))!=resolvedParaLevel) { + printErrorLine(); + errln("\nError on line %d: Wrong resolved paragraph level from ubidi_setParaWithControls; expected %d actual %d", + (int)lineNumber, resolvedParaLevel, actualLevel); + continue; + } + if(!checkLevels(actualLevels, ubidi_getProcessedLength(ubidi.getAlias()))) { + continue; + } } } @@ -631,7 +710,7 @@ UBool BiDiConformanceTest::checkOrdering(UBiDi *ubidi) { // and loop over each run's indexes, but that seems unnecessary for this test code. for(i=visualIndex=0; i