blob: e9a190a7f5940629a7b1f8eb254369ed41491604 [file] [log] [blame]
/*
*******************************************************************************
* Copyright (C) 2002, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
* $Source:
* $Date:
* $Revision:
*
*****************************************************************************************
*/
/**
* Port From: ICU4C v2.1 : collate/CollationMonkeyTest
* Source File: $ICU4CRoot/source/test/intltest/mnkytst.cpp
**/
package com.ibm.icu.dev.test.collator;
import com.ibm.icu.dev.test.*;
import com.ibm.icu.text.*;
import java.util.Random;
import java.util.Locale;
/**
* CollationMonkeyTest is a third level test class. This tests the random
* substrings of the default test strings to verify if the compare and
* sort key algorithm works correctly. For example, any string is always
* less than the string itself appended with any character.
*/
public class CollationMonkeyTest extends TestFmwk {
private String source = "-abcdefghijklmnopqrstuvwxyz#&^$@";
public static void main(String[] args) throws Exception {
new CollationMonkeyTest().run(args);
}
public void TestCollationKey() {
if(source.length() == 0) {
errln("CollationMonkeyTest.TestCollationKey(): source is empty - ICU_DATA not set or data missing?");
return;
}
Collator myCollator;
try {
myCollator = Collator.getInstance(new Locale("en", "US"));
} catch (Exception e) {
errln("ERROR: in creation of collator of ENGLISH locale");
return;
}
Random rand = new Random();
int s = rand.nextInt(0x7fff) % source.length();
int t = rand.nextInt(0x7fff) % source.length();
int slen = Math.abs(rand.nextInt(0x7fff) % source.length() - source.length()) % source.length();
int tlen = Math.abs(rand.nextInt(0x7fff) % source.length() - source.length()) % source.length();
String subs = source.substring(Math.min(s, slen), Math.min(s + slen, source.length()));
String subt = source.substring(Math.min(t, tlen), Math.min(t + tlen, source.length()));
CollationKey collationKey1, collationKey2;
myCollator.setStrength(Collator.TERTIARY);
collationKey1 = myCollator.getCollationKey(subs);
collationKey2 = myCollator.getCollationKey(subt);
int result = collationKey1.compareTo(collationKey2); // Tertiary
int revResult = collationKey2.compareTo(collationKey1); // Tertiary
report( subs, subt, result, revResult);
myCollator.setStrength(Collator.SECONDARY);
collationKey1 = myCollator.getCollationKey(subs);
collationKey2 = myCollator.getCollationKey(subt);
result = collationKey1.compareTo(collationKey2); // Secondary
revResult = collationKey2.compareTo(collationKey1); // Secondary
report( subs, subt, result, revResult);
myCollator.setStrength(Collator.PRIMARY);
collationKey1 = myCollator.getCollationKey(subs);
collationKey2 = myCollator.getCollationKey(subt);
result = collationKey1.compareTo(collationKey2); // Primary
revResult = collationKey2.compareTo(collationKey1); // Primary
report(subs, subt, result, revResult);
String msg = "";
String addOne = subs + String.valueOf(0xE000);
collationKey1 = myCollator.getCollationKey(subs);
collationKey2 = myCollator.getCollationKey(addOne);
result = collationKey1.compareTo(collationKey2);
if (result != -1) {
msg += "CollationKey(";
msg += subs;
msg += ") .LT. CollationKey(";
msg += addOne;
msg += ") Failed.";
errln(msg);
}
msg = "";
result = collationKey2.compareTo(collationKey1);
if (result != 1) {
msg += "CollationKey(";
msg += addOne;
msg += ") .GT. CollationKey(";
msg += subs;
msg += ") Failed.";
errln(msg);
}
}
// perform monkey tests using Collator.compare
public void TestCompare() {
if(source.length() == 0) {
errln("CollationMonkeyTest.TestCompare(): source is empty - ICU_DATA not set or data missing?");
return;
}
Collator myCollator;
try {
myCollator = Collator.getInstance(new Locale("en", "US"));
} catch (Exception e) {
errln("ERROR: in creation of collator of ENGLISH locale");
return;
}
/* Seed the random-number generator with current time so that
* the numbers will be different every time we run.
*/
Random rand = new Random();
int s = rand.nextInt(0x7fff) % source.length();
int t = rand.nextInt(0x7fff) % source.length();
int slen = Math.abs(rand.nextInt(0x7fff) % source.length() - source.length()) % source.length();
int tlen = Math.abs(rand.nextInt(0x7fff) % source.length() - source.length()) % source.length();
String subs = source.substring(Math.min(s, slen), Math.min(s + slen, source.length()));
String subt = source.substring(Math.min(t, tlen), Math.min(t + tlen, source.length()));
myCollator.setStrength(Collator.TERTIARY);
int result = myCollator.compare(subs, subt); // Tertiary
int revResult = myCollator.compare(subt, subs); // Tertiary
report(subs, subt, result, revResult);
myCollator.setStrength(Collator.SECONDARY);
result = myCollator.compare(subs, subt); // Secondary
revResult = myCollator.compare(subt, subs); // Secondary
report(subs, subt, result, revResult);
myCollator.setStrength(Collator.PRIMARY);
result = myCollator.compare(subs, subt); // Primary
revResult = myCollator.compare(subt, subs); // Primary
report(subs, subt, result, revResult);
String msg = "";
String addOne = subs + String.valueOf(0xE000);
result = myCollator.compare(subs, addOne);
if (result != -1) {
msg += "Test : ";
msg += subs;
msg += " .LT. ";
msg += addOne;
msg += " Failed.";
errln(msg);
}
msg = "";
result = myCollator.compare(addOne, subs);
if (result != 1) {
msg += "Test : ";
msg += addOne;
msg += " .GT. ";
msg += subs;
msg += " Failed.";
errln(msg);
}
}
void report(String s, String t, int result, int revResult) {
if (revResult != -result) {
String msg = "";
msg += s;
msg += " and ";
msg += t;
msg += " round trip comparison failed";
msg += " (result " + result + ", reverse Result " + revResult + ")";
errln(msg);
}
}
public void TestRules() {
String testSourceCases[] = {
"\u0061\u0062\u007a",
"\u0061\u0062\u007a",
};
String testTargetCases[] = {
"\u0061\u0062\u00e4",
"\u0061\u0062\u0061\u0308",
};
int i=0;
logln("Demo Test 1 : Create a new table collation with rules \"& z < 0x00e4\"");
Collator col = Collator.getInstance(new Locale("en", "US"));
String baseRules = ((RuleBasedCollator)col).getRules();
String newRules = " & z < ";
newRules = baseRules + newRules + String.valueOf(0x00e4);
RuleBasedCollator myCollation = null;
try {
myCollation = new RuleBasedCollator(newRules);
} catch (Exception e) {
errln( "Demo Test 1 Table Collation object creation failed.");
return;
}
for(i=0; i<2; i++){
doTest(myCollation, testSourceCases[i], testTargetCases[i], -1);
}
logln("Demo Test 2 : Create a new table collation with rules \"& z < a 0x0308\"");
newRules = "";
newRules = baseRules + " & z < a" + String.valueOf(0x0308);
try {
myCollation = new RuleBasedCollator(newRules);
} catch (Exception e) {
errln( "Demo Test 1 Table Collation object creation failed.");
return;
}
for(i=0; i<2; i++){
doTest(myCollation, testSourceCases[i], testTargetCases[i], -1);
}
}
void doTest(RuleBasedCollator myCollation, String mysource, String target, int result) {
int compareResult = myCollation.compare(source, target);
CollationKey sortKey1, sortKey2;
try {
sortKey1 = myCollation.getCollationKey(source);
sortKey2 = myCollation.getCollationKey(target);
} catch (Exception e) {
errln("SortKey generation Failed.\n");
return;
}
int keyResult = sortKey1.compareTo(sortKey2);
reportCResult( mysource, target, sortKey1, sortKey2, compareResult, keyResult, compareResult, result );
}
public 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);
}
}
}
String appendCompareResult(int result, String target) {
if (result == -1) { //LESS
target += "LESS";
} else if (result == 0) { //EQUAL
target += "EQUAL";
} else if (result == 1) { //GREATER
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;
}
}