void LocalPointerTest::TestLocalXyzPointerMoveSwap() { #if !UCONFIG_NO_NORMALIZATION IcuTestErrorCode errorCode(*this, "TestLocalXyzPointerMoveSwap"); const UNormalizer2 *nfc=unorm2_getNFCInstance(errorCode); const UNormalizer2 *nfd=unorm2_getNFDInstance(errorCode); if(errorCode.logIfFailureAndReset("unorm2_getNF[CD]Instance()")) { return; } UnicodeSet emptySet; UNormalizer2 *p1 = unorm2_openFiltered(nfc, emptySet.toUSet(), errorCode); UNormalizer2 *p2 = unorm2_openFiltered(nfd, emptySet.toUSet(), errorCode); LocalUNormalizer2Pointer f1(p1); LocalUNormalizer2Pointer f2(p2); if(errorCode.logIfFailureAndReset("unorm2_openFiltered()")) { return; } if(f1.isNull() || f2.isNull()) { errln("LocalUNormalizer2Pointer failure"); return; } f1.swap(f2); if(f1.getAlias() != p2 || f2.getAlias() != p1) { errln("LocalUNormalizer2Pointer.swap() did not swap"); } swap(f1, f2); if(f1.getAlias() != p1 || f2.getAlias() != p2) { errln("swap(LocalUNormalizer2Pointer) did not swap back"); } LocalUNormalizer2Pointer f3; f3.moveFrom(f1); if(f3.getAlias() != p1 || f1.isValid()) { errln("LocalUNormalizer2Pointer.moveFrom() did not move"); } #if U_HAVE_RVALUE_REFERENCES infoln("TestLocalXyzPointerMoveSwap() with rvalue references"); f1 = static_cast<LocalUNormalizer2Pointer &&>(f3); if(f1.getAlias() != p1 || f3.isValid()) { errln("LocalUNormalizer2Pointer move assignment operator did not move"); } LocalUNormalizer2Pointer f4(static_cast<LocalUNormalizer2Pointer &&>(f2)); if(f4.getAlias() != p2 || f2.isValid()) { errln("LocalUNormalizer2Pointer move constructor did not move"); } #else infoln("TestLocalXyzPointerMoveSwap() without rvalue references"); #endif // Move self assignment leaves the object valid but in an undefined state. // Do it to make sure there is no crash, // but do not check for any particular resulting value. f1.moveFrom(f1); f3.moveFrom(f3); #endif /* !UCONFIG_NO_NORMALIZATION */ }
void LocalPointerTest::TestLocalArrayMoveSwap() { UnicodeString *p1 = new UnicodeString[2]; UnicodeString *p2 = new UnicodeString[3]; LocalArray<UnicodeString> a1(p1); LocalArray<UnicodeString> a2(p2); a1.swap(a2); if(a1.getAlias() != p2 || a2.getAlias() != p1) { errln("LocalArray.swap() did not swap"); } swap(a1, a2); if(a1.getAlias() != p1 || a2.getAlias() != p2) { errln("swap(LocalArray) did not swap back"); } LocalArray<UnicodeString> a3; a3.moveFrom(a1); if(a3.getAlias() != p1 || a1.isValid()) { errln("LocalArray.moveFrom() did not move"); } #if U_HAVE_RVALUE_REFERENCES infoln("TestLocalArrayMoveSwap() with rvalue references"); a1 = static_cast<LocalArray<UnicodeString> &&>(a3); if(a1.getAlias() != p1 || a3.isValid()) { errln("LocalArray move assignment operator did not move"); } LocalArray<UnicodeString> a4(static_cast<LocalArray<UnicodeString> &&>(a2)); if(a4.getAlias() != p2 || a2.isValid()) { errln("LocalArray move constructor did not move"); } #else infoln("TestLocalArrayMoveSwap() without rvalue references"); #endif // Move self assignment leaves the object valid but in an undefined state. // Do it to make sure there is no crash, // but do not check for any particular resulting value. a1.moveFrom(a1); a3.moveFrom(a3); }
void LocalPointerTest::TestLocalPointerMoveSwap() { UnicodeString *p1 = new UnicodeString((UChar)0x61); UnicodeString *p2 = new UnicodeString((UChar)0x62); LocalPointer<UnicodeString> s1(p1); LocalPointer<UnicodeString> s2(p2); s1.swap(s2); if(s1.getAlias() != p2 || s2.getAlias() != p1) { errln("LocalPointer.swap() did not swap"); } swap(s1, s2); if(s1.getAlias() != p1 || s2.getAlias() != p2) { errln("swap(LocalPointer) did not swap back"); } LocalPointer<UnicodeString> s3; s3.moveFrom(s1); if(s3.getAlias() != p1 || s1.isValid()) { errln("LocalPointer.moveFrom() did not move"); } #if U_HAVE_RVALUE_REFERENCES infoln("TestLocalPointerMoveSwap() with rvalue references"); s1 = static_cast<LocalPointer<UnicodeString> &&>(s3); if(s1.getAlias() != p1 || s3.isValid()) { errln("LocalPointer move assignment operator did not move"); } LocalPointer<UnicodeString> s4(static_cast<LocalPointer<UnicodeString> &&>(s2)); if(s4.getAlias() != p2 || s2.isValid()) { errln("LocalPointer move constructor did not move"); } #else infoln("TestLocalPointerMoveSwap() without rvalue references"); #endif // Move self assignment leaves the object valid but in an undefined state. // Do it to make sure there is no crash, // but do not check for any particular resulting value. s1.moveFrom(s1); s3.moveFrom(s3); }
void UCAConformanceTest::openTestFile(const char *type) { const char *ext = ".txt"; if(testFile) { fclose(testFile); } char buffer[1024]; uprv_strcpy(buffer, testDataPath); uprv_strcat(buffer, type); int32_t bufLen = (int32_t)uprv_strlen(buffer); // we try to open 3 files: // path/CollationTest_type.txt // path/CollationTest_type_SHORT.txt // path/CollationTest_type_STUB.txt // we are going to test with the first one that we manage to open. uprv_strcpy(buffer+bufLen, ext); testFile = fopen(buffer, "rb"); if(testFile == 0) { uprv_strcpy(buffer+bufLen, "_SHORT"); uprv_strcat(buffer, ext); testFile = fopen(buffer, "rb"); if(testFile == 0) { uprv_strcpy(buffer+bufLen, "_STUB"); uprv_strcat(buffer, ext); testFile = fopen(buffer, "rb"); if (testFile == 0) { *(buffer+bufLen) = 0; dataerrln("Could not open any of the conformance test files, tried opening base %s\n", buffer); return; } else { infoln( "INFO: Working with the stub file.\n" "If you need the full conformance test, please\n" "download the appropriate data files from:\n" "http://unicode.org/cldr/trac/browser/trunk/common/uca"); } } } }
void SSearchTest::offsetTest() { const char *test[] = { // The sequence \u0FB3\u0F71\u0F71\u0F80 contains a discontiguous // contraction (\u0FB3\u0F71\u0F80) logically followed by \u0F71. "\\u1E33\\u0FB3\\u0F71\\u0F71\\u0F80\\uD835\\uDF6C\\u01B0", "\\ua191\\u16ef\\u2036\\u017a", #if 0 // This results in a complex interaction between contraction, // expansion and normalization that confuses the backwards offset fixups. "\\u0F7F\\u0F80\\u0F81\\u0F82\\u0F83\\u0F84\\u0F85", #endif "\\u0F80\\u0F81\\u0F82\\u0F83\\u0F84\\u0F85", "\\u07E9\\u07EA\\u07F1\\u07F2\\u07F3", "\\u02FE\\u02FF" "\\u0300\\u0301\\u0302\\u0303\\u0304\\u0305\\u0306\\u0307\\u0308\\u0309\\u030A\\u030B\\u030C\\u030D\\u030E\\u030F" "\\u0310\\u0311\\u0312\\u0313\\u0314\\u0315\\u0316\\u0317\\u0318\\u0319\\u031A\\u031B\\u031C\\u031D\\u031E\\u031F" "\\u0320\\u0321\\u0322\\u0323\\u0324\\u0325\\u0326\\u0327\\u0328\\u0329\\u032A\\u032B\\u032C\\u032D\\u032E\\u032F" "\\u0330\\u0331\\u0332\\u0333\\u0334\\u0335\\u0336\\u0337\\u0338\\u0339\\u033A\\u033B\\u033C\\u033D\\u033E\\u033F" "\\u0340\\u0341\\u0342\\u0343\\u0344\\u0345\\u0346\\u0347\\u0348\\u0349\\u034A\\u034B\\u034C\\u034D\\u034E", // currently not working, see #8081 "\\u02FE\\u02FF\\u0300\\u0301\\u0302\\u0303\\u0316\\u0317\\u0318", // currently not working, see #8081 "a\\u02FF\\u0301\\u0316", // currently not working, see #8081 "a\\u02FF\\u0316\\u0301", "a\\u0430\\u0301\\u0316", "a\\u0430\\u0316\\u0301", "abc\\u0E41\\u0301\\u0316", "abc\\u0E41\\u0316\\u0301", "\\u0E41\\u0301\\u0316", "\\u0E41\\u0316\\u0301", "a\\u0301\\u0316", "a\\u0316\\u0301", "\\uAC52\\uAC53", "\\u34CA\\u34CB", "\\u11ED\\u11EE", "\\u30C3\\u30D0", "p\\u00E9ch\\u00E9", "a\\u0301\\u0325", "a\\u0300\\u0325", "a\\u0325\\u0300", "A\\u0323\\u0300B", "A\\u0300\\u0323B", "A\\u0301\\u0323B", "A\\u0302\\u0301\\u0323B", "abc", "ab\\u0300c", "ab\\u0300\\u0323c", " \\uD800\\uDC00\\uDC00", "a\\uD800\\uDC00\\uDC00", "A\\u0301\\u0301", "A\\u0301\\u0323", "A\\u0301\\u0323B", "B\\u0301\\u0323C", "A\\u0300\\u0323B", "\\u0301A\\u0301\\u0301", "abcd\\r\\u0301", "p\\u00EAche", "pe\\u0302che", }; int32_t testCount = ARRAY_SIZE(test); UErrorCode status = U_ZERO_ERROR; RuleBasedCollator *col = (RuleBasedCollator *) Collator::createInstance(Locale::getEnglish(), status); if (U_FAILURE(status)) { errcheckln(status, "Failed to create collator in offsetTest! - %s", u_errorName(status)); return; } char buffer[4096]; // A bit of a hack... just happens to be long enough for all the test cases... // We could allocate one that's the right size by (CE_count * 10) + 2 // 10 chars is enough room for 8 hex digits plus ", ". 2 extra chars for "[" and "]" col->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status); for(int32_t i = 0; i < testCount; i += 1) { if (i>=4 && i<=6 && logKnownIssue("9156", "was 8081")) { continue; // timebomb until ticket #9156 (was #8081) is resolved } UnicodeString ts = CharsToUnicodeString(test[i]); CollationElementIterator *iter = col->createCollationElementIterator(ts); OrderList forwardList; OrderList backwardList; int32_t order, low, high; do { low = iter->getOffset(); order = iter->next(status); high = iter->getOffset(); forwardList.add(order, low, high); } while (order != CollationElementIterator::NULLORDER); iter->reset(); iter->setOffset(ts.length(), status); backwardList.add(CollationElementIterator::NULLORDER, iter->getOffset(), iter->getOffset()); do { high = iter->getOffset(); order = iter->previous(status); low = iter->getOffset(); if (order == CollationElementIterator::NULLORDER) { break; } backwardList.add(order, low, high); } while (TRUE); backwardList.reverse(); if (forwardList.compare(backwardList)) { logln("Works with \"%s\"", test[i]); logln("Forward offsets: [%s]", printOffsets(buffer, forwardList)); // logln("Backward offsets: [%s]", printOffsets(buffer, backwardList)); logln("Forward CEs: [%s]", printOrders(buffer, forwardList)); // logln("Backward CEs: [%s]", printOrders(buffer, backwardList)); logln(); } else { errln("Fails with \"%s\"", test[i]); infoln("Forward offsets: [%s]", printOffsets(buffer, forwardList)); infoln("Backward offsets: [%s]", printOffsets(buffer, backwardList)); infoln("Forward CEs: [%s]", printOrders(buffer, forwardList)); infoln("Backward CEs: [%s]", printOrders(buffer, backwardList)); infoln(); } delete iter; } delete col; }
void SSearchTest::monkeyTest(char *params) { // ook! UErrorCode status = U_ZERO_ERROR; //UCollator *coll = ucol_open(NULL, &status); UCollator *coll = ucol_openFromShortString("S1", FALSE, NULL, &status); if (U_FAILURE(status)) { errcheckln(status, "Failed to create collator in MonkeyTest! - %s", u_errorName(status)); return; } CollData *monkeyData = new CollData(coll, status); USet *expansions = uset_openEmpty(); USet *contractions = uset_openEmpty(); ucol_getContractionsAndExpansions(coll, contractions, expansions, FALSE, &status); U_STRING_DECL(letter_pattern, "[[:letter:]-[:ideographic:]-[:hangul:]]", 39); U_STRING_INIT(letter_pattern, "[[:letter:]-[:ideographic:]-[:hangul:]]", 39); USet *letters = uset_openPattern(letter_pattern, 39, &status); SetMonkey letterMonkey(letters); StringSetMonkey contractionMonkey(contractions, coll, monkeyData); StringSetMonkey expansionMonkey(expansions, coll, monkeyData); UnicodeString testCase; UnicodeString alternate; UnicodeString pattern, altPattern; UnicodeString prefix, altPrefix; UnicodeString suffix, altSuffix; Monkey *monkeys[] = { &letterMonkey, &contractionMonkey, &expansionMonkey, &contractionMonkey, &expansionMonkey, &contractionMonkey, &expansionMonkey, &contractionMonkey, &expansionMonkey}; int32_t monkeyCount = sizeof(monkeys) / sizeof(monkeys[0]); // int32_t nonMatchCount = 0; UCollationStrength strengths[] = {UCOL_PRIMARY, UCOL_SECONDARY, UCOL_TERTIARY}; const char *strengthNames[] = {"primary", "secondary", "tertiary"}; int32_t strengthCount = sizeof(strengths) / sizeof(strengths[0]); int32_t loopCount = quick? 1000 : 10000; int32_t firstStrength = 0; int32_t lastStrength = strengthCount - 1; //*/ 0; if (params != NULL) { #if !UCONFIG_NO_REGULAR_EXPRESSIONS UnicodeString p(params); loopCount = getIntParam("loop", p, loopCount); m_seed = getIntParam("seed", p, m_seed); RegexMatcher m(" *strength *= *(primary|secondary|tertiary) *", p, 0, status); if (m.find()) { UnicodeString breakType = m.group(1, status); for (int32_t s = 0; s < strengthCount; s += 1) { if (breakType == strengthNames[s]) { firstStrength = lastStrength = s; break; } } m.reset(); p = m.replaceFirst("", status); } if (RegexMatcher("\\S", p, 0, status).find()) { // Each option is stripped out of the option string as it is processed. // All options have been checked. The option string should have been completely emptied.. char buf[100]; p.extract(buf, sizeof(buf), NULL, status); buf[sizeof(buf)-1] = 0; errln("Unrecognized or extra parameter: %s\n", buf); return; } #else infoln("SSearchTest built with UCONFIG_NO_REGULAR_EXPRESSIONS: ignoring parameters."); #endif } for(int32_t s = firstStrength; s <= lastStrength; s += 1) { int32_t notFoundCount = 0; logln("Setting strength to %s.", strengthNames[s]); ucol_setStrength(coll, strengths[s]); // TODO: try alternate prefix and suffix too? // TODO: alterntaes are only equal at primary strength. Is this OK? for(int32_t t = 0; t < loopCount; t += 1) { uint32_t seed = m_seed; // int32_t nmc = 0; generateTestCase(coll, monkeys, monkeyCount, pattern, altPattern); generateTestCase(coll, monkeys, monkeyCount, prefix, altPrefix); generateTestCase(coll, monkeys, monkeyCount, suffix, altSuffix); // pattern notFoundCount += monkeyTestCase(coll, pattern, pattern, altPattern, "pattern", strengthNames[s], seed); testCase.remove(); testCase.append(prefix); testCase.append(/*alt*/pattern); // prefix + pattern notFoundCount += monkeyTestCase(coll, testCase, pattern, altPattern, "prefix + pattern", strengthNames[s], seed); testCase.append(suffix); // prefix + pattern + suffix notFoundCount += monkeyTestCase(coll, testCase, pattern, altPattern, "prefix + pattern + suffix", strengthNames[s], seed); testCase.remove(); testCase.append(pattern); testCase.append(suffix); // pattern + suffix notFoundCount += monkeyTestCase(coll, testCase, pattern, altPattern, "pattern + suffix", strengthNames[s], seed); } logln("For strength %s the not found count is %d.", strengthNames[s], notFoundCount); } uset_close(contractions); uset_close(expansions); uset_close(letters); delete monkeyData; ucol_close(coll); }
void SSearchTest::searchTest() { #if !UCONFIG_NO_REGULAR_EXPRESSIONS && !UCONFIG_NO_FILE_IO UErrorCode status = U_ZERO_ERROR; char path[PATH_BUFFER_SIZE]; const char *testFilePath = getPath(path, "ssearch.xml"); if (testFilePath == NULL) { return; /* Couldn't get path: error message already output. */ } LocalPointer<UXMLParser> parser(UXMLParser::createParser(status)); TEST_ASSERT_SUCCESS(status); LocalPointer<UXMLElement> root(parser->parseFile(testFilePath, status)); TEST_ASSERT_SUCCESS(status); if (U_FAILURE(status)) { return; } const UnicodeString *debugTestCase = root->getAttribute("debug"); if (debugTestCase != NULL) { // setenv("USEARCH_DEBUG", "1", 1); } const UXMLElement *testCase; int32_t tc = 0; while((testCase = root->nextChildElement(tc)) != NULL) { if (testCase->getTagName().compare("test-case") != 0) { errln("ssearch, unrecognized XML Element in test file"); continue; } const UnicodeString *id = testCase->getAttribute("id"); *testId = 0; if (id != NULL) { id->extract(0, id->length(), testId, sizeof(testId), US_INV); } // If debugging test case has been specified and this is not it, skip to next. if (id!=NULL && debugTestCase!=NULL && *id != *debugTestCase) { continue; } // // Get the requested collation strength. // Default is tertiary if the XML attribute is missing from the test case. // const UnicodeString *strength = testCase->getAttribute("strength"); UColAttributeValue collatorStrength = UCOL_PRIMARY; if (strength==NULL) { collatorStrength = UCOL_TERTIARY;} else if (*strength=="PRIMARY") { collatorStrength = UCOL_PRIMARY;} else if (*strength=="SECONDARY") { collatorStrength = UCOL_SECONDARY;} else if (*strength=="TERTIARY") { collatorStrength = UCOL_TERTIARY;} else if (*strength=="QUATERNARY") { collatorStrength = UCOL_QUATERNARY;} else if (*strength=="IDENTICAL") { collatorStrength = UCOL_IDENTICAL;} else { // Bogus value supplied for strength. Shouldn't happen, even from // typos, if the XML source has been validated. // This assert is a little deceiving in that strength can be // any of the allowed values, not just TERTIARY, but it will // do the job of getting the error output. TEST_ASSERT(*strength=="TERTIARY") } // // Get the collator normalization flag. Default is UCOL_OFF. // UColAttributeValue normalize = UCOL_OFF; const UnicodeString *norm = testCase->getAttribute("norm"); TEST_ASSERT (norm==NULL || *norm=="ON" || *norm=="OFF"); if (norm!=NULL && *norm=="ON") { normalize = UCOL_ON; } // // Get the alternate_handling flag. Default is UCOL_NON_IGNORABLE. // UColAttributeValue alternateHandling = UCOL_NON_IGNORABLE; const UnicodeString *alt = testCase->getAttribute("alternate_handling"); TEST_ASSERT (alt == NULL || *alt == "SHIFTED" || *alt == "NON_IGNORABLE"); if (alt != NULL && *alt == "SHIFTED") { alternateHandling = UCOL_SHIFTED; } const UnicodeString defLocale("en"); char clocale[100]; const UnicodeString *locale = testCase->getAttribute("locale"); if (locale == NULL || locale->length()==0) { locale = &defLocale; }; locale->extract(0, locale->length(), clocale, sizeof(clocale), NULL); UnicodeString text; UnicodeString target; UnicodeString pattern; int32_t expectedMatchStart = -1; int32_t expectedMatchLimit = -1; const UXMLElement *n; int32_t nodeCount = 0; n = testCase->getChildElement("pattern"); TEST_ASSERT(n != NULL); if (n==NULL) { continue; } text = n->getText(FALSE); text = text.unescape(); pattern.append(text); nodeCount++; n = testCase->getChildElement("pre"); if (n!=NULL) { text = n->getText(FALSE); text = text.unescape(); target.append(text); nodeCount++; } n = testCase->getChildElement("m"); if (n!=NULL) { expectedMatchStart = target.length(); text = n->getText(FALSE); text = text.unescape(); target.append(text); expectedMatchLimit = target.length(); nodeCount++; } n = testCase->getChildElement("post"); if (n!=NULL) { text = n->getText(FALSE); text = text.unescape(); target.append(text); nodeCount++; } // Check that there weren't extra things in the XML TEST_ASSERT(nodeCount == testCase->countChildren()); // Open a collator and StringSearch based on the parameters // obtained from the XML. // status = U_ZERO_ERROR; LocalUCollatorPointer collator(ucol_open(clocale, &status)); ucol_setStrength(collator.getAlias(), collatorStrength); ucol_setAttribute(collator.getAlias(), UCOL_NORMALIZATION_MODE, normalize, &status); ucol_setAttribute(collator.getAlias(), UCOL_ALTERNATE_HANDLING, alternateHandling, &status); LocalUStringSearchPointer uss(usearch_openFromCollator(pattern.getBuffer(), pattern.length(), target.getBuffer(), target.length(), collator.getAlias(), NULL, // the break iterator &status)); TEST_ASSERT_SUCCESS(status); if (U_FAILURE(status)) { continue; } int32_t foundStart = 0; int32_t foundLimit = 0; UBool foundMatch; // // Do the search, check the match result against the expected results. // foundMatch= usearch_search(uss.getAlias(), 0, &foundStart, &foundLimit, &status); TEST_ASSERT_SUCCESS(status); if ((foundMatch && expectedMatchStart<0) || (foundStart != expectedMatchStart) || (foundLimit != expectedMatchLimit)) { TEST_ASSERT(FALSE); // ouput generic error position infoln("Found, expected match start = %d, %d \n" "Found, expected match limit = %d, %d", foundStart, expectedMatchStart, foundLimit, expectedMatchLimit); } // In case there are other matches... // (should we only do this if the test case passed?) while (foundMatch) { expectedMatchStart = foundStart; expectedMatchLimit = foundLimit; foundMatch = usearch_search(uss.getAlias(), foundLimit, &foundStart, &foundLimit, &status); } uss.adoptInstead(usearch_openFromCollator(pattern.getBuffer(), pattern.length(), target.getBuffer(), target.length(), collator.getAlias(), NULL, &status)); // // Do the backwards search, check the match result against the expected results. // foundMatch= usearch_searchBackwards(uss.getAlias(), target.length(), &foundStart, &foundLimit, &status); TEST_ASSERT_SUCCESS(status); if ((foundMatch && expectedMatchStart<0) || (foundStart != expectedMatchStart) || (foundLimit != expectedMatchLimit)) { TEST_ASSERT(FALSE); // ouput generic error position infoln("Found, expected backwards match start = %d, %d \n" "Found, expected backwards match limit = %d, %d", foundStart, expectedMatchStart, foundLimit, expectedMatchLimit); } } #endif }
void DataDrivenNumberFormatTestSuite::showLineInfo() { UnicodeString indent(" "); infoln(indent + fFileTestName); infoln(indent + fFileLine); }
void MultithreadTest::TestCollators() { UErrorCode status = U_ZERO_ERROR; FILE *testFile = NULL; char testDataPath[1024]; strcpy(testDataPath, IntlTest::getSourceTestData(status)); if (U_FAILURE(status)) { errln("ERROR: could not open test data %s", u_errorName(status)); return; } strcat(testDataPath, "CollationTest_"); const char* type = "NON_IGNORABLE"; const char *ext = ".txt"; if(testFile) { fclose(testFile); } char buffer[1024]; strcpy(buffer, testDataPath); strcat(buffer, type); size_t bufLen = strlen(buffer); // we try to open 3 files: // path/CollationTest_type.txt // path/CollationTest_type_SHORT.txt // path/CollationTest_type_STUB.txt // we are going to test with the first one that we manage to open. strcpy(buffer+bufLen, ext); testFile = fopen(buffer, "rb"); if(testFile == 0) { strcpy(buffer+bufLen, "_SHORT"); strcat(buffer, ext); testFile = fopen(buffer, "rb"); if(testFile == 0) { strcpy(buffer+bufLen, "_STUB"); strcat(buffer, ext); testFile = fopen(buffer, "rb"); if (testFile == 0) { *(buffer+bufLen) = 0; dataerrln("could not open any of the conformance test files, tried opening base %s", buffer); return; } else { infoln( "INFO: Working with the stub file.\n" "If you need the full conformance test, please\n" "download the appropriate data files from:\n" "http://source.icu-project.org/repos/icu/tools/trunk/unicodetools/com/ibm/text/data/"); } } } Line *lines = new Line[200000]; memset(lines, 0, sizeof(Line)*200000); int32_t lineNum = 0; UChar bufferU[1024]; int32_t buflen = 0; uint32_t first = 0; uint32_t offset = 0; while (fgets(buffer, 1024, testFile) != NULL) { offset = 0; if(*buffer == 0 || strlen(buffer) < 3 || buffer[0] == '#') { continue; } offset = u_parseString(buffer, bufferU, 1024, &first, &status); buflen = offset; bufferU[offset++] = 0; lines[lineNum].buflen = buflen; //lines[lineNum].buff = new UChar[buflen+1]; u_memcpy(lines[lineNum].buff, bufferU, buflen); lineNum++; } fclose(testFile); if(U_FAILURE(status)) { dataerrln("Couldn't read the test file!"); return; } UCollator *coll = ucol_open("root", &status); if(U_FAILURE(status)) { errcheckln(status, "Couldn't open UCA collator"); return; } ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); ucol_setAttribute(coll, UCOL_CASE_FIRST, UCOL_OFF, &status); ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_OFF, &status); ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_TERTIARY, &status); ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &status); int32_t noSpawned = 0; int32_t spawnResult = 0; LocalArray<CollatorThreadTest> tests(new CollatorThreadTest[kCollatorThreadThreads]); logln(UnicodeString("Spawning: ") + kCollatorThreadThreads + " threads * " + kFormatThreadIterations + " iterations each."); int32_t j = 0; for(j = 0; j < kCollatorThreadThreads; j++) { //logln("Setting collator %i", j); tests[j].setCollator(coll, lines, lineNum); } for(j = 0; j < kCollatorThreadThreads; j++) { log("%i ", j); spawnResult = tests[j].start(); if(spawnResult != 0) { infoln("THREAD INFO: Couldn't spawn more than %i threads", noSpawned); break; } noSpawned++; } logln("Spawned all"); if (noSpawned == 0) { errln("No threads could be spawned."); return; } for(int32_t patience = kCollatorThreadPatience;patience > 0; patience --) { logln("Waiting..."); int32_t i; int32_t terrs = 0; int32_t completed =0; for(i=0;i<kCollatorThreadThreads;i++) { if (tests[i].isRunning() == FALSE) { completed++; //logln(UnicodeString("Test #") + i + " is complete.. "); UnicodeString theErr; if(tests[i].getError(theErr)) { terrs++; errln(UnicodeString("#") + i + ": " + theErr); } // print out the error, too, if any. } } logln("Completed %i tests", completed); if(completed == noSpawned) { logln("Done! All %i tests are finished", noSpawned); if(terrs) { errln("There were errors."); SimpleThread::errorFunc(); } ucol_close(coll); //for(i = 0; i < lineNum; i++) { //delete[] lines[i].buff; //} delete[] lines; return; } SimpleThread::sleep(900); } errln("patience exceeded. "); SimpleThread::errorFunc(); ucol_close(coll); }
void MultithreadTest::TestCollators() { UErrorCode status = U_ZERO_ERROR; FILE *testFile = NULL; char testDataPath[1024]; strcpy(testDataPath, IntlTest::getSourceTestData(status)); if (U_FAILURE(status)) { errln("ERROR: could not open test data %s", u_errorName(status)); return; } strcat(testDataPath, "CollationTest_"); const char* type = "NON_IGNORABLE"; const char *ext = ".txt"; if(testFile) { fclose(testFile); } char buffer[1024]; strcpy(buffer, testDataPath); strcat(buffer, type); size_t bufLen = strlen(buffer); // we try to open 3 files: // path/CollationTest_type.txt // path/CollationTest_type_SHORT.txt // path/CollationTest_type_STUB.txt // we are going to test with the first one that we manage to open. strcpy(buffer+bufLen, ext); testFile = fopen(buffer, "rb"); if(testFile == 0) { strcpy(buffer+bufLen, "_SHORT"); strcat(buffer, ext); testFile = fopen(buffer, "rb"); if(testFile == 0) { strcpy(buffer+bufLen, "_STUB"); strcat(buffer, ext); testFile = fopen(buffer, "rb"); if (testFile == 0) { *(buffer+bufLen) = 0; dataerrln("could not open any of the conformance test files, tried opening base %s", buffer); return; } else { infoln( "INFO: Working with the stub file.\n" "If you need the full conformance test, please\n" "download the appropriate data files from:\n" "http://source.icu-project.org/repos/icu/tools/trunk/unicodetools/com/ibm/text/data/"); } } } LocalArray<Line> lines(new Line[200000]); memset(lines.getAlias(), 0, sizeof(Line)*200000); int32_t lineNum = 0; UChar bufferU[1024]; uint32_t first = 0; while (fgets(buffer, 1024, testFile) != NULL) { if(*buffer == 0 || buffer[0] == '#') { // Store empty and comment lines so that errors are reported // for the real test file lines. lines[lineNum].buflen = 0; lines[lineNum].buff[0] = 0; } else { int32_t buflen = u_parseString(buffer, bufferU, 1024, &first, &status); lines[lineNum].buflen = buflen; u_memcpy(lines[lineNum].buff, bufferU, buflen); lines[lineNum].buff[buflen] = 0; } lineNum++; } fclose(testFile); if(U_FAILURE(status)) { dataerrln("Couldn't read the test file!"); return; } UVersionInfo uniVersion; static const UVersionInfo v62 = { 6, 2, 0, 0 }; u_getUnicodeVersion(uniVersion); UBool isAtLeastUCA62 = uprv_memcmp(uniVersion, v62, 4) >= 0; LocalPointer<Collator> coll(Collator::createInstance(Locale::getRoot(), status)); if(U_FAILURE(status)) { errcheckln(status, "Couldn't open UCA collator"); return; } coll->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status); coll->setAttribute(UCOL_CASE_FIRST, UCOL_OFF, status); coll->setAttribute(UCOL_CASE_LEVEL, UCOL_OFF, status); coll->setAttribute(UCOL_STRENGTH, isAtLeastUCA62 ? UCOL_IDENTICAL : UCOL_TERTIARY, status); coll->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, status); int32_t spawnResult = 0; LocalArray<CollatorThreadTest> tests(new CollatorThreadTest[kCollatorThreadThreads]); logln(UnicodeString("Spawning: ") + kCollatorThreadThreads + " threads * " + kFormatThreadIterations + " iterations each."); int32_t j = 0; for(j = 0; j < kCollatorThreadThreads; j++) { //logln("Setting collator %i", j); tests[j].setCollator(coll.getAlias(), lines.getAlias(), lineNum, isAtLeastUCA62); } for(j = 0; j < kCollatorThreadThreads; j++) { log("%i ", j); spawnResult = tests[j].start(); if(spawnResult != 0) { errln("%s:%d THREAD INFO: thread %d failed to start with status %d", __FILE__, __LINE__, j, spawnResult); return; } } logln("Spawned all"); for(int32_t i=0;i<kCollatorThreadThreads;i++) { tests[i].join(); //logln(UnicodeString("Test #") + i + " is complete.. "); } }