Index: source/test/intltest/itercoll.cpp |
diff --git a/source/test/intltest/itercoll.cpp b/source/test/intltest/itercoll.cpp |
deleted file mode 100644 |
index cd586d83eaf375cdcc73a0de8301575bb9ea5a95..0000000000000000000000000000000000000000 |
--- a/source/test/intltest/itercoll.cpp |
+++ /dev/null |
@@ -1,702 +0,0 @@ |
-/******************************************************************** |
- * COPYRIGHT: |
- * Copyright (c) 1997-2014, International Business Machines Corporation and |
- * others. All Rights Reserved. |
- ********************************************************************/ |
- |
-#include "unicode/utypes.h" |
- |
-#if !UCONFIG_NO_COLLATION |
- |
-#include "unicode/coll.h" |
-#include "unicode/tblcoll.h" |
-#include "unicode/unistr.h" |
-#include "unicode/sortkey.h" |
-#include "itercoll.h" |
-#include "unicode/schriter.h" |
-#include "unicode/chariter.h" |
-#include "unicode/uchar.h" |
-#include "cmemory.h" |
- |
-#define ARRAY_LENGTH(array) (sizeof array / sizeof array[0]) |
- |
-static UErrorCode status = U_ZERO_ERROR; |
- |
-CollationIteratorTest::CollationIteratorTest() |
- : test1("What subset of all possible test cases?", ""), |
- test2("has the highest probability of detecting", "") |
-{ |
- en_us = (RuleBasedCollator *)Collator::createInstance(Locale::getUS(), status); |
- if(U_FAILURE(status)) { |
- delete en_us; |
- en_us = 0; |
- errcheckln(status, "Collator creation failed with %s", u_errorName(status)); |
- return; |
- } |
- |
-} |
- |
-CollationIteratorTest::~CollationIteratorTest() |
-{ |
- delete en_us; |
-} |
- |
-/** |
- * Test for CollationElementIterator previous and next for the whole set of |
- * unicode characters. |
- */ |
-void CollationIteratorTest::TestUnicodeChar() |
-{ |
- CollationElementIterator *iter; |
- UChar codepoint; |
- UnicodeString source; |
- |
- for (codepoint = 1; codepoint < 0xFFFE;) |
- { |
- source.remove(); |
- |
- while (codepoint % 0xFF != 0) |
- { |
- if (u_isdefined(codepoint)) |
- source += codepoint; |
- codepoint ++; |
- } |
- |
- if (u_isdefined(codepoint)) |
- source += codepoint; |
- |
- if (codepoint != 0xFFFF) |
- codepoint ++; |
- |
- iter = en_us->createCollationElementIterator(source); |
- /* A basic test to see if it's working at all */ |
- backAndForth(*iter); |
- delete iter; |
- } |
-} |
- |
-/** |
- * Test for CollationElementIterator.previous() |
- * |
- * @bug 4108758 - Make sure it works with contracting characters |
- * |
- */ |
-void CollationIteratorTest::TestPrevious(/* char* par */) |
-{ |
- UErrorCode status = U_ZERO_ERROR; |
- CollationElementIterator *iter = en_us->createCollationElementIterator(test1); |
- |
- // A basic test to see if it's working at all |
- backAndForth(*iter); |
- delete iter; |
- |
- // Test with a contracting character sequence |
- UnicodeString source; |
- RuleBasedCollator *c1 = NULL; |
- c1 = new RuleBasedCollator( |
- (UnicodeString)"&a,A < b,B < c,C, d,D < z,Z < ch,cH,Ch,CH", status); |
- |
- if (c1 == NULL || U_FAILURE(status)) |
- { |
- errln("Couldn't create a RuleBasedCollator with a contracting sequence."); |
- delete c1; |
- return; |
- } |
- |
- source = "abchdcba"; |
- iter = c1->createCollationElementIterator(source); |
- backAndForth(*iter); |
- delete iter; |
- delete c1; |
- |
- // Test with an expanding character sequence |
- RuleBasedCollator *c2 = NULL; |
- c2 = new RuleBasedCollator((UnicodeString)"&a < b < c/abd < d", status); |
- |
- if (c2 == NULL || U_FAILURE(status)) |
- { |
- errln("Couldn't create a RuleBasedCollator with an expanding sequence."); |
- delete c2; |
- return; |
- } |
- |
- source = "abcd"; |
- iter = c2->createCollationElementIterator(source); |
- backAndForth(*iter); |
- delete iter; |
- delete c2; |
- |
- // Now try both |
- RuleBasedCollator *c3 = NULL; |
- c3 = new RuleBasedCollator((UnicodeString)"&a < b < c/aba < d < z < ch", status); |
- |
- if (c3 == NULL || U_FAILURE(status)) |
- { |
- errln("Couldn't create a RuleBasedCollator with both an expanding and a contracting sequence."); |
- delete c3; |
- return; |
- } |
- |
- source = "abcdbchdc"; |
- iter = c3->createCollationElementIterator(source); |
- backAndForth(*iter); |
- delete iter; |
- delete c3; |
- |
- status=U_ZERO_ERROR; |
- source= CharsToUnicodeString("\\u0e41\\u0e02\\u0e41\\u0e02\\u0e27abc"); |
- |
- Collator *c4 = Collator::createInstance(Locale("th", "TH", ""), status); |
- if(U_FAILURE(status)){ |
- errln("Couldn't create a collator"); |
- } |
- iter = ((RuleBasedCollator*)c4)->createCollationElementIterator(source); |
- backAndForth(*iter); |
- delete iter; |
- delete c4; |
- |
- source= CharsToUnicodeString("\\u0061\\u30CF\\u3099\\u30FC"); |
- Collator *c5 = Collator::createInstance(Locale("ja", "JP", ""), status); |
- |
- iter = ((RuleBasedCollator*)c5)->createCollationElementIterator(source); |
- if(U_FAILURE(status)){ |
- errln("Couldn't create Japanese collator\n"); |
- } |
- backAndForth(*iter); |
- delete iter; |
- delete c5; |
-} |
- |
-/** |
- * Test for getOffset() and setOffset() |
- */ |
-void CollationIteratorTest::TestOffset(/* char* par */) |
-{ |
- CollationElementIterator *iter = en_us->createCollationElementIterator(test1); |
- UErrorCode status = U_ZERO_ERROR; |
- // testing boundaries |
- iter->setOffset(0, status); |
- if (U_FAILURE(status) || iter->previous(status) != CollationElementIterator::NULLORDER) { |
- errln("Error: After setting offset to 0, we should be at the end " |
- "of the backwards iteration"); |
- } |
- iter->setOffset(test1.length(), status); |
- if (U_FAILURE(status) || iter->next(status) != CollationElementIterator::NULLORDER) { |
- errln("Error: After setting offset to end of the string, we should " |
- "be at the end of the backwards iteration"); |
- } |
- |
- // Run all the way through the iterator, then get the offset |
- int32_t orderLength = 0; |
- Order *orders = getOrders(*iter, orderLength); |
- |
- int32_t offset = iter->getOffset(); |
- |
- if (offset != test1.length()) |
- { |
- UnicodeString msg1("offset at end != length: "); |
- UnicodeString msg2(" vs "); |
- |
- errln(msg1 + offset + msg2 + test1.length()); |
- } |
- |
- // Now set the offset back to the beginning and see if it works |
- CollationElementIterator *pristine = en_us->createCollationElementIterator(test1); |
- |
- iter->setOffset(0, status); |
- |
- if (U_FAILURE(status)) |
- { |
- errln("setOffset failed."); |
- } |
- else |
- { |
- assertEqual(*iter, *pristine); |
- } |
- |
- delete pristine; |
- delete[] orders; |
- delete iter; |
- |
- // setting offset in the middle of a contraction |
- UnicodeString contraction = "change"; |
- status = U_ZERO_ERROR; |
- RuleBasedCollator tailored("& a < ch", status); |
- if (U_FAILURE(status)) { |
- errln("Error: in creation of Spanish collator - %s", u_errorName(status)); |
- return; |
- } |
- iter = tailored.createCollationElementIterator(contraction); |
- Order *order = getOrders(*iter, orderLength); |
- iter->setOffset(1, status); // sets offset in the middle of ch |
- int32_t order2Length = 0; |
- Order *order2 = getOrders(*iter, order2Length); |
- if (orderLength != order2Length || uprv_memcmp(order, order2, orderLength * sizeof(Order)) != 0) { |
- errln("Error: setting offset in the middle of a contraction should be the same as setting it to the start of the contraction"); |
- } |
- delete[] order; |
- delete[] order2; |
- delete iter; |
- contraction = "peache"; |
- iter = tailored.createCollationElementIterator(contraction); |
- iter->setOffset(3, status); |
- order = getOrders(*iter, orderLength); |
- iter->setOffset(4, status); // sets offset in the middle of ch |
- order2 = getOrders(*iter, order2Length); |
- if (orderLength != order2Length || uprv_memcmp(order, order2, orderLength * sizeof(Order)) != 0) { |
- errln("Error: setting offset in the middle of a contraction should be the same as setting it to the start of the contraction"); |
- } |
- delete[] order; |
- delete[] order2; |
- delete iter; |
- // setting offset in the middle of a surrogate pair |
- UnicodeString surrogate = UNICODE_STRING_SIMPLE("\\ud800\\udc00str").unescape(); |
- iter = tailored.createCollationElementIterator(surrogate); |
- order = getOrders(*iter, orderLength); |
- iter->setOffset(1, status); // sets offset in the middle of surrogate |
- order2 = getOrders(*iter, order2Length); |
- if (orderLength != order2Length || uprv_memcmp(order, order2, orderLength * sizeof(Order)) != 0) { |
- errln("Error: setting offset in the middle of a surrogate pair should be the same as setting it to the start of the surrogate pair"); |
- } |
- delete[] order; |
- delete[] order2; |
- delete iter; |
- surrogate = UNICODE_STRING_SIMPLE("simple\\ud800\\udc00str").unescape(); |
- iter = tailored.createCollationElementIterator(surrogate); |
- iter->setOffset(6, status); |
- order = getOrders(*iter, orderLength); |
- iter->setOffset(7, status); // sets offset in the middle of surrogate |
- order2 = getOrders(*iter, order2Length); |
- if (orderLength != order2Length || uprv_memcmp(order, order2, orderLength * sizeof(Order)) != 0) { |
- errln("Error: setting offset in the middle of a surrogate pair should be the same as setting it to the start of the surrogate pair"); |
- } |
- delete[] order; |
- delete[] order2; |
- delete iter; |
- // TODO: try iterating halfway through a messy string. |
-} |
- |
-/** |
- * Test for setText() |
- */ |
-void CollationIteratorTest::TestSetText(/* char* par */) |
-{ |
- CollationElementIterator *iter1 = en_us->createCollationElementIterator(test1); |
- CollationElementIterator *iter2 = en_us->createCollationElementIterator(test2); |
- UErrorCode status = U_ZERO_ERROR; |
- |
- // Run through the second iterator just to exercise it |
- int32_t c = iter2->next(status); |
- int32_t i = 0; |
- |
- while ( ++i < 10 && c != CollationElementIterator::NULLORDER) |
- { |
- if (U_FAILURE(status)) |
- { |
- errln("iter2->next() returned an error."); |
- delete iter2; |
- delete iter1; |
- } |
- |
- c = iter2->next(status); |
- } |
- |
- // Now set it to point to the same string as the first iterator |
- iter2->setText(test1, status); |
- |
- if (U_FAILURE(status)) |
- { |
- errln("call to iter2->setText(test1) failed."); |
- } |
- else |
- { |
- assertEqual(*iter1, *iter2); |
- } |
- iter1->reset(); |
- //now use the overloaded setText(ChracterIterator&, UErrorCode) function to set the text |
- CharacterIterator* chariter = new StringCharacterIterator(test1); |
- iter2->setText(*chariter, status); |
- if (U_FAILURE(status)) |
- { |
- errln("call to iter2->setText(chariter(test1)) failed."); |
- } |
- else |
- { |
- assertEqual(*iter1, *iter2); |
- } |
- |
- // test for an empty string |
- UnicodeString empty(""); |
- iter1->setText(empty, status); |
- if (U_FAILURE(status) |
- || iter1->next(status) != (int32_t)CollationElementIterator::NULLORDER) { |
- errln("Empty string should have no CEs."); |
- } |
- ((StringCharacterIterator *)chariter)->setText(empty); |
- iter1->setText(*chariter, status); |
- if (U_FAILURE(status) |
- || iter1->next(status) != (int32_t)CollationElementIterator::NULLORDER) { |
- errln("Empty string should have no CEs."); |
- } |
- delete chariter; |
- delete iter2; |
- delete iter1; |
-} |
- |
-/** @bug 4108762 |
- * Test for getMaxExpansion() |
- */ |
-void CollationIteratorTest::TestMaxExpansion(/* char* par */) |
-{ |
- UErrorCode status = U_ZERO_ERROR; |
- UnicodeString rule("&a < ab < c/aba < d < z < ch"); |
- RuleBasedCollator *coll = new RuleBasedCollator(rule, status); |
- UChar ch = 0; |
- UnicodeString str(ch); |
- |
- CollationElementIterator *iter = coll->createCollationElementIterator(str); |
- |
- while (ch < 0xFFFF && U_SUCCESS(status)) { |
- int count = 1; |
- uint32_t order; |
- ch ++; |
- UnicodeString str(ch); |
- iter->setText(str, status); |
- order = iter->previous(status); |
- |
- /* thai management */ |
- if (CollationElementIterator::isIgnorable(order)) |
- order = iter->previous(status); |
- |
- while (U_SUCCESS(status) |
- && iter->previous(status) != (int32_t)CollationElementIterator::NULLORDER) |
- { |
- count ++; |
- } |
- |
- if (U_FAILURE(status) && iter->getMaxExpansion(order) < count) { |
- errln("Failure at codepoint %d, maximum expansion count < %d\n", |
- ch, count); |
- } |
- } |
- |
- delete iter; |
- delete coll; |
-} |
- |
-/* |
- * @bug 4157299 |
- */ |
-void CollationIteratorTest::TestClearBuffers(/* char* par */) |
-{ |
- UErrorCode status = U_ZERO_ERROR; |
- RuleBasedCollator *c = new RuleBasedCollator((UnicodeString)"&a < b < c & ab = d", status); |
- |
- if (c == NULL || U_FAILURE(status)) |
- { |
- errln("Couldn't create a RuleBasedCollator."); |
- delete c; |
- return; |
- } |
- |
- UnicodeString source("abcd"); |
- CollationElementIterator *i = c->createCollationElementIterator(source); |
- int32_t e0 = i->next(status); // save the first collation element |
- |
- if (U_FAILURE(status)) |
- { |
- errln("call to i->next() failed. err=%s", u_errorName(status)); |
- } |
- else |
- { |
- i->setOffset(3, status); // go to the expanding character |
- |
- if (U_FAILURE(status)) |
- { |
- errln("call to i->setOffset(3) failed. err=%s", u_errorName(status)); |
- } |
- else |
- { |
- i->next(status); // but only use up half of it |
- |
- if (U_FAILURE(status)) |
- { |
- errln("call to i->next() failed. err=%s", u_errorName(status)); |
- } |
- else |
- { |
- i->setOffset(0, status); // go back to the beginning |
- |
- if (U_FAILURE(status)) |
- { |
- errln("call to i->setOffset(0) failed. err=%s", u_errorName(status)); |
- } |
- else |
- { |
- int32_t e = i->next(status); // and get this one again |
- |
- if (U_FAILURE(status)) |
- { |
- errln("call to i->next() failed. err=%s", u_errorName(status)); |
- } |
- else if (e != e0) |
- { |
- errln("got 0x%X, expected 0x%X", e, e0); |
- } |
- } |
- } |
- } |
- } |
- |
- delete i; |
- delete c; |
-} |
- |
-/** |
- * Testing the assignment operator |
- */ |
-void CollationIteratorTest::TestAssignment() |
-{ |
- UErrorCode status = U_ZERO_ERROR; |
- RuleBasedCollator *coll = |
- (RuleBasedCollator *)Collator::createInstance(status); |
- |
- if (coll == NULL || U_FAILURE(status)) |
- { |
- errln("Couldn't create a default collator."); |
- return; |
- } |
- |
- UnicodeString source("abcd"); |
- CollationElementIterator *iter1 = |
- coll->createCollationElementIterator(source); |
- |
- CollationElementIterator iter2 = *iter1; |
- |
- if (*iter1 != iter2) { |
- errln("Fail collation iterator assignment does not produce the same elements"); |
- } |
- |
- CollationElementIterator iter3(*iter1); |
- |
- if (*iter1 != iter3) { |
- errln("Fail collation iterator copy constructor does not produce the same elements"); |
- } |
- |
- source = CharsToUnicodeString("a\\u0300\\u0325"); |
- coll->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status); |
- CollationElementIterator *iter4 |
- = coll->createCollationElementIterator(source); |
- CollationElementIterator iter5(*iter4); |
- if (*iter4 != iter5) { |
- errln("collation iterator assignment does not produce the same elements"); |
- } |
- iter4->next(status); |
- if (U_FAILURE(status) || *iter4 == iter5) { |
- errln("collation iterator not equal"); |
- } |
- iter5.next(status); |
- if (U_FAILURE(status) || *iter4 != iter5) { |
- errln("collation iterator equal"); |
- } |
- iter4->next(status); |
- if (U_FAILURE(status) || *iter4 == iter5) { |
- errln("collation iterator not equal"); |
- } |
- iter5.next(status); |
- if (U_FAILURE(status) || *iter4 != iter5) { |
- errln("collation iterator equal"); |
- } |
- CollationElementIterator iter6(*iter4); |
- if (*iter4 != iter6) { |
- errln("collation iterator equal"); |
- } |
- iter4->next(status); |
- if (U_FAILURE(status) || *iter4 == iter5) { |
- errln("collation iterator not equal"); |
- } |
- iter5.next(status); |
- if (U_FAILURE(status) || *iter4 != iter5) { |
- errln("collation iterator equal"); |
- } |
- iter4->next(status); |
- if (U_FAILURE(status) || *iter4 == iter5) { |
- errln("collation iterator not equal"); |
- } |
- iter5.next(status); |
- if (U_FAILURE(status) || *iter4 != iter5) { |
- errln("collation iterator equal"); |
- } |
- delete iter1; |
- delete iter4; |
- delete coll; |
-} |
- |
-/** |
- * Testing the constructors |
- */ |
-void CollationIteratorTest::TestConstructors() |
-{ |
- UErrorCode status = U_ZERO_ERROR; |
- RuleBasedCollator *coll = |
- (RuleBasedCollator *)Collator::createInstance(status); |
- if (coll == NULL || U_FAILURE(status)) |
- { |
- errln("Couldn't create a default collator."); |
- return; |
- } |
- |
- // testing protected constructor with character iterator as argument |
- StringCharacterIterator chariter(test1); |
- CollationElementIterator *iter1 = |
- coll->createCollationElementIterator(chariter); |
- if (U_FAILURE(status)) { |
- errln("Couldn't create collation element iterator with character iterator."); |
- return; |
- } |
- CollationElementIterator *iter2 = |
- coll->createCollationElementIterator(test1); |
- |
- // initially the 2 collation element iterators should be the same |
- if (*iter1 != *iter1 || *iter2 != *iter2 || *iter1 != *iter2 |
- || *iter2 != *iter1) { |
- errln("CollationElementIterators constructed with the same string data should be the same at the start"); |
- } |
- assertEqual(*iter1, *iter2); |
- |
- delete iter1; |
- delete iter2; |
- |
- // tests empty strings |
- UnicodeString empty(""); |
- iter1 = coll->createCollationElementIterator(empty); |
- chariter.setText(empty); |
- iter2 = coll->createCollationElementIterator(chariter); |
- if (*iter1 != *iter1 || *iter2 != *iter2 || *iter1 != *iter2 |
- || *iter2 != *iter1) { |
- errln("CollationElementIterators constructed with the same string data should be the same at the start"); |
- } |
- if (iter1->next(status) != (int32_t)CollationElementIterator::NULLORDER) { |
- errln("Empty string should have no CEs."); |
- } |
- if (iter2->next(status) != (int32_t)CollationElementIterator::NULLORDER) { |
- errln("Empty string should have no CEs."); |
- } |
- delete iter1; |
- delete iter2; |
- delete coll; |
-} |
- |
-/** |
- * Testing the strength order |
- */ |
-void CollationIteratorTest::TestStrengthOrder() |
-{ |
- int order = 0x0123ABCD; |
- |
- UErrorCode status = U_ZERO_ERROR; |
- RuleBasedCollator *coll = |
- (RuleBasedCollator *)Collator::createInstance(status); |
- if (coll == NULL || U_FAILURE(status)) |
- { |
- errln("Couldn't create a default collator."); |
- return; |
- } |
- |
- coll->setStrength(Collator::PRIMARY); |
- CollationElementIterator *iter = |
- coll->createCollationElementIterator(test1); |
- |
- if (iter == NULL) { |
- errln("Couldn't create a collation element iterator from default collator"); |
- return; |
- } |
- |
- if (iter->strengthOrder(order) != 0x01230000) { |
- errln("Strength order for a primary strength collator should be the first 2 bytes"); |
- return; |
- } |
- |
- coll->setStrength(Collator::SECONDARY); |
- if (iter->strengthOrder(order) != 0x0123AB00) { |
- errln("Strength order for a secondary strength collator should be the third byte"); |
- return; |
- } |
- |
- coll->setStrength(Collator::TERTIARY); |
- if (iter->strengthOrder(order) != order) { |
- errln("Strength order for a tertiary strength collator should be the third byte"); |
- return; |
- } |
- delete iter; |
- delete coll; |
-} |
- |
-/** |
- * Return a string containing all of the collation orders |
- * returned by calls to next on the specified iterator |
- */ |
-UnicodeString &CollationIteratorTest::orderString(CollationElementIterator &iter, UnicodeString &target) |
-{ |
- int32_t order; |
- UErrorCode status = U_ZERO_ERROR; |
- |
- while ((order = iter.next(status)) != CollationElementIterator::NULLORDER) |
- { |
- target += "0x"; |
- appendHex(order, 8, target); |
- target += " "; |
- } |
- |
- return target; |
-} |
- |
-void CollationIteratorTest::assertEqual(CollationElementIterator &i1, CollationElementIterator &i2) |
-{ |
- int32_t c1, c2, count = 0; |
- UErrorCode status = U_ZERO_ERROR; |
- |
- do |
- { |
- c1 = i1.next(status); |
- c2 = i2.next(status); |
- |
- if (c1 != c2) |
- { |
- errln(" %d: strength(0x%X) != strength(0x%X)", count, c1, c2); |
- break; |
- } |
- |
- count += 1; |
- } |
- while (c1 != CollationElementIterator::NULLORDER); |
-} |
- |
-void CollationIteratorTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/) |
-{ |
- if (exec) |
- { |
- logln("Collation Iteration Tests: "); |
- } |
- |
- if(en_us) { |
- switch (index) |
- { |
- case 0: name = "TestPrevious"; if (exec) TestPrevious(/* par */); break; |
- case 1: name = "TestOffset"; if (exec) TestOffset(/* par */); break; |
- case 2: name = "TestSetText"; if (exec) TestSetText(/* par */); break; |
- case 3: name = "TestMaxExpansion"; if (exec) TestMaxExpansion(/* par */); break; |
- case 4: name = "TestClearBuffers"; if (exec) TestClearBuffers(/* par */); break; |
- case 5: name = "TestUnicodeChar"; if (exec) TestUnicodeChar(/* par */); break; |
- case 6: name = "TestAssignment"; if (exec) TestAssignment(/* par */); break; |
- case 7: name = "TestConstructors"; if (exec) TestConstructors(/* par */); break; |
- case 8: name = "TestStrengthOrder"; if (exec) TestStrengthOrder(/* par */); break; |
- default: name = ""; break; |
- } |
- } else { |
- dataerrln("Class iterator not instantiated"); |
- name = ""; |
- } |
-} |
- |
-#endif /* #if !UCONFIG_NO_COLLATION */ |