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; 1405fa7802d0874812c234a29745586677ee5837eaFredrik Roubertimport org.junit.runner.RunWith; 1505fa7802d0874812c234a29745586677ee5837eaFredrik Roubertimport org.junit.runners.JUnit4; 16f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert 17aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.dev.test.TestFmwk; 18aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.impl.CharTrie; 19aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.impl.IntTrie; 20aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.impl.IntTrieBuilder; 21aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.impl.Trie; 22aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.impl.TrieBuilder; 23aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.impl.TrieIterator; 24aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.UTF16; 25aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.util.RangeValueIterator; 262e13a2bdade5cd0a635f0bd89805931a6fd710daPete Gillinimport android.icu.testsharding.MainTestShard; 27aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 28aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/** 2905fa7802d0874812c234a29745586677ee5837eaFredrik Roubert* Testing class for Trie. Tests here will be simple, since both CharTrie and 30aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin* IntTrie are very similar and are heavily used in other parts of ICU4J. 31aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin* Codes using Tries are expected to have detailed tests. 32aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin* @author Syn Wee Quek 33aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin* @since release 2.1 Jan 01 2002 34aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin*/ 352e13a2bdade5cd0a635f0bd89805931a6fd710daPete Gillin@MainTestShard 3605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert@RunWith(JUnit4.class) 3705fa7802d0874812c234a29745586677ee5837eaFredrik Roubertpublic final class TrieTest extends TestFmwk 3805fa7802d0874812c234a29745586677ee5837eaFredrik Roubert{ 39aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // constructor --------------------------------------------------- 4005fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 41aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 42aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Constructor 43aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 44aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public TrieTest() 45aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 46aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 4705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 48aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // public methods ----------------------------------------------- 4905fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 5005fa7802d0874812c234a29745586677ee5837eaFredrik Roubert /** 51aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Values for setting possibly overlapping, out-of-order ranges of values 52aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 5305fa7802d0874812c234a29745586677ee5837eaFredrik Roubert private static final class SetRange 54aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 55aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin SetRange(int start, int limit, int value, boolean overwrite) 56aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 57aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin this.start = start; 58aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin this.limit = limit; 59aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin this.value = value; 60aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin this.overwrite = overwrite; 61aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 6205fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 63aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int start, limit; 64aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value; 65aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin boolean overwrite; 66aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 6705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 68aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 69aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Values for testing: 70aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * value is set from the previous boundary's limit to before 71aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * this boundary's limit 72aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 7305fa7802d0874812c234a29745586677ee5837eaFredrik Roubert private static final class CheckRange 74aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 75aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin CheckRange(int limit, int value) 76aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 77aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin this.limit = limit; 78aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin this.value = value; 79aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 8005fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 81aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int limit; 82aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value; 83aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 8405fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 8505fa7802d0874812c234a29745586677ee5837eaFredrik Roubert private static final class _testFoldedValue 8605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert implements TrieBuilder.DataManipulate 87aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 88aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public _testFoldedValue(IntTrieBuilder builder) 89aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 90aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin m_builder_ = builder; 91aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 9205fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 9305fa7802d0874812c234a29745586677ee5837eaFredrik Roubert @Override 94aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public int getFoldedValue(int start, int offset) 95aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 96aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int foldedValue = 0; 97aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int limit = start + 0x400; 98aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin while (start < limit) { 99aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value = m_builder_.getValue(start); 100aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (m_builder_.isInZeroBlock(start)) { 101aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin start += TrieBuilder.DATA_BLOCK_LENGTH; 10205fa7802d0874812c234a29745586677ee5837eaFredrik Roubert } 103aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin else { 104aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin foldedValue |= value; 105aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ++ start; 106aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 107aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 10805fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 109aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (foldedValue != 0) { 110aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return (offset << 16) | foldedValue; 11105fa7802d0874812c234a29745586677ee5837eaFredrik Roubert } 112aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return 0; 113aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 11405fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 115aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private IntTrieBuilder m_builder_; 116aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 11705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 11805fa7802d0874812c234a29745586677ee5837eaFredrik Roubert private static final class _testFoldingOffset 11905fa7802d0874812c234a29745586677ee5837eaFredrik Roubert implements Trie.DataManipulate 120aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 12105fa7802d0874812c234a29745586677ee5837eaFredrik Roubert @Override 122aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public int getFoldingOffset(int value) 123aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 124aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return value >>> 16; 125aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 126aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 12705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 128aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static final class _testEnumValue extends TrieIterator 129aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 130aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public _testEnumValue(Trie data) 131aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 132aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin super(data); 133aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 13405fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 13505fa7802d0874812c234a29745586677ee5837eaFredrik Roubert @Override 136aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin protected int extract(int value) 137aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 138aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return value ^ 0x5555; 139aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 140aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 14105fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 142aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private void _testTrieIteration(IntTrie trie, CheckRange checkRanges[], 14305fa7802d0874812c234a29745586677ee5837eaFredrik Roubert int countCheckRanges) 144aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 145aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // write a string 146aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int countValues = 0; 147aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin StringBuffer s = new StringBuffer(); 148aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int values[] = new int[30]; 149aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = 0; i < countCheckRanges; ++ i) { 150aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int c = checkRanges[i].limit; 151aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (c != 0) { 152aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin -- c; 153aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin UTF16.append(s, c); 154aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin values[countValues ++] = checkRanges[i].value; 155aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 156aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 157aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int limit = s.length(); 158aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // try forward 159aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int p = 0; 160aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int i = 0; 161aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin while(p < limit) { 162aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int c = UTF16.charAt(s, p); 163aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin p += UTF16.getCharCount(c); 164aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value = trie.getCodePointValue(c); 165aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (value != values[i]) { 16605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert errln("wrong value from UTRIE_NEXT(U+" 16705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert + Integer.toHexString(c) + "): 0x" 168aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(value) + " instead of 0x" 169aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(values[i])); 170aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 171aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // unlike the c version lead is 0 if c is non-supplementary 172aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin char lead = UTF16.getLeadSurrogate(c); 17305fa7802d0874812c234a29745586677ee5837eaFredrik Roubert char trail = UTF16.getTrailSurrogate(c); 17405fa7802d0874812c234a29745586677ee5837eaFredrik Roubert if (lead == 0 17505fa7802d0874812c234a29745586677ee5837eaFredrik Roubert ? trail != s.charAt(p - 1) 17605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert : !UTF16.isLeadSurrogate(lead) 17705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert || !UTF16.isTrailSurrogate(trail) || lead != s.charAt(p - 2) 178aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin || trail != s.charAt(p - 1)) { 17905fa7802d0874812c234a29745586677ee5837eaFredrik Roubert errln("wrong (lead, trail) from UTRIE_NEXT(U+" 180aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(c)); 181aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin continue; 182aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 183aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (lead != 0) { 184aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin value = trie.getLeadValue(lead); 185aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin value = trie.getTrailValue(value, trail); 186aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (value != trie.getSurrogateValue(lead, trail) 187aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin && value != values[i]) { 18805fa7802d0874812c234a29745586677ee5837eaFredrik Roubert errln("wrong value from getting supplementary " 18905fa7802d0874812c234a29745586677ee5837eaFredrik Roubert + "values (U+" 190aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(c) + "): 0x" 191aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(value) + " instead of 0x" 192aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(values[i])); 193aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 194aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 195aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ++ i; 196aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 197aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 19805fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 19905fa7802d0874812c234a29745586677ee5837eaFredrik Roubert private void _testTrieRanges(SetRange setRanges[], int countSetRanges, 200aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin CheckRange checkRanges[], int countCheckRanges, 20105fa7802d0874812c234a29745586677ee5837eaFredrik Roubert boolean latin1Linear) 202aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 203aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin IntTrieBuilder newTrie = new IntTrieBuilder(null, 2000, 20405fa7802d0874812c234a29745586677ee5837eaFredrik Roubert checkRanges[0].value, 205aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin checkRanges[0].value, 206aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin latin1Linear); 20705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 208aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // set values from setRanges[] 209aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin boolean ok = true; 210aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = 0; i < countSetRanges; ++ i) { 211aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int start = setRanges[i].start; 212aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int limit = setRanges[i].limit; 213aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value = setRanges[i].value; 214aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin boolean overwrite = setRanges[i].overwrite; 215aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if ((limit - start) == 1 && overwrite) { 216aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ok &= newTrie.setValue(start, value); 21705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert } 218aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin else { 219aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ok &= newTrie.setRange(start, limit, value, overwrite); 220aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 221aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 222aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!ok) { 223aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("setting values into a trie failed"); 224aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return; 225aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 22605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 227aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // verify that all these values are in the new Trie 228aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int start = 0; 229aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = 0; i < countCheckRanges; ++ i) { 230aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int limit = checkRanges[i].limit; 231aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value = checkRanges[i].value; 23205fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 233aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin while (start < limit) { 234aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (value != newTrie.getValue(start)) { 23505fa7802d0874812c234a29745586677ee5837eaFredrik Roubert errln("newTrie [U+" 23605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert + Integer.toHexString(start) + "]==0x" 23705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert + Integer.toHexString(newTrie.getValue(start)) 238aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " instead of 0x" + Integer.toHexString(value)); 239aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 240aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ++ start; 241aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 242aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 24305fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 24405fa7802d0874812c234a29745586677ee5837eaFredrik Roubert IntTrie trie = newTrie.serialize(new _testFoldedValue(newTrie), 245aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new _testFoldingOffset()); 24605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 247aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // test linear Latin-1 range from utrie_getData() 248aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (latin1Linear) { 249aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin start = 0; 250aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = 0; i < countCheckRanges && start <= 0xff; ++ i) { 251aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int limit = checkRanges[i].limit; 252aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value = checkRanges[i].value; 25305fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 254aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin while (start < limit && start <= 0xff) { 255aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (value != trie.getLatin1LinearValue((char)start)) { 25605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert errln("IntTrie.getLatin1LinearValue[U+" 257aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(start) + "]==0x" 258aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString( 25905fa7802d0874812c234a29745586677ee5837eaFredrik Roubert trie.getLatin1LinearValue((char) start)) 260aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " instead of 0x" + Integer.toHexString(value)); 261aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 262aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ++ start; 263aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 264aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 265aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 26605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 267aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (latin1Linear != trie.isLatin1Linear()) { 268aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("trie serialization did not preserve " 269aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "Latin-1-linearity"); 270aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 27105fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 272aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // verify that all these values are in the serialized Trie 273aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin start = 0; 274aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = 0; i < countCheckRanges; ++ i) { 275aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int limit = checkRanges[i].limit; 276aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value = checkRanges[i].value; 27705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 278aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (start == 0xd800) { 279aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // skip surrogates 280aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin start = limit; 281aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin continue; 282aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 28305fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 284aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin while (start < limit) { 285aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (start <= 0xffff) { 286aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value2 = trie.getBMPValue((char)start); 287aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (value != value2) { 288aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("serialized trie.getBMPValue(U+" 28905fa7802d0874812c234a29745586677ee5837eaFredrik Roubert + Integer.toHexString(start) + " == 0x" 290aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(value2) + " instead of 0x" 291aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(value)); 292aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 293aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!UTF16.isLeadSurrogate((char)start)) { 294aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin value2 = trie.getLeadValue((char)start); 295aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (value != value2) { 296aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("serialized trie.getLeadValue(U+" 29705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert + Integer.toHexString(start) + " == 0x" 298aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(value2) + " instead of 0x" 299aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(value)); 300aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 301aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 302aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 303aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value2 = trie.getCodePointValue(start); 304aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (value != value2) { 305aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("serialized trie.getCodePointValue(U+" 30605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert + Integer.toHexString(start) + ")==0x" 30705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert + Integer.toHexString(value2) + " instead of 0x" 308aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(value)); 309aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 310aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ++ start; 311aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 312aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 31305fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 314aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // enumerate and verify all ranges 31505fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 316aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int enumRanges = 1; 317aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin TrieIterator iter = new _testEnumValue(trie); 318aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RangeValueIterator.Element result = new RangeValueIterator.Element(); 319aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin while (iter.next(result)) { 32005fa7802d0874812c234a29745586677ee5837eaFredrik Roubert if (result.start != checkRanges[enumRanges -1].limit 321aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin || result.limit != checkRanges[enumRanges].limit 322aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin || (result.value ^ 0x5555) != checkRanges[enumRanges].value) { 323aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("utrie_enum() delivers wrong range [U+" 32405fa7802d0874812c234a29745586677ee5837eaFredrik Roubert + Integer.toHexString(result.start) + "..U+" 32505fa7802d0874812c234a29745586677ee5837eaFredrik Roubert + Integer.toHexString(result.limit) + "].0x" 32605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert + Integer.toHexString(result.value ^ 0x5555) 327aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " instead of [U+" 32805fa7802d0874812c234a29745586677ee5837eaFredrik Roubert + Integer.toHexString(checkRanges[enumRanges -1].limit) 32905fa7802d0874812c234a29745586677ee5837eaFredrik Roubert + "..U+" 33005fa7802d0874812c234a29745586677ee5837eaFredrik Roubert + Integer.toHexString(checkRanges[enumRanges].limit) 33105fa7802d0874812c234a29745586677ee5837eaFredrik Roubert + "].0x" 332aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(checkRanges[enumRanges].value)); 333aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 334aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin enumRanges ++; 335aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 33605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 337aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // test linear Latin-1 range 338aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (trie.isLatin1Linear()) { 339aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (start = 0; start < 0x100; ++ start) { 34005fa7802d0874812c234a29745586677ee5837eaFredrik Roubert if (trie.getLatin1LinearValue((char)start) 341aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin != trie.getLeadValue((char)start)) { 342aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("trie.getLatin1LinearValue[U+" 343aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString(start) + "]=0x" 344aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString( 345aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin trie.getLatin1LinearValue((char)start)) 34605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert + " instead of 0x" 347aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + Integer.toHexString( 348aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin trie.getLeadValue((char)start))); 349aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 350aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 351aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 35205fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 353aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin _testTrieIteration(trie, checkRanges, countCheckRanges); 354aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 35505fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 35605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert private void _testTrieRanges2(SetRange setRanges[], 35705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert int countSetRanges, 35805fa7802d0874812c234a29745586677ee5837eaFredrik Roubert CheckRange checkRanges[], 35905fa7802d0874812c234a29745586677ee5837eaFredrik Roubert int countCheckRanges) 360aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 361aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin _testTrieRanges(setRanges, countSetRanges, checkRanges, countCheckRanges, 362aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin false); 36305fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 364aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin _testTrieRanges(setRanges, countSetRanges, checkRanges, countCheckRanges, 365aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin true); 366aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 36705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 368aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private void _testTrieRanges4(SetRange setRanges[], int countSetRanges, 36905fa7802d0874812c234a29745586677ee5837eaFredrik Roubert CheckRange checkRanges[], 37005fa7802d0874812c234a29745586677ee5837eaFredrik Roubert int countCheckRanges) 371aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 37205fa7802d0874812c234a29745586677ee5837eaFredrik Roubert _testTrieRanges2(setRanges, countSetRanges, checkRanges, 373aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin countCheckRanges); 374aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 37505fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 376aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // test data ------------------------------------------------------------ 37705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 37805fa7802d0874812c234a29745586677ee5837eaFredrik Roubert /** 379aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * set consecutive ranges, even with value 0 380aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 381aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static SetRange setRanges1[]={ 382aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0, 0x20, 0, false), 383aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x20, 0xa7, 0x1234, false), 384aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0xa7, 0x3400, 0, false), 385aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x3400, 0x9fa6, 0x6162, false), 386aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x9fa6, 0xda9e, 0x3132, false), 387aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // try to disrupt _testFoldingOffset16() 38805fa7802d0874812c234a29745586677ee5837eaFredrik Roubert new SetRange(0xdada, 0xeeee, 0x87ff, false), 389aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0xeeee, 0x11111, 1, false), 390aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x11111, 0x44444, 0x6162, false), 391aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x44444, 0x60003, 0, false), 392aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0xf0003, 0xf0004, 0xf, false), 393aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0xf0004, 0xf0006, 0x10, false), 394aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0xf0006, 0xf0007, 0x11, false), 395aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0xf0007, 0xf0020, 0x12, false), 396aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0xf0020, 0x110000, 0, false) 397aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 39805fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 399aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static CheckRange checkRanges1[]={ 400aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0, 0), // dummy start range to make _testEnumRange() simpler 401aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x20, 0), 402aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xa7, 0x1234), 403aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x3400, 0), 404aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x9fa6, 0x6162), 405aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xda9e, 0x3132), 406aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xdada, 0), 407aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xeeee, 0x87ff), 408aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x11111,1), 409aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x44444,0x6162), 410aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xf0003,0), 411aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xf0004,0xf), 412aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xf0006,0x10), 413aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xf0007,0x11), 414aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xf0020,0x12), 415aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x110000, 0) 416aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 41705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 41805fa7802d0874812c234a29745586677ee5837eaFredrik Roubert /** 419aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * set some interesting overlapping ranges 420aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 421aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static SetRange setRanges2[]={ 422aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x21, 0x7f, 0x5555, true), 423aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x2f800,0x2fedc, 0x7a, true), 424aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x72, 0xdd, 3, true), 425aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0xdd, 0xde, 4, false), 426aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x2f987,0x2fa98, 5, true), 427aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x2f777,0x2f833, 0, true), 428aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x2f900,0x2ffee, 1, false), 429aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x2ffee,0x2ffef, 2, true) 430aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 43105fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 432aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static CheckRange checkRanges2[]={ 433aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // dummy start range to make _testEnumRange() simpler 43405fa7802d0874812c234a29745586677ee5837eaFredrik Roubert new CheckRange(0, 0), 435aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x21, 0), 436aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x72, 0x5555), 437aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xdd, 3), 438aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xde, 4), 439aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x2f833,0), 440aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x2f987,0x7a), 441aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x2fa98,5), 442aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x2fedc,0x7a), 443aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x2ffee,1), 444aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x2ffef,2), 445aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x110000, 0) 446aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 44705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 44805fa7802d0874812c234a29745586677ee5837eaFredrik Roubert /** 449aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * use a non-zero initial value 450aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 451aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static SetRange setRanges3[]={ 452aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x31, 0xa4, 1, false), 453aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x3400, 0x6789, 2, false), 454aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x30000,0x34567,9, true), 455aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new SetRange(0x45678,0x56789,3, true) 456aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 45705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 458aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static CheckRange checkRanges3[]={ 459aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // dummy start range, also carries the initial value 46005fa7802d0874812c234a29745586677ee5837eaFredrik Roubert new CheckRange(0, 9), 461aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x31, 9), 462aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0xa4, 1), 463aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x3400, 9), 464aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x6789, 2), 465aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x45678,9), 466aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x56789,3), 467aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new CheckRange(0x110000,9) 468aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 46905fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 470f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 47105fa7802d0874812c234a29745586677ee5837eaFredrik Roubert public void TestIntTrie() 472aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 47305fa7802d0874812c234a29745586677ee5837eaFredrik Roubert _testTrieRanges4(setRanges1, setRanges1.length, checkRanges1, 474aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin checkRanges1.length); 47505fa7802d0874812c234a29745586677ee5837eaFredrik Roubert _testTrieRanges4(setRanges2, setRanges2.length, checkRanges2, 47605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert checkRanges2.length); 47705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert _testTrieRanges4(setRanges3, setRanges3.length, checkRanges3, 478aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin checkRanges3.length); 479aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 480aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 481aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static class DummyGetFoldingOffset implements Trie.DataManipulate { 48205fa7802d0874812c234a29745586677ee5837eaFredrik Roubert @Override 483aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public int getFoldingOffset(int value) { 484aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return -1; /* never get non-initialValue data for supplementary code points */ 485aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 486aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 487aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 488f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 489aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestDummyCharTrie() { 490aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin CharTrie trie; 49105fa7802d0874812c234a29745586677ee5837eaFredrik Roubert final int initialValue=0x313, leadUnitValue=0xaffe; 492aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value; 493aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int c; 494aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin trie=new CharTrie(initialValue, leadUnitValue, new DummyGetFoldingOffset()); 495aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 496aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* test that all code points have initialValue */ 497aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for(c=0; c<=0x10ffff; ++c) { 498aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin value=trie.getCodePointValue(c); 499aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if(value!=initialValue) { 500aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("CharTrie/dummy.getCodePointValue(c)(U+"+hex(c)+")=0x"+hex(value)+" instead of 0x"+hex(initialValue)); 501aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 502aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 503aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 504aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* test that the lead surrogate code units have leadUnitValue */ 505aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for(c=0xd800; c<=0xdbff; ++c) { 506aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin value=trie.getLeadValue((char)c); 507aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if(value!=leadUnitValue) { 508aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("CharTrie/dummy.getLeadValue(c)(U+"+hex(c)+")=0x"+hex(value)+" instead of 0x"+hex(leadUnitValue)); 509aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 510aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 511aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 512aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 513f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 514aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestDummyIntTrie() { 515aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin IntTrie trie; 51605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert final int initialValue=0x01234567, leadUnitValue=0x89abcdef; 517aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int value; 518aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int c; 519aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin trie=new IntTrie(initialValue, leadUnitValue, new DummyGetFoldingOffset()); 520aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 521aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* test that all code points have initialValue */ 522aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for(c=0; c<=0x10ffff; ++c) { 523aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin value=trie.getCodePointValue(c); 524aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if(value!=initialValue) { 525aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("IntTrie/dummy.getCodePointValue(c)(U+"+hex(c)+")=0x"+hex(value)+" instead of 0x"+hex(initialValue)); 526aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 527aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 528aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 529aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* test that the lead surrogate code units have leadUnitValue */ 530aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for(c=0xd800; c<=0xdbff; ++c) { 531aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin value=trie.getLeadValue((char)c); 532aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if(value!=leadUnitValue) { 533aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("IntTrie/dummy.getLeadValue(c)(U+"+hex(c)+")=0x"+hex(value)+" instead of 0x"+hex(leadUnitValue)); 534aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 535aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 536aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 537aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin} 538