15779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes/*
25779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes * Copyright (C) 2010 The Android Open Source Project
35779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes *
45779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
55779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes * you may not use this file except in compliance with the License.
65779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes * You may obtain a copy of the License at
75779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes *
85779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
95779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes *
105779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes * Unless required by applicable law or agreed to in writing, software
115779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
125779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes * See the License for the specific language governing permissions and
145779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes * limitations under the License.
155779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes */
165779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes
174557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonpackage libcore.java.text;
185779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes
194557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.text.CharacterIterator;
204557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.text.CollationElementIterator;
214557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.text.Collator;
224557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.text.ParseException;
234557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.text.RuleBasedCollator;
244557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.text.StringCharacterIterator;
255779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughesimport java.util.Locale;
265779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes
275779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughespublic class CollatorTest extends junit.framework.TestCase {
285779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes    public void test_setStrengthI() throws Exception {
295779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        Collator collator = Collator.getInstance();
305779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        collator.setStrength(Collator.PRIMARY);
315779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        assertEquals(Collator.PRIMARY, collator.getStrength());
325779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        collator.setStrength(Collator.SECONDARY);
335779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        assertEquals(Collator.SECONDARY, collator.getStrength());
345779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        collator.setStrength(Collator.TERTIARY);
355779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        assertEquals(Collator.TERTIARY, collator.getStrength());
365779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        collator.setStrength(Collator.IDENTICAL);
375779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        assertEquals(Collator.IDENTICAL, collator.getStrength());
385779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        try {
395779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes            collator.setStrength(-1);
405779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes            fail("IllegalArgumentException was not thrown.");
415779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        } catch (IllegalArgumentException expected) {
425779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        }
435779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes    }
445779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes
455779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes    public void test_stackCorruption() throws Exception {
465779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        // This used to crash Android.
475779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        Collator mColl = Collator.getInstance();
485779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        mColl.setStrength(Collator.PRIMARY);
495779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        mColl.getCollationKey("2d294f2d3739433565147655394f3762f3147312d3731641452f310");
505779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes    }
515779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes
525779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes    public void test_collationKeySize() throws Exception {
535779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        // Test to verify that very large collation keys are not truncated.
545779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        StringBuilder b = new StringBuilder();
555779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        for (int i = 0; i < 1024; i++) {
565779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes            b.append("0123456789ABCDEF");
575779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        }
585779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        String sixteen = b.toString();
595779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        b.append("_THE_END");
605779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        String sixteenplus = b.toString();
615779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes
625779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        Collator mColl = Collator.getInstance();
635779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        mColl.setStrength(Collator.PRIMARY);
645779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes
655779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        byte [] arr = mColl.getCollationKey(sixteen).toByteArray();
665779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        int len = arr.length;
675779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        assertTrue("Collation key not 0 terminated", arr[arr.length - 1] == 0);
685779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        len--;
695779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        String foo = new String(arr, 0, len, "iso8859-1");
705779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes
715779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        arr = mColl.getCollationKey(sixteen).toByteArray();
725779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        len = arr.length;
735779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        assertTrue("Collation key not 0 terminated", arr[arr.length - 1] == 0);
745779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        len--;
755779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        String bar = new String(arr, 0, len, "iso8859-1");
765779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes
775779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        assertTrue("Collation keys should differ", foo.equals(bar));
785779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes    }
795779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes
805779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes    public void test_decompositionCompatibility() throws Exception {
815779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        Collator myCollator = Collator.getInstance();
825779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        myCollator.setDecomposition(Collator.NO_DECOMPOSITION);
835779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        assertFalse("Error: \u00e0\u0325 should not equal to a\u0325\u0300 without decomposition",
845779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes                myCollator.compare("\u00e0\u0325", "a\u0325\u0300") == 0);
855779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        myCollator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
865779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes        assertTrue("Error: \u00e0\u0325 should equal to a\u0325\u0300 with decomposition",
875779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes                myCollator.compare("\u00e0\u0325", "a\u0325\u0300") == 0);
885779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes    }
89a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes
90a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes    public void testEqualsObject() throws ParseException {
91a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        String rule = "< a < b < c < d < e";
92a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        RuleBasedCollator coll = new RuleBasedCollator(rule);
93a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes
94a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        assertEquals(Collator.TERTIARY, coll.getStrength());
95cf686df19a9f52169247b06b09587eafcdc9960aElliott Hughes        assertEquals(Collator.NO_DECOMPOSITION, coll.getDecomposition());
96a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        RuleBasedCollator other = new RuleBasedCollator(rule);
97a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        assertTrue(coll.equals(other));
98a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes
99a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        coll.setStrength(Collator.PRIMARY);
100a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        assertFalse(coll.equals(other));
101a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes
102a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        coll.setStrength(Collator.TERTIARY);
103a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        coll.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
104a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        other.setDecomposition(Collator.NO_DECOMPOSITION); // See comment above.
105a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        assertFalse(coll.equals(other));
106a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes    }
107a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes
108a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes    public void test_Harmony_1352() throws Exception {
109a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        // Regression test for HARMONY-1352, that doesn't get run in the harmony test suite because
110a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        // of an earlier failure.
111a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        try {
112a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes            new RuleBasedCollator("< a< b< c< d").getCollationElementIterator((CharacterIterator) null);
113a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes            fail("NullPointerException expected");
114a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        } catch (NullPointerException expected) {
115a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        }
116a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes    }
117a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes
118a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes    private void assertCollationElementIterator(CollationElementIterator it, Integer... offsets) {
119a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        for (int offset : offsets) {
120a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes            assertEquals(offset, it.getOffset());
121a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes            it.next();
122a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        }
123a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        assertEquals(CollationElementIterator.NULLORDER, it.next());
124a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes    }
125a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes
126a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes    private void assertGetCollationElementIteratorString(Locale l, String s, Integer... offsets) {
127a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        RuleBasedCollator coll = (RuleBasedCollator) Collator.getInstance(l);
128a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        assertCollationElementIterator(coll.getCollationElementIterator(s), offsets);
129a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes    }
130a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes
131a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes    private void assertGetCollationElementIteratorCharacterIterator(Locale l, String s, Integer... offsets) {
132a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        RuleBasedCollator coll = (RuleBasedCollator) Collator.getInstance(l);
133a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        CharacterIterator it = new StringCharacterIterator(s);
134a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        assertCollationElementIterator(coll.getCollationElementIterator(it), offsets);
135a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes    }
136a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes
137a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes    public void testGetCollationElementIteratorString() throws Exception {
138a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        assertGetCollationElementIteratorString(new Locale("es", "", "TRADITIONAL"), "cha", 0, 2, 3);
139a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        assertGetCollationElementIteratorString(new Locale("es", "", ""), "cha", 0, 1, 2, 3);
1403be1277a4644a149c158f99febbab890fc7b708fclaireho        assertGetCollationElementIteratorString(new Locale("de", "DE", ""), "\u00e6b", 0, 1, 1, 1, 1, 2);
141a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes    }
142a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes
143a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes    public void testGetCollationElementIteratorCharacterIterator() throws Exception {
144a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        assertGetCollationElementIteratorCharacterIterator(new Locale("es", "", "TRADITIONAL"), "cha", 0, 2, 3);
145a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes        assertGetCollationElementIteratorCharacterIterator(new Locale("es", "", ""), "cha", 0, 1, 2, 3);
1463be1277a4644a149c158f99febbab890fc7b708fclaireho        assertGetCollationElementIteratorCharacterIterator(new Locale("de", "DE", ""), "\u00e6b", 0, 1, 1, 1, 1, 2);
147a7d4139bed693bf6037bf5f7f49a24b077102adcElliott Hughes    }
1485779f05dd67ea322017c4ceb45270f5c6969d6b5Elliott Hughes}
149