| Index: source/test/intltest/usettest.cpp
|
| diff --git a/source/test/intltest/usettest.cpp b/source/test/intltest/usettest.cpp
|
| index 3f1713d357ba783cb65e77c365a1bcb20dcc3133..f715c5bffb36734fd386f3f3f07dee5d66c8be20 100644
|
| --- a/source/test/intltest/usettest.cpp
|
| +++ b/source/test/intltest/usettest.cpp
|
| @@ -1,6 +1,6 @@
|
| /*
|
| ********************************************************************************
|
| -* Copyright (C) 1999-2014 International Business Machines Corporation and
|
| +* Copyright (C) 1999-2015 International Business Machines Corporation and
|
| * others. All Rights Reserved.
|
| ********************************************************************************
|
| * Date Name Description
|
| @@ -90,6 +90,7 @@ UnicodeSetTest::runIndexedTest(int32_t index, UBool exec,
|
| CASE(21,TestFreezable);
|
| CASE(22,TestSpan);
|
| CASE(23,TestStringSpan);
|
| + CASE(24,TestUCAUnsafeBackwards);
|
| default: name = ""; break;
|
| }
|
| }
|
| @@ -1714,6 +1715,12 @@ void UnicodeSetTest::TestSurrogate() {
|
| errln((UnicodeString)"FAIL: " + UnicodeString(DATA[i], -1, US_INV) + ".size() == " +
|
| set.size() + ", expected 4");
|
| }
|
| +
|
| + {
|
| + UErrorCode subErr = U_ZERO_ERROR;
|
| + checkRoundTrip(set);
|
| + checkSerializeRoundTrip(set, subErr);
|
| + }
|
| }
|
| }
|
|
|
| @@ -1730,8 +1737,12 @@ void UnicodeSetTest::TestExhaustive() {
|
| logln((UnicodeString)"Testing " + i + ", " + x);
|
| _testComplement(i, x, y);
|
|
|
| + UnicodeSet &toTest = bitsToSet(i, aa);
|
| +
|
| // AS LONG AS WE ARE HERE, check roundtrip
|
| - checkRoundTrip(bitsToSet(i, aa));
|
| + checkRoundTrip(toTest);
|
| + UErrorCode ec = U_ZERO_ERROR;
|
| + checkSerializeRoundTrip(toTest, ec);
|
|
|
| for (int32_t j = 0; j < limit; ++j) {
|
| _testAdd(i,j, x,y,z);
|
| @@ -1890,39 +1901,80 @@ UnicodeString UnicodeSetTest::getPairs(const UnicodeSet& set) {
|
| * get the same thing back
|
| */
|
| void UnicodeSetTest::checkRoundTrip(const UnicodeSet& s) {
|
| - UErrorCode ec = U_ZERO_ERROR;
|
| + {
|
| + UnicodeSet t(s);
|
| + checkEqual(s, t, "copy ct");
|
| + }
|
|
|
| - UnicodeSet t(s);
|
| - checkEqual(s, t, "copy ct");
|
| + {
|
| + UnicodeSet t(0xabcd, 0xdef0); // dummy contents should be overwritten
|
| + t = s;
|
| + checkEqual(s, t, "operator=");
|
| + }
|
|
|
| - t = s;
|
| - checkEqual(s, t, "operator=");
|
| + {
|
| + UnicodeSet t;
|
| + copyWithIterator(t, s, FALSE);
|
| + checkEqual(s, t, "iterator roundtrip");
|
| + }
|
|
|
| - copyWithIterator(t, s, FALSE);
|
| - checkEqual(s, t, "iterator roundtrip");
|
| + {
|
| + UnicodeSet t;
|
| + copyWithIterator(t, s, TRUE); // try range
|
| + checkEqual(s, t, "iterator roundtrip");
|
| + }
|
|
|
| - copyWithIterator(t, s, TRUE); // try range
|
| - checkEqual(s, t, "iterator roundtrip");
|
| -
|
| - UnicodeString pat; s.toPattern(pat, FALSE);
|
| - t.applyPattern(pat, ec);
|
| - if (U_FAILURE(ec)) {
|
| - errln("FAIL: applyPattern");
|
| - return;
|
| - } else {
|
| - checkEqual(s, t, "toPattern(false)");
|
| + {
|
| + UnicodeSet t;
|
| + UnicodeString pat;
|
| + UErrorCode ec = U_ZERO_ERROR;
|
| + s.toPattern(pat, FALSE);
|
| + t.applyPattern(pat, ec);
|
| + if (U_FAILURE(ec)) {
|
| + errln("FAIL: toPattern(escapeUnprintable=FALSE), applyPattern - %s", u_errorName(ec));
|
| + return;
|
| + } else {
|
| + checkEqual(s, t, "toPattern(false)");
|
| + }
|
| }
|
| -
|
| - s.toPattern(pat, TRUE);
|
| - t.applyPattern(pat, ec);
|
| - if (U_FAILURE(ec)) {
|
| - errln("FAIL: applyPattern");
|
| - return;
|
| - } else {
|
| - checkEqual(s, t, "toPattern(true)");
|
| +
|
| + {
|
| + UnicodeSet t;
|
| + UnicodeString pat;
|
| + UErrorCode ec = U_ZERO_ERROR;
|
| + s.toPattern(pat, TRUE);
|
| + t.applyPattern(pat, ec);
|
| + if (U_FAILURE(ec)) {
|
| + errln("FAIL: toPattern(escapeUnprintable=TRUE), applyPattern - %s", u_errorName(ec));
|
| + return;
|
| + } else {
|
| + checkEqual(s, t, "toPattern(true)");
|
| + }
|
| }
|
| }
|
| -
|
| +
|
| +void UnicodeSetTest::checkSerializeRoundTrip(const UnicodeSet& t, UErrorCode &status) {
|
| + if(U_FAILURE(status)) return;
|
| + int32_t len = t.serialize(serializeBuffer.getAlias(), serializeBuffer.getCapacity(), status);
|
| + if(status == U_BUFFER_OVERFLOW_ERROR) {
|
| + status = U_ZERO_ERROR;
|
| + serializeBuffer.resize(len);
|
| + len = t.serialize(serializeBuffer.getAlias(), serializeBuffer.getCapacity(), status);
|
| + // let 2nd error stand
|
| + }
|
| + if(U_FAILURE(status)) {
|
| + errln("checkSerializeRoundTrip: error %s serializing buffer\n", u_errorName(status));
|
| + return;
|
| + }
|
| + UnicodeSet deserialized(serializeBuffer.getAlias(), len, UnicodeSet::kSerialized, status);
|
| + if(U_FAILURE(status)) {
|
| + errln("checkSerializeRoundTrip: error %s deserializing buffer: buf %p len %d, original %d\n", u_errorName(status), serializeBuffer.getAlias(), len, t.getRangeCount());
|
| + return;
|
| + }
|
| +
|
| + checkEqual(t, deserialized, "Set was unequal when deserialized");
|
| +}
|
| +
|
| void UnicodeSetTest::copyWithIterator(UnicodeSet& t, const UnicodeSet& s, UBool withRange) {
|
| t.clear();
|
| UnicodeSetIterator it(s);
|
| @@ -1946,6 +1998,8 @@ void UnicodeSetTest::copyWithIterator(UnicodeSet& t, const UnicodeSet& s, UBool
|
| }
|
|
|
| UBool UnicodeSetTest::checkEqual(const UnicodeSet& s, const UnicodeSet& t, const char* message) {
|
| + assertEquals(UnicodeString("RangeCount: ","") + message, s.getRangeCount(), t.getRangeCount());
|
| + assertEquals(UnicodeString("size: ","") + message, s.size(), t.size());
|
| UnicodeString source; s.toPattern(source, TRUE);
|
| UnicodeString result; t.toPattern(result, TRUE);
|
| if (s != t) {
|
| @@ -3812,3 +3866,59 @@ void UnicodeSetTest::TestStringSpan() {
|
| errln("FAIL: UnicodeSet(%s).spanBack(while longest match) returns the wrong value", pattern);
|
| }
|
| }
|
| +
|
| +/**
|
| + * Including collationroot.h fails here with
|
| +1>c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\driverspecs.h(142): error C2008: '$' : unexpected in macro definition
|
| + * .. so, we skip this test on Windows.
|
| + *
|
| + * the cause is that intltest builds with /Za which disables language extensions - which means
|
| + * windows header files can't be used.
|
| + */
|
| +#if !UCONFIG_NO_COLLATION && !U_PLATFORM_HAS_WIN32_API
|
| +#include "collationroot.h"
|
| +#include "collationtailoring.h"
|
| +#endif
|
| +
|
| +void UnicodeSetTest::TestUCAUnsafeBackwards() {
|
| +#if U_PLATFORM_HAS_WIN32_API
|
| + infoln("Skipping TestUCAUnsafeBackwards() - can't include collationroot.h on Windows without language extensions!");
|
| +#elif !UCONFIG_NO_COLLATION
|
| + UErrorCode errorCode = U_ZERO_ERROR;
|
| +
|
| + // Get the unsafeBackwardsSet
|
| + const CollationCacheEntry *rootEntry = CollationRoot::getRootCacheEntry(errorCode);
|
| + if(U_FAILURE(errorCode)) {
|
| + dataerrln("FAIL: %s getting root cache entry", u_errorName(errorCode));
|
| + return;
|
| + }
|
| + //const UVersionInfo &version = rootEntry->tailoring->version;
|
| + const UnicodeSet *unsafeBackwardSet = rootEntry->tailoring->unsafeBackwardSet;
|
| +
|
| + checkSerializeRoundTrip(*unsafeBackwardSet, errorCode);
|
| +
|
| + if(!logKnownIssue("11891","UnicodeSet fails to round trip on CollationRoot...unsafeBackwards set")) {
|
| + // simple test case
|
| + // TODO(ticket #11891): Simplify this test function to this simple case. Rename it appropriately.
|
| + // TODO(ticket #11891): Port test to Java. Is this a bug there, too?
|
| + UnicodeSet surrogates;
|
| + surrogates.add(0xd83a); // a lead surrogate
|
| + surrogates.add(0xdc00, 0xdfff); // a range of trail surrogates
|
| + UnicodeString pat;
|
| + surrogates.toPattern(pat, FALSE); // bad: [ 0xd83a, 0xdc00, 0x2d, 0xdfff ]
|
| + // TODO: Probably fix either UnicodeSet::_generatePattern() or _appendToPat()
|
| + // so that at least one type of surrogate code points are escaped,
|
| + // or (minimally) so that adjacent lead+trail surrogate code points are escaped.
|
| + errorCode = U_ZERO_ERROR;
|
| + UnicodeSet s2;
|
| + s2.applyPattern(pat, errorCode); // looks like invalid range [ 0x1e800, 0x2d, 0xdfff ]
|
| + if(U_FAILURE(errorCode)) {
|
| + errln("FAIL: surrogates to/from pattern - %s", u_errorName(errorCode));
|
| + } else {
|
| + checkEqual(surrogates, s2, "surrogates to/from pattern");
|
| + }
|
| + // This occurs in the UCA unsafe-backwards set.
|
| + checkRoundTrip(*unsafeBackwardSet);
|
| + }
|
| +#endif
|
| +}
|
|
|