1b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* 2b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho******************************************************************************* 3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* Copyright (C) 2010-2011, International Business Machines 4b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* Corporation and others. All Rights Reserved. 5b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho******************************************************************************* 6b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* file name: ucharstrietest.cpp 7b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* encoding: US-ASCII 8b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* tab size: 8 (not used) 9b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* indentation:4 10b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* 11b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* created on: 2010nov16 12b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* created by: Markus W. Scherer 13b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*/ 14b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 15b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include <string.h> 16b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 17b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/utypes.h" 18b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/appendable.h" 19b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/localpointer.h" 20b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/ucharstrie.h" 21b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/ucharstriebuilder.h" 22b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/uniset.h" 23b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/unistr.h" 24b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "intltest.h" 25b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 26b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) 27b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 28b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostruct StringAndValue { 29b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const char *s; 30b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t value; 31b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}; 32b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 33b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoclass UCharsTrieTest : public IntlTest { 34b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehopublic: 35b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCharsTrieTest(); 36b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho virtual ~UCharsTrieTest(); 37b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 38b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=NULL); 39b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestBuilder(); 40b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestEmpty(); 41b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void Test_a(); 42b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void Test_a_ab(); 43b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestShortestBranch(); 44b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestBranches(); 45b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestLongSequence(); 46b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestLongBranch(); 47b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestValuesForState(); 48b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestCompact(); 49b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestFirstForCodePoint(); 50b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestNextForCodePoint(); 51b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 52b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCharsTrie *buildLargeTrie(int32_t numUniqueFirst); 53b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestLargeTrie(); 54b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 55b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCharsTrie *buildMonthsTrie(UStringTrieBuildOption buildOption); 56b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestHasUniqueValue(); 57b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestGetNextUChars(); 58b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestIteratorFromBranch(); 59b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestIteratorFromLinearMatch(); 60b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestTruncatingIteratorFromRoot(); 61b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestTruncatingIteratorFromLinearMatchShort(); 62b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestTruncatingIteratorFromLinearMatchLong(); 63b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void TestIteratorFromUChars(); 64b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 65b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void checkData(const StringAndValue data[], int32_t dataLength); 66b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void checkData(const StringAndValue data[], int32_t dataLength, UStringTrieBuildOption buildOption); 67b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCharsTrie *buildTrie(const StringAndValue data[], int32_t dataLength, 68b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UStringTrieBuildOption buildOption); 69b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void checkFirst(UCharsTrie &trie, const StringAndValue data[], int32_t dataLength); 70b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void checkNext(UCharsTrie &trie, const StringAndValue data[], int32_t dataLength); 71b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void checkNextWithState(UCharsTrie &trie, const StringAndValue data[], int32_t dataLength); 72b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void checkNextString(UCharsTrie &trie, const StringAndValue data[], int32_t dataLength); 73b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void checkIterator(UCharsTrie &trie, const StringAndValue data[], int32_t dataLength); 74b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void checkIterator(UCharsTrie::Iterator &iter, const StringAndValue data[], int32_t dataLength); 75b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 76b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoprivate: 77b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCharsTrieBuilder *builder_; 78b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}; 79b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 80b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoextern IntlTest *createUCharsTrieTest() { 81b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return new UCharsTrieTest(); 82b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 83b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 84b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUCharsTrieTest::UCharsTrieTest() : builder_(NULL) { 85b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IcuTestErrorCode errorCode(*this, "UCharsTrieTest()"); 86b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho builder_=new UCharsTrieBuilder(errorCode); 87b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 88b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 89b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUCharsTrieTest::~UCharsTrieTest() { 90b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete builder_; 91b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 92b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 93b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char * /*par*/) { 94b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(exec) { 95b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho logln("TestSuite UCharsTrieTest: "); 96b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 97b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO_BEGIN; 98b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestBuilder); 99b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestEmpty); 100b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(Test_a); 101b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(Test_a_ab); 102b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestShortestBranch); 103b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestBranches); 104b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestLongSequence); 105b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestLongBranch); 106b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestValuesForState); 107b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestCompact); 108b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestFirstForCodePoint); 109b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestNextForCodePoint); 110b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestLargeTrie); 111b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestHasUniqueValue); 112b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestGetNextUChars); 113b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestIteratorFromBranch); 114b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestIteratorFromLinearMatch); 115b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestTruncatingIteratorFromRoot); 116b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestTruncatingIteratorFromLinearMatchShort); 117b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestTruncatingIteratorFromLinearMatchLong); 118b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO(TestIteratorFromUChars); 119b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE_AUTO_END; 120b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 121b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 122b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestBuilder() { 123b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IcuTestErrorCode errorCode(*this, "TestBuilder()"); 124b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete builder_->build(USTRINGTRIE_BUILD_FAST, errorCode); 125b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(errorCode.reset()!=U_INDEX_OUTOFBOUNDS_ERROR) { 126b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("UCharsTrieBuilder().build() did not set U_INDEX_OUTOFBOUNDS_ERROR"); 127b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 128b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 129b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // TODO: remove .build(...) once add() checks for duplicates. 130b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho builder_->add("=", 0, errorCode).add("=", 1, errorCode).build(USTRINGTRIE_BUILD_FAST, errorCode); 131b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(errorCode.reset()!=U_ILLEGAL_ARGUMENT_ERROR) { 132b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("UCharsTrieBuilder.add() did not detect duplicates"); 133b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 134b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 135b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 136b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 137b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestEmpty() { 138b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue data[]={ 139b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "", 0 } 140b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 141b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkData(data, LENGTHOF(data)); 142b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 143b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 144b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::Test_a() { 145b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue data[]={ 146b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "a", 1 } 147b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 148b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkData(data, LENGTHOF(data)); 149b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 150b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 151b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::Test_a_ab() { 152b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue data[]={ 153b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "a", 1 }, 154b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "ab", 100 } 155b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 156b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkData(data, LENGTHOF(data)); 157b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 158b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 159b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestShortestBranch() { 160b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue data[]={ 161b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "a", 1000 }, 162b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "b", 2000 } 163b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 164b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkData(data, LENGTHOF(data)); 165b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 166b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 167b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestBranches() { 168b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue data[]={ 169b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "a", 0x10 }, 170b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "cc", 0x40 }, 171b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "e", 0x100 }, 172b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "ggg", 0x400 }, 173b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "i", 0x1000 }, 174b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "kkkk", 0x4000 }, 175b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "n", 0x10000 }, 176b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "ppppp", 0x40000 }, 177b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "r", 0x100000 }, 178b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "sss", 0x200000 }, 179b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "t", 0x400000 }, 180b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "uu", 0x800000 }, 181b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "vv", 0x7fffffff }, 182b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "zz", 0x80000000 } 183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for(int32_t length=2; length<=LENGTHOF(data); ++length) { 185b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho infoln("TestBranches length=%d", (int)length); 186b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkData(data, length); 187b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 188b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 189b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 190b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestLongSequence() { 191b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue data[]={ 192b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "a", -1 }, 193b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // sequence of linear-match nodes 194b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", -2 }, 195b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // more than 256 units 196b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 197b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 199b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 200b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 201b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", -3 } 202b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 203b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkData(data, LENGTHOF(data)); 204b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 205b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 206b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestLongBranch() { 207b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Split-branch and interesting compact-integer values. 208b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue data[]={ 209b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "a", -2 }, 210b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "b", -1 }, 211b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "c", 0 }, 212b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "d2", 1 }, 213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "f", 0x3f }, 214b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "g", 0x40 }, 215b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "h", 0x41 }, 216b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "j23", 0x1900 }, 217b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "j24", 0x19ff }, 218b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "j25", 0x1a00 }, 219b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "k2", 0x1a80 }, 220b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "k3", 0x1aff }, 221b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "l234567890", 0x1b00 }, 222b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "l234567890123", 0x1b01 }, 223b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn", 0x10ffff }, 224b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "oooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0x110000 }, 225b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "pppppppppppppppppppppppppppppppppppppppppppppppppppppp", 0x120000 }, 226b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "r", 0x333333 }, 227b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "s2345", 0x4444444 }, 228b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "t234567890", 0x77777777 }, 229b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "z", 0x80000001 } 230b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 231b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkData(data, LENGTHOF(data)); 232b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 233b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 234b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestValuesForState() { 235b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Check that saveState() and resetToState() interact properly 236b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // with next() and current(). 237b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue data[]={ 238b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "a", -1 }, 239b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "ab", -2 }, 240b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "abc", -3 }, 241b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "abcd", -4 }, 242b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "abcde", -5 }, 243b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "abcdef", -6 } 244b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 245b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkData(data, LENGTHOF(data)); 246b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 247b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 248b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestCompact() { 249b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Duplicate trailing strings and values provide opportunities for compacting. 250b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue data[]={ 251b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "+", 0 }, 252b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "+august", 8 }, 253b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "+december", 12 }, 254b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "+july", 7 }, 255b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "+june", 6 }, 256b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "+november", 11 }, 257b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "+october", 10 }, 258b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "+september", 9 }, 259b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "-", 0 }, 260b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "-august", 8 }, 261b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "-december", 12 }, 262b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "-july", 7 }, 263b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "-june", 6 }, 264b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "-november", 11 }, 265b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "-october", 10 }, 266b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "-september", 9 }, 267b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // The l+n branch (with its sub-nodes) is a duplicate but will be written 268b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // both times because each time it follows a different linear-match node. 269b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "xjuly", 7 }, 270b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "xjune", 6 } 271b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 272b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkData(data, LENGTHOF(data)); 273b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 274b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 275b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestFirstForCodePoint() { 276b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue data[]={ 277b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "a", 1 }, 278b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "a\\ud800", 2 }, 279b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "a\\U00010000", 3 }, 280b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "\\ud840", 4 }, 281b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "\\U00020000\\udbff", 5 }, 282b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "\\U00020000\\U0010ffff", 6 }, 283b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "\\U00020000\\U0010ffffz", 7 }, 284b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "\\U00050000xy", 8 }, 285b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "\\U00050000xyz", 9 } 286b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 287b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkData(data, LENGTHOF(data)); 288b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 289b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 290b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestNextForCodePoint() { 291b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue data[]={ 292b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "\\u4dff\\U00010000\\u9999\\U00020000\\udfff\\U0010ffff", 2000000000 }, 293b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "\\u4dff\\U00010000\\u9999\\U00020002", 44444 }, 294b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "\\u4dff\\U000103ff", 99999 } 295b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 296b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho LocalPointer<UCharsTrie> trie(buildTrie(data, LENGTHOF(data), USTRINGTRIE_BUILD_FAST)); 297b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(trie.isNull()) { 298b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; // buildTrie() reported an error 299b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 300b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UStringTrieResult result; 301b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if( (result=trie->nextForCodePoint(0x4dff))!=USTRINGTRIE_NO_VALUE || result!=trie->current() || 302b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (result=trie->nextForCodePoint(0x10000))!=USTRINGTRIE_NO_VALUE || result!=trie->current() || 303b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (result=trie->nextForCodePoint(0x9999))!=USTRINGTRIE_NO_VALUE || result!=trie->current() || 304b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (result=trie->nextForCodePoint(0x20000))!=USTRINGTRIE_NO_VALUE || result!=trie->current() || 305b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (result=trie->nextForCodePoint(0xdfff))!=USTRINGTRIE_NO_VALUE || result!=trie->current() || 306b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (result=trie->nextForCodePoint(0x10ffff))!=USTRINGTRIE_FINAL_VALUE || result!=trie->current() || 307b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->getValue()!=2000000000 308b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ) { 309b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("UCharsTrie.nextForCodePoint() fails for %s", data[0].s); 310b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 311b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if( (result=trie->firstForCodePoint(0x4dff))!=USTRINGTRIE_NO_VALUE || result!=trie->current() || 312b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (result=trie->nextForCodePoint(0x10000))!=USTRINGTRIE_NO_VALUE || result!=trie->current() || 313b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (result=trie->nextForCodePoint(0x9999))!=USTRINGTRIE_NO_VALUE || result!=trie->current() || 314b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (result=trie->nextForCodePoint(0x20002))!=USTRINGTRIE_FINAL_VALUE || result!=trie->current() || 315b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->getValue()!=44444 316b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ) { 317b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("UCharsTrie.nextForCodePoint() fails for %s", data[1].s); 318b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 319b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if( (result=trie->reset().nextForCodePoint(0x4dff))!=USTRINGTRIE_NO_VALUE || result!=trie->current() || 320b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (result=trie->nextForCodePoint(0x10000))!=USTRINGTRIE_NO_VALUE || result!=trie->current() || 321b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (result=trie->nextForCodePoint(0x9999))!=USTRINGTRIE_NO_VALUE || result!=trie->current() || 322b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (result=trie->nextForCodePoint(0x20222))!=USTRINGTRIE_NO_MATCH || result!=trie->current() // no match for trail surrogate 323b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ) { 324b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("UCharsTrie.nextForCodePoint() fails for \\u4dff\\U00010000\\u9999\\U00020222"); 325b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 326b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if( (result=trie->reset().nextForCodePoint(0x4dff))!=USTRINGTRIE_NO_VALUE || result!=trie->current() || 327b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (result=trie->nextForCodePoint(0x103ff))!=USTRINGTRIE_FINAL_VALUE || result!=trie->current() || 328b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->getValue()!=99999 329b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ) { 330b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("UCharsTrie.nextForCodePoint() fails for %s", data[2].s); 331b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 332b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 333b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 334b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// Definitions in the anonymous namespace are invisible outside this file. 335b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehonamespace { 336b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 337b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// Generate (string, value) pairs. 338b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// The first string (before next()) will be empty. 339b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoclass Generator { 340b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehopublic: 341b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho Generator() : value(4711), num(0) {} 342b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho void next() { 343b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar c; 344b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho s.truncate(0); 345b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho s.append(c=(UChar)(value>>16)); 346b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho s.append((UChar)(value>>4)); 347b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(value&1) { 348b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho s.append((UChar)value); 349b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 350b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho set.add(c); 351b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho value+=((value>>5)&0x7ff)*3+1; 352b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ++num; 353b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 354b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UnicodeString &getString() const { return s; } 355b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t getValue() const { return value; } 356b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t countUniqueFirstChars() const { return set.size(); } 357b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t getIndex() const { return num; } 358b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 359b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoprivate: 360b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString s; 361b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeSet set; 362b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t value; 363b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t num; 364b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}; 365b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 366b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} // end namespace 367b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 368b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUCharsTrie *UCharsTrieTest::buildLargeTrie(int32_t numUniqueFirst) { 369b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IcuTestErrorCode errorCode(*this, "buildLargeTrie()"); 370b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho Generator gen; 371b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho builder_->clear(); 372b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho while(gen.countUniqueFirstChars()<numUniqueFirst) { 373b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho builder_->add(gen.getString(), gen.getValue(), errorCode); 374b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho gen.next(); 375b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 376b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho infoln("buildLargeTrie(%ld) added %ld strings", (long)numUniqueFirst, (long)gen.getIndex()); 377b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString trieUChars; 378b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho builder_->buildUnicodeString(USTRINGTRIE_BUILD_FAST, trieUChars, errorCode); 379b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho logln("serialized trie size: %ld UChars\n", (long)trieUChars.length()); 380b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return new UCharsTrie(trieUChars.getBuffer()); 381b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 382b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 383b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// Exercise a large branch node. 384b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestLargeTrie() { 385b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho LocalPointer<UCharsTrie> trie(buildLargeTrie(1111)); 386b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(trie.isNull()) { 387b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; // buildTrie() reported an error 388b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 389b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho Generator gen; 390b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho while(gen.countUniqueFirstChars()<1111) { 391b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString x(gen.getString()); 392b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t value=gen.getValue(); 393b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(!x.isEmpty()) { 394b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(trie->first(x[0])==USTRINGTRIE_NO_MATCH) { 395b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("first(first char U+%04X)=USTRINGTRIE_NO_MATCH for string %ld\n", 396b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho x[0], (long)gen.getIndex()); 397b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 398b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 399b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho x.remove(0, 1); 400b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 401b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UStringTrieResult result=trie->next(x.getBuffer(), x.length()); 402b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(!USTRINGTRIE_HAS_VALUE(result) || result!=trie->current() || value!=trie->getValue()) { 403b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("next(%d chars U+%04X U+%04X)!=hasValue or " 404b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "next()!=current() or getValue() wrong " 405b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "for string %ld\n", (int)x.length(), x[0], x[1], (long)gen.getIndex()); 406b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 407b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 408b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho gen.next(); 409b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 410b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 411b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 412b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoenum { 413b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho u_a=0x61, 414b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho u_b=0x62, 415b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho u_c=0x63, 416b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho u_j=0x6a, 417b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho u_n=0x6e, 418b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho u_r=0x72, 419b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho u_u=0x75, 420b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho u_y=0x79 421b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}; 422b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 423b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUCharsTrie *UCharsTrieTest::buildMonthsTrie(UStringTrieBuildOption buildOption) { 424b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // All types of nodes leading to the same value, 425b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // for code coverage of recursive functions. 426b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // In particular, we need a lot of branches on some single level 427b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // to exercise a split-branch node. 428b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue data[]={ 429b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "august", 8 }, 430b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jan", 1 }, 431b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jan.", 1 }, 432b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jana", 1 }, 433b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janbb", 1 }, 434b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janc", 1 }, 435b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janddd", 1 }, 436b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janee", 1 }, 437b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janef", 1 }, 438b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janf", 1 }, 439b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jangg", 1 }, 440b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janh", 1 }, 441b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janiiii", 1 }, 442b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janj", 1 }, 443b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jankk", 1 }, 444b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jankl", 1 }, 445b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jankmm", 1 }, 446b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janl", 1 }, 447b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janm", 1 }, 448b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jannnnnnnnnnnnnnnnnnnnnnnnnnnnn", 1 }, 449b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jano", 1 }, 450b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janpp", 1 }, 451b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janqqq", 1 }, 452b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janr", 1 }, 453b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "januar", 1 }, 454b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "january", 1 }, 455b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "july", 7 }, 456b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jun", 6 }, 457b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jun.", 6 }, 458b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "june", 6 } 459b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 460b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return buildTrie(data, LENGTHOF(data), buildOption); 461b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 462b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 463b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestHasUniqueValue() { 464b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho LocalPointer<UCharsTrie> trie(buildMonthsTrie(USTRINGTRIE_BUILD_FAST)); 465b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(trie.isNull()) { 466b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; // buildTrie() reported an error 467b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 468b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t uniqueValue; 469b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(trie->hasUniqueValue(uniqueValue)) { 470b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("unique value at root"); 471b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 472b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_j); 473b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_a); 474b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_n); 475b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // hasUniqueValue() directly after next() 476b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(!trie->hasUniqueValue(uniqueValue) || uniqueValue!=1) { 477b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("not unique value 1 after \"jan\""); 478b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 479b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->first(u_j); 480b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_u); 481b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(trie->hasUniqueValue(uniqueValue)) { 482b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("unique value after \"ju\""); 483b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 484b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(trie->next(u_n)!=USTRINGTRIE_INTERMEDIATE_VALUE || 6!=trie->getValue()) { 485b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("not normal value 6 after \"jun\""); 486b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 487b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // hasUniqueValue() after getValue() 488b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(!trie->hasUniqueValue(uniqueValue) || uniqueValue!=6) { 489b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("not unique value 6 after \"jun\""); 490b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 491b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // hasUniqueValue() from within a linear-match node 492b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->first(u_a); 493b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_u); 494b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(!trie->hasUniqueValue(uniqueValue) || uniqueValue!=8) { 495b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("not unique value 8 after \"au\""); 496b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 497b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 498b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 499b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestGetNextUChars() { 500b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho LocalPointer<UCharsTrie> trie(buildMonthsTrie(USTRINGTRIE_BUILD_SMALL)); 501b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(trie.isNull()) { 502b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; // buildTrie() reported an error 503b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 504b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString buffer; 505b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeStringAppendable app(buffer); 506b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t count=trie->getNextUChars(app); 507b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(count!=2 || buffer.length()!=2 || buffer[0]!=u_a || buffer[1]!=u_j) { 508b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("months getNextUChars()!=[aj] at root"); 509b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 510b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_j); 511b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_a); 512b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_n); 513b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // getNextUChars() directly after next() 514b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho buffer.remove(); 515b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho count=trie->getNextUChars(app); 516b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(count!=20 || buffer!=UNICODE_STRING_SIMPLE(".abcdefghijklmnopqru")) { 517b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("months getNextUChars()!=[.abcdefghijklmnopqru] after \"jan\""); 518b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 519b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // getNextUChars() after getValue() 520b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->getValue(); // next() had returned USTRINGTRIE_INTERMEDIATE_VALUE. 521b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho buffer.remove(); 522b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho count=trie->getNextUChars(app); 523b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(count!=20 || buffer!=UNICODE_STRING_SIMPLE(".abcdefghijklmnopqru")) { 524b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("months getNextUChars()!=[.abcdefghijklmnopqru] after \"jan\"+getValue()"); 525b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 526b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // getNextUChars() from a linear-match node 527b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_u); 528b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho buffer.remove(); 529b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho count=trie->getNextUChars(app); 530b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(count!=1 || buffer.length()!=1 || buffer[0]!=u_a) { 531b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("months getNextUChars()!=[a] after \"janu\""); 532b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 533b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_a); 534b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho buffer.remove(); 535b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho count=trie->getNextUChars(app); 536b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(count!=1 || buffer.length()!=1 || buffer[0]!=u_r) { 537b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("months getNextUChars()!=[r] after \"janua\""); 538b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 539b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_r); 540b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_y); 541b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // getNextUChars() after a final match 542b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho buffer.remove(); 543b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho count=trie->getNextUChars(app); 544b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(count!=0 || buffer.length()!=0) { 545b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("months getNextUChars()!=[] after \"january\""); 546b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 547b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 548b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 549b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestIteratorFromBranch() { 550b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho LocalPointer<UCharsTrie> trie(buildMonthsTrie(USTRINGTRIE_BUILD_FAST)); 551b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(trie.isNull()) { 552b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; // buildTrie() reported an error 553b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 554b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Go to a branch node. 555b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_j); 556b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_a); 557b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_n); 558b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IcuTestErrorCode errorCode(*this, "TestIteratorFromBranch()"); 559b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCharsTrie::Iterator iter(*trie, 0, errorCode); 560b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(errorCode.logIfFailureAndReset("UCharsTrie::Iterator(trie) constructor")) { 561b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 562b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 563b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Expected data: Same as in buildMonthsTrie(), except only the suffixes 564b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // following "jan". 565b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue data[]={ 566b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "", 1 }, 567b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { ".", 1 }, 568b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "a", 1 }, 569b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "bb", 1 }, 570b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "c", 1 }, 571b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "ddd", 1 }, 572b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "ee", 1 }, 573b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "ef", 1 }, 574b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "f", 1 }, 575b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "gg", 1 }, 576b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "h", 1 }, 577b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "iiii", 1 }, 578b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "j", 1 }, 579b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "kk", 1 }, 580b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "kl", 1 }, 581b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "kmm", 1 }, 582b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "l", 1 }, 583b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "m", 1 }, 584b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "nnnnnnnnnnnnnnnnnnnnnnnnnnnn", 1 }, 585b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "o", 1 }, 586b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "pp", 1 }, 587b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "qqq", 1 }, 588b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "r", 1 }, 589b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "uar", 1 }, 590b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "uary", 1 } 591b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 592b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkIterator(iter, data, LENGTHOF(data)); 593b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Reset, and we should get the same result. 594b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho logln("after iter.reset()"); 595b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkIterator(iter.reset(), data, LENGTHOF(data)); 596b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 597b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 598b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestIteratorFromLinearMatch() { 599b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho LocalPointer<UCharsTrie> trie(buildMonthsTrie(USTRINGTRIE_BUILD_SMALL)); 600b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(trie.isNull()) { 601b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; // buildTrie() reported an error 602b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 603b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Go into a linear-match node. 604b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_j); 605b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_a); 606b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_n); 607b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_u); 608b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_a); 609b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IcuTestErrorCode errorCode(*this, "TestIteratorFromLinearMatch()"); 610b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCharsTrie::Iterator iter(*trie, 0, errorCode); 611b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(errorCode.logIfFailureAndReset("UCharsTrie::Iterator(trie) constructor")) { 612b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 613b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 614b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Expected data: Same as in buildMonthsTrie(), except only the suffixes 615b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // following "janua". 616b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue data[]={ 617b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "r", 1 }, 618b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "ry", 1 } 619b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 620b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkIterator(iter, data, LENGTHOF(data)); 621b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Reset, and we should get the same result. 622b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho logln("after iter.reset()"); 623b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkIterator(iter.reset(), data, LENGTHOF(data)); 624b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 625b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 626b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestTruncatingIteratorFromRoot() { 627b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho LocalPointer<UCharsTrie> trie(buildMonthsTrie(USTRINGTRIE_BUILD_FAST)); 628b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(trie.isNull()) { 629b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; // buildTrie() reported an error 630b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 631b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IcuTestErrorCode errorCode(*this, "TestTruncatingIteratorFromRoot()"); 632b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCharsTrie::Iterator iter(*trie, 4, errorCode); 633b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(errorCode.logIfFailureAndReset("UCharsTrie::Iterator(trie) constructor")) { 634b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 635b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 636b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Expected data: Same as in buildMonthsTrie(), except only the first 4 characters 637b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // of each string, and no string duplicates from the truncation. 638b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue data[]={ 639b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "augu", -1 }, 640b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jan", 1 }, 641b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jan.", 1 }, 642b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jana", 1 }, 643b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janb", -1 }, 644b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janc", 1 }, 645b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jand", -1 }, 646b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jane", -1 }, 647b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janf", 1 }, 648b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jang", -1 }, 649b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janh", 1 }, 650b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jani", -1 }, 651b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janj", 1 }, 652b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jank", -1 }, 653b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janl", 1 }, 654b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janm", 1 }, 655b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jann", -1 }, 656b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jano", 1 }, 657b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janp", -1 }, 658b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janq", -1 }, 659b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janr", 1 }, 660b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "janu", -1 }, 661b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "july", 7 }, 662b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jun", 6 }, 663b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "jun.", 6 }, 664b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "june", 6 } 665b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 666b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkIterator(iter, data, LENGTHOF(data)); 667b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Reset, and we should get the same result. 668b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho logln("after iter.reset()"); 669b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkIterator(iter.reset(), data, LENGTHOF(data)); 670b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 671b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 672b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestTruncatingIteratorFromLinearMatchShort() { 673b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue data[]={ 674b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "abcdef", 10 }, 675b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "abcdepq", 200 }, 676b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "abcdeyz", 3000 } 677b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 678b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho LocalPointer<UCharsTrie> trie(buildTrie(data, LENGTHOF(data), USTRINGTRIE_BUILD_FAST)); 679b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(trie.isNull()) { 680b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; // buildTrie() reported an error 681b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 682b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Go into a linear-match node. 683b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_a); 684b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_b); 685b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IcuTestErrorCode errorCode(*this, "TestTruncatingIteratorFromLinearMatchShort()"); 686b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Truncate within the linear-match node. 687b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCharsTrie::Iterator iter(*trie, 2, errorCode); 688b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(errorCode.logIfFailureAndReset("UCharsTrie::Iterator(trie) constructor")) { 689b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 690b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 691b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue expected[]={ 692b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "cd", -1 } 693b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 694b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkIterator(iter, expected, LENGTHOF(expected)); 695b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Reset, and we should get the same result. 696b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho logln("after iter.reset()"); 697b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkIterator(iter.reset(), expected, LENGTHOF(expected)); 698b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 699b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 700b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestTruncatingIteratorFromLinearMatchLong() { 701b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue data[]={ 702b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "abcdef", 10 }, 703b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "abcdepq", 200 }, 704b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "abcdeyz", 3000 } 705b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 706b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho LocalPointer<UCharsTrie> trie(buildTrie(data, LENGTHOF(data), USTRINGTRIE_BUILD_FAST)); 707b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(trie.isNull()) { 708b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; // buildTrie() reported an error 709b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 710b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Go into a linear-match node. 711b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_a); 712b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_b); 713b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie->next(u_c); 714b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IcuTestErrorCode errorCode(*this, "TestTruncatingIteratorFromLinearMatchLong()"); 715b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Truncate after the linear-match node. 716b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCharsTrie::Iterator iter(*trie, 3, errorCode); 717b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(errorCode.logIfFailureAndReset("UCharsTrie::Iterator(trie) constructor")) { 718b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 719b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 720b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue expected[]={ 721b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "def", 10 }, 722b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "dep", -1 }, 723b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "dey", -1 } 724b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 725b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkIterator(iter, expected, LENGTHOF(expected)); 726b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Reset, and we should get the same result. 727b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho logln("after iter.reset()"); 728b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkIterator(iter.reset(), expected, LENGTHOF(expected)); 729b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 730b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 731b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::TestIteratorFromUChars() { 732b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const StringAndValue data[]={ 733b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "mm", 3 }, 734b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "mmm", 33 }, 735b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "mmnop", 333 } 736b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 737b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho builder_->clear(); 738b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IcuTestErrorCode errorCode(*this, "TestIteratorFromUChars()"); 739b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for(int32_t i=0; i<LENGTHOF(data); ++i) { 740b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho builder_->add(data[i].s, data[i].value, errorCode); 741b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 742b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString trieUChars; 743b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho builder_->buildUnicodeString(USTRINGTRIE_BUILD_FAST, trieUChars, errorCode); 744b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCharsTrie::Iterator iter(trieUChars.getBuffer(), 0, errorCode); 745b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkIterator(iter, data, LENGTHOF(data)); 746b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 747b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 748b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::checkData(const StringAndValue data[], int32_t dataLength) { 749b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho logln("checkData(dataLength=%d, fast)", (int)dataLength); 750b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkData(data, dataLength, USTRINGTRIE_BUILD_FAST); 751b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho logln("checkData(dataLength=%d, small)", (int)dataLength); 752b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkData(data, dataLength, USTRINGTRIE_BUILD_SMALL); 753b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 754b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 755b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::checkData(const StringAndValue data[], int32_t dataLength, UStringTrieBuildOption buildOption) { 756b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho LocalPointer<UCharsTrie> trie(buildTrie(data, dataLength, buildOption)); 757b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(trie.isNull()) { 758b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; // buildTrie() reported an error 759b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 760b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkFirst(*trie, data, dataLength); 761b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkNext(*trie, data, dataLength); 762b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkNextWithState(*trie, data, dataLength); 763b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkNextString(*trie, data, dataLength); 764b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkIterator(*trie, data, dataLength); 765b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 766b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 767b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUCharsTrie *UCharsTrieTest::buildTrie(const StringAndValue data[], int32_t dataLength, 768b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UStringTrieBuildOption buildOption) { 769b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IcuTestErrorCode errorCode(*this, "buildTrie()"); 770b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Add the items to the trie builder in an interesting (not trivial, not random) order. 771b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t index, step; 772b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(dataLength&1) { 773b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Odd number of items. 774b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho index=dataLength/2; 775b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho step=2; 776b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if((dataLength%3)!=0) { 777b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Not a multiple of 3. 778b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho index=dataLength/5; 779b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho step=3; 780b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 781b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho index=dataLength-1; 782b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho step=-1; 783b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 784b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho builder_->clear(); 785b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for(int32_t i=0; i<dataLength; ++i) { 786b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho builder_->add(UnicodeString(data[index].s, -1, US_INV).unescape(), 787b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho data[index].value, errorCode); 788b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho index=(index+step)%dataLength; 789b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 790b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString trieUChars; 791b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho builder_->buildUnicodeString(buildOption, trieUChars, errorCode); 792b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho LocalPointer<UCharsTrie> trie(builder_->build(buildOption, errorCode)); 793b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(!errorCode.logIfFailureAndReset("add()/build()")) { 794b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho builder_->add("zzz", 999, errorCode); 795b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(errorCode.reset()!=U_NO_WRITE_PERMISSION) { 796b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("builder.build().add(zzz) did not set U_NO_WRITE_PERMISSION"); 797b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 798b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 799b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho logln("serialized trie size: %ld UChars\n", (long)trieUChars.length()); 800b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString trieUChars2; 801b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho builder_->buildUnicodeString(buildOption, trieUChars2, errorCode); 802b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(trieUChars.getBuffer()==trieUChars2.getBuffer()) { 803b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("builder.buildUnicodeString() before & after build() returned same array"); 804b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 805b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(errorCode.isFailure()) { 806b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return NULL; 807b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 808b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Tries from either build() method should be identical but 809b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // UCharsTrie does not implement equals(). 810b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // We just return either one. 811b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if((dataLength&1)!=0) { 812b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return trie.orphan(); 813b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 814b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return new UCharsTrie(trieUChars2.getBuffer()); 815b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 816b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 817b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 818b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::checkFirst(UCharsTrie &trie, 819b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const StringAndValue data[], int32_t dataLength) { 820b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for(int32_t i=0; i<dataLength; ++i) { 821b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(*data[i].s==0) { 822b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho continue; // skip empty string 823b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 824b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString expectedString=UnicodeString(data[i].s, -1, US_INV).unescape(); 825b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar32 c=expectedString[0]; 826b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar32 nextCp=expectedString.length()>1 ? expectedString[1] : 0; 827b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UStringTrieResult firstResult=trie.first(c); 828b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t firstValue=USTRINGTRIE_HAS_VALUE(firstResult) ? trie.getValue() : -1; 829b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UStringTrieResult nextResult=trie.next(nextCp); 830b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(firstResult!=trie.reset().next(c) || 831b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho firstResult!=trie.current() || 832b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho firstValue!=(USTRINGTRIE_HAS_VALUE(firstResult) ? trie.getValue() : -1) || 833b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nextResult!=trie.next(nextCp) 834b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ) { 835b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie.first(U+%04X)!=trie.reset().next(same) for %s", 836b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho c, data[i].s); 837b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 838b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho c=expectedString.char32At(0); 839b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t cLength=U16_LENGTH(c); 840b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nextCp=expectedString.length()>cLength ? expectedString.char32At(cLength) : 0; 841b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho firstResult=trie.firstForCodePoint(c); 842b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho firstValue=USTRINGTRIE_HAS_VALUE(firstResult) ? trie.getValue() : -1; 843b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nextResult=trie.nextForCodePoint(nextCp); 844b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(firstResult!=trie.reset().nextForCodePoint(c) || 845b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho firstResult!=trie.current() || 846b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho firstValue!=(USTRINGTRIE_HAS_VALUE(firstResult) ? trie.getValue() : -1) || 847b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nextResult!=trie.nextForCodePoint(nextCp) 848b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ) { 849b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie.firstForCodePoint(U+%04X)!=trie.reset().nextForCodePoint(same) for %s", 850b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho c, data[i].s); 851b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 852b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 853b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie.reset(); 854b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 855b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 856b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::checkNext(UCharsTrie &trie, 857b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const StringAndValue data[], int32_t dataLength) { 858b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCharsTrie::State state; 859b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for(int32_t i=0; i<dataLength; ++i) { 860b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString expectedString=UnicodeString(data[i].s, -1, US_INV).unescape(); 861b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t stringLength= (i&1) ? -1 : expectedString.length(); 862b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UStringTrieResult result; 863b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if( !USTRINGTRIE_HAS_VALUE( 864b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho result=trie.next(expectedString.getTerminatedBuffer(), stringLength)) || 865b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho result!=trie.current() 866b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ) { 867b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie does not seem to contain %s", data[i].s); 868b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if(trie.getValue()!=data[i].value) { 869b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie value for %s is %ld=0x%lx instead of expected %ld=0x%lx", 870b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho data[i].s, 871b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (long)trie.getValue(), (long)trie.getValue(), 872b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (long)data[i].value, (long)data[i].value); 873b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if(result!=trie.current() || trie.getValue()!=data[i].value) { 874b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie value for %s changes when repeating current()/getValue()", data[i].s); 875b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 876b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie.reset(); 877b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho stringLength=expectedString.length(); 878b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho result=trie.current(); 879b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for(int32_t j=0; j<stringLength; ++j) { 880b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(!USTRINGTRIE_HAS_NEXT(result)) { 881b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie.current()!=hasNext before end of %s (at index %d)", data[i].s, j); 882b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 883b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 884b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(result==USTRINGTRIE_INTERMEDIATE_VALUE) { 885b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie.getValue(); 886b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(trie.current()!=USTRINGTRIE_INTERMEDIATE_VALUE) { 887b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie.getValue().current()!=USTRINGTRIE_INTERMEDIATE_VALUE before end of %s (at index %d)", data[i].s, j); 888b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 889b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 890b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 891b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho result=trie.next(expectedString[j]); 892b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(!USTRINGTRIE_MATCHES(result)) { 893b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie.next()=USTRINGTRIE_NO_MATCH before end of %s (at index %d)", data[i].s, j); 894b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 895b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 896b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(result!=trie.current()) { 897b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie.next()!=following current() before end of %s (at index %d)", data[i].s, j); 898b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 899b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 900b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 901b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(!USTRINGTRIE_HAS_VALUE(result)) { 902b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie.next()!=hasValue at the end of %s", data[i].s); 903b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho continue; 904b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 905b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie.getValue(); 906b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(result!=trie.current()) { 907b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie.current() != current()+getValue()+current() after end of %s", 908b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho data[i].s); 909b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 910b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Compare the final current() with whether next() can actually continue. 911b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie.saveState(state); 912b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool nextContinues=FALSE; 913b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for(int32_t c=0x20; c<0xe000; ++c) { 914b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(c==0x80) { 915b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho c=0xd800; // Check for ASCII and surrogates but not all of the BMP. 916b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 917b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(trie.resetToState(state).next(c)) { 918b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nextContinues=TRUE; 919b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 920b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 921b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 922b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if((result==USTRINGTRIE_INTERMEDIATE_VALUE)!=nextContinues) { 923b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("(trie.current()==USTRINGTRIE_INTERMEDIATE_VALUE) contradicts " 924b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "(trie.next(some UChar)!=USTRINGTRIE_NO_MATCH) after end of %s", data[i].s); 925b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 926b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie.reset(); 927b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 928b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 929b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 930b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::checkNextWithState(UCharsTrie &trie, 931b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const StringAndValue data[], int32_t dataLength) { 932b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCharsTrie::State noState, state; 933b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for(int32_t i=0; i<dataLength; ++i) { 934b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if((i&1)==0) { 935b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // This should have no effect. 936b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie.resetToState(noState); 937b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 938b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString expectedString=UnicodeString(data[i].s, -1, US_INV).unescape(); 939b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t stringLength=expectedString.length(); 940b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t partialLength=stringLength/3; 941b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for(int32_t j=0; j<partialLength; ++j) { 942b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(!USTRINGTRIE_MATCHES(trie.next(expectedString[j]))) { 943b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie.next()=USTRINGTRIE_NO_MATCH for a prefix of %s", data[i].s); 944b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 945b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 946b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 947b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie.saveState(state); 948b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UStringTrieResult resultAtState=trie.current(); 949b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UStringTrieResult result; 950b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t valueAtState=-99; 951b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(USTRINGTRIE_HAS_VALUE(resultAtState)) { 952b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho valueAtState=trie.getValue(); 953b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 954b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho result=trie.next(0); // mismatch 955b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(result!=USTRINGTRIE_NO_MATCH || result!=trie.current()) { 956b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie.next(0) matched after part of %s", data[i].s); 957b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 958b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if( resultAtState!=trie.resetToState(state).current() || 959b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (USTRINGTRIE_HAS_VALUE(resultAtState) && valueAtState!=trie.getValue()) 960b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ) { 961b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie.next(part of %s) changes current()/getValue() after " 962b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "saveState/next(0)/resetToState", 963b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho data[i].s); 964b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if(!USTRINGTRIE_HAS_VALUE( 965b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho result=trie.next(expectedString.getTerminatedBuffer()+partialLength, 966b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho stringLength-partialLength)) || 967b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho result!=trie.current()) { 968b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie.next(rest of %s) does not seem to contain %s after " 969b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "saveState/next(0)/resetToState", 970b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho data[i].s, data[i].s); 971b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if(!USTRINGTRIE_HAS_VALUE( 972b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho result=trie.resetToState(state). 973b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho next(expectedString.getTerminatedBuffer()+partialLength, 974b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho stringLength-partialLength)) || 975b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho result!=trie.current()) { 976b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie does not seem to contain %s after saveState/next(rest)/resetToState", 977b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho data[i].s); 978b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if(trie.getValue()!=data[i].value) { 979b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie value for %s is %ld=0x%lx instead of expected %ld=0x%lx", 980b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho data[i].s, 981b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (long)trie.getValue(), (long)trie.getValue(), 982b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (long)data[i].value, (long)data[i].value); 983b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 984b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie.reset(); 985b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 986b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 987b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 988b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// next(string) is also tested in other functions, 989b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// but here we try to go partway through the string, and then beyond it. 990b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::checkNextString(UCharsTrie &trie, 991b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const StringAndValue data[], int32_t dataLength) { 992b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for(int32_t i=0; i<dataLength; ++i) { 993b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString expectedString=UnicodeString(data[i].s, -1, US_INV).unescape(); 994b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t stringLength=expectedString.length(); 995b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(!trie.next(expectedString.getTerminatedBuffer(), stringLength/2)) { 996b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie.next(up to middle of string)=USTRINGTRIE_NO_MATCH for %s", data[i].s); 997b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho continue; 998b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 999b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Test that we stop properly at the end of the string. 1000b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(trie.next(expectedString.getTerminatedBuffer()+stringLength/2, 1001b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho stringLength+1-stringLength/2)) { 1002b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie.next(string+NUL)!=USTRINGTRIE_NO_MATCH for %s", data[i].s); 1003b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1004b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho trie.reset(); 1005b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1006b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 1007b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1008b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::checkIterator(UCharsTrie &trie, 1009b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const StringAndValue data[], int32_t dataLength) { 1010b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IcuTestErrorCode errorCode(*this, "checkIterator()"); 1011b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCharsTrie::Iterator iter(trie, 0, errorCode); 1012b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(errorCode.logIfFailureAndReset("UCharsTrie::Iterator(trieUChars) constructor")) { 1013b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 1014b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1015b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho checkIterator(iter, data, dataLength); 1016b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 1017b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1018b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid UCharsTrieTest::checkIterator(UCharsTrie::Iterator &iter, 1019b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const StringAndValue data[], int32_t dataLength) { 1020b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IcuTestErrorCode errorCode(*this, "checkIterator()"); 1021b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for(int32_t i=0; i<dataLength; ++i) { 1022b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(!iter.hasNext()) { 1023b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie iterator hasNext()=FALSE for item %d: %s", (int)i, data[i].s); 1024b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 1025b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1026b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool hasNext=iter.next(errorCode); 1027b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(errorCode.logIfFailureAndReset("trie iterator next() for item %d: %s", (int)i, data[i].s)) { 1028b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 1029b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1030b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(!hasNext) { 1031b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie iterator next()=FALSE for item %d: %s", (int)i, data[i].s); 1032b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 1033b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1034b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString expectedString=UnicodeString(data[i].s, -1, US_INV).unescape(); 1035b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(iter.getString()!=expectedString) { 1036b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho char buffer[1000]; 1037b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString invString(prettify(iter.getString())); 1038b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho invString.extract(0, invString.length(), buffer, LENGTHOF(buffer), US_INV); 1039b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie iterator next().getString()=%s but expected %s for item %d", 1040b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho buffer, data[i].s, (int)i); 1041b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1042b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(iter.getValue()!=data[i].value) { 1043b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie iterator next().getValue()=%ld=0x%lx but expected %ld=0x%lx for item %d: %s", 1044b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (long)iter.getValue(), (long)iter.getValue(), 1045b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (long)data[i].value, (long)data[i].value, 1046b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (int)i, data[i].s); 1047b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1048b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1049b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(iter.hasNext()) { 1050b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie iterator hasNext()=TRUE after all items"); 1051b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1052b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool hasNext=iter.next(errorCode); 1053b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errorCode.logIfFailureAndReset("trie iterator next() after all items"); 1054b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(hasNext) { 1055b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("trie iterator next()=TRUE after all items"); 1056b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1057b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 1058