blob: 906857bdb82fe8146f03c8513c6b7fe4a7612933 [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.tests.java.text;
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;
import junit.framework.TestCase;
public class RuleBasedCollatorTest extends TestCase {
public void test_getCollationKeyLjava_lang_String() throws Exception {
// Regression test for HARMONY-28
String source = null;
String Simple = "&9 < a< b< c< d";
RuleBasedCollator rbc = new RuleBasedCollator(Simple);
CollationKey ck = rbc.getCollationKey(source);
assertNull("Assert 1: getCollationKey (null) does not return null", ck);
}
public void testHashCode() throws ParseException {
{
String rule = "&9 < a < b < c < d";
RuleBasedCollator coll = new RuleBasedCollator(rule);
assertEquals(rule.hashCode(), coll.hashCode());
}
{
String rule = "&9 < a < b < c < d < e";
RuleBasedCollator coll = new RuleBasedCollator(rule);
assertEquals(rule.hashCode(), coll.hashCode());
}
}
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());
}
public void testEqualsObject() throws ParseException {
String rule = "&9 < a < b < c < d < e";
RuleBasedCollator coll = new RuleBasedCollator(rule);
assertEquals(Collator.TERTIARY, coll.getStrength());
assertEquals(Collator.NO_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);
assertFalse(coll.equals(other));
}
public void testCompareStringString() throws ParseException {
String rule = "&9 < c < b < a";
RuleBasedCollator coll = new RuleBasedCollator(rule);
assertEquals(-1, coll.compare("c", "a"));
}
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);
}
public void testGetRules() throws ParseException {
String rule = "&9 < a = b < c";
RuleBasedCollator coll = new RuleBasedCollator(rule);
assertEquals(rule, coll.getRules());
}
public void testGetCollationElementIteratorString() throws Exception {
{
Locale locale = Locale.forLanguageTag("es-u-co-trad");
RuleBasedCollator coll = (RuleBasedCollator) Collator.getInstance(locale);
String source = "cha";
CollationElementIterator iterator = coll.getCollationElementIterator(source);
int[] e_offset = { 0, 2, 3 };
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);
}
assertEquals(CollationElementIterator.NULLORDER, iterator.next());
}
{
Locale locale = new Locale("de", "DE");
RuleBasedCollator coll = (RuleBasedCollator) Collator.getInstance(locale);
String source = "\u00fcb";
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);
}
assertEquals(CollationElementIterator.NULLORDER, iterator.next());
}
//Regression for HARMONY-1352
try {
new RuleBasedCollator("&9 < a< b< c< d").getCollationElementIterator((String)null);
fail();
} catch (NullPointerException expected) {
}
}
public void testGetCollationElementIteratorCharacterIterator() throws Exception {
{
Locale locale = Locale.forLanguageTag("es-u-co-trad");
RuleBasedCollator coll = (RuleBasedCollator) Collator.getInstance(locale);
String text = "cha";
StringCharacterIterator source = new StringCharacterIterator(text);
CollationElementIterator iterator = coll.getCollationElementIterator(source);
int[] e_offset = { 0, 2, 3 };
int offset = iterator.getOffset();
int i = 0;
assertEquals(e_offset[i++], offset);
while (offset != text.length()) {
iterator.next();
offset = iterator.getOffset();
// System.out.println(offset);
assertEquals(e_offset[i++], offset);
}
assertEquals(CollationElementIterator.NULLORDER, iterator.next());
}
{
Locale locale = new Locale("de", "DE");
RuleBasedCollator coll = (RuleBasedCollator) Collator.getInstance(locale);
String text = "\u00fcb";
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);
}
assertEquals(CollationElementIterator.NULLORDER, iterator.next());
}
//Regression for HARMONY-1352
try {
new RuleBasedCollator("&9 < a< b< c< d").getCollationElementIterator((CharacterIterator)null);
fail();
} catch (NullPointerException expected) {
}
}
public void testStrength() {
RuleBasedCollator coll = (RuleBasedCollator) Collator.getInstance(Locale.US);
for (int i = 0; i < 4; i++) {
coll.setStrength(i);
assertEquals(i, coll.getStrength());
}
}
public void testDecomposition() {
RuleBasedCollator coll = (RuleBasedCollator) Collator.getInstance(Locale.US);
for (int i = 0; i < 2; i++) {
coll.setDecomposition(i);
assertEquals(i, coll.getDecomposition());
}
}
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"));
}
public void testGetAvailableLocales() {
assertTrue(Collator.getAvailableLocales().length > 0);
}
// Test CollationKey
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));
}
public void testNullPointerException() throws Exception {
//Regression for HARMONY-241
try {
new RuleBasedCollator(null);
fail();
} catch (NullPointerException expected) {
}
}
public void testCompareNull() throws Exception {
//Regression for HARMONY-836
try {
new RuleBasedCollator("&9 < a").compare(null, null);
fail();
} catch (NullPointerException expected) {
}
}
public void testEmptyRules() throws Exception {
new RuleBasedCollator("");
new RuleBasedCollator(" ");
new RuleBasedCollator("# This is a comment.");
}
}