| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.harmony.text.tests.java.text; |
| |
| import dalvik.annotation.KnownFailure; |
| import dalvik.annotation.TestLevel; |
| import dalvik.annotation.TestTargetClass; |
| import dalvik.annotation.TestTargetNew; |
| import dalvik.annotation.TestTargets; |
| |
| import java.io.UnsupportedEncodingException; |
| import java.text.CollationKey; |
| import java.text.Collator; |
| import java.text.ParseException; |
| import java.text.RuleBasedCollator; |
| import java.util.Locale; |
| |
| @TestTargetClass(Collator.class) |
| public class CollatorTest extends junit.framework.TestCase { |
| |
| /** |
| * @tests java.text.Collator#clone() |
| */ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "", |
| method = "clone", |
| args = {} |
| ) |
| public void test_clone() { |
| Collator c = Collator.getInstance(Locale.GERMAN); |
| Collator c2 = (Collator) c.clone(); |
| assertTrue("Clones answered false to equals", c.equals(c2)); |
| assertTrue("Clones were equivalent", c != c2); |
| } |
| |
| /** |
| * @tests java.text.Collator#compare(java.lang.Object, java.lang.Object) |
| */ |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "", |
| method = "compare", |
| args = {java.lang.Object.class, java.lang.Object.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "", |
| method = "setStrength", |
| args = {int.class} |
| ) |
| }) |
| public void test_compareLjava_lang_ObjectLjava_lang_Object() { |
| Collator c = Collator.getInstance(Locale.FRENCH); |
| Object o, o2; |
| |
| c.setStrength(Collator.IDENTICAL); |
| o = "E"; |
| o2 = "F"; |
| assertTrue("a) Failed on primary difference", c.compare(o, o2) < 0); |
| o = "e"; |
| o2 = "\u00e9"; |
| assertTrue("a) Failed on secondary difference", c.compare(o, o2) < 0); |
| o = "e"; |
| o2 = "E"; |
| assertTrue("a) Failed on tertiary difference", c.compare(o, o2) < 0); |
| o = "\u0001"; |
| o2 = "\u0002"; |
| assertTrue("a) Failed on identical", c.compare(o, o2) < 0); |
| o = "e"; |
| o2 = "e"; |
| assertEquals("a) Failed on equivalence", 0, c.compare(o, o2)); |
| assertTrue("a) Failed on primary expansion", |
| c.compare("\u01db", "v") < 0); |
| |
| c.setStrength(Collator.TERTIARY); |
| o = "E"; |
| o2 = "F"; |
| assertTrue("b) Failed on primary difference", c.compare(o, o2) < 0); |
| o = "e"; |
| o2 = "\u00e9"; |
| assertTrue("b) Failed on secondary difference", c.compare(o, o2) < 0); |
| o = "e"; |
| o2 = "E"; |
| assertTrue("b) Failed on tertiary difference", c.compare(o, o2) < 0); |
| o = "\u0001"; |
| o2 = "\u0002"; |
| assertEquals("b) Failed on identical", 0, c.compare(o, o2)); |
| o = "e"; |
| o2 = "e"; |
| assertEquals("b) Failed on equivalence", 0, c.compare(o, o2)); |
| |
| c.setStrength(Collator.SECONDARY); |
| o = "E"; |
| o2 = "F"; |
| assertTrue("c) Failed on primary difference", c.compare(o, o2) < 0); |
| o = "e"; |
| o2 = "\u00e9"; |
| assertTrue("c) Failed on secondary difference", c.compare(o, o2) < 0); |
| o = "e"; |
| o2 = "E"; |
| assertEquals("c) Failed on tertiary difference", 0, c.compare(o, o2)); |
| o = "\u0001"; |
| o2 = "\u0002"; |
| assertEquals("c) Failed on identical", 0, c.compare(o, o2)); |
| o = "e"; |
| o2 = "e"; |
| assertEquals("c) Failed on equivalence", 0, c.compare(o, o2)); |
| |
| c.setStrength(Collator.PRIMARY); |
| o = "E"; |
| o2 = "F"; |
| assertTrue("d) Failed on primary difference", c.compare(o, o2) < 0); |
| o = "e"; |
| o2 = "\u00e9"; |
| assertEquals("d) Failed on secondary difference", 0, c.compare(o, o2)); |
| o = "e"; |
| o2 = "E"; |
| assertEquals("d) Failed on tertiary difference", 0, c.compare(o, o2)); |
| o = "\u0001"; |
| o2 = "\u0002"; |
| assertEquals("d) Failed on identical", 0, c.compare(o, o2)); |
| o = "e"; |
| o2 = "e"; |
| assertEquals("d) Failed on equivalence", 0, c.compare(o, o2)); |
| |
| try { |
| c.compare("e", new StringBuffer("Blah")); |
| } catch (ClassCastException e) { |
| // correct |
| return; |
| } |
| fail("Failed to throw ClassCastException"); |
| } |
| |
| /** |
| * @tests java.text.Collator#equals(java.lang.Object) |
| */ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "", |
| method = "equals", |
| args = {java.lang.Object.class} |
| ) |
| public void test_equalsLjava_lang_Object() { |
| Collator c = Collator.getInstance(Locale.ENGLISH); |
| Collator c2 = (Collator) c.clone(); |
| assertTrue("Cloned collators not equal", c.equals(c2)); |
| c2.setStrength(Collator.SECONDARY); |
| assertTrue("Collators with different strengths equal", !c.equals(c2)); |
| } |
| |
| /** |
| * @tests java.text.Collator#equals(java.lang.String, java.lang.String) |
| */ |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "", |
| method = "equals", |
| args = {java.lang.String.class, java.lang.String.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "", |
| method = "setStrength", |
| args = {int.class} |
| ) |
| }) |
| public void test_equalsLjava_lang_StringLjava_lang_String() { |
| Collator c = Collator.getInstance(Locale.FRENCH); |
| |
| c.setStrength(Collator.IDENTICAL); |
| assertTrue("a) Failed on primary difference", !c.equals("E", "F")); |
| assertTrue("a) Failed on secondary difference", !c |
| .equals("e", "\u00e9")); |
| assertTrue("a) Failed on tertiary difference", !c.equals("e", "E")); |
| assertTrue("a) Failed on identical", !c.equals("\u0001", "\u0002")); |
| assertTrue("a) Failed on equivalence", c.equals("e", "e")); |
| |
| c.setStrength(Collator.TERTIARY); |
| assertTrue("b) Failed on primary difference", !c.equals("E", "F")); |
| assertTrue("b) Failed on secondary difference", !c |
| .equals("e", "\u00e9")); |
| assertTrue("b) Failed on tertiary difference", !c.equals("e", "E")); |
| assertTrue("b) Failed on identical", c.equals("\u0001", "\u0002")); |
| assertTrue("b) Failed on equivalence", c.equals("e", "e")); |
| |
| c.setStrength(Collator.SECONDARY); |
| assertTrue("c) Failed on primary difference", !c.equals("E", "F")); |
| assertTrue("c) Failed on secondary difference", !c |
| .equals("e", "\u00e9")); |
| assertTrue("c) Failed on tertiary difference", c.equals("e", "E")); |
| assertTrue("c) Failed on identical", c.equals("\u0001", "\u0002")); |
| assertTrue("c) Failed on equivalence", c.equals("e", "e")); |
| |
| c.setStrength(Collator.PRIMARY); |
| assertTrue("d) Failed on primary difference", !c.equals("E", "F")); |
| assertTrue("d) Failed on secondary difference", c.equals("e", "\u00e9")); |
| assertTrue("d) Failed on tertiary difference", c.equals("e", "E")); |
| assertTrue("d) Failed on identical", c.equals("\u0001", "\u0002")); |
| assertTrue("d) Failed on equivalence", c.equals("e", "e")); |
| } |
| |
| /** |
| * @tests java.text.Collator#getAvailableLocales() |
| */ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "getAvailableLocales", |
| args = {} |
| ) |
| public void test_getAvailableLocales() { |
| Locale[] locales = Collator.getAvailableLocales(); |
| assertTrue("No locales", locales.length > 0); |
| boolean hasUS = false; |
| for (int i = locales.length; --i >= 0;) { |
| Collator c1 = Collator.getInstance(locales[i]); |
| assertTrue("Doesn't work", c1.compare("a", "b") < 0); |
| assertTrue("Wrong decomposition", |
| c1.getDecomposition() == Collator.NO_DECOMPOSITION); |
| assertTrue("Wrong strength", c1.getStrength() == Collator.TERTIARY); |
| // The default decomposition for collators created with getInstance |
| // is NO_DECOMPOSITION where collators created from rules have |
| // CANONICAL_DECOMPOSITION. Verified on RI. |
| c1.setDecomposition(Collator.CANONICAL_DECOMPOSITION); |
| if (locales[i].equals(Locale.US)) { |
| hasUS = true; |
| } |
| if (c1 instanceof RuleBasedCollator) { |
| String rule = ""; |
| Collator temp = null; |
| try { |
| rule = ((RuleBasedCollator) c1).getRules(); |
| temp = new RuleBasedCollator(rule); |
| } catch (ParseException e) { |
| fail(e.getMessage() + " for rule: \"" + rule + "\""); |
| } |
| assertTrue("Can't recreate: " + locales[i], temp.equals(c1)); |
| } |
| } |
| assertTrue("en_US locale not available", hasUS); |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "", |
| method = "Collator", |
| args = {} |
| ) |
| public void test_Constructor() { |
| TestCollator collator = new TestCollator(); |
| assertEquals(Collator.TERTIARY, collator.getStrength()); |
| } |
| |
| /** |
| * @tests java.text.Collator#getDecomposition() |
| */ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "getDecomposition", |
| args = {} |
| ) |
| public void test_getDecomposition() { |
| RuleBasedCollator collator; |
| try { |
| collator = new RuleBasedCollator("; \u0300 < a, A < b < c < d"); |
| } catch (ParseException e) { |
| fail("ParseException"); |
| return; |
| } |
| assertTrue("Wrong default", |
| collator.getDecomposition() == Collator.CANONICAL_DECOMPOSITION); |
| |
| collator.setDecomposition(Collator.NO_DECOMPOSITION); |
| assertEquals(Collator.NO_DECOMPOSITION, collator.getDecomposition()); |
| |
| // BEGIN android-removed |
| // Android doesn't support full decomposition |
| // collator.setDecomposition(Collator.FULL_DECOMPOSITION); |
| // assertEquals(Collator.FULL_DECOMPOSITION, collator.getDecomposition()); |
| // EN android-removed |
| } |
| |
| /** |
| * @tests java.text.Collator#getInstance() |
| */ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "", |
| method = "getInstance", |
| args = {} |
| ) |
| public void test_getInstance() { |
| Collator c1 = Collator.getInstance(); |
| Collator c2 = Collator.getInstance(Locale.getDefault()); |
| assertTrue("Wrong locale", c1.equals(c2)); |
| } |
| |
| /** |
| * @tests java.text.Collator#getInstance(java.util.Locale) |
| */ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "", |
| method = "getInstance", |
| args = {java.util.Locale.class} |
| ) |
| public void test_getInstanceLjava_util_Locale() { |
| assertTrue("Used to test", true); |
| } |
| |
| /** |
| * @tests java.text.Collator#getStrength() |
| */ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| notes = "", |
| method = "getStrength", |
| args = {} |
| ) |
| public void test_getStrength() { |
| RuleBasedCollator collator; |
| try { |
| collator = new RuleBasedCollator("; \u0300 < a, A < b < c < d"); |
| } catch (ParseException e) { |
| fail("ParseException"); |
| return; |
| } |
| assertTrue("Wrong default", collator.getStrength() == Collator.TERTIARY); |
| } |
| |
| /** |
| * @tests java.text.Collator#setDecomposition(int) |
| */ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "setDecomposition", |
| args = {int.class} |
| ) |
| public void test_setDecompositionI() { |
| Collator c = Collator.getInstance(Locale.FRENCH); |
| c.setStrength(Collator.IDENTICAL); |
| c.setDecomposition(Collator.NO_DECOMPOSITION); |
| assertFalse("Collator should not be using decomposition", c.equals( |
| "\u212B", "\u00C5")); // "ANGSTROM SIGN" and "LATIN CAPITAL |
| // LETTER A WITH RING ABOVE" |
| c.setDecomposition(Collator.CANONICAL_DECOMPOSITION); |
| assertTrue("Collator should be using decomposition", c.equals("\u212B", |
| "\u00C5")); // "ANGSTROM SIGN" and "LATIN CAPITAL LETTER A WITH |
| // RING ABOVE" |
| // BEGIN android-removed |
| // Android doesn't support FULL_DECOMPOSITION |
| // c.setDecomposition(Collator.FULL_DECOMPOSITION); |
| // assertTrue("Should be equal under full decomposition", c.equals( |
| // "\u2163", "IV")); // roman number "IV" |
| // END android-removed |
| |
| try { |
| c.setDecomposition(-1); |
| fail("IllegalArgumentException should be thrown."); |
| } catch(IllegalArgumentException iae) { |
| //expected |
| } |
| } |
| |
| /** |
| * @tests java.text.Collator#setStrength(int) |
| */ |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| notes = "Verifies IllegalArgumentException.", |
| method = "setStrength", |
| args = {int.class} |
| ) |
| public void test_setStrengthI() { |
| // Functionality is verified in compare and equals tests. |
| Collator collator = Collator.getInstance(); |
| collator.setStrength(Collator.PRIMARY); |
| assertEquals(Collator.PRIMARY, collator.getStrength()); |
| |
| collator.setStrength(Collator.SECONDARY); |
| assertEquals(Collator.SECONDARY, collator.getStrength()); |
| |
| collator.setStrength(Collator.TERTIARY); |
| assertEquals(Collator.TERTIARY, collator.getStrength()); |
| |
| collator.setStrength(Collator.IDENTICAL); |
| assertEquals(Collator.IDENTICAL, collator.getStrength()); |
| |
| try { |
| collator.setStrength(-1); |
| fail("IllegalArgumentException was not thrown."); |
| } catch(IllegalArgumentException iae) { |
| //expected |
| } |
| } |
| // Regression test for Android bug |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.PARTIAL, |
| notes = "Regression test.", |
| method = "setStrength", |
| args = {int.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL, |
| notes = "Regression test.", |
| method = "getCollationKey", |
| args = {java.lang.String.class} |
| ) |
| }) |
| public void test_stackCorruption() { |
| Collator mColl = Collator.getInstance(); |
| mColl.setStrength(Collator.PRIMARY); |
| mColl.getCollationKey("2d294f2d3739433565147655394f3762f3147312d3731641452f310"); |
| } |
| |
| // Test to verify that very large collation keys are not truncated. |
| @TestTargetNew( |
| level = TestLevel.PARTIAL, |
| notes = "Doesn't verify null as a parameter.", |
| method = "getCollationKey", |
| args = {java.lang.String.class} |
| ) |
| public void test_collationKeySize() { |
| StringBuilder b = new StringBuilder(); |
| for (int i = 0; i < 1024; i++) { |
| b.append("0123456789ABCDEF"); |
| } |
| String sixteen = b.toString(); |
| b.append("_THE_END"); |
| String sixteenplus = b.toString(); |
| |
| Collator mColl = Collator.getInstance(); |
| mColl.setStrength(Collator.PRIMARY); |
| |
| try { |
| byte [] arr = mColl.getCollationKey(sixteen).toByteArray(); |
| int len = arr.length; |
| assertTrue("Collation key not 0 terminated", arr[arr.length - 1] == 0); |
| len--; |
| String foo = new String(arr, 0, len, "iso8859-1"); |
| |
| arr = mColl.getCollationKey(sixteen).toByteArray(); |
| len = arr.length; |
| assertTrue("Collation key not 0 terminated", arr[arr.length - 1] == 0); |
| len--; |
| String bar = new String(arr, 0, len, "iso8859-1"); |
| |
| assertTrue("Collation keys should differ", foo.equals(bar)); |
| } catch (UnsupportedEncodingException ex) { |
| fail("UnsupportedEncodingException"); |
| } |
| } |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.PARTIAL, |
| notes = "", |
| method = "setDecomposition", |
| args = {int.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL, |
| notes = "", |
| method = "compare", |
| args = {java.lang.String.class, java.lang.String.class} |
| ) |
| }) |
| public void test_decompositionCompatibility() { |
| Collator myCollator = Collator.getInstance(); |
| myCollator.setDecomposition(Collator.NO_DECOMPOSITION); |
| assertFalse("Error: \u00e0\u0325 should not equal to a\u0325\u0300 " + |
| "without decomposition", |
| myCollator.compare("\u00e0\u0325", "a\u0325\u0300") == 0); |
| myCollator.setDecomposition(Collator.CANONICAL_DECOMPOSITION); |
| assertTrue("Error: \u00e0\u0325 should equal to a\u0325\u0300 " + |
| "with decomposition", |
| myCollator.compare("\u00e0\u0325", "a\u0325\u0300") == 0); |
| } |
| |
| class TestCollator extends Collator { |
| |
| @Override |
| public int compare(String source, String target) { |
| return 0; |
| } |
| |
| @Override |
| public CollationKey getCollationKey(String source) { |
| return null; |
| } |
| |
| @Override |
| public int hashCode() { |
| return 0; |
| } |
| |
| } |
| } |