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