blob: 68452e666c6471b26f7e350ce49bcfd16daf8dd5 [file] [log] [blame]
/*
* 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.AndroidOnly;
import dalvik.annotation.KnownFailure;
import dalvik.annotation.TestLevel;
import dalvik.annotation.TestTargetClass;
import dalvik.annotation.TestTargetNew;
import dalvik.annotation.TestTargets;
import junit.framework.TestCase;
import java.text.CharacterIterator;
import java.text.CollationElementIterator;
import java.text.CollationKey;
import java.text.Collator;
import java.text.ParseException;
import java.text.RuleBasedCollator;
import java.text.StringCharacterIterator;
import java.util.Locale;
@TestTargetClass(RuleBasedCollator.class)
public class RuleBasedCollatorTest extends TestCase {
/**
* @tests java.text.RuleBasedCollator#RuleBasedCollator(String)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "RuleBasedCollator",
args = {java.lang.String.class}
)
public void test_constrLRuleBasedCollatorLjava_lang_String() {
RuleBasedCollator rbc;
try {
rbc = new RuleBasedCollator("<a< b< c< d");
assertNotSame("RuleBasedCollator object is null", null, rbc);
} catch (java.text.ParseException pe) {
fail("java.text.ParseException is thrown for correct string");
}
try {
rbc = new RuleBasedCollator("<a< '&'b< \u0301< d");
assertNotSame("RuleBasedCollator object is null", null, rbc);
} catch (java.text.ParseException pe) {
fail("java.text.ParseException is thrown for correct string");
}
try {
new RuleBasedCollator(null);
fail("No Exception is thrown for correct string");
} catch (java.text.ParseException pe) {
fail("java.lang.NullPointerException is not thrown for correct string");
} catch (java.lang.NullPointerException npe) {
}
// Commented since fails agains RI and Android, too:
//
// // Android allows to pass empty rules to a collator. It results in
// // a collator with default UCA rules.
// try {
// new RuleBasedCollator("");
// } catch (java.text.ParseException pe) {
// fail("java.text.ParseException is thrown for empty string");
// }
try {
new RuleBasedCollator("1234567%$#845");
fail("java.text.ParseException is not thrown for wrong rules");
} catch (java.text.ParseException pe) {
}
}
@TestTargetNew(
level = TestLevel.PARTIAL,
notes = "Regression test. Doesn't verify positive functionality.",
method = "getCollationKey",
args = {java.lang.String.class}
)
public void test_getCollationKeyLjava_lang_String() {
// Regression test for HARMONY-28
String source = null;
RuleBasedCollator rbc = null;
try {
String Simple = "< a< b< c< d";
rbc = new RuleBasedCollator(Simple);
} catch (ParseException e) {
fail("Assert 0: Unexpected format exception " + e);
}
CollationKey ck = rbc.getCollationKey(source);
assertNull("Assert 1: getCollationKey (null) does not return null", ck);
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "hashCode",
args = {}
)
public void testHashCode() throws ParseException {
{
String rule = "< a < b < c < d";
RuleBasedCollator coll = new RuleBasedCollator(rule);
assertEquals(rule.hashCode(), coll.hashCode());
}
{
String rule = "< a < b < c < d < e";
RuleBasedCollator coll = new RuleBasedCollator(rule);
assertEquals(rule.hashCode(), coll.hashCode());
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "clone",
args = {}
)
public void testClone() throws ParseException {
RuleBasedCollator coll = (RuleBasedCollator) Collator
.getInstance(Locale.US);
RuleBasedCollator clone = (RuleBasedCollator) coll.clone();
assertNotSame(coll, clone);
assertEquals(coll.getRules(), clone.getRules());
assertEquals(coll.getDecomposition(), clone.getDecomposition());
assertEquals(coll.getStrength(), clone.getStrength());
}
/*
* Class under test for boolean equals(java.lang.Object)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "equals",
args = {java.lang.Object.class}
)
public void testEqualsObject() throws ParseException {
String rule = "< a < b < c < d < e";
RuleBasedCollator coll = new RuleBasedCollator(rule);
assertEquals(Collator.TERTIARY, coll.getStrength());
assertEquals(Collator.CANONICAL_DECOMPOSITION, coll.getDecomposition());
RuleBasedCollator other = new RuleBasedCollator(rule);
assertTrue(coll.equals(other));
coll.setStrength(Collator.PRIMARY);
assertFalse(coll.equals(other));
coll.setStrength(Collator.TERTIARY);
coll.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
assertTrue(coll.equals(other));
}
/*
* Class under test for int compare(java.lang.String, java.lang.String)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "compare",
args = {java.lang.String.class, java.lang.String.class}
)
public void testCompareStringString() throws ParseException {
String rule = "< c < b < a";
RuleBasedCollator coll = new RuleBasedCollator(rule);
assertEquals(-1, coll.compare("c", "a"));
assertEquals(-1, coll.compare("a", "d"));
assertEquals(1, coll.compare("3", "1"));
assertEquals(1, coll.compare("A", "1"));
assertEquals(0, coll.compare("A", "A"));
}
@TestTargetNew(
level = TestLevel.PARTIAL,
notes = "Doesn't verify null as a parameter.",
method = "getCollationKey",
args = {java.lang.String.class}
)
public void testGetCollationKey() {
RuleBasedCollator coll = (RuleBasedCollator) Collator
.getInstance(Locale.GERMAN);
String source = "abc";
CollationKey key1 = coll.getCollationKey(source);
assertEquals(source, key1.getSourceString());
String source2 = "abb";
CollationKey key2 = coll.getCollationKey(source2);
assertEquals(source2, key2.getSourceString());
assertTrue(key1.compareTo(key2) > 0);
assertTrue(coll.compare(source, source2) > 0);
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getRules",
args = {}
)
public void testGetRules() throws ParseException {
String rule = "< a = b < c";
RuleBasedCollator coll = new RuleBasedCollator(rule);
assertEquals(rule, coll.getRules());
}
/*
* Class under test for java.text.CollationElementIterator
* getCollationElementIterator(java.lang.String)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getCollationElementIterator",
args = {java.lang.String.class}
)
public void testGetCollationElementIteratorString() throws Exception {
{
Locale locale = new Locale("es", "", "TRADITIONAL");
RuleBasedCollator coll = (RuleBasedCollator) Collator
.getInstance(locale);
String source = "cha";
CollationElementIterator iterator = coll
.getCollationElementIterator(source);
int[] e_offset = { 0, 1, 2 };
int offset = iterator.getOffset();
int i = 0;
assertEquals(e_offset[i++], offset);
while (offset != source.length() - 1) {
iterator.next();
offset = iterator.getOffset();
assertEquals(e_offset[i++], offset);
}
}
{
Locale locale = new Locale("de", "DE");
RuleBasedCollator coll = (RuleBasedCollator) Collator
.getInstance(locale);
String source = "\u00E6b";
CollationElementIterator iterator = coll
.getCollationElementIterator(source);
int[] e_offset = { 0, 1, 1, 2 };
int offset = iterator.getOffset();
int i = 0;
assertEquals(e_offset[i++], offset);
while (offset != source.length()) {
iterator.next();
offset = iterator.getOffset();
assertEquals(e_offset[i++], offset);
}
}
// Regression for HARMONY-1352
try {
new RuleBasedCollator("< a< b< c< d").getCollationElementIterator((String)null);
fail("NullPointerException expected");
} catch (NullPointerException e) {
// expected
}
}
/*
* Class under test for java.text.CollationElementIterator
* getCollationElementIterator(java.text.CharacterIterator)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "getCollationElementIterator",
args = {java.text.CharacterIterator.class}
)
public void testGetCollationElementIteratorCharacterIterator() throws Exception {
{
Locale locale = new Locale("cs", "CZ", "");
RuleBasedCollator coll = (RuleBasedCollator) Collator
.getInstance(locale);
String text = "cha";
StringCharacterIterator source = new StringCharacterIterator(text);
CollationElementIterator iterator = coll
.getCollationElementIterator(source);
int[] e_offset = { 0, 2 };
int offset = iterator.getOffset();
int i = 0;
assertEquals(e_offset[i++], offset);
while (offset != text.length() - 1) {
iterator.next();
offset = iterator.getOffset();
assertEquals(e_offset[i], offset);
i++;
}
}
{
Locale locale = new Locale("de", "DE");
RuleBasedCollator coll = (RuleBasedCollator) Collator
.getInstance(locale);
String text = "\u00E6b";
StringCharacterIterator source = new StringCharacterIterator(text);
CollationElementIterator iterator = coll
.getCollationElementIterator(source);
int[] e_offset = { 0, 1, 1, 2 };
int offset = iterator.getOffset();
int i = 0;
assertEquals(e_offset[i++], offset);
while (offset != text.length()) {
iterator.next();
offset = iterator.getOffset();
assertEquals(e_offset[i++], offset);
}
}
// Regression for HARMONY-1352
try {
new RuleBasedCollator("< a< b< c< d").getCollationElementIterator((CharacterIterator)null);
fail("NullPointerException expected");
} catch (NullPointerException e) {
// expected
}
}
@TestTargets({
@TestTargetNew(
level = TestLevel.PARTIAL,
notes = "Doesn't verify setStrength method with PRIMARY, SECONDARY, TERTIARY or IDENTICAL values as a parameter; doesn't verify thatsetStrength method can throw IllegalArgumentException.",
method = "setStrength",
args = {int.class}
),
@TestTargetNew(
level = TestLevel.PARTIAL,
notes = "Doesn't verify setStrength method with PRIMARY, SECONDARY, TERTIARY or IDENTICAL values as a parameter; doesn't verify thatsetStrength method can throw IllegalArgumentException.",
method = "getStrength",
args = {}
)
})
public void testStrength() {
RuleBasedCollator coll = (RuleBasedCollator) Collator
.getInstance(Locale.US);
for (int i = 0; i < 4; i++) {
coll.setStrength(i);
assertEquals(i, coll.getStrength());
}
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "setDecomposition",
args = {int.class}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getDecomposition",
args = {}
)
})
public void testDecomposition() {
RuleBasedCollator coll = (RuleBasedCollator) Collator
.getInstance(Locale.US);
int [] decompositions = {Collator.NO_DECOMPOSITION,
Collator.CANONICAL_DECOMPOSITION};
for (int decom:decompositions) {
coll.setDecomposition(decom);
assertEquals(decom, coll.getDecomposition());
}
try {
coll.setDecomposition(-1);
fail("IllegalArgumentException was not thrown.");
} catch(IllegalArgumentException iae) {
//expected
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getInstance",
args = {}
)
public void testCollator_GetInstance() {
Collator coll = Collator.getInstance();
Object obj1 = "a";
Object obj2 = "b";
assertEquals(-1, coll.compare(obj1, obj2));
Collator.getInstance();
assertFalse(coll.equals("A", "\uFF21"));
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "getAvailableLocales",
args = {}
)
public void testGetAvaiableLocales() {
Locale[] locales = Collator.getAvailableLocales();
boolean isUS = false;
for (int i = 0; i < locales.length; i++) {
if(locales[i].equals(Locale.US))
isUS = true;
}
assertTrue("No Locale.US in the array.", isUS);
}
// Test CollationKey
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getCollationKey",
args = {java.lang.String.class}
)
public void testCollationKey() {
Collator coll = Collator.getInstance(Locale.US);
String text = "abc";
CollationKey key = coll.getCollationKey(text);
key.hashCode();
CollationKey key2 = coll.getCollationKey("abc");
assertEquals(0, key.compareTo(key2));
}
/**
* @tests java.text.RuleBasedCollator.RuleBasedCollator(java.lang.String)
*/
@TestTargetNew(
level = TestLevel.PARTIAL,
notes = "Verifies RuleBasedCollator(java.lang.String) constructor with null as a parameter.",
method = "RuleBasedCollator",
args = {java.lang.String.class}
)
public void testNullPointerException() throws Exception {
// Regression for HARMONY-241
try {
new RuleBasedCollator(null);
fail("Constructor RuleBasedCollator(null) "
+ "should throw NullPointerException");
} catch (NullPointerException e) {}
}
/**
* @tests java.text.RuleBasedCollator.compare(java.lang.String, java.lang.String)
*/
@TestTargetNew(
level = TestLevel.PARTIAL,
notes = "Verifies null as parameters.",
method = "compare",
args = {java.lang.String.class, java.lang.String.class}
)
public void testCompareNull() throws Exception {
// Regression for HARMONY-836
try {
new RuleBasedCollator("< a").compare(null, null);
fail("RuleBasedCollator.compare(null, null) "
+ "should throw NullPointerException");
} catch (NullPointerException e) {}
}
/**
* @tests java.text.RuleBasedCollator.RuleBasedCollator(java.lang.String)
*/
@TestTargetNew(
level = TestLevel.PARTIAL,
notes = "Verifies empty string as a parameter.",
method = "RuleBasedCollator",
args = {java.lang.String.class}
)
@AndroidOnly("Android uses icu for collating. " +
"Icu has default UCA rules it uses to collate. " +
"To create a default instance with these rules an empty " +
"rule has to be passed to icu. This behavior is different " +
"from the RI which would throw an exception.")
public void testEmptyStringException() {
try {
RuleBasedCollator coll = new RuleBasedCollator("");
assertTrue(coll.equals(new RuleBasedCollator("")));
} catch (ParseException e) {
fail("Constructor RuleBasedCollator(\"\") "
+ "should NOT throw ParseException.");
}
}
}