Index: source/test/intltest/srchtest.cpp |
diff --git a/source/test/intltest/srchtest.cpp b/source/test/intltest/srchtest.cpp |
deleted file mode 100644 |
index a748ac707465a30a1b540022caa56b0a569c4005..0000000000000000000000000000000000000000 |
--- a/source/test/intltest/srchtest.cpp |
+++ /dev/null |
@@ -1,2484 +0,0 @@ |
-/* |
-***************************************************************************** |
-* Copyright (C) 2001-2011, International Business Machines orporation |
-* and others. All Rights Reserved. |
-****************************************************************************/ |
- |
-#include "unicode/utypes.h" |
- |
-#if !UCONFIG_NO_COLLATION |
- |
-#include "srchtest.h" |
-#if !UCONFIG_NO_BREAK_ITERATION |
-#include "../cintltst/usrchdat.c" |
-#endif |
-#include "unicode/stsearch.h" |
-#include "unicode/ustring.h" |
-#include "unicode/schriter.h" |
-#include <string.h> |
-#include <stdio.h> |
- |
-// private definitions ----------------------------------------------------- |
- |
-#define CASE(id,test) \ |
- case id: \ |
- name = #test; \ |
- if (exec) { \ |
- logln(#test "---"); \ |
- logln((UnicodeString)""); \ |
- if(areBroken) { \ |
- dataerrln(__FILE__ " cannot test - failed to create collator."); \ |
- } else { \ |
- test(); \ |
- } \ |
- } \ |
- break; |
- |
-// public contructors and destructors -------------------------------------- |
- |
-StringSearchTest::StringSearchTest() |
-#if !UCONFIG_NO_BREAK_ITERATION |
-: |
- m_en_wordbreaker_(NULL), m_en_characterbreaker_(NULL) |
-#endif |
-{ |
-#if !UCONFIG_NO_BREAK_ITERATION |
- UErrorCode status = U_ZERO_ERROR; |
- |
- m_en_us_ = (RuleBasedCollator *)Collator::createInstance("en_US", status); |
- m_fr_fr_ = (RuleBasedCollator *)Collator::createInstance("fr_FR", status); |
- m_de_ = (RuleBasedCollator *)Collator::createInstance("de_DE", status); |
- m_es_ = (RuleBasedCollator *)Collator::createInstance("es_ES", status); |
- if(U_FAILURE(status)) { |
- delete m_en_us_; |
- delete m_fr_fr_; |
- delete m_de_; |
- delete m_es_; |
- m_en_us_ = 0; |
- m_fr_fr_ = 0; |
- m_de_ = 0; |
- m_es_ = 0; |
- errln("Collator creation failed with %s", u_errorName(status)); |
- return; |
- } |
- |
- |
- UnicodeString rules; |
- rules.setTo(((RuleBasedCollator *)m_de_)->getRules()); |
- UChar extrarules[128]; |
- u_unescape(EXTRACOLLATIONRULE, extrarules, 128); |
- rules.append(extrarules, u_strlen(extrarules)); |
- delete m_de_; |
- |
- m_de_ = new RuleBasedCollator(rules, status); |
- |
- rules.setTo(((RuleBasedCollator *)m_es_)->getRules()); |
- rules.append(extrarules, u_strlen(extrarules)); |
- |
- delete m_es_; |
- |
- m_es_ = new RuleBasedCollator(rules, status); |
- |
-#if !UCONFIG_NO_BREAK_ITERATION |
- m_en_wordbreaker_ = BreakIterator::createWordInstance( |
- Locale::getEnglish(), status); |
- m_en_characterbreaker_ = BreakIterator::createCharacterInstance( |
- Locale::getEnglish(), status); |
-#endif |
-#endif |
-} |
- |
-StringSearchTest::~StringSearchTest() |
-{ |
-#if !UCONFIG_NO_BREAK_ITERATION |
- delete m_en_us_; |
- delete m_fr_fr_; |
- delete m_de_; |
- delete m_es_; |
-#if !UCONFIG_NO_BREAK_ITERATION |
- delete m_en_wordbreaker_; |
- delete m_en_characterbreaker_; |
-#endif |
-#endif |
-} |
- |
-// public methods ---------------------------------------------------------- |
- |
-void StringSearchTest::runIndexedTest(int32_t index, UBool exec, |
- const char* &name, char* ) |
-{ |
-#if !UCONFIG_NO_BREAK_ITERATION |
- UBool areBroken = FALSE; |
- if (m_en_us_ == NULL && m_fr_fr_ == NULL && m_de_ == NULL && |
- m_es_ == NULL && m_en_wordbreaker_ == NULL && |
- m_en_characterbreaker_ == NULL && exec) { |
- areBroken = TRUE; |
- } |
- |
- switch (index) { |
-#if !UCONFIG_NO_FILE_IO |
- CASE(0, TestOpenClose) |
-#endif |
- CASE(1, TestInitialization) |
- CASE(2, TestBasic) |
- CASE(3, TestNormExact) |
- CASE(4, TestStrength) |
-#if UCONFIG_NO_BREAK_ITERATION |
- case 5: |
- name = "TestBreakIterator"; |
- break; |
-#else |
- CASE(5, TestBreakIterator) |
-#endif |
- CASE(6, TestVariable) |
- CASE(7, TestOverlap) |
- CASE(8, TestCollator) |
- CASE(9, TestPattern) |
- CASE(10, TestText) |
- CASE(11, TestCompositeBoundaries) |
- CASE(12, TestGetSetOffset) |
- CASE(13, TestGetSetAttribute) |
- CASE(14, TestGetMatch) |
- CASE(15, TestSetMatch) |
- CASE(16, TestReset) |
- CASE(17, TestSupplementary) |
- CASE(18, TestContraction) |
- CASE(19, TestIgnorable) |
- CASE(20, TestCanonical) |
- CASE(21, TestNormCanonical) |
- CASE(22, TestStrengthCanonical) |
-#if UCONFIG_NO_BREAK_ITERATION |
- case 23: |
- name = "TestBreakIteratorCanonical"; |
- break; |
-#else |
- CASE(23, TestBreakIteratorCanonical) |
-#endif |
- CASE(24, TestVariableCanonical) |
- CASE(25, TestOverlapCanonical) |
- CASE(26, TestCollatorCanonical) |
- CASE(27, TestPatternCanonical) |
- CASE(28, TestTextCanonical) |
- CASE(29, TestCompositeBoundariesCanonical) |
- CASE(30, TestGetSetOffsetCanonical) |
- CASE(31, TestSupplementaryCanonical) |
- CASE(32, TestContractionCanonical) |
- CASE(33, TestUClassID) |
- CASE(34, TestSubclass) |
- CASE(35, TestCoverage) |
- CASE(36, TestDiacriticMatch) |
- default: name = ""; break; |
- } |
-#else |
- name=""; |
-#endif |
-} |
- |
-#if !UCONFIG_NO_BREAK_ITERATION |
-// private methods ------------------------------------------------------ |
- |
-RuleBasedCollator * StringSearchTest::getCollator(const char *collator) |
-{ |
- if (collator == NULL) { |
- return m_en_us_; |
- } |
- if (strcmp(collator, "fr") == 0) { |
- return m_fr_fr_; |
- } |
- else if (strcmp(collator, "de") == 0) { |
- return m_de_; |
- } |
- else if (strcmp(collator, "es") == 0) { |
- return m_es_; |
- } |
- else { |
- return m_en_us_; |
- } |
-} |
- |
-BreakIterator * StringSearchTest::getBreakIterator(const char *breaker) |
-{ |
-#if UCONFIG_NO_BREAK_ITERATION |
- return NULL; |
-#else |
- if (breaker == NULL) { |
- return NULL; |
- } |
- if (strcmp(breaker, "wordbreaker") == 0) { |
- return m_en_wordbreaker_; |
- } |
- else { |
- return m_en_characterbreaker_; |
- } |
-#endif |
-} |
- |
-char * StringSearchTest::toCharString(const UnicodeString &text) |
-{ |
- static char result[1024]; |
- int index = 0; |
- int count = 0; |
- int length = text.length(); |
- |
- for (; count < length; count ++) { |
- UChar ch = text[count]; |
- if (ch >= 0x20 && ch <= 0x7e) { |
- result[index ++] = (char)ch; |
- } |
- else { |
- sprintf(result+index, "\\u%04x", ch); |
- index += 6; /* \uxxxx */ |
- } |
- } |
- result[index] = 0; |
- |
- return result; |
-} |
- |
-Collator::ECollationStrength StringSearchTest::getECollationStrength( |
- const UCollationStrength &strength) const |
-{ |
- switch (strength) |
- { |
- case UCOL_PRIMARY : |
- return Collator::PRIMARY; |
- case UCOL_SECONDARY : |
- return Collator::SECONDARY; |
- case UCOL_TERTIARY : |
- return Collator::TERTIARY; |
- default : |
- return Collator::IDENTICAL; |
- } |
-} |
- |
-UBool StringSearchTest::assertEqualWithStringSearch(StringSearch *strsrch, |
- const SearchData *search) |
-{ |
- int32_t count = 0; |
- UErrorCode status = U_ZERO_ERROR; |
- int32_t matchindex = search->offset[count]; |
- UnicodeString matchtext; |
- int32_t matchlength; |
- |
- strsrch->setAttribute(USEARCH_ELEMENT_COMPARISON, search->elemCompare, status); |
- if (U_FAILURE(status)) { |
- errln("Error setting USEARCH_ELEMENT_COMPARISON attribute %s", u_errorName(status)); |
- return FALSE; |
- } |
- |
- if (strsrch->getMatchedStart() != USEARCH_DONE || |
- strsrch->getMatchedLength() != 0) { |
- errln("Error with the initialization of match start and length"); |
- } |
- |
- // start of next matches |
- while (U_SUCCESS(status) && matchindex >= 0) { |
- matchlength = search->size[count]; |
- strsrch->next(status); |
- if (matchindex != strsrch->getMatchedStart() || |
- matchlength != strsrch->getMatchedLength()) { |
- char *str = toCharString(strsrch->getText()); |
- errln("Text: %s", str); |
- str = toCharString(strsrch->getPattern()); |
- errln("Pattern: %s", str); |
- errln("Error next match found at %d (len:%d); expected %d (len:%d)", |
- strsrch->getMatchedStart(), strsrch->getMatchedLength(), |
- matchindex, matchlength); |
- return FALSE; |
- } |
- count ++; |
- |
- strsrch->getMatchedText(matchtext); |
- |
- if (U_FAILURE(status) || |
- strsrch->getText().compareBetween(matchindex, |
- matchindex + matchlength, |
- matchtext, 0, |
- matchtext.length())) { |
- errln("Error getting next matched text"); |
- } |
- |
- matchindex = search->offset[count]; |
- } |
- strsrch->next(status); |
- if (strsrch->getMatchedStart() != USEARCH_DONE || |
- strsrch->getMatchedLength() != 0) { |
- char *str = toCharString(strsrch->getText()); |
- errln("Text: %s", str); |
- str = toCharString(strsrch->getPattern()); |
- errln("Pattern: %s", str); |
- errln("Error next match found at %d (len:%d); expected <NO MATCH>", |
- strsrch->getMatchedStart(), strsrch->getMatchedLength()); |
- return FALSE; |
- } |
- |
- // start of previous matches |
- count = count == 0 ? 0 : count - 1; |
- matchindex = search->offset[count]; |
- while (U_SUCCESS(status) && matchindex >= 0) { |
- matchlength = search->size[count]; |
- strsrch->previous(status); |
- if (matchindex != strsrch->getMatchedStart() || |
- matchlength != strsrch->getMatchedLength()) { |
- char *str = toCharString(strsrch->getText()); |
- errln("Text: %s", str); |
- str = toCharString(strsrch->getPattern()); |
- errln("Pattern: %s", str); |
- errln("Error previous match found at %d (len:%d); expected %d (len:%d)", |
- strsrch->getMatchedStart(), strsrch->getMatchedLength(), |
- matchindex, matchlength); |
- return FALSE; |
- } |
- |
- strsrch->getMatchedText(matchtext); |
- |
- if (U_FAILURE(status) || |
- strsrch->getText().compareBetween(matchindex, |
- matchindex + matchlength, |
- matchtext, 0, |
- matchtext.length())) { |
- errln("Error getting previous matched text"); |
- } |
- |
- matchindex = count > 0 ? search->offset[count - 1] : -1; |
- count --; |
- } |
- strsrch->previous(status); |
- if (strsrch->getMatchedStart() != USEARCH_DONE || |
- strsrch->getMatchedLength() != 0) { |
- char *str = toCharString(strsrch->getText()); |
- errln("Text: %s", str); |
- str = toCharString(strsrch->getPattern()); |
- errln("Pattern: %s", str); |
- errln("Error previous match found at %d (len:%d); expected <NO MATCH>", |
- strsrch->getMatchedStart(), strsrch->getMatchedLength()); |
- return FALSE; |
- } |
- |
- int32_t nextStart; |
- UBool isOverlap = (strsrch->getAttribute(USEARCH_OVERLAP) == USEARCH_ON); |
- |
- // start of following matches |
- count = 0; |
- matchindex = search->offset[count]; |
- nextStart = 0; |
- |
- while (TRUE) { |
- strsrch->following(nextStart, status); |
- |
- if (matchindex < 0) { |
- if (strsrch->getMatchedStart() != USEARCH_DONE || |
- strsrch->getMatchedLength() != 0) { |
- char *str = toCharString(strsrch->getText()); |
- errln("Text: %s", str); |
- str = toCharString(strsrch->getPattern()); |
- errln("Pattern: %s", str); |
- errln("Error following match starting at %d (overlap:%d) found at %d (len:%d); expected <NO MATCH>", |
- nextStart, isOverlap, |
- strsrch->getMatchedStart(), strsrch->getMatchedLength()); |
- return FALSE; |
- } |
- // no more matches |
- break; |
- } |
- |
- matchlength = search->size[count]; |
- if (strsrch->getMatchedStart() != matchindex |
- || strsrch->getMatchedLength() != matchlength |
- || U_FAILURE(status)) { |
- char *str = toCharString(strsrch->getText()); |
- errln("Text: %s\n", str); |
- str = toCharString(strsrch->getPattern()); |
- errln("Pattern: %s\n", str); |
- errln("Error following match starting at %d (overlap: %d) found at %d (len:%d); expected %d (len:%d)\n", |
- nextStart, isOverlap, |
- strsrch->getMatchedStart(), strsrch->getMatchedLength(), |
- matchindex, matchlength); |
- return FALSE; |
- } |
- |
- if (isOverlap || strsrch->getMatchedLength() == 0) { |
- nextStart = strsrch->getMatchedStart() + 1; |
- } else { |
- nextStart = strsrch->getMatchedStart() + strsrch->getMatchedLength(); |
- } |
- |
- count++; |
- matchindex = search->offset[count]; |
- } |
- |
- // start preceding matches |
- count = -1; // last non-negative offset index, could be -1 if no match |
- while (search->offset[count + 1] >= 0) { |
- count++; |
- } |
- nextStart = strsrch->getText().length(); |
- |
- while (TRUE) { |
- strsrch->preceding(nextStart, status); |
- |
- if (count < 0) { |
- if (strsrch->getMatchedStart() != USEARCH_DONE || strsrch->getMatchedLength() != 0) { |
- char *str = toCharString(strsrch->getText()); |
- errln("Text: %s\n", str); |
- str = toCharString(strsrch->getPattern()); |
- errln("Pattern: %s\n", str); |
- errln("Error preceding match starting at %d (overlap: %d) found at %d (len:%d); expected <NO MATCH>\n", |
- nextStart, isOverlap, |
- strsrch->getMatchedStart(), |
- strsrch->getMatchedLength()); |
- return FALSE; |
- } |
- // no more matches |
- break; |
- } |
- |
- matchindex = search->offset[count]; |
- matchlength = search->size[count]; |
- if (strsrch->getMatchedStart() != matchindex |
- || strsrch->getMatchedLength() != matchlength |
- || U_FAILURE(status)) { |
- char *str = toCharString(strsrch->getText()); |
- errln("Text: %s\n", str); |
- str = toCharString(strsrch->getPattern()); |
- errln("Pattern: %s\n", str); |
- errln("Error preceding match starting at %d (overlap: %d) found at %d (len:%d); expected %d (len:%d)\n", |
- nextStart, isOverlap, |
- strsrch->getMatchedStart(), strsrch->getMatchedLength(), |
- matchindex, matchlength); |
- return FALSE; |
- } |
- |
- nextStart = matchindex; |
- count--; |
- } |
- |
- strsrch->setAttribute(USEARCH_ELEMENT_COMPARISON, USEARCH_STANDARD_ELEMENT_COMPARISON, status); |
- return TRUE; |
-} |
- |
-UBool StringSearchTest::assertEqual(const SearchData *search) |
-{ |
- UErrorCode status = U_ZERO_ERROR; |
- |
- Collator *collator = getCollator(search->collator); |
- BreakIterator *breaker = getBreakIterator(search->breaker); |
- StringSearch *strsrch, *strsrch2; |
- UChar temp[128]; |
- |
-#if UCONFIG_NO_BREAK_ITERATION |
- if(search->breaker) { |
- return TRUE; /* skip test */ |
- } |
-#endif |
- u_unescape(search->text, temp, 128); |
- UnicodeString text; |
- text.setTo(temp); |
- u_unescape(search->pattern, temp, 128); |
- UnicodeString pattern; |
- pattern.setTo(temp); |
- |
-#if !UCONFIG_NO_BREAK_ITERATION |
- if (breaker != NULL) { |
- breaker->setText(text); |
- } |
-#endif |
- collator->setStrength(getECollationStrength(search->strength)); |
- strsrch = new StringSearch(pattern, text, (RuleBasedCollator *)collator, |
- breaker, status); |
- if (U_FAILURE(status)) { |
- errln("Error opening string search %s", u_errorName(status)); |
- return FALSE; |
- } |
- |
- if (!assertEqualWithStringSearch(strsrch, search)) { |
- collator->setStrength(getECollationStrength(UCOL_TERTIARY)); |
- delete strsrch; |
- return FALSE; |
- } |
- |
- |
- strsrch2 = strsrch->clone(); |
- if( strsrch2 == strsrch || *strsrch2 != *strsrch || |
- !assertEqualWithStringSearch(strsrch2, search) |
- ) { |
- infoln("failure with StringSearch.clone()"); |
- collator->setStrength(getECollationStrength(UCOL_TERTIARY)); |
- delete strsrch; |
- delete strsrch2; |
- return FALSE; |
- } |
- delete strsrch2; |
- |
- collator->setStrength(getECollationStrength(UCOL_TERTIARY)); |
- delete strsrch; |
- return TRUE; |
-} |
- |
-UBool StringSearchTest::assertCanonicalEqual(const SearchData *search) |
-{ |
- UErrorCode status = U_ZERO_ERROR; |
- Collator *collator = getCollator(search->collator); |
- BreakIterator *breaker = getBreakIterator(search->breaker); |
- StringSearch *strsrch; |
- UChar temp[128]; |
- UBool result = TRUE; |
- |
-#if UCONFIG_NO_BREAK_ITERATION |
- if(search->breaker) { |
- return TRUE; /* skip test */ |
- } |
-#endif |
- |
- u_unescape(search->text, temp, 128); |
- UnicodeString text; |
- text.setTo(temp); |
- u_unescape(search->pattern, temp, 128); |
- UnicodeString pattern; |
- pattern.setTo(temp); |
- |
-#if !UCONFIG_NO_BREAK_ITERATION |
- if (breaker != NULL) { |
- breaker->setText(text); |
- } |
-#endif |
- collator->setStrength(getECollationStrength(search->strength)); |
- collator->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status); |
- strsrch = new StringSearch(pattern, text, (RuleBasedCollator *)collator, |
- breaker, status); |
- strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status); |
- if (U_FAILURE(status)) { |
- errln("Error opening string search %s", u_errorName(status)); |
- result = FALSE; |
- goto bail; |
- } |
- |
- if (!assertEqualWithStringSearch(strsrch, search)) { |
- result = FALSE; |
- goto bail; |
- } |
- |
-bail: |
- collator->setStrength(getECollationStrength(UCOL_TERTIARY)); |
- collator->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_OFF, status); |
- delete strsrch; |
- |
- return result; |
-} |
- |
-UBool StringSearchTest::assertEqualWithAttribute(const SearchData *search, |
- USearchAttributeValue canonical, |
- USearchAttributeValue overlap) |
-{ |
- UErrorCode status = U_ZERO_ERROR; |
- Collator *collator = getCollator(search->collator); |
- BreakIterator *breaker = getBreakIterator(search->breaker); |
- StringSearch *strsrch; |
- UChar temp[128]; |
- |
- |
-#if UCONFIG_NO_BREAK_ITERATION |
- if(search->breaker) { |
- return TRUE; /* skip test */ |
- } |
-#endif |
- |
- u_unescape(search->text, temp, 128); |
- UnicodeString text; |
- text.setTo(temp); |
- u_unescape(search->pattern, temp, 128); |
- UnicodeString pattern; |
- pattern.setTo(temp); |
- |
-#if !UCONFIG_NO_BREAK_ITERATION |
- if (breaker != NULL) { |
- breaker->setText(text); |
- } |
-#endif |
- collator->setStrength(getECollationStrength(search->strength)); |
- strsrch = new StringSearch(pattern, text, (RuleBasedCollator *)collator, |
- breaker, status); |
- strsrch->setAttribute(USEARCH_CANONICAL_MATCH, canonical, status); |
- strsrch->setAttribute(USEARCH_OVERLAP, overlap, status); |
- |
- if (U_FAILURE(status)) { |
- errln("Error opening string search %s", u_errorName(status)); |
- return FALSE; |
- } |
- |
- if (!assertEqualWithStringSearch(strsrch, search)) { |
- collator->setStrength(getECollationStrength(UCOL_TERTIARY)); |
- delete strsrch; |
- return FALSE; |
- } |
- collator->setStrength(getECollationStrength(UCOL_TERTIARY)); |
- delete strsrch; |
- return TRUE; |
-} |
- |
-void StringSearchTest::TestOpenClose() |
-{ |
- UErrorCode status = U_ZERO_ERROR; |
- StringSearch *result; |
- BreakIterator *breakiter = m_en_wordbreaker_; |
- UnicodeString pattern; |
- UnicodeString text; |
- UnicodeString temp("a"); |
- StringCharacterIterator chariter(text); |
- |
- /* testing null arguments */ |
- result = new StringSearch(pattern, text, NULL, NULL, status); |
- if (U_SUCCESS(status)) { |
- errln("Error: NULL arguments should produce an error"); |
- } |
- delete result; |
- |
- chariter.setText(text); |
- status = U_ZERO_ERROR; |
- result = new StringSearch(pattern, chariter, NULL, NULL, status); |
- if (U_SUCCESS(status)) { |
- errln("Error: NULL arguments should produce an error"); |
- } |
- delete result; |
- |
- text.append(0, 0x1); |
- status = U_ZERO_ERROR; |
- result = new StringSearch(pattern, text, NULL, NULL, status); |
- if (U_SUCCESS(status)) { |
- errln("Error: Empty pattern should produce an error"); |
- } |
- delete result; |
- |
- chariter.setText(text); |
- status = U_ZERO_ERROR; |
- result = new StringSearch(pattern, chariter, NULL, NULL, status); |
- if (U_SUCCESS(status)) { |
- errln("Error: Empty pattern should produce an error"); |
- } |
- delete result; |
- |
- text.remove(); |
- pattern.append(temp); |
- status = U_ZERO_ERROR; |
- result = new StringSearch(pattern, text, NULL, NULL, status); |
- if (U_SUCCESS(status)) { |
- errln("Error: Empty text should produce an error"); |
- } |
- delete result; |
- |
- chariter.setText(text); |
- status = U_ZERO_ERROR; |
- result = new StringSearch(pattern, chariter, NULL, NULL, status); |
- if (U_SUCCESS(status)) { |
- errln("Error: Empty text should produce an error"); |
- } |
- delete result; |
- |
- text.append(temp); |
- status = U_ZERO_ERROR; |
- result = new StringSearch(pattern, text, NULL, NULL, status); |
- if (U_SUCCESS(status)) { |
- errln("Error: NULL arguments should produce an error"); |
- } |
- delete result; |
- |
- chariter.setText(text); |
- status = U_ZERO_ERROR; |
- result = new StringSearch(pattern, chariter, NULL, NULL, status); |
- if (U_SUCCESS(status)) { |
- errln("Error: NULL arguments should produce an error"); |
- } |
- delete result; |
- |
- status = U_ZERO_ERROR; |
- result = new StringSearch(pattern, text, m_en_us_, NULL, status); |
- if (U_FAILURE(status)) { |
- errln("Error: NULL break iterator is valid for opening search"); |
- } |
- delete result; |
- |
- status = U_ZERO_ERROR; |
- result = new StringSearch(pattern, chariter, m_en_us_, NULL, status); |
- if (U_FAILURE(status)) { |
- errln("Error: NULL break iterator is valid for opening search"); |
- } |
- delete result; |
- |
- status = U_ZERO_ERROR; |
- result = new StringSearch(pattern, text, Locale::getEnglish(), NULL, status); |
- if (U_FAILURE(status) || result == NULL) { |
- errln("Error: NULL break iterator is valid for opening search"); |
- } |
- delete result; |
- |
- status = U_ZERO_ERROR; |
- result = new StringSearch(pattern, chariter, Locale::getEnglish(), NULL, status); |
- if (U_FAILURE(status)) { |
- errln("Error: NULL break iterator is valid for opening search"); |
- } |
- delete result; |
- |
- status = U_ZERO_ERROR; |
- result = new StringSearch(pattern, text, m_en_us_, breakiter, status); |
- if (U_FAILURE(status)) { |
- errln("Error: Break iterator is valid for opening search"); |
- } |
- delete result; |
- |
- status = U_ZERO_ERROR; |
- result = new StringSearch(pattern, chariter, m_en_us_, NULL, status); |
- if (U_FAILURE(status)) { |
- errln("Error: Break iterator is valid for opening search"); |
- } |
- delete result; |
-} |
- |
-void StringSearchTest::TestInitialization() |
-{ |
- UErrorCode status = U_ZERO_ERROR; |
- UnicodeString pattern; |
- UnicodeString text; |
- UnicodeString temp("a"); |
- StringSearch *result; |
- int count; |
- |
- /* simple test on the pattern ce construction */ |
- pattern.append(temp); |
- pattern.append(temp); |
- text.append(temp); |
- text.append(temp); |
- text.append(temp); |
- result = new StringSearch(pattern, text, m_en_us_, NULL, status); |
- if (U_FAILURE(status)) { |
- errln("Error opening search %s", u_errorName(status)); |
- } |
- StringSearch *copy = new StringSearch(*result); |
- if (*(copy->getCollator()) != *(result->getCollator()) || |
- copy->getBreakIterator() != result->getBreakIterator() || |
- copy->getMatchedLength() != result->getMatchedLength() || |
- copy->getMatchedStart() != result->getMatchedStart() || |
- copy->getOffset() != result->getOffset() || |
- copy->getPattern() != result->getPattern() || |
- copy->getText() != result->getText() || |
- *(copy) != *(result)) |
- { |
- errln("Error copying StringSearch"); |
- } |
- delete copy; |
- |
- copy = (StringSearch *)result->safeClone(); |
- if (*(copy->getCollator()) != *(result->getCollator()) || |
- copy->getBreakIterator() != result->getBreakIterator() || |
- copy->getMatchedLength() != result->getMatchedLength() || |
- copy->getMatchedStart() != result->getMatchedStart() || |
- copy->getOffset() != result->getOffset() || |
- copy->getPattern() != result->getPattern() || |
- copy->getText() != result->getText() || |
- *(copy) != *(result)) { |
- errln("Error copying StringSearch"); |
- } |
- delete result; |
- |
- /* testing if an extremely large pattern will fail the initialization */ |
- for (count = 0; count < 512; count ++) { |
- pattern.append(temp); |
- } |
- result = new StringSearch(pattern, text, m_en_us_, NULL, status); |
- if (*result != *result) { |
- errln("Error: string search object expected to match itself"); |
- } |
- if (*result == *copy) { |
- errln("Error: string search objects are not expected to match"); |
- } |
- *copy = *result; |
- if (*(copy->getCollator()) != *(result->getCollator()) || |
- copy->getBreakIterator() != result->getBreakIterator() || |
- copy->getMatchedLength() != result->getMatchedLength() || |
- copy->getMatchedStart() != result->getMatchedStart() || |
- copy->getOffset() != result->getOffset() || |
- copy->getPattern() != result->getPattern() || |
- copy->getText() != result->getText() || |
- *(copy) != *(result)) { |
- errln("Error copying StringSearch"); |
- } |
- if (U_FAILURE(status)) { |
- errln("Error opening search %s", u_errorName(status)); |
- } |
- delete result; |
- delete copy; |
-} |
- |
-void StringSearchTest::TestBasic() |
-{ |
- int count = 0; |
- while (BASIC[count].text != NULL) { |
- //printf("count %d", count); |
- if (!assertEqual(&BASIC[count])) { |
- infoln("Error at test number %d", count); |
- } |
- count ++; |
- } |
-} |
- |
-void StringSearchTest::TestNormExact() |
-{ |
- int count = 0; |
- UErrorCode status = U_ZERO_ERROR; |
- m_en_us_->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status); |
- if (U_FAILURE(status)) { |
- errln("Error setting collation normalization %s", |
- u_errorName(status)); |
- } |
- while (BASIC[count].text != NULL) { |
- if (!assertEqual(&BASIC[count])) { |
- infoln("Error at test number %d", count); |
- } |
- count ++; |
- } |
- count = 0; |
- while (NORMEXACT[count].text != NULL) { |
- if (!assertEqual(&NORMEXACT[count])) { |
- infoln("Error at test number %d", count); |
- } |
- count ++; |
- } |
- m_en_us_->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_OFF, status); |
- count = 0; |
- while (NONNORMEXACT[count].text != NULL) { |
- if (!assertEqual(&NONNORMEXACT[count])) { |
- infoln("Error at test number %d", count); |
- } |
- count ++; |
- } |
-} |
- |
-void StringSearchTest::TestStrength() |
-{ |
- int count = 0; |
- while (STRENGTH[count].text != NULL) { |
- if (!assertEqual(&STRENGTH[count])) { |
- infoln("Error at test number %d", count); |
- } |
- count ++; |
- } |
-} |
- |
-#if !UCONFIG_NO_BREAK_ITERATION |
- |
-void StringSearchTest::TestBreakIterator() |
-{ |
- UChar temp[128]; |
- u_unescape(BREAKITERATOREXACT[0].text, temp, 128); |
- UnicodeString text; |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(BREAKITERATOREXACT[0].pattern, temp, 128); |
- UnicodeString pattern; |
- pattern.setTo(temp, u_strlen(temp)); |
- |
- UErrorCode status = U_ZERO_ERROR; |
- StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, NULL, |
- status); |
- if (U_FAILURE(status)) { |
- errln("Error opening string search %s", u_errorName(status)); |
- } |
- |
- strsrch->setBreakIterator(NULL, status); |
- if (U_FAILURE(status) || strsrch->getBreakIterator() != NULL) { |
- errln("Error usearch_getBreakIterator returned wrong object"); |
- } |
- |
- strsrch->setBreakIterator(m_en_characterbreaker_, status); |
- if (U_FAILURE(status) || |
- strsrch->getBreakIterator() != m_en_characterbreaker_) { |
- errln("Error usearch_getBreakIterator returned wrong object"); |
- } |
- |
- strsrch->setBreakIterator(m_en_wordbreaker_, status); |
- if (U_FAILURE(status) || |
- strsrch->getBreakIterator() != m_en_wordbreaker_) { |
- errln("Error usearch_getBreakIterator returned wrong object"); |
- } |
- |
- delete strsrch; |
- |
- int count = 0; |
- while (count < 4) { |
- // special purposes for tests numbers 0-3 |
- const SearchData *search = &(BREAKITERATOREXACT[count]); |
- RuleBasedCollator *collator = getCollator(search->collator); |
- BreakIterator *breaker = getBreakIterator(search->breaker); |
- StringSearch *strsrch; |
- |
- u_unescape(search->text, temp, 128); |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(search->pattern, temp, 128); |
- pattern.setTo(temp, u_strlen(temp)); |
- if (breaker != NULL) { |
- breaker->setText(text); |
- } |
- collator->setStrength(getECollationStrength(search->strength)); |
- |
- strsrch = new StringSearch(pattern, text, collator, breaker, status); |
- if (U_FAILURE(status) || |
- strsrch->getBreakIterator() != breaker) { |
- errln("Error setting break iterator"); |
- if (strsrch != NULL) { |
- delete strsrch; |
- } |
- } |
- if (!assertEqualWithStringSearch(strsrch, search)) { |
- collator->setStrength(getECollationStrength(UCOL_TERTIARY)); |
- delete strsrch; |
- } |
- search = &(BREAKITERATOREXACT[count + 1]); |
- breaker = getBreakIterator(search->breaker); |
- if (breaker != NULL) { |
- breaker->setText(text); |
- } |
- strsrch->setBreakIterator(breaker, status); |
- if (U_FAILURE(status) || |
- strsrch->getBreakIterator() != breaker) { |
- errln("Error setting break iterator"); |
- delete strsrch; |
- } |
- strsrch->reset(); |
- if (!assertEqualWithStringSearch(strsrch, search)) { |
- infoln("Error at test number %d", count); |
- } |
- delete strsrch; |
- count += 2; |
- } |
- count = 0; |
- while (BREAKITERATOREXACT[count].text != NULL) { |
- if (!assertEqual(&BREAKITERATOREXACT[count])) { |
- infoln("Error at test number %d", count); |
- } |
- count ++; |
- } |
-} |
- |
-#endif |
- |
-void StringSearchTest::TestVariable() |
-{ |
- int count = 0; |
- UErrorCode status = U_ZERO_ERROR; |
- m_en_us_->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, status); |
- if (U_FAILURE(status)) { |
- errln("Error setting collation alternate attribute %s", |
- u_errorName(status)); |
- } |
- while (VARIABLE[count].text != NULL) { |
- logln("variable %d", count); |
- if (!assertEqual(&VARIABLE[count])) { |
- infoln("Error at test number %d", count); |
- } |
- count ++; |
- } |
- m_en_us_->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, |
- status); |
-} |
- |
-void StringSearchTest::TestOverlap() |
-{ |
- int count = 0; |
- while (OVERLAP[count].text != NULL) { |
- if (!assertEqualWithAttribute(&OVERLAP[count], USEARCH_OFF, |
- USEARCH_ON)) { |
- errln("Error at overlap test number %d", count); |
- } |
- count ++; |
- } |
- count = 0; |
- while (NONOVERLAP[count].text != NULL) { |
- if (!assertEqual(&NONOVERLAP[count])) { |
- errln("Error at non overlap test number %d", count); |
- } |
- count ++; |
- } |
- |
- count = 0; |
- while (count < 1) { |
- const SearchData *search = &(OVERLAP[count]); |
- UChar temp[128]; |
- u_unescape(search->text, temp, 128); |
- UnicodeString text; |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(search->pattern, temp, 128); |
- UnicodeString pattern; |
- pattern.setTo(temp, u_strlen(temp)); |
- |
- RuleBasedCollator *collator = getCollator(search->collator); |
- UErrorCode status = U_ZERO_ERROR; |
- StringSearch *strsrch = new StringSearch(pattern, text, |
- collator, NULL, |
- status); |
- |
- strsrch->setAttribute(USEARCH_OVERLAP, USEARCH_ON, status); |
- if (U_FAILURE(status) || |
- strsrch->getAttribute(USEARCH_OVERLAP) != USEARCH_ON) { |
- errln("Error setting overlap option"); |
- } |
- if (!assertEqualWithStringSearch(strsrch, search)) { |
- delete strsrch; |
- return; |
- } |
- |
- search = &(NONOVERLAP[count]); |
- strsrch->setAttribute(USEARCH_OVERLAP, USEARCH_OFF, status); |
- if (U_FAILURE(status) || |
- strsrch->getAttribute(USEARCH_OVERLAP) != USEARCH_OFF) { |
- errln("Error setting overlap option"); |
- } |
- strsrch->reset(); |
- if (!assertEqualWithStringSearch(strsrch, search)) { |
- delete strsrch; |
- errln("Error at test number %d", count); |
- } |
- |
- count ++; |
- delete strsrch; |
- } |
-} |
- |
-void StringSearchTest::TestCollator() |
-{ |
- // test collator that thinks "o" and "p" are the same thing |
- UChar temp[128]; |
- u_unescape(COLLATOR[0].text, temp, 128); |
- UnicodeString text; |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(COLLATOR[0].pattern, temp, 128); |
- UnicodeString pattern; |
- pattern.setTo(temp, u_strlen(temp)); |
- |
- UErrorCode status = U_ZERO_ERROR; |
- StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, NULL, |
- status); |
- if (U_FAILURE(status)) { |
- errln("Error opening string search %s", u_errorName(status)); |
- delete strsrch; |
- return; |
- } |
- if (!assertEqualWithStringSearch(strsrch, &COLLATOR[0])) { |
- delete strsrch; |
- return; |
- } |
- |
- u_unescape(TESTCOLLATORRULE, temp, 128); |
- UnicodeString rules; |
- rules.setTo(temp, u_strlen(temp)); |
- RuleBasedCollator *tailored = new RuleBasedCollator(rules, status); |
- tailored->setStrength(getECollationStrength(COLLATOR[1].strength)); |
- |
- if (U_FAILURE(status)) { |
- errln("Error opening rule based collator %s", u_errorName(status)); |
- delete strsrch; |
- delete tailored; |
- return; |
- } |
- |
- strsrch->setCollator(tailored, status); |
- if (U_FAILURE(status) || (*strsrch->getCollator()) != (*tailored)) { |
- errln("Error setting rule based collator"); |
- delete strsrch; |
- delete tailored; |
- } |
- strsrch->reset(); |
- if (!assertEqualWithStringSearch(strsrch, &COLLATOR[1])) { |
- delete strsrch; |
- delete tailored; |
- return; |
- } |
- |
- strsrch->setCollator(m_en_us_, status); |
- strsrch->reset(); |
- if (U_FAILURE(status) || (*strsrch->getCollator()) != (*m_en_us_)) { |
- errln("Error setting rule based collator"); |
- delete strsrch; |
- delete tailored; |
- } |
- if (!assertEqualWithStringSearch(strsrch, &COLLATOR[0])) { |
- errln("Error searching collator test"); |
- } |
- delete strsrch; |
- delete tailored; |
-} |
- |
-void StringSearchTest::TestPattern() |
-{ |
- |
- UChar temp[512]; |
- int templength; |
- u_unescape(PATTERN[0].text, temp, 512); |
- UnicodeString text; |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(PATTERN[0].pattern, temp, 512); |
- UnicodeString pattern; |
- pattern.setTo(temp, u_strlen(temp)); |
- |
- m_en_us_->setStrength(getECollationStrength(PATTERN[0].strength)); |
- UErrorCode status = U_ZERO_ERROR; |
- StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, NULL, |
- status); |
- |
- if (U_FAILURE(status)) { |
- errln("Error opening string search %s", u_errorName(status)); |
- m_en_us_->setStrength(getECollationStrength(UCOL_TERTIARY)); |
- if (strsrch != NULL) { |
- delete strsrch; |
- } |
- return; |
- } |
- if (strsrch->getPattern() != pattern) { |
- errln("Error setting pattern"); |
- } |
- if (!assertEqualWithStringSearch(strsrch, &PATTERN[0])) { |
- m_en_us_->setStrength(getECollationStrength(UCOL_TERTIARY)); |
- if (strsrch != NULL) { |
- delete strsrch; |
- } |
- return; |
- } |
- |
- u_unescape(PATTERN[1].pattern, temp, 512); |
- pattern.setTo(temp, u_strlen(temp)); |
- strsrch->setPattern(pattern, status); |
- if (pattern != strsrch->getPattern()) { |
- errln("Error setting pattern"); |
- m_en_us_->setStrength(getECollationStrength(UCOL_TERTIARY)); |
- if (strsrch != NULL) { |
- delete strsrch; |
- } |
- return; |
- } |
- strsrch->reset(); |
- if (U_FAILURE(status)) { |
- errln("Error setting pattern %s", u_errorName(status)); |
- } |
- if (!assertEqualWithStringSearch(strsrch, &PATTERN[1])) { |
- m_en_us_->setStrength(getECollationStrength(UCOL_TERTIARY)); |
- if (strsrch != NULL) { |
- delete strsrch; |
- } |
- return; |
- } |
- |
- u_unescape(PATTERN[0].pattern, temp, 512); |
- pattern.setTo(temp, u_strlen(temp)); |
- strsrch->setPattern(pattern, status); |
- if (pattern != strsrch->getPattern()) { |
- errln("Error setting pattern"); |
- m_en_us_->setStrength(getECollationStrength(UCOL_TERTIARY)); |
- if (strsrch != NULL) { |
- delete strsrch; |
- } |
- return; |
- } |
- strsrch->reset(); |
- if (U_FAILURE(status)) { |
- errln("Error setting pattern %s", u_errorName(status)); |
- } |
- if (!assertEqualWithStringSearch(strsrch, &PATTERN[0])) { |
- m_en_us_->setStrength(getECollationStrength(UCOL_TERTIARY)); |
- if (strsrch != NULL) { |
- delete strsrch; |
- } |
- return; |
- } |
- /* enormous pattern size to see if this crashes */ |
- for (templength = 0; templength != 512; templength ++) { |
- temp[templength] = 0x61; |
- } |
- temp[511] = 0; |
- pattern.setTo(temp, 511); |
- strsrch->setPattern(pattern, status); |
- if (U_FAILURE(status)) { |
- errln("Error setting pattern with size 512, %s", u_errorName(status)); |
- } |
- m_en_us_->setStrength(getECollationStrength(UCOL_TERTIARY)); |
- if (strsrch != NULL) { |
- delete strsrch; |
- } |
-} |
- |
-void StringSearchTest::TestText() |
-{ |
- UChar temp[128]; |
- u_unescape(TEXT[0].text, temp, 128); |
- UnicodeString text; |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(TEXT[0].pattern, temp, 128); |
- UnicodeString pattern; |
- pattern.setTo(temp, u_strlen(temp)); |
- |
- UErrorCode status = U_ZERO_ERROR; |
- StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, NULL, |
- status); |
- if (U_FAILURE(status)) { |
- errln("Error opening string search %s", u_errorName(status)); |
- return; |
- } |
- if (text != strsrch->getText()) { |
- errln("Error setting text"); |
- } |
- if (!assertEqualWithStringSearch(strsrch, &TEXT[0])) { |
- delete strsrch; |
- return; |
- } |
- |
- u_unescape(TEXT[1].text, temp, 128); |
- text.setTo(temp, u_strlen(temp)); |
- strsrch->setText(text, status); |
- if (text != strsrch->getText()) { |
- errln("Error setting text"); |
- delete strsrch; |
- return; |
- } |
- if (U_FAILURE(status)) { |
- errln("Error setting text %s", u_errorName(status)); |
- } |
- if (!assertEqualWithStringSearch(strsrch, &TEXT[1])) { |
- delete strsrch; |
- return; |
- } |
- |
- u_unescape(TEXT[0].text, temp, 128); |
- text.setTo(temp, u_strlen(temp)); |
- StringCharacterIterator chariter(text); |
- strsrch->setText(chariter, status); |
- if (text != strsrch->getText()) { |
- errln("Error setting text"); |
- delete strsrch; |
- return; |
- } |
- if (U_FAILURE(status)) { |
- errln("Error setting pattern %s", u_errorName(status)); |
- } |
- if (!assertEqualWithStringSearch(strsrch, &TEXT[0])) { |
- errln("Error searching within set text"); |
- } |
- delete strsrch; |
-} |
- |
-void StringSearchTest::TestCompositeBoundaries() |
-{ |
- int count = 0; |
- while (COMPOSITEBOUNDARIES[count].text != NULL) { |
- logln("composite %d", count); |
- if (!assertEqual(&COMPOSITEBOUNDARIES[count])) { |
- errln("Error at test number %d", count); |
- } |
- count ++; |
- } |
-} |
- |
-void StringSearchTest::TestGetSetOffset() |
-{ |
- UErrorCode status = U_ZERO_ERROR; |
- UnicodeString pattern("1234567890123456"); |
- UnicodeString text("12345678901234567890123456789012"); |
- StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, |
- NULL, status); |
- /* testing out of bounds error */ |
- strsrch->setOffset(-1, status); |
- if (U_SUCCESS(status)) { |
- errln("Error expecting set offset error"); |
- } |
- strsrch->setOffset(128, status); |
- if (U_SUCCESS(status)) { |
- errln("Error expecting set offset error"); |
- } |
- int index = 0; |
- while (BASIC[index].text != NULL) { |
- UErrorCode status = U_ZERO_ERROR; |
- SearchData search = BASIC[index ++]; |
- UChar temp[128]; |
- |
- u_unescape(search.text, temp, 128); |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(search.pattern, temp, 128); |
- pattern.setTo(temp, u_strlen(temp)); |
- strsrch->setText(text, status); |
- strsrch->setPattern(pattern, status); |
- strsrch->getCollator()->setStrength(getECollationStrength( |
- search.strength)); |
- strsrch->reset(); |
- |
- int count = 0; |
- int32_t matchindex = search.offset[count]; |
- while (U_SUCCESS(status) && matchindex >= 0) { |
- int32_t matchlength = search.size[count]; |
- strsrch->next(status); |
- if (matchindex != strsrch->getMatchedStart() || |
- matchlength != strsrch->getMatchedLength()) { |
- char *str = toCharString(strsrch->getText()); |
- errln("Text: %s", str); |
- str = toCharString(strsrch->getPattern()); |
- errln("Pattern: %s", str); |
- errln("Error match found at %d %d", |
- strsrch->getMatchedStart(), |
- strsrch->getMatchedLength()); |
- return; |
- } |
- matchindex = search.offset[count + 1] == -1 ? -1 : |
- search.offset[count + 2]; |
- if (search.offset[count + 1] != -1) { |
- strsrch->setOffset(search.offset[count + 1] + 1, status); |
- if (strsrch->getOffset() != search.offset[count + 1] + 1) { |
- errln("Error setting offset\n"); |
- return; |
- } |
- } |
- |
- count += 2; |
- } |
- strsrch->next(status); |
- if (strsrch->getMatchedStart() != USEARCH_DONE) { |
- char *str = toCharString(strsrch->getText()); |
- errln("Text: %s", str); |
- str = toCharString(strsrch->getPattern()); |
- errln("Pattern: %s", str); |
- errln("Error match found at %d %d", |
- strsrch->getMatchedStart(), |
- strsrch->getMatchedLength()); |
- return; |
- } |
- } |
- strsrch->getCollator()->setStrength(getECollationStrength( |
- UCOL_TERTIARY)); |
- delete strsrch; |
-} |
- |
-void StringSearchTest::TestGetSetAttribute() |
-{ |
- UErrorCode status = U_ZERO_ERROR; |
- UnicodeString pattern("pattern"); |
- UnicodeString text("text"); |
- StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, NULL, |
- status); |
- if (U_FAILURE(status)) { |
- errln("Error opening search %s", u_errorName(status)); |
- return; |
- } |
- |
- strsrch->setAttribute(USEARCH_OVERLAP, USEARCH_DEFAULT, status); |
- if (U_FAILURE(status) || |
- strsrch->getAttribute(USEARCH_OVERLAP) != USEARCH_OFF) { |
- errln("Error setting overlap to the default"); |
- } |
- strsrch->setAttribute(USEARCH_OVERLAP, USEARCH_ON, status); |
- if (U_FAILURE(status) || |
- strsrch->getAttribute(USEARCH_OVERLAP) != USEARCH_ON) { |
- errln("Error setting overlap true"); |
- } |
- strsrch->setAttribute(USEARCH_OVERLAP, USEARCH_OFF, status); |
- if (U_FAILURE(status) || |
- strsrch->getAttribute(USEARCH_OVERLAP) != USEARCH_OFF) { |
- errln("Error setting overlap false"); |
- } |
- strsrch->setAttribute(USEARCH_OVERLAP, USEARCH_ATTRIBUTE_VALUE_COUNT, |
- status); |
- if (U_SUCCESS(status)) { |
- errln("Error setting overlap to illegal value"); |
- } |
- status = U_ZERO_ERROR; |
- strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_DEFAULT, status); |
- if (U_FAILURE(status) || |
- strsrch->getAttribute(USEARCH_CANONICAL_MATCH) != USEARCH_OFF) { |
- errln("Error setting canonical match to the default"); |
- } |
- strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status); |
- if (U_FAILURE(status) || |
- strsrch->getAttribute(USEARCH_CANONICAL_MATCH) != USEARCH_ON) { |
- errln("Error setting canonical match true"); |
- } |
- strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_OFF, status); |
- if (U_FAILURE(status) || |
- strsrch->getAttribute(USEARCH_CANONICAL_MATCH) != USEARCH_OFF) { |
- errln("Error setting canonical match false"); |
- } |
- strsrch->setAttribute(USEARCH_CANONICAL_MATCH, |
- USEARCH_ATTRIBUTE_VALUE_COUNT, status); |
- if (U_SUCCESS(status)) { |
- errln("Error setting canonical match to illegal value"); |
- } |
- status = U_ZERO_ERROR; |
- strsrch->setAttribute(USEARCH_ATTRIBUTE_COUNT, USEARCH_DEFAULT, status); |
- if (U_SUCCESS(status)) { |
- errln("Error setting illegal attribute success"); |
- } |
- |
- delete strsrch; |
-} |
- |
-void StringSearchTest::TestGetMatch() |
-{ |
- UChar temp[128]; |
- SearchData search = MATCH[0]; |
- u_unescape(search.text, temp, 128); |
- UnicodeString text; |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(search.pattern, temp, 128); |
- UnicodeString pattern; |
- pattern.setTo(temp, u_strlen(temp)); |
- |
- UErrorCode status = U_ZERO_ERROR; |
- StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, NULL, |
- status); |
- if (U_FAILURE(status)) { |
- errln("Error opening string search %s", u_errorName(status)); |
- if (strsrch != NULL) { |
- delete strsrch; |
- } |
- return; |
- } |
- |
- int count = 0; |
- int32_t matchindex = search.offset[count]; |
- UnicodeString matchtext; |
- while (U_SUCCESS(status) && matchindex >= 0) { |
- int32_t matchlength = search.size[count]; |
- strsrch->next(status); |
- if (matchindex != strsrch->getMatchedStart() || |
- matchlength != strsrch->getMatchedLength()) { |
- char *str = toCharString(strsrch->getText()); |
- errln("Text: %s", str); |
- str = toCharString(strsrch->getPattern()); |
- errln("Pattern: %s", str); |
- errln("Error match found at %d %d", strsrch->getMatchedStart(), |
- strsrch->getMatchedLength()); |
- return; |
- } |
- count ++; |
- |
- status = U_ZERO_ERROR; |
- strsrch->getMatchedText(matchtext); |
- if (matchtext.length() != matchlength || U_FAILURE(status)){ |
- errln("Error getting match text"); |
- } |
- matchindex = search.offset[count]; |
- } |
- status = U_ZERO_ERROR; |
- strsrch->next(status); |
- if (strsrch->getMatchedStart() != USEARCH_DONE || |
- strsrch->getMatchedLength() != 0) { |
- errln("Error end of match not found"); |
- } |
- status = U_ZERO_ERROR; |
- strsrch->getMatchedText(matchtext); |
- if (matchtext.length() != 0) { |
- errln("Error getting null matches"); |
- } |
- delete strsrch; |
-} |
- |
-void StringSearchTest::TestSetMatch() |
-{ |
- int count = 0; |
- while (MATCH[count].text != NULL) { |
- SearchData search = MATCH[count]; |
- UChar temp[128]; |
- UErrorCode status = U_ZERO_ERROR; |
- u_unescape(search.text, temp, 128); |
- UnicodeString text; |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(search.pattern, temp, 128); |
- UnicodeString pattern; |
- pattern.setTo(temp, u_strlen(temp)); |
- |
- StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, |
- NULL, status); |
- if (U_FAILURE(status)) { |
- errln("Error opening string search %s", u_errorName(status)); |
- if (strsrch != NULL) { |
- delete strsrch; |
- } |
- return; |
- } |
- |
- int size = 0; |
- while (search.offset[size] != -1) { |
- size ++; |
- } |
- |
- if (strsrch->first(status) != search.offset[0] || U_FAILURE(status)) { |
- errln("Error getting first match"); |
- } |
- if (strsrch->last(status) != search.offset[size -1] || |
- U_FAILURE(status)) { |
- errln("Error getting last match"); |
- } |
- |
- int index = 0; |
- while (index < size) { |
- if (index + 2 < size) { |
- if (strsrch->following(search.offset[index + 2] - 1, status) |
- != search.offset[index + 2] || U_FAILURE(status)) { |
- errln("Error getting following match at index %d", |
- search.offset[index + 2] - 1); |
- } |
- } |
- if (index + 1 < size) { |
- if (strsrch->preceding(search.offset[index + 1] + |
- search.size[index + 1] + 1, |
- status) != search.offset[index + 1] || |
- U_FAILURE(status)) { |
- errln("Error getting preceeding match at index %d", |
- search.offset[index + 1] + 1); |
- } |
- } |
- index += 2; |
- } |
- status = U_ZERO_ERROR; |
- if (strsrch->following(text.length(), status) != USEARCH_DONE) { |
- errln("Error expecting out of bounds match"); |
- } |
- if (strsrch->preceding(0, status) != USEARCH_DONE) { |
- errln("Error expecting out of bounds match"); |
- } |
- count ++; |
- delete strsrch; |
- } |
-} |
- |
-void StringSearchTest::TestReset() |
-{ |
- UErrorCode status = U_ZERO_ERROR; |
- UnicodeString text("fish fish"); |
- UnicodeString pattern("s"); |
- StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, NULL, |
- status); |
- if (U_FAILURE(status)) { |
- errln("Error opening string search %s", u_errorName(status)); |
- if (strsrch != NULL) { |
- delete strsrch; |
- } |
- return; |
- } |
- strsrch->setAttribute(USEARCH_OVERLAP, USEARCH_ON, status); |
- strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status); |
- strsrch->setOffset(9, status); |
- if (U_FAILURE(status)) { |
- errln("Error setting attributes and offsets"); |
- } |
- else { |
- strsrch->reset(); |
- if (strsrch->getAttribute(USEARCH_OVERLAP) != USEARCH_OFF || |
- strsrch->getAttribute(USEARCH_CANONICAL_MATCH) != USEARCH_OFF || |
- strsrch->getOffset() != 0 || strsrch->getMatchedLength() != 0 || |
- strsrch->getMatchedStart() != USEARCH_DONE) { |
- errln("Error resetting string search"); |
- } |
- strsrch->previous(status); |
- if (strsrch->getMatchedStart() != 7 || |
- strsrch->getMatchedLength() != 1) { |
- errln("Error resetting string search\n"); |
- } |
- } |
- delete strsrch; |
-} |
- |
-void StringSearchTest::TestSupplementary() |
-{ |
- int count = 0; |
- while (SUPPLEMENTARY[count].text != NULL) { |
- if (!assertEqual(&SUPPLEMENTARY[count])) { |
- errln("Error at test number %d", count); |
- } |
- count ++; |
- } |
-} |
- |
-void StringSearchTest::TestContraction() |
-{ |
- UChar temp[128]; |
- UErrorCode status = U_ZERO_ERROR; |
- |
- u_unescape(CONTRACTIONRULE, temp, 128); |
- UnicodeString rules; |
- rules.setTo(temp, u_strlen(temp)); |
- RuleBasedCollator *collator = new RuleBasedCollator(rules, |
- getECollationStrength(UCOL_TERTIARY), UCOL_ON, status); |
- if (U_FAILURE(status)) { |
- errln("Error opening collator %s", u_errorName(status)); |
- } |
- UnicodeString text("text"); |
- UnicodeString pattern("pattern"); |
- StringSearch *strsrch = new StringSearch(pattern, text, collator, NULL, |
- status); |
- if (U_FAILURE(status)) { |
- errln("Error opening string search %s", u_errorName(status)); |
- } |
- |
- int count = 0; |
- while (CONTRACTION[count].text != NULL) { |
- u_unescape(CONTRACTION[count].text, temp, 128); |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(CONTRACTION[count].pattern, temp, 128); |
- pattern.setTo(temp, u_strlen(temp)); |
- strsrch->setText(text, status); |
- strsrch->setPattern(pattern, status); |
- if (!assertEqualWithStringSearch(strsrch, &CONTRACTION[count])) { |
- errln("Error at test number %d", count); |
- } |
- count ++; |
- } |
- delete strsrch; |
- delete collator; |
-} |
- |
-void StringSearchTest::TestIgnorable() |
-{ |
- UChar temp[128]; |
- u_unescape(IGNORABLERULE, temp, 128); |
- UnicodeString rules; |
- rules.setTo(temp, u_strlen(temp)); |
- UErrorCode status = U_ZERO_ERROR; |
- int count = 0; |
- RuleBasedCollator *collator = new RuleBasedCollator(rules, |
- getECollationStrength(IGNORABLE[count].strength), |
- UCOL_ON, status); |
- if (U_FAILURE(status)) { |
- errln("Error opening collator %s", u_errorName(status)); |
- return; |
- } |
- UnicodeString pattern("pattern"); |
- UnicodeString text("text"); |
- StringSearch *strsrch = new StringSearch(pattern, text, collator, NULL, |
- status); |
- if (U_FAILURE(status)) { |
- errln("Error opening string search %s", u_errorName(status)); |
- delete collator; |
- return; |
- } |
- |
- while (IGNORABLE[count].text != NULL) { |
- u_unescape(IGNORABLE[count].text, temp, 128); |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(IGNORABLE[count].pattern, temp, 128); |
- pattern.setTo(temp, u_strlen(temp)); |
- strsrch->setText(text, status); |
- strsrch->setPattern(pattern, status); |
- if (!assertEqualWithStringSearch(strsrch, &IGNORABLE[count])) { |
- errln("Error at test number %d", count); |
- } |
- count ++; |
- } |
- delete strsrch; |
- delete collator; |
-} |
- |
-void StringSearchTest::TestDiacriticMatch() |
-{ |
- UChar temp[128]; |
- UErrorCode status = U_ZERO_ERROR; |
- int count = 0; |
- RuleBasedCollator* coll = NULL; |
- StringSearch *strsrch = NULL; |
- |
- UnicodeString pattern("pattern"); |
- UnicodeString text("text"); |
- |
- const SearchData *search; |
- |
- search = &(DIACRITICMATCH[count]); |
- while (search->text != NULL) { |
- coll = getCollator(search->collator); |
- coll->setStrength(getECollationStrength(search->strength)); |
- strsrch = new StringSearch(pattern, text, coll, getBreakIterator(search->breaker), status); |
- if (U_FAILURE(status)) { |
- errln("Error opening string search %s", u_errorName(status)); |
- return; |
- } |
- u_unescape(search->text, temp, 128); |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(search->pattern, temp, 128); |
- pattern.setTo(temp, u_strlen(temp)); |
- strsrch->setText(text, status); |
- strsrch->setPattern(pattern, status); |
- if (!assertEqualWithStringSearch(strsrch, search)) { |
- errln("Error at test number %d", count); |
- } |
- search = &(DIACRITICMATCH[++count]); |
- delete strsrch; |
- } |
- |
-} |
- |
-void StringSearchTest::TestCanonical() |
-{ |
- int count = 0; |
- while (BASICCANONICAL[count].text != NULL) { |
- if (!assertCanonicalEqual(&BASICCANONICAL[count])) { |
- errln("Error at test number %d", count); |
- } |
- count ++; |
- } |
-} |
- |
-void StringSearchTest::TestNormCanonical() |
-{ |
- UErrorCode status = U_ZERO_ERROR; |
- m_en_us_->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status); |
- int count = 0; |
- while (NORMCANONICAL[count].text != NULL) { |
- if (!assertCanonicalEqual(&NORMCANONICAL[count])) { |
- errln("Error at test number %d", count); |
- } |
- count ++; |
- } |
- m_en_us_->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_OFF, status); |
-} |
- |
-void StringSearchTest::TestStrengthCanonical() |
-{ |
- int count = 0; |
- while (STRENGTHCANONICAL[count].text != NULL) { |
- if (!assertCanonicalEqual(&STRENGTHCANONICAL[count])) { |
- errln("Error at test number %d", count); |
- } |
- count ++; |
- } |
-} |
- |
-#if !UCONFIG_NO_BREAK_ITERATION |
- |
-void StringSearchTest::TestBreakIteratorCanonical() |
-{ |
- UErrorCode status = U_ZERO_ERROR; |
- int count = 0; |
- |
- while (count < 4) { |
- // special purposes for tests numbers 0-3 |
- UChar temp[128]; |
- const SearchData *search = &(BREAKITERATORCANONICAL[count]); |
- |
- u_unescape(search->text, temp, 128); |
- UnicodeString text; |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(search->pattern, temp, 128); |
- UnicodeString pattern; |
- pattern.setTo(temp, u_strlen(temp)); |
- RuleBasedCollator *collator = getCollator(search->collator); |
- collator->setStrength(getECollationStrength(search->strength)); |
- |
- BreakIterator *breaker = getBreakIterator(search->breaker); |
- StringSearch *strsrch = new StringSearch(pattern, text, collator, |
- breaker, status); |
- if (U_FAILURE(status)) { |
- errln("Error creating string search data"); |
- return; |
- } |
- strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status); |
- if (U_FAILURE(status) || |
- strsrch->getBreakIterator() != breaker) { |
- errln("Error setting break iterator"); |
- delete strsrch; |
- return; |
- } |
- if (!assertEqualWithStringSearch(strsrch, search)) { |
- collator->setStrength(getECollationStrength(UCOL_TERTIARY)); |
- delete strsrch; |
- return; |
- } |
- search = &(BREAKITERATOREXACT[count + 1]); |
- breaker = getBreakIterator(search->breaker); |
- if (breaker == NULL) { |
- errln("Error creating BreakIterator"); |
- return; |
- } |
- breaker->setText(strsrch->getText()); |
- strsrch->setBreakIterator(breaker, status); |
- if (U_FAILURE(status) || strsrch->getBreakIterator() != breaker) { |
- errln("Error setting break iterator"); |
- delete strsrch; |
- return; |
- } |
- strsrch->reset(); |
- strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status); |
- if (!assertEqualWithStringSearch(strsrch, search)) { |
- errln("Error at test number %d", count); |
- return; |
- } |
- delete strsrch; |
- count += 2; |
- } |
- count = 0; |
- while (BREAKITERATORCANONICAL[count].text != NULL) { |
- if (!assertEqual(&BREAKITERATORCANONICAL[count])) { |
- errln("Error at test number %d", count); |
- return; |
- } |
- count ++; |
- } |
-} |
- |
-#endif |
- |
-void StringSearchTest::TestVariableCanonical() |
-{ |
- int count = 0; |
- UErrorCode status = U_ZERO_ERROR; |
- m_en_us_->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, status); |
- if (U_FAILURE(status)) { |
- errln("Error setting collation alternate attribute %s", |
- u_errorName(status)); |
- } |
- while (VARIABLE[count].text != NULL) { |
- logln("variable %d", count); |
- if (!assertCanonicalEqual(&VARIABLE[count])) { |
- errln("Error at test number %d", count); |
- } |
- count ++; |
- } |
- m_en_us_->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, |
- status); |
-} |
- |
-void StringSearchTest::TestOverlapCanonical() |
-{ |
- int count = 0; |
- while (OVERLAPCANONICAL[count].text != NULL) { |
- if (!assertEqualWithAttribute(&OVERLAPCANONICAL[count], USEARCH_ON, |
- USEARCH_ON)) { |
- errln("Error at overlap test number %d", count); |
- } |
- count ++; |
- } |
- count = 0; |
- while (NONOVERLAP[count].text != NULL) { |
- if (!assertCanonicalEqual(&NONOVERLAPCANONICAL[count])) { |
- errln("Error at non overlap test number %d", count); |
- } |
- count ++; |
- } |
- |
- count = 0; |
- while (count < 1) { |
- UChar temp[128]; |
- const SearchData *search = &(OVERLAPCANONICAL[count]); |
- UErrorCode status = U_ZERO_ERROR; |
- |
- u_unescape(search->text, temp, 128); |
- UnicodeString text; |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(search->pattern, temp, 128); |
- UnicodeString pattern; |
- pattern.setTo(temp, u_strlen(temp)); |
- RuleBasedCollator *collator = getCollator(search->collator); |
- StringSearch *strsrch = new StringSearch(pattern, text, collator, |
- NULL, status); |
- strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status); |
- strsrch->setAttribute(USEARCH_OVERLAP, USEARCH_ON, status); |
- if (U_FAILURE(status) || |
- strsrch->getAttribute(USEARCH_OVERLAP) != USEARCH_ON) { |
- errln("Error setting overlap option"); |
- } |
- if (!assertEqualWithStringSearch(strsrch, search)) { |
- delete strsrch; |
- return; |
- } |
- search = &(NONOVERLAPCANONICAL[count]); |
- strsrch->setAttribute(USEARCH_OVERLAP, USEARCH_OFF, status); |
- if (U_FAILURE(status) || |
- strsrch->getAttribute(USEARCH_OVERLAP) != USEARCH_OFF) { |
- errln("Error setting overlap option"); |
- } |
- strsrch->reset(); |
- if (!assertEqualWithStringSearch(strsrch, search)) { |
- delete strsrch; |
- errln("Error at test number %d", count); |
- } |
- |
- count ++; |
- delete strsrch; |
- } |
-} |
- |
-void StringSearchTest::TestCollatorCanonical() |
-{ |
- /* test collator that thinks "o" and "p" are the same thing */ |
- UChar temp[128]; |
- u_unescape(COLLATORCANONICAL[0].text, temp, 128); |
- UnicodeString text; |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(COLLATORCANONICAL[0].pattern, temp, 128); |
- UnicodeString pattern; |
- pattern.setTo(temp, u_strlen(temp)); |
- |
- UErrorCode status = U_ZERO_ERROR; |
- StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, |
- NULL, status); |
- strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status); |
- if (U_FAILURE(status)) { |
- errln("Error opening string search %s", u_errorName(status)); |
- } |
- if (!assertEqualWithStringSearch(strsrch, &COLLATORCANONICAL[0])) { |
- delete strsrch; |
- return; |
- } |
- |
- u_unescape(TESTCOLLATORRULE, temp, 128); |
- UnicodeString rules; |
- rules.setTo(temp, u_strlen(temp)); |
- RuleBasedCollator *tailored = new RuleBasedCollator(rules, |
- getECollationStrength(COLLATORCANONICAL[1].strength), |
- UCOL_ON, status); |
- |
- if (U_FAILURE(status)) { |
- errln("Error opening rule based collator %s", u_errorName(status)); |
- } |
- |
- strsrch->setCollator(tailored, status); |
- if (U_FAILURE(status) || *(strsrch->getCollator()) != *tailored) { |
- errln("Error setting rule based collator"); |
- } |
- strsrch->reset(); |
- strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status); |
- if (!assertEqualWithStringSearch(strsrch, &COLLATORCANONICAL[1])) { |
- delete strsrch; |
- if (tailored != NULL) { |
- delete tailored; |
- } |
- |
- return; |
- } |
- |
- strsrch->setCollator(m_en_us_, status); |
- strsrch->reset(); |
- if (U_FAILURE(status) || *(strsrch->getCollator()) != *m_en_us_) { |
- errln("Error setting rule based collator"); |
- } |
- if (!assertEqualWithStringSearch(strsrch, &COLLATORCANONICAL[0])) { |
- } |
- delete strsrch; |
- if (tailored != NULL) { |
- delete tailored; |
- } |
-} |
- |
-void StringSearchTest::TestPatternCanonical() |
-{ |
- |
- UChar temp[128]; |
- |
- u_unescape(PATTERNCANONICAL[0].text, temp, 128); |
- UnicodeString text; |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(PATTERNCANONICAL[0].pattern, temp, 128); |
- UnicodeString pattern; |
- pattern.setTo(temp, u_strlen(temp)); |
- |
- m_en_us_->setStrength( |
- getECollationStrength(PATTERNCANONICAL[0].strength)); |
- |
- UErrorCode status = U_ZERO_ERROR; |
- StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, NULL, |
- status); |
- strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status); |
- if (U_FAILURE(status)) { |
- errln("Error opening string search %s", u_errorName(status)); |
- goto ENDTESTPATTERN; |
- } |
- if (pattern != strsrch->getPattern()) { |
- errln("Error setting pattern"); |
- } |
- if (!assertEqualWithStringSearch(strsrch, &PATTERNCANONICAL[0])) { |
- goto ENDTESTPATTERN; |
- } |
- |
- u_unescape(PATTERNCANONICAL[1].pattern, temp, 128); |
- pattern.setTo(temp, u_strlen(temp)); |
- strsrch->setPattern(pattern, status); |
- if (pattern != strsrch->getPattern()) { |
- errln("Error setting pattern"); |
- goto ENDTESTPATTERN; |
- } |
- strsrch->reset(); |
- strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status); |
- if (U_FAILURE(status)) { |
- errln("Error setting pattern %s", u_errorName(status)); |
- } |
- if (!assertEqualWithStringSearch(strsrch, &PATTERNCANONICAL[1])) { |
- goto ENDTESTPATTERN; |
- } |
- |
- u_unescape(PATTERNCANONICAL[0].pattern, temp, 128); |
- pattern.setTo(temp, u_strlen(temp)); |
- strsrch->setPattern(pattern, status); |
- if (pattern != strsrch->getPattern()) { |
- errln("Error setting pattern"); |
- goto ENDTESTPATTERN; |
- } |
- strsrch->reset(); |
- strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status); |
- if (U_FAILURE(status)) { |
- errln("Error setting pattern %s", u_errorName(status)); |
- } |
- if (!assertEqualWithStringSearch(strsrch, &PATTERNCANONICAL[0])) { |
- goto ENDTESTPATTERN; |
- } |
-ENDTESTPATTERN: |
- m_en_us_->setStrength(getECollationStrength(UCOL_TERTIARY)); |
- if (strsrch != NULL) { |
- delete strsrch; |
- } |
-} |
- |
-void StringSearchTest::TestTextCanonical() |
-{ |
- UChar temp[128]; |
- u_unescape(TEXTCANONICAL[0].text, temp, 128); |
- UnicodeString text; |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(TEXTCANONICAL[0].pattern, temp, 128); |
- UnicodeString pattern; |
- pattern.setTo(temp, u_strlen(temp)); |
- |
- UErrorCode status = U_ZERO_ERROR; |
- StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, NULL, |
- status); |
- strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status); |
- |
- if (U_FAILURE(status)) { |
- errln("Error opening string search %s", u_errorName(status)); |
- goto ENDTESTPATTERN; |
- } |
- if (text != strsrch->getText()) { |
- errln("Error setting text"); |
- } |
- if (!assertEqualWithStringSearch(strsrch, &TEXTCANONICAL[0])) { |
- goto ENDTESTPATTERN; |
- } |
- |
- u_unescape(TEXTCANONICAL[1].text, temp, 128); |
- text.setTo(temp, u_strlen(temp)); |
- strsrch->setText(text, status); |
- if (text != strsrch->getText()) { |
- errln("Error setting text"); |
- goto ENDTESTPATTERN; |
- } |
- if (U_FAILURE(status)) { |
- errln("Error setting text %s", u_errorName(status)); |
- } |
- if (!assertEqualWithStringSearch(strsrch, &TEXTCANONICAL[1])) { |
- goto ENDTESTPATTERN; |
- } |
- |
- u_unescape(TEXTCANONICAL[0].text, temp, 128); |
- text.setTo(temp, u_strlen(temp)); |
- strsrch->setText(text, status); |
- if (text != strsrch->getText()) { |
- errln("Error setting text"); |
- goto ENDTESTPATTERN; |
- } |
- if (U_FAILURE(status)) { |
- errln("Error setting pattern %s", u_errorName(status)); |
- } |
- if (!assertEqualWithStringSearch(strsrch, &TEXTCANONICAL[0])) { |
- goto ENDTESTPATTERN; |
- } |
-ENDTESTPATTERN: |
- if (strsrch != NULL) { |
- delete strsrch; |
- } |
-} |
- |
-void StringSearchTest::TestCompositeBoundariesCanonical() |
-{ |
- int count = 0; |
- while (COMPOSITEBOUNDARIESCANONICAL[count].text != NULL) { |
- logln("composite %d", count); |
- if (!assertCanonicalEqual(&COMPOSITEBOUNDARIESCANONICAL[count])) { |
- errln("Error at test number %d", count); |
- } |
- count ++; |
- } |
-} |
- |
-void StringSearchTest::TestGetSetOffsetCanonical() |
-{ |
- |
- UErrorCode status = U_ZERO_ERROR; |
- UnicodeString text("text"); |
- UnicodeString pattern("pattern"); |
- StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, NULL, |
- status); |
- Collator *collator = strsrch->getCollator(); |
- |
- collator->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status); |
- |
- strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status); |
- /* testing out of bounds error */ |
- strsrch->setOffset(-1, status); |
- if (U_SUCCESS(status)) { |
- errln("Error expecting set offset error"); |
- } |
- strsrch->setOffset(128, status); |
- if (U_SUCCESS(status)) { |
- errln("Error expecting set offset error"); |
- } |
- int index = 0; |
- UChar temp[128]; |
- while (BASICCANONICAL[index].text != NULL) { |
- SearchData search = BASICCANONICAL[index ++]; |
- if (BASICCANONICAL[index].text == NULL) { |
- /* skip the last one */ |
- break; |
- } |
- |
- u_unescape(search.text, temp, 128); |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(search.pattern, temp, 128); |
- pattern.setTo(temp, u_strlen(temp)); |
- |
- UErrorCode status = U_ZERO_ERROR; |
- strsrch->setText(text, status); |
- |
- strsrch->setPattern(pattern, status); |
- |
- int count = 0; |
- int32_t matchindex = search.offset[count]; |
- while (U_SUCCESS(status) && matchindex >= 0) { |
- int32_t matchlength = search.size[count]; |
- strsrch->next(status); |
- if (matchindex != strsrch->getMatchedStart() || |
- matchlength != strsrch->getMatchedLength()) { |
- char *str = toCharString(strsrch->getText()); |
- errln("Text: %s", str); |
- str = toCharString(strsrch->getPattern()); |
- errln("Pattern: %s", str); |
- errln("Error match found at %d %d", |
- strsrch->getMatchedStart(), |
- strsrch->getMatchedLength()); |
- goto bail; |
- } |
- matchindex = search.offset[count + 1] == -1 ? -1 : |
- search.offset[count + 2]; |
- if (search.offset[count + 1] != -1) { |
- strsrch->setOffset(search.offset[count + 1] + 1, status); |
- if (strsrch->getOffset() != search.offset[count + 1] + 1) { |
- errln("Error setting offset"); |
- goto bail; |
- } |
- } |
- |
- count += 2; |
- } |
- strsrch->next(status); |
- if (strsrch->getMatchedStart() != USEARCH_DONE) { |
- char *str = toCharString(strsrch->getText()); |
- errln("Text: %s", str); |
- str = toCharString(strsrch->getPattern()); |
- errln("Pattern: %s", str); |
- errln("Error match found at %d %d", strsrch->getMatchedStart(), |
- strsrch->getMatchedLength()); |
- goto bail; |
- } |
- } |
- |
-bail: |
- collator->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_OFF, status); |
- delete strsrch; |
-} |
- |
-void StringSearchTest::TestSupplementaryCanonical() |
-{ |
- int count = 0; |
- while (SUPPLEMENTARYCANONICAL[count].text != NULL) { |
- if (!assertCanonicalEqual(&SUPPLEMENTARYCANONICAL[count])) { |
- errln("Error at test number %d", count); |
- } |
- count ++; |
- } |
-} |
- |
-void StringSearchTest::TestContractionCanonical() |
-{ |
- UChar temp[128]; |
- |
- u_unescape(CONTRACTIONRULE, temp, 128); |
- UnicodeString rules; |
- rules.setTo(temp, u_strlen(temp)); |
- |
- UErrorCode status = U_ZERO_ERROR; |
- RuleBasedCollator *collator = new RuleBasedCollator(rules, |
- getECollationStrength(UCOL_TERTIARY), UCOL_ON, status); |
- if (U_FAILURE(status)) { |
- errln("Error opening collator %s", u_errorName(status)); |
- } |
- UnicodeString text("text"); |
- UnicodeString pattern("pattern"); |
- StringSearch *strsrch = new StringSearch(pattern, text, collator, NULL, |
- status); |
- strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status); |
- if (U_FAILURE(status)) { |
- errln("Error opening string search %s", u_errorName(status)); |
- } |
- |
- int count = 0; |
- while (CONTRACTIONCANONICAL[count].text != NULL) { |
- u_unescape(CONTRACTIONCANONICAL[count].text, temp, 128); |
- text.setTo(temp, u_strlen(temp)); |
- u_unescape(CONTRACTIONCANONICAL[count].pattern, temp, 128); |
- pattern.setTo(temp, u_strlen(temp)); |
- strsrch->setText(text, status); |
- strsrch->setPattern(pattern, status); |
- if (!assertEqualWithStringSearch(strsrch, |
- &CONTRACTIONCANONICAL[count])) { |
- errln("Error at test number %d", count); |
- } |
- count ++; |
- } |
- delete strsrch; |
- delete collator; |
-} |
- |
-void StringSearchTest::TestUClassID() |
-{ |
- char id = *((char *)StringSearch::getStaticClassID()); |
- if (id != 0) { |
- errln("Static class id for StringSearch should be 0"); |
- } |
- UErrorCode status = U_ZERO_ERROR; |
- UnicodeString text("text"); |
- UnicodeString pattern("pattern"); |
- StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, NULL, |
- status); |
- id = *((char *)strsrch->getDynamicClassID()); |
- if (id != 0) { |
- errln("Dynamic class id for StringSearch should be 0"); |
- } |
- delete strsrch; |
-} |
- |
-class TestSearch : public SearchIterator |
-{ |
-public: |
- TestSearch(const TestSearch &obj); |
- TestSearch(const UnicodeString &text, |
- BreakIterator *breakiter, |
- const UnicodeString &pattern); |
- ~TestSearch(); |
- |
- void setOffset(int32_t position, UErrorCode &status); |
- int32_t getOffset() const; |
- SearchIterator* safeClone() const; |
- |
- |
- /** |
- * ICU "poor man's RTTI", returns a UClassID for the actual class. |
- * |
- * @draft ICU 2.2 |
- */ |
- virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } |
- |
- /** |
- * ICU "poor man's RTTI", returns a UClassID for this class. |
- * |
- * @draft ICU 2.2 |
- */ |
- static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } |
- |
- UBool operator!=(const TestSearch &that) const; |
- |
- UnicodeString m_pattern_; |
- |
-protected: |
- int32_t handleNext(int32_t position, UErrorCode &status); |
- int32_t handlePrev(int32_t position, UErrorCode &status); |
- TestSearch & operator=(const TestSearch &that); |
- |
-private: |
- |
- /** |
- * The address of this static class variable serves as this class's ID |
- * for ICU "poor man's RTTI". |
- */ |
- static const char fgClassID; |
- uint32_t m_offset_; |
-}; |
- |
-const char TestSearch::fgClassID=0; |
- |
-TestSearch::TestSearch(const TestSearch &obj) : SearchIterator(obj) |
-{ |
- m_offset_ = obj.m_offset_; |
- m_pattern_ = obj.m_pattern_; |
-} |
- |
-TestSearch::TestSearch(const UnicodeString &text, |
- BreakIterator *breakiter, |
- const UnicodeString &pattern) : SearchIterator() |
-{ |
- m_breakiterator_ = breakiter; |
- m_pattern_ = pattern; |
- m_text_ = text; |
- m_offset_ = 0; |
- m_pattern_ = pattern; |
-} |
- |
-TestSearch::~TestSearch() |
-{ |
-} |
- |
- |
-void TestSearch::setOffset(int32_t position, UErrorCode &status) |
-{ |
- if (position >= 0 && position <= m_text_.length()) { |
- m_offset_ = position; |
- } |
- else { |
- status = U_INDEX_OUTOFBOUNDS_ERROR; |
- } |
-} |
- |
-int32_t TestSearch::getOffset() const |
-{ |
- return m_offset_; |
-} |
- |
-SearchIterator * TestSearch::safeClone() const |
-{ |
- return new TestSearch(m_text_, m_breakiterator_, m_pattern_); |
-} |
- |
-UBool TestSearch::operator!=(const TestSearch &that) const |
-{ |
- if (SearchIterator::operator !=(that)) { |
- return FALSE; |
- } |
- return m_offset_ != that.m_offset_ || m_pattern_ != that.m_pattern_; |
-} |
- |
-int32_t TestSearch::handleNext(int32_t start, UErrorCode &status) |
-{ |
- if(U_SUCCESS(status)) { |
- int match = m_text_.indexOf(m_pattern_, start); |
- if (match < 0) { |
- m_offset_ = m_text_.length(); |
- setMatchStart(m_offset_); |
- setMatchLength(0); |
- return USEARCH_DONE; |
- } |
- setMatchStart(match); |
- m_offset_ = match; |
- setMatchLength(m_pattern_.length()); |
- return match; |
- } else { |
- return USEARCH_DONE; |
- } |
-} |
- |
-int32_t TestSearch::handlePrev(int32_t start, UErrorCode &status) |
-{ |
- if(U_SUCCESS(status)) { |
- int match = m_text_.lastIndexOf(m_pattern_, 0, start); |
- if (match < 0) { |
- m_offset_ = 0; |
- setMatchStart(m_offset_); |
- setMatchLength(0); |
- return USEARCH_DONE; |
- } |
- setMatchStart(match); |
- m_offset_ = match; |
- setMatchLength(m_pattern_.length()); |
- return match; |
- } else { |
- return USEARCH_DONE; |
- } |
-} |
- |
-TestSearch & TestSearch::operator=(const TestSearch &that) |
-{ |
- SearchIterator::operator=(that); |
- m_offset_ = that.m_offset_; |
- m_pattern_ = that.m_pattern_; |
- return *this; |
-} |
- |
-void StringSearchTest::TestSubclass() |
-{ |
- UnicodeString text("abc abcd abc"); |
- UnicodeString pattern("abc"); |
- TestSearch search(text, NULL, pattern); |
- TestSearch search2(search); |
- int expected[] = {0, 4, 9}; |
- UErrorCode status = U_ZERO_ERROR; |
- int i; |
- StringCharacterIterator chariter(text); |
- |
- search.setText(text, status); |
- if (search.getText() != search2.getText()) { |
- errln("Error setting text"); |
- } |
- |
- search.setText(chariter, status); |
- if (search.getText() != search2.getText()) { |
- errln("Error setting text"); |
- } |
- |
- search.reset(); |
- // comparing constructors |
- |
- for (i = 0; i < (int)(sizeof(expected) / sizeof(expected[0])); i ++) { |
- if (search.next(status) != expected[i]) { |
- errln("Error getting next match"); |
- } |
- if (search.getMatchedLength() != search.m_pattern_.length()) { |
- errln("Error getting next match length"); |
- } |
- } |
- if (search.next(status) != USEARCH_DONE) { |
- errln("Error should have reached the end of the iteration"); |
- } |
- for (i = sizeof(expected) / sizeof(expected[0]) - 1; i >= 0; i --) { |
- if (search.previous(status) != expected[i]) { |
- errln("Error getting previous match"); |
- } |
- if (search.getMatchedLength() != search.m_pattern_.length()) { |
- errln("Error getting previous match length"); |
- } |
- } |
- if (search.previous(status) != USEARCH_DONE) { |
- errln("Error should have reached the start of the iteration"); |
- } |
-} |
- |
-class StubSearchIterator:public SearchIterator{ |
-public: |
- StubSearchIterator(){} |
- virtual void setOffset(int32_t , UErrorCode &) {}; |
- virtual int32_t getOffset(void) const {return 0;}; |
- virtual SearchIterator* safeClone(void) const {return NULL;}; |
- virtual int32_t handleNext(int32_t , UErrorCode &){return 0;}; |
- virtual int32_t handlePrev(int32_t , UErrorCode &) {return 0;}; |
- virtual UClassID getDynamicClassID() const { |
- static char classID = 0; |
- return (UClassID)&classID; |
- } |
-}; |
- |
-void StringSearchTest::TestCoverage(){ |
- StubSearchIterator stub1, stub2; |
- UErrorCode status = U_ZERO_ERROR; |
- |
- if (stub1 != stub2){ |
- errln("new StubSearchIterator should be equal"); |
- } |
- |
- stub2.setText(UnicodeString("ABC"), status); |
- if (U_FAILURE(status)) { |
- errln("Error: SearchIterator::SetText"); |
- } |
- |
- stub1 = stub2; |
- if (stub1 != stub2){ |
- errln("SearchIterator::operator = assigned object should be equal"); |
- } |
-} |
- |
-#endif /* !UCONFIG_NO_BREAK_ITERATION */ |
- |
-#endif /* #if !UCONFIG_NO_COLLATION */ |