blob: 65acd89f5d3e3b0a3a391be83a59d30863a87c85 [file] [log] [blame]
/*
*******************************************************************************
* Copyright (C) 2005-2007, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*******************************************************************************
*/
package com.ibm.icu.dev.test.stringprep;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;
import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.dev.test.TestUtil;
import com.ibm.icu.text.IDNA;
import com.ibm.icu.text.StringPrepParseException;
import com.ibm.icu.text.UTF16;
/**
* @author limaoyu
*
*/
public class IDNAConformanceTest extends TestFmwk {
public static void main(String[] args) throws Exception {
new IDNAConformanceTest().run(args);
}
public void TestConformance() {
TreeMap inputData = null;
try {
inputData = ReadInput.getInputData();
} catch (UnsupportedEncodingException e) {
errln(e.getMessage());
return;
} catch (IOException e) {
errln(e.getMessage());
return;
}
Set keyMap = inputData.keySet();
for (Iterator iter = keyMap.iterator(); iter.hasNext();) {
Long element = (Long) iter.next();
HashMap tempHash = (HashMap) inputData.get(element);
//get all attributes from input data
String passfail = (String) tempHash.get("passfail");
String desc = (String) tempHash.get("desc");
String type = (String) tempHash.get("type");
String namebase = (String) tempHash.get("namebase");
String nameutf8 = (String) tempHash.get("nameutf8");
String namezone = (String) tempHash.get("namezone");
String failzone1 = (String) tempHash.get("failzone1");
String failzone2 = (String) tempHash.get("failzone2");
//they maybe includes <*> style unicode
namebase = stringReplace(namebase);
namezone = stringReplace(namezone);
String result = null;
boolean failed = false;
if ("toascii".equals(tempHash.get("type"))) {
//get the result
try {
//by default STD3 rules are not used, but if the description
//includes UseSTD3ASCIIRules, we will set it.
if (desc.toLowerCase().indexOf(
"UseSTD3ASCIIRules".toLowerCase()) == -1) {
result = IDNA.convertIDNToASCII(namebase,
IDNA.ALLOW_UNASSIGNED).toString();
} else {
result = IDNA.convertIDNToASCII(namebase,
IDNA.USE_STD3_RULES).toString();
}
} catch (StringPrepParseException e2) {
//errln(e2.getMessage());
failed = true;
}
if ("pass".equals(passfail)) {
if (!namezone.equals(result)) {
printInfo(desc, namebase, nameutf8, namezone,
failzone1, failzone2, result, type, passfail);
errln("\t pass fail standard is pass, but failed");
} else {
printInfo(desc, namebase, nameutf8, namezone,
failzone1, failzone2, result, type, passfail);
logln("\tpassed");
}
}
if ("fail".equals(passfail)) {
if (failed) {
printInfo(desc, namebase, nameutf8, namezone,
failzone1, failzone2, result, type, passfail);
logln("passed");
} else {
printInfo(desc, namebase, nameutf8, namezone,
failzone1, failzone2, result, type, passfail);
errln("\t pass fail standard is fail, but no exception thrown out");
}
}
} else if ("tounicode".equals(tempHash.get("type"))) {
try {
//by default STD3 rules are not used, but if the description
//includes UseSTD3ASCIIRules, we will set it.
if (desc.toLowerCase().indexOf(
"UseSTD3ASCIIRules".toLowerCase()) == -1) {
result = IDNA.convertIDNToUnicode(namebase,
IDNA.ALLOW_UNASSIGNED).toString();
} else {
result = IDNA.convertIDNToUnicode(namebase,
IDNA.USE_STD3_RULES).toString();
}
} catch (StringPrepParseException e2) {
//errln(e2.getMessage());
failed = true;
}
if ("pass".equals(passfail)) {
if (!namezone.equals(result)) {
printInfo(desc, namebase, nameutf8, namezone,
failzone1, failzone2, result, type, passfail);
errln("\t Did not get the expected result. Expected: " + prettify(namezone) + " Got: " + prettify(result));
} else {
printInfo(desc, namebase, nameutf8, namezone,
failzone1, failzone2, result, type, passfail);
logln("\tpassed");
}
}
if ("fail".equals(passfail)) {
if (failed || namebase.equals(result)) {
printInfo(desc, namebase, nameutf8, namezone,
failzone1, failzone2, result, type, passfail);
logln("\tpassed");
} else {
printInfo(desc, namebase, nameutf8, namezone,
failzone1, failzone2, result, type, passfail);
errln("\t pass fail standard is fail, but no exception thrown out");
}
}
} else {
continue;
}
}
}
/**
* Print log message.
* @param desc
* @param namebase
* @param nameutf8
* @param namezone
* @param failzone1
* @param failzone2
* @param result
*/
private void printInfo(String desc, String namebase,
String nameutf8, String namezone, String failzone1,
String failzone2, String result, String type, String passfail) {
logln("desc:\t" + desc);
log("\t");
logln("type:\t" + type);
log("\t");
logln("pass fail standard:\t" + passfail);
log("\t");
logln("namebase:\t" + namebase);
log("\t");
logln("nameutf8:\t" + nameutf8);
log("\t");
logln("namezone:\t" + namezone);
log("\t");
logln("failzone1:\t" + failzone1);
log("\t");
logln("failzone2:\t" + failzone2);
log("\t");
logln("result:\t" + result);
}
/**
* Change unicode string from <00AD> to \u00AD, for the later is accepted
* by Java
* @param str String including <*> style unicode
* @return \\u String
*/
private static String stringReplace(String str) {
StringBuffer result = new StringBuffer();
char[] chars = str.toCharArray();
StringBuffer sbTemp = new StringBuffer();
for (int i = 0; i < chars.length; i++) {
if ('<' == chars[i]) {
sbTemp = new StringBuffer();
while ('>' != chars[i + 1]) {
sbTemp.append(chars[++i]);
}
/*
* The unicode sometimes is larger then \uFFFF, so have to use
* UTF16.
*/
int toBeInserted = Integer.parseInt(sbTemp.toString(), 16);
if ((toBeInserted >> 16) == 0) {
result.append((char) toBeInserted);
} else {
String utf16String = UTF16.valueOf(toBeInserted);
char[] charsTemp = utf16String.toCharArray();
for (int j = 0; j < charsTemp.length; j++) {
result.append((char) charsTemp[j]);
}
}
} else if ('>' == chars[i]) {//end when met with '>'
continue;
} else {
result.append(chars[i]);
}
}
return result.toString();
}
/**
* This class is used to read test data from TestInput file.
*
* @author limaoyu
*
*/
public static class ReadInput {
public static TreeMap getInputData() throws IOException,
UnsupportedEncodingException {
TreeMap result = new TreeMap();
try {
BufferedReader in = TestUtil.getDataReader("IDNATestInput.txt", "utf-8");
String tempStr = null;
int records = 0;
boolean firstLine = true;
HashMap hashItem = new HashMap();
while ((tempStr = in.readLine()) != null) {
//ignore the first line if it's "====="
if (firstLine) {
if ("=====".equals(tempStr))
continue;
firstLine = false;
}
//Ignore empty line
if ("".equals(tempStr)) {
continue;
}
String attr = "";//attribute
String body = "";//value
//get attr and body from line input, and then set them into each hash item.
int postion = tempStr.indexOf(":");
if (postion > -1) {
attr = tempStr.substring(0, postion).trim();
body = tempStr.substring(postion + 1).trim();
//deal with combination lines when end with '\'
while (null != body && body.length() > 0
&& '\\' == body.charAt(body.length() - 1)) {
body = body.substring(0, body.length() - 1);
body += "\n";
tempStr = in.readLine();
body += tempStr;
}
}
//push them to hash item
hashItem.put(attr, body);
//if met "=====", it means this item is finished
if ("=====".equals(tempStr)) {
//set them into result, using records number as key
result.put(new Long(records), hashItem);
//create another hash item and continue
hashItem = new HashMap();
records++;
continue;
}
}
} catch (UnsupportedEncodingException e) {
throw e;
} catch (FileNotFoundException e) {
throw e;
} catch (IOException e) {
throw e;
}
return result;
}
}
}