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