blob: 30f440a827fd1d45a2c1ddc8d5257627a7de7c62 [file] [log] [blame]
/*
*******************************************************************************
* Copyright (C) 2002-2010, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
/**
* Port From: ICU4C v2.1 : Collate/CollationFrenchTest
* Source File: $ICU4CRoot/source/test/intltest/frcoll.cpp
**/
package com.ibm.icu.dev.test.collator;
import java.util.Locale;
import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.text.CollationKey;
import com.ibm.icu.text.Collator;
import com.ibm.icu.text.RuleBasedCollator;
public class CollationFrenchTest extends TestFmwk{
public static void main(String[] args) throws Exception {
new CollationFrenchTest().run(args);
}
private static char[][] testSourceCases = {
{0x0061/*'a'*/, 0x0062/*'b'*/, 0x0063/*'c'*/},
{0x0043/*'C'*/, 0x004f/*'O'*/, 0x0054/*'T'*/, 0x0045/*'E'*/},
{0x0063/*'c'*/, 0x006f/*'o'*/, 0x002d/*'-'*/, 0x006f/*'o'*/, 0x0070/*'p'*/},
{0x0070/*'p'*/, 0x00EA, 0x0063/*'c'*/, 0x0068/*'h'*/, 0x0065/*'e'*/},
{0x0070/*'p'*/, 0x00EA, 0x0063/*'c'*/, 0x0068/*'h'*/, 0x0065/*'e'*/, 0x0072/*'r'*/},
{0x0070/*'p'*/, 0x00E9, 0x0063/*'c'*/, 0x0068/*'h'*/, 0x0065/*'e'*/, 0x0072/*'r'*/},
{0x0070/*'p'*/, 0x00E9, 0x0063/*'c'*/, 0x0068/*'h'*/, 0x0065/*'e'*/, 0x0072/*'r'*/},
{0x0048/*'H'*/, 0x0065/*'e'*/, 0x006c/*'l'*/, 0x006c/*'l'*/, 0x006f/*'o'*/},
{0x01f1},
{0xfb00},
{0x01fa},
{0x0101}
};
private static char[][] testTargetCases = {
{0x0041/*'A'*/, 0x0042/*'B'*/, 0x0043/*'C'*/},
{0x0063/*'c'*/, 0x00f4, 0x0074/*'t'*/, 0x0065/*'e'*/},
{0x0043/*'C'*/, 0x004f/*'O'*/, 0x004f/*'O'*/, 0x0050/*'P'*/},
{0x0070/*'p'*/, 0x00E9, 0x0063/*'c'*/, 0x0068/*'h'*/, 0x00E9},
{0x0070/*'p'*/, 0x00E9, 0x0063/*'c'*/, 0x0068/*'h'*/, 0x00E9},
{0x0070/*'p'*/, 0x00EA, 0x0063/*'c'*/, 0x0068/*'h'*/, 0x0065/*'e'*/},
{0x0070/*'p'*/, 0x00EA, 0x0063/*'c'*/, 0x0068/*'h'*/, 0x0065/*'e'*/, 0x0072/*'r'*/},
{0x0068/*'h'*/, 0x0065/*'e'*/, 0x006c/*'l'*/, 0x006c/*'l'*/, 0x004f/*'O'*/},
{0x01ee},
{0x25ca},
{0x00e0},
{0x01df}
};
private static int[] results = {
-1,
-1,
-1, /*Collator::GREATER,*/
-1,
1,
1,
-1,
1,
-1, /*Collator::GREATER,*/
1,
-1,
-1
};
// 0x0300 is grave, 0x0301 is acute
// the order of elements in this array must be different than the order in CollationEnglishTest
private static char[][] testAcute = {
/*00*/ {0x0065/*'e'*/, 0x0065/*'e'*/},
/*01*/ {0x0065/*'e'*/, 0x0301, 0x0065/*'e'*/},
/*02*/ {0x0065/*'e'*/, 0x0300, 0x0301, 0x0065/*'e'*/},
/*03*/ {0x0065/*'e'*/, 0x0300, 0x0065/*'e'*/},
/*04*/ {0x0065/*'e'*/, 0x0301, 0x0300, 0x0065/*'e'*/},
/*05*/ {0x0065/*'e'*/, 0x0065/*'e'*/, 0x0301},
/*06*/ {0x0065/*'e'*/, 0x0301, 0x0065/*'e'*/, 0x0301},
/*07*/ {0x0065/*'e'*/, 0x0300, 0x0301, 0x0065/*'e'*/, 0x0301},
/*08*/ {0x0065/*'e'*/, 0x0300, 0x0065/*'e'*/, 0x0301},
/*09*/ {0x0065/*'e'*/, 0x0301, 0x0300, 0x0065/*'e'*/, 0x0301},
/*0a*/ {0x0065/*'e'*/, 0x0065/*'e'*/, 0x0300, 0x0301},
/*0b*/ {0x0065/*'e'*/, 0x0301, 0x0065/*'e'*/, 0x0300, 0x0301},
/*0c*/ {0x0065/*'e'*/, 0x0300, 0x0301, 0x0065/*'e'*/, 0x0300, 0x0301},
/*0d*/ {0x0065/*'e'*/, 0x0300, 0x0065/*'e'*/, 0x0300, 0x0301},
/*0e*/ {0x0065/*'e'*/, 0x0301, 0x0300, 0x0065/*'e'*/, 0x0300, 0x0301},
/*0f*/ {0x0065/*'e'*/, 0x0065/*'e'*/, 0x0300},
/*10*/ {0x0065/*'e'*/, 0x0301, 0x0065/*'e'*/, 0x0300},
/*11*/ {0x0065/*'e'*/, 0x0300, 0x0301, 0x0065/*'e'*/, 0x0300},
/*12*/ {0x0065/*'e'*/, 0x0300, 0x0065/*'e'*/, 0x0300},
/*13*/ {0x0065/*'e'*/, 0x0301, 0x0300, 0x0065/*'e'*/, 0x0300},
/*14*/ {0x0065/*'e'*/, 0x0065/*'e'*/, 0x0301, 0x0300},
/*15*/ {0x0065/*'e'*/, 0x0301, 0x0065/*'e'*/, 0x0301, 0x0300},
/*16*/ {0x0065/*'e'*/, 0x0300, 0x0301, 0x0065/*'e'*/, 0x0301, 0x0300},
/*17*/ {0x0065/*'e'*/, 0x0300, 0x0065/*'e'*/, 0x0301, 0x0300},
/*18*/ {0x0065/*'e'*/, 0x0301, 0x0300, 0x0065/*'e'*/, 0x0301, 0x0300}
};
private static char[][] testBugs = {
{0x0061/*'a'*/},
{0x0041/*'A'*/},
{0x0065/*'e'*/},
{0x0045/*'E'*/},
{0x00e9},
{0x00e8},
{0x00ea},
{0x00eb},
{0x0065/*'e'*/, 0x0061/*'a'*/},
{0x0078/*'x'*/}
};
private Collator myCollation = null;
public CollationFrenchTest() {
}
protected void init()throws Exception{
myCollation = Collator.getInstance(Locale.CANADA_FRENCH);
}
// perform tests with strength TERTIARY
public void TestTertiary() {
int i = 0;
myCollation.setStrength(Collator.TERTIARY);
for (i = 0; i < 12 ; i++) {
doTest(testSourceCases[i], testTargetCases[i], results[i]);
}
}
// perform tests with strength SECONDARY
public void TestSecondary() {
//test acute and grave ordering
int i = 0;
int j;
int expected;
myCollation.setStrength(Collator.SECONDARY);
for (i = 0; i < testAcute.length; i++) {
for (j = 0; j < testAcute.length; j++) {
if (i < j) {
expected = -1;
} else if (i == j) {
expected = 0;
} else {
expected = 1;
}
doTest(testAcute[i], testAcute[j], expected );
}
}
}
// perform extra tests
public void TestExtra() {
int i, j;
myCollation.setStrength(Collator.TERTIARY);
for (i = 0; i < 9 ; i++) {
for (j = i + 1; j < 10; j += 1) {
doTest(testBugs[i], testBugs[j], -1);
}
}
}
public void TestContinuationReordering()
{
String rule = "&0x2f00 << 0x2f01";
try {
RuleBasedCollator collator = new RuleBasedCollator(rule);
collator.setFrenchCollation(true);
CollationKey key1
= collator.getCollationKey("a\u0325\u2f00\u2f01b\u0325");
CollationKey key2
= collator.getCollationKey("a\u0325\u2f01\u2f01b\u0325");
if (key1.compareTo(key2) >= 0) {
errln("Error comparing continuation strings");
}
} catch (Exception e) {
errln(e.toString());
}
}
// main test routine, test rules specific to the french locale
private void doTest(char[] source, char[] target, int result) {
String s = new String(source);
String t = new String(target);
int compareResult = myCollation.compare(s, t);
CollationKey sortKey1, sortKey2;
sortKey1 = myCollation.getCollationKey(s);
sortKey2 = myCollation.getCollationKey(t);
int keyResult = sortKey1.compareTo(sortKey2);
reportCResult(s, t, sortKey1, sortKey2, compareResult, keyResult, compareResult, result);
}
private void reportCResult( String source, String target, CollationKey sourceKey, CollationKey targetKey,
int compareResult, int keyResult, int incResult, int expectedResult ) {
if (expectedResult < -1 || expectedResult > 1) {
errln("***** invalid call to reportCResult ****");
return;
}
boolean ok1 = (compareResult == expectedResult);
boolean ok2 = (keyResult == expectedResult);
boolean ok3 = (incResult == expectedResult);
if (ok1 && ok2 && ok3 && !isVerbose()) {
return;
} else {
String msg1 = ok1? "Ok: compare(\"" : "FAIL: compare(\"";
String msg2 = "\", \"";
String msg3 = "\") returned ";
String msg4 = "; expected ";
String sExpect = new String("");
String sResult = new String("");
sResult = appendCompareResult(compareResult, sResult);
sExpect = appendCompareResult(expectedResult, sExpect);
if (ok1) {
logln(msg1 + source + msg2 + target + msg3 + sResult);
} else {
errln(msg1 + source + msg2 + target + msg3 + sResult + msg4 + sExpect);
}
msg1 = ok2 ? "Ok: key(\"" : "FAIL: key(\"";
msg2 = "\").compareTo(key(\"";
msg3 = "\")) returned ";
sResult = appendCompareResult(keyResult, sResult);
if (ok2) {
logln(msg1 + source + msg2 + target + msg3 + sResult);
} else {
errln(msg1 + source + msg2 + target + msg3 + sResult + msg4 + sExpect);
msg1 = " ";
msg2 = " vs. ";
errln(msg1 + prettify(sourceKey) + msg2 + prettify(targetKey));
}
msg1 = ok3 ? "Ok: incCompare(\"" : "FAIL: incCompare(\"";
msg2 = "\", \"";
msg3 = "\") returned ";
sResult = appendCompareResult(incResult, sResult);
if (ok3) {
logln(msg1 + source + msg2 + target + msg3 + sResult);
} else {
errln(msg1 + source + msg2 + target + msg3 + sResult + msg4 + sExpect);
}
}
}
private String appendCompareResult(int result, String target) {
if (result == -1) {
target += "LESS";
} else if (result == 0) {
target += "EQUAL";
} else if (result == 1) {
target += "GREATER";
} else {
String huh = "?";
target += huh + result;
}
return target;
}
String prettify(CollationKey sourceKey) {
int i;
byte[] bytes= sourceKey.toByteArray();
String target = "[";
for (i = 0; i < bytes.length; i++) {
target += Integer.toHexString(bytes[i]);
target += " ";
}
target += "]";
return target;
}
}