TrieTest.java revision 2e13a2bdade5cd0a635f0bd89805931a6fd710da
1aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/* GENERATED SOURCE. DO NOT MODIFY. */ 2f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// © 2016 and later: Unicode, Inc. and others. 3f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License 4aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/** 5aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin******************************************************************************* 6aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin* Copyright (C) 1996-2010, International Business Machines Corporation and * 7aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin* others. All Rights Reserved. * 8aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin******************************************************************************* 9aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin*/ 10aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 11aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpackage android.icu.dev.test.util; 12aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 13f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubertimport org.junit.Test; 14f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert 15aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.dev.test.TestFmwk; 16aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.impl.CharTrie; 17aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.impl.IntTrie; 18aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.impl.IntTrieBuilder; 19aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.impl.Trie; 20aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.impl.TrieBuilder; 21aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.impl.TrieIterator; 22aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.UTF16; 23aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.util.RangeValueIterator; 242e13a2bdade5cd0a635f0bd89805931a6fd710daPete Gillinimport android.icu.testsharding.MainTestShard; 25aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 26aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/** 27aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin* Testing class for Trie. Tests here will be simple, since both CharTrie and 28aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin* IntTrie are very similar and are heavily used in other parts of ICU4J. 29aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin* Codes using Tries are expected to have detailed tests. 30aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin* @author Syn Wee Quek 31aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin* @since release 2.1 Jan 01 2002 32aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin*/ 332e13a2bdade5cd0a635f0bd89805931a6fd710daPete Gillin@MainTestShard 34aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpublic final class TrieTest extends TestFmwk 35aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin{ 36aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // constructor --------------------------------------------------- 37aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 38aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 39aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Constructor 40aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 41aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public TrieTest() 42aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 43aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 44aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 45aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // public methods ----------------------------------------------- 46aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 47aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 48aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Values for setting possibly overlapping, out-of-order ranges of values 49aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 50aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static final class SetRange 51aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 52aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin SetRange(int start, int limit, int value, boolean overwrite) 53aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 54aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin this.start = start; 55aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin this.limit = limit; 56aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin this.value = value; 57aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin this.overwrite = overwrite; 58aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 59aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 60aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int start, limit; 61aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value; 62aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin boolean overwrite; 63aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 64aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 65aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 66aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Values for testing: 67aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * value is set from the previous boundary's limit to before 68aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * this boundary's limit 69aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 70aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static final class CheckRange 71aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 72aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin CheckRange(int limit, int value) 73aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 74aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin this.limit = limit; 75aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin this.value = value; 76aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 77aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 78aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int limit; 79aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value; 80aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 81aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 82aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static final class _testFoldedValue 83aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin implements TrieBuilder.DataManipulate 84aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 85aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public _testFoldedValue(IntTrieBuilder builder) 86aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 87aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin m_builder_ = builder; 88aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 89aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 90aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public int getFoldedValue(int start, int offset) 91aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 92aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int foldedValue = 0; 93aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int limit = start + 0x400; 94aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin while (start < limit) { 95aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value = m_builder_.getValue(start); 96aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (m_builder_.isInZeroBlock(start)) { 97aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin start += TrieBuilder.DATA_BLOCK_LENGTH; 98aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 99aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin else { 100aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin foldedValue |= value; 101aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ++ start; 102aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 103aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 104aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 105aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (foldedValue != 0) { 106aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return (offset << 16) | foldedValue; 107aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 108aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return 0; 109aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 110aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 111aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private IntTrieBuilder m_builder_; 112aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 113aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 114aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static final class _testFoldingOffset 115aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin implements Trie.DataManipulate 116aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 117aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public int getFoldingOffset(int value) 118aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 119aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return value >>> 16; 120aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 121aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 122aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 123aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static final class _testEnumValue extends TrieIterator 124aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 125aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public _testEnumValue(Trie data) 126aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 127aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin super(data); 128aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 129aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 130aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin protected int extract(int value) 131aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 132aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return value ^ 0x5555; 133aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 134aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 135aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 136aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private void _testTrieIteration(IntTrie trie, CheckRange checkRanges[], 137aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int countCheckRanges) 138aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 139aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // write a string 140aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int countValues = 0; 141aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin StringBuffer s = new StringBuffer(); 142aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int values[] = new int[30]; 143aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = 0; i < countCheckRanges; ++ i) { 144aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int c = checkRanges[i].limit; 145aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (c != 0) { 146aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin -- c; 147aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin UTF16.append(s, c); 148aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin values[countValues ++] = checkRanges[i].value; 149aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 150aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 151aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int limit = s.length(); 152aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // try forward 153aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int p = 0; 154aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int i = 0; 155aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin while(p < limit) { 156aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int c = UTF16.charAt(s, p); 157aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin p += UTF16.getCharCount(c); 158aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value = trie.getCodePointValue(c); 159aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (value != values[i]) { 160aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("wrong value from UTRIE_NEXT(U+" 161aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(c) + "): 0x" 162aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(value) + " instead of 0x" 163aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(values[i])); 164aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 165aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // unlike the c version lead is 0 if c is non-supplementary 166aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin char lead = UTF16.getLeadSurrogate(c); 167aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin char trail = UTF16.getTrailSurrogate(c); 168aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (lead == 0 169aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ? trail != s.charAt(p - 1) 170aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin : !UTF16.isLeadSurrogate(lead) 171aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin || !UTF16.isTrailSurrogate(trail) || lead != s.charAt(p - 2) 172aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin || trail != s.charAt(p - 1)) { 173aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("wrong (lead, trail) from UTRIE_NEXT(U+" 174aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(c)); 175aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin continue; 176aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 177aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (lead != 0) { 178aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin value = trie.getLeadValue(lead); 179aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin value = trie.getTrailValue(value, trail); 180aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (value != trie.getSurrogateValue(lead, trail) 181aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin && value != values[i]) { 182aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("wrong value from getting supplementary " 183aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "values (U+" 184aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(c) + "): 0x" 185aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(value) + " instead of 0x" 186aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(values[i])); 187aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 188aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 189aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ++ i; 190aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 191aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 192aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 193aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private void _testTrieRanges(SetRange setRanges[], int countSetRanges, 194aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin CheckRange checkRanges[], int countCheckRanges, 195aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin boolean latin1Linear) 196aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 197aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin IntTrieBuilder newTrie = new IntTrieBuilder(null, 2000, 198aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin checkRanges[0].value, 199aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin checkRanges[0].value, 200aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin latin1Linear); 201aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 202aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // set values from setRanges[] 203aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin boolean ok = true; 204aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = 0; i < countSetRanges; ++ i) { 205aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int start = setRanges[i].start; 206aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int limit = setRanges[i].limit; 207aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value = setRanges[i].value; 208aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin boolean overwrite = setRanges[i].overwrite; 209aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if ((limit - start) == 1 && overwrite) { 210aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ok &= newTrie.setValue(start, value); 211aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 212aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin else { 213aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ok &= newTrie.setRange(start, limit, value, overwrite); 214aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 215aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 216aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!ok) { 217aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("setting values into a trie failed"); 218aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return; 219aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 220aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 221aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // verify that all these values are in the new Trie 222aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int start = 0; 223aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = 0; i < countCheckRanges; ++ i) { 224aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int limit = checkRanges[i].limit; 225aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value = checkRanges[i].value; 226aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 227aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin while (start < limit) { 228aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (value != newTrie.getValue(start)) { 229aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("newTrie [U+" 230aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(start) + "]==0x" 231aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(newTrie.getValue(start)) 232aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " instead of 0x" + Integer.toHexString(value)); 233aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 234aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ++ start; 235aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 236aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 237aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 238aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin IntTrie trie = newTrie.serialize(new _testFoldedValue(newTrie), 239aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new _testFoldingOffset()); 240aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 241aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // test linear Latin-1 range from utrie_getData() 242aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (latin1Linear) { 243aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin start = 0; 244aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = 0; i < countCheckRanges && start <= 0xff; ++ i) { 245aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int limit = checkRanges[i].limit; 246aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value = checkRanges[i].value; 247aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 248aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin while (start < limit && start <= 0xff) { 249aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (value != trie.getLatin1LinearValue((char)start)) { 250aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("IntTrie.getLatin1LinearValue[U+" 251aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(start) + "]==0x" 252aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString( 253aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin trie.getLatin1LinearValue((char) start)) 254aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " instead of 0x" + Integer.toHexString(value)); 255aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 256aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ++ start; 257aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 258aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 259aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 260aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 261aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (latin1Linear != trie.isLatin1Linear()) { 262aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("trie serialization did not preserve " 263aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "Latin-1-linearity"); 264aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 265aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 266aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // verify that all these values are in the serialized Trie 267aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin start = 0; 268aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = 0; i < countCheckRanges; ++ i) { 269aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int limit = checkRanges[i].limit; 270aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value = checkRanges[i].value; 271aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 272aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (start == 0xd800) { 273aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // skip surrogates 274aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin start = limit; 275aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin continue; 276aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 277aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 278aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin while (start < limit) { 279aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (start <= 0xffff) { 280aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value2 = trie.getBMPValue((char)start); 281aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (value != value2) { 282aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("serialized trie.getBMPValue(U+" 283aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(start) + " == 0x" 284aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(value2) + " instead of 0x" 285aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(value)); 286aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 287aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!UTF16.isLeadSurrogate((char)start)) { 288aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin value2 = trie.getLeadValue((char)start); 289aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (value != value2) { 290aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("serialized trie.getLeadValue(U+" 291aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(start) + " == 0x" 292aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(value2) + " instead of 0x" 293aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(value)); 294aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 295aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 296aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 297aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value2 = trie.getCodePointValue(start); 298aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (value != value2) { 299aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("serialized trie.getCodePointValue(U+" 300aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(start) + ")==0x" 301aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(value2) + " instead of 0x" 302aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(value)); 303aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 304aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ++ start; 305aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 306aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 307aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 308aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // enumerate and verify all ranges 309aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 310aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int enumRanges = 1; 311aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin TrieIterator iter = new _testEnumValue(trie); 312aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RangeValueIterator.Element result = new RangeValueIterator.Element(); 313aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin while (iter.next(result)) { 314aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (result.start != checkRanges[enumRanges -1].limit 315aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin || result.limit != checkRanges[enumRanges].limit 316aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin || (result.value ^ 0x5555) != checkRanges[enumRanges].value) { 317aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("utrie_enum() delivers wrong range [U+" 318aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(result.start) + "..U+" 319aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(result.limit) + "].0x" 320aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(result.value ^ 0x5555) 321aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " instead of [U+" 322aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(checkRanges[enumRanges -1].limit) 323aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "..U+" 324aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(checkRanges[enumRanges].limit) 325aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "].0x" 326aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(checkRanges[enumRanges].value)); 327aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 328aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin enumRanges ++; 329aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 330aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 331aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // test linear Latin-1 range 332aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (trie.isLatin1Linear()) { 333aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (start = 0; start < 0x100; ++ start) { 334aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (trie.getLatin1LinearValue((char)start) 335aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin != trie.getLeadValue((char)start)) { 336aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("trie.getLatin1LinearValue[U+" 337aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(start) + "]=0x" 338aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString( 339aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin trie.getLatin1LinearValue((char)start)) 340aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " instead of 0x" 341aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString( 342aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin trie.getLeadValue((char)start))); 343aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 344aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 345aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 346aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 347aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin _testTrieIteration(trie, checkRanges, countCheckRanges); 348aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 349aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 350aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private void _testTrieRanges2(SetRange setRanges[], 351aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int countSetRanges, 352aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin CheckRange checkRanges[], 353aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int countCheckRanges) 354aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 355aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin _testTrieRanges(setRanges, countSetRanges, checkRanges, countCheckRanges, 356aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin false); 357aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 358aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin _testTrieRanges(setRanges, countSetRanges, checkRanges, countCheckRanges, 359aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin true); 360aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 361aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 362aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private void _testTrieRanges4(SetRange setRanges[], int countSetRanges, 363aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin CheckRange checkRanges[], 364aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int countCheckRanges) 365aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 366aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin _testTrieRanges2(setRanges, countSetRanges, checkRanges, 367aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin countCheckRanges); 368aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 369aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 370aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // test data ------------------------------------------------------------ 371aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 372aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 373aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * set consecutive ranges, even with value 0 374aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 375aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static SetRange setRanges1[]={ 376aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0, 0x20, 0, false), 377aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x20, 0xa7, 0x1234, false), 378aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0xa7, 0x3400, 0, false), 379aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x3400, 0x9fa6, 0x6162, false), 380aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x9fa6, 0xda9e, 0x3132, false), 381aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // try to disrupt _testFoldingOffset16() 382aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0xdada, 0xeeee, 0x87ff, false), 383aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0xeeee, 0x11111, 1, false), 384aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x11111, 0x44444, 0x6162, false), 385aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x44444, 0x60003, 0, false), 386aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0xf0003, 0xf0004, 0xf, false), 387aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0xf0004, 0xf0006, 0x10, false), 388aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0xf0006, 0xf0007, 0x11, false), 389aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0xf0007, 0xf0020, 0x12, false), 390aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0xf0020, 0x110000, 0, false) 391aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 392aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 393aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static CheckRange checkRanges1[]={ 394aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0, 0), // dummy start range to make _testEnumRange() simpler 395aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x20, 0), 396aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xa7, 0x1234), 397aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x3400, 0), 398aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x9fa6, 0x6162), 399aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xda9e, 0x3132), 400aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xdada, 0), 401aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xeeee, 0x87ff), 402aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x11111,1), 403aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x44444,0x6162), 404aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xf0003,0), 405aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xf0004,0xf), 406aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xf0006,0x10), 407aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xf0007,0x11), 408aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xf0020,0x12), 409aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x110000, 0) 410aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 411aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 412aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 413aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * set some interesting overlapping ranges 414aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 415aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static SetRange setRanges2[]={ 416aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x21, 0x7f, 0x5555, true), 417aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x2f800,0x2fedc, 0x7a, true), 418aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x72, 0xdd, 3, true), 419aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0xdd, 0xde, 4, false), 420aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x2f987,0x2fa98, 5, true), 421aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x2f777,0x2f833, 0, true), 422aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x2f900,0x2ffee, 1, false), 423aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x2ffee,0x2ffef, 2, true) 424aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 425aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 426aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static CheckRange checkRanges2[]={ 427aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // dummy start range to make _testEnumRange() simpler 428aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0, 0), 429aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x21, 0), 430aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x72, 0x5555), 431aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xdd, 3), 432aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xde, 4), 433aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x2f833,0), 434aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x2f987,0x7a), 435aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x2fa98,5), 436aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x2fedc,0x7a), 437aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x2ffee,1), 438aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x2ffef,2), 439aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x110000, 0) 440aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 441aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 442aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 443aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * use a non-zero initial value 444aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 445aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static SetRange setRanges3[]={ 446aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x31, 0xa4, 1, false), 447aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x3400, 0x6789, 2, false), 448aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x30000,0x34567,9, true), 449aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x45678,0x56789,3, true) 450aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 451aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 452aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static CheckRange checkRanges3[]={ 453aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // dummy start range, also carries the initial value 454aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0, 9), 455aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x31, 9), 456aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xa4, 1), 457aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x3400, 9), 458aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x6789, 2), 459aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x45678,9), 460aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x56789,3), 461aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x110000,9) 462aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 463aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 464f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 465aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestIntTrie() 466aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 467aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin _testTrieRanges4(setRanges1, setRanges1.length, checkRanges1, 468aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin checkRanges1.length); 469aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin _testTrieRanges4(setRanges2, setRanges2.length, checkRanges2, 470aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin checkRanges2.length); 471aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin _testTrieRanges4(setRanges3, setRanges3.length, checkRanges3, 472aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin checkRanges3.length); 473aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 474aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 475aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static class DummyGetFoldingOffset implements Trie.DataManipulate { 476aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public int getFoldingOffset(int value) { 477aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return -1; /* never get non-initialValue data for supplementary code points */ 478aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 479aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 480aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 481f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 482aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestDummyCharTrie() { 483aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin CharTrie trie; 484aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin final int initialValue=0x313, leadUnitValue=0xaffe; 485aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value; 486aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int c; 487aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin trie=new CharTrie(initialValue, leadUnitValue, new DummyGetFoldingOffset()); 488aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 489aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* test that all code points have initialValue */ 490aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for(c=0; c<=0x10ffff; ++c) { 491aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin value=trie.getCodePointValue(c); 492aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if(value!=initialValue) { 493aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("CharTrie/dummy.getCodePointValue(c)(U+"+hex(c)+")=0x"+hex(value)+" instead of 0x"+hex(initialValue)); 494aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 495aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 496aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 497aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* test that the lead surrogate code units have leadUnitValue */ 498aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for(c=0xd800; c<=0xdbff; ++c) { 499aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin value=trie.getLeadValue((char)c); 500aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if(value!=leadUnitValue) { 501aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("CharTrie/dummy.getLeadValue(c)(U+"+hex(c)+")=0x"+hex(value)+" instead of 0x"+hex(leadUnitValue)); 502aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 503aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 504aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 505aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 506f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 507aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestDummyIntTrie() { 508aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin IntTrie trie; 509aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin final int initialValue=0x01234567, leadUnitValue=0x89abcdef; 510aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value; 511aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int c; 512aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin trie=new IntTrie(initialValue, leadUnitValue, new DummyGetFoldingOffset()); 513aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 514aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* test that all code points have initialValue */ 515aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for(c=0; c<=0x10ffff; ++c) { 516aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin value=trie.getCodePointValue(c); 517aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if(value!=initialValue) { 518aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("IntTrie/dummy.getCodePointValue(c)(U+"+hex(c)+")=0x"+hex(value)+" instead of 0x"+hex(initialValue)); 519aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 520aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 521aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 522aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* test that the lead surrogate code units have leadUnitValue */ 523aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for(c=0xd800; c<=0xdbff; ++c) { 524aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin value=trie.getLeadValue((char)c); 525aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if(value!=leadUnitValue) { 526aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("IntTrie/dummy.getLeadValue(c)(U+"+hex(c)+")=0x"+hex(value)+" instead of 0x"+hex(leadUnitValue)); 527aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 528aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 529aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 530aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin} 531