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