blob: 6dac7fee94cd4487e4bcf4e24aa2c9d6d86de5e5 [file] [log] [blame]
/*
*******************************************************************************
* Copyright (C) 2002-2008, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
package com.ibm.icu.dev.test.collator;
import java.util.Locale;
import java.util.Random;
import com.ibm.icu.dev.test.*;
import com.ibm.icu.text.*;
/**
*
* CollationCreationMethodTest checks to ensure that the collators act the same whether they are created by choosing a
* locale and loading the data from file, or by using rules.
*
* @author Brian Rower - IBM - August 2008
*
*/
public class CollationCreationMethodTest extends TestFmwk
{
public static void main(String[] args) throws Exception
{
new CollationCreationMethodTest().run(args);
}
public void TestRuleVsLocaleCreationMonkey()
{
//create a RBC from a collator reader by reading in a locale collation file
//also create one simply from a rules string (which should be
//pulled from the locale collation file)
//and then do crazy monkey testing on it to make sure they are the same.
int x,y,z;
Random r = createRandom();
String randString1;
CollationKey key1;
CollationKey key2;
Locale[] locales = Collator.getAvailableLocales();
RuleBasedCollator localeCollator;
RuleBasedCollator ruleCollator;
for(z = 0; z < 60; z++)
{
x = r.nextInt(locales.length);
try
{
//this is making the assumption that the only type of collator that will be made is RBC
localeCollator = (RuleBasedCollator)Collator.getInstance(locales[x]);
ruleCollator = new RuleBasedCollator(localeCollator.getRules());
logln("Rules are: " + localeCollator.getRules());
}
catch (Exception e)
{
warnln("ERROR: in creation of collator of " + locales[x].getDisplayName() + " locale");
return;
}
//do it several times for each collator
int n = 3;
for(y = 0; y < n; y++)
{
randString1 = generateNewString(r);
key1 = localeCollator.getCollationKey(randString1);
key2 = ruleCollator.getCollationKey(randString1);
report(locales[x].getDisplayName(), randString1, key1, key2);
}
}
}
private String generateNewString(Random r)
{
int maxCodePoints = 40;
byte[] c = new byte[r.nextInt(maxCodePoints)*2]; //two bytes for each code point
int x;
int z;
String s = "";
for(x = 0; x < c.length/2; x = x + 2) //once around for each UTF-16 character
{
z = r.nextInt(0x7fff); //the code point...
c[x + 1] = (byte)z;
c[x] = (byte)(z >>> 4);
}
try
{
s = new String(c, "UTF-16BE");
}
catch(Exception e)
{
warnln("Error creating random strings");
}
return s;
}
private void report(String localeName, String string1, CollationKey k1, CollationKey k2)
{
if (!k1.equals(k2))
{
String msg = "";
msg += "With " + localeName + "Collator: ";
msg += string1;
msg += " failed to produce identical keys on both collators";
errln(msg);
}
}
}