scuffed-code/icu4c/source/test/intltest/hxuntrts.cpp
2000-05-18 22:08:39 +00:00

413 lines
17 KiB
C++

/*****************************************************************************************
* *
* COPYRIGHT: *
* (C) Copyright International Business Machines Corporation, 2000 *
* Licensed Material - Program-Property of IBM - All Rights Reserved. *
* US Government Users Restricted Rights - Use, duplication, or disclosure *
* restricted by GSA ADP Schedule Contract with IBM Corp. *
* *
*****************************************************************************************
************************************************************************
* Date Name Description
* 03/17/2000 Madhu Creation.
************************************************************************/
#include "ittrans.h"
#include "hxuntrts.h"
#include "unicode/utypes.h"
#include "unicode/translit.h"
#include "unicode/hextouni.h"
#include "unicode/unifilt.h"
#include "intltest.h"
#include <string.h>
#include <stdio.h>
/*converts a Unicodestring to integer*/
static int32_t getInt(UnicodeString str)
{
int len=str.length();
char *alias;
char *buffer=new char[len+1];
alias=buffer;
for(int i=0; i< len; i++){
*alias=(char)str.charAt(i);
alias++;
}
*alias='\0';
return atoi(buffer);
}
//---------------------------------------------
// runIndexedTest
//---------------------------------------------
void HexToUniTransliteratorTest::runIndexedTest( int32_t index, UBool exec, char* &name, char* par )
{
if (exec) logln((UnicodeString)"TestSuite HexadecimalToUnicode Transliterator API ");
switch (index) {
case 0: name = "TestConstruction"; if (exec) TestConstruction(); break;
case 1: name = "TestCloneEqual"; if (exec) TestCloneEqual(); break;
case 2: name = "TestPattern"; if (exec) TestPattern(); break;
case 3: name = "TestSimpleTransliterate"; if (exec) TestSimpleTransliterate(); break;
case 4: name = "TestTransliterate"; if (exec) TestTransliterate(); break;
default: name = ""; break; /*needed to end loop*/
}
}
/**
* Used by TestConstruction() and TestTransliterate.
*/
class TestHexFilter : public UnicodeFilter {
virtual UnicodeFilter* clone() const {
return new TestHexFilter(*this);
}
virtual UBool contains(UChar c) const {
if(c == 0x0061 || c == 0x0063 )
return FALSE;
else
return TRUE;
}
};
void HexToUniTransliteratorTest::TestConstruction(){
UErrorCode status=U_ZERO_ERROR;
logln("Testing the construction HexToUnicodeTransliterator()");
HexToUnicodeTransliterator *trans1=new HexToUnicodeTransliterator();
if(trans1==0){
errln("HexToUnicodeTransliterator construction failed Error=" + (UnicodeString)u_errorName(status));
return;
}
delete trans1;
logln("Testing the cosntruction HexToUnicodeTransliterator(pattern, status)");
UnicodeString pattern("\\\\U+0000abc");
trans1=new HexToUnicodeTransliterator(pattern, status);
if(U_FAILURE(status)){
errln("HexToUnicodeTransliterator construction failed with pattern =" + pattern + " Error=" + (UnicodeString)u_errorName(status));
status=U_ZERO_ERROR;
return;
}
delete trans1;
logln("Testing the construction HexToUnicodeTransliterator(pattern, status) with illegal pattern");
UnicodeString pattern2("\\X+");
trans1=new HexToUnicodeTransliterator(pattern2, status);
if(U_FAILURE(status)){
logln("OK: HexToUnicodeTransliterator construction for illegal pattern failed, as expected");
status=U_ZERO_ERROR;
} else {
errln("Error: calling the HexToUnicodeTransliterator constructor with illegal pattern should fail");
delete trans1;
}
logln("Testing the construction HexToUnicodeTransliterator(pattern, adoptedFilter, status)");
trans1=new HexToUnicodeTransliterator(pattern, NULL, status);
if(U_FAILURE(status)){
errln("HexToUnicodeTransliterator construction failed. Error=" + (UnicodeString)u_errorName(status));
status=U_ZERO_ERROR;
return;
}
logln("Testing the copy construction");
HexToUnicodeTransliterator *trans1copy=new HexToUnicodeTransliterator(*trans1);
if(trans1->toPattern() != trans1copy->toPattern() ||
trans1->getID() != trans1copy->getID() ){
errln("Copy construction failed");
}
delete trans1copy;
delete trans1;
logln("Testing the construction HexToUnicodeTransliterator(adoptedFilter)");
trans1=new HexToUnicodeTransliterator(new TestHexFilter);
if(trans1 == 0){
errln("HexToUnicodeTransliterator construction failed. Error=" + (UnicodeString)u_errorName(status));
return;
}
logln("Testing the copy construction");
trans1copy=new HexToUnicodeTransliterator(*trans1);
if(trans1->getFilter() == NULL || trans1copy->getFilter() == NULL ||
trans1->toPattern() != trans1copy->toPattern() ||
trans1->getID() != trans1copy->getID() ){
errln("Copy construction failed");
}
delete trans1copy;
delete trans1;
}
void HexToUniTransliteratorTest::TestCloneEqual(){
UErrorCode status=U_ZERO_ERROR;
HexToUnicodeTransliterator *transdefault=new HexToUnicodeTransliterator();
UnicodeString pattern1("\\U##00");
UnicodeString pattern2("\\\\uni0000");
HexToUnicodeTransliterator *trans1=new HexToUnicodeTransliterator(pattern1, status);
if(U_FAILURE(status) && status==U_ILLEGAL_ARGUMENT_ERROR){
errln("HexToUnicodeTransliterator construction failed");
status=U_ZERO_ERROR;
return;
}
HexToUnicodeTransliterator *trans2=new HexToUnicodeTransliterator(pattern2, status);
if(U_FAILURE(status) && status==U_ILLEGAL_ARGUMENT_ERROR){
errln("HexToUnicodeTransliterator construction failed");
status=U_ZERO_ERROR;
return;
}
logln("Testing the clone() API of the HexToUnicodeTransliterator");
HexToUnicodeTransliterator *transdefaultclone=(HexToUnicodeTransliterator*)transdefault->clone();
HexToUnicodeTransliterator *trans1clone=(HexToUnicodeTransliterator*)trans1->clone();
HexToUnicodeTransliterator *trans2clone=(HexToUnicodeTransliterator*)trans2->clone();
if(transdefault->toPattern() != transdefaultclone->toPattern() ||
trans1->toPattern() != trans1clone->toPattern() ||
trans2->toPattern() != trans2clone->toPattern() ||
transdefault->toPattern() == trans1->toPattern() ||
trans1->toPattern() == trans2clone->toPattern() ||
trans2->toPattern() == transdefault->toPattern() ) {
errln("Error: clone() failed");
}
logln("Testing the =operator of the HexToUnicodeTransliterator");
HexToUnicodeTransliterator *transdefaultequal=transdefault;
HexToUnicodeTransliterator *trans1equal=trans1;
HexToUnicodeTransliterator *trans2equal=trans2;
if(transdefault->toPattern() != transdefaultequal->toPattern() ||
trans1->toPattern() != trans1equal->toPattern() ||
trans2->toPattern() != trans2equal->toPattern() ||
transdefault->toPattern() == trans1->toPattern() ||
trans1->toPattern() == trans2equal->toPattern() ||
trans2->toPattern() == transdefault->toPattern() ) {
errln("Error: equal() failed");
}
if(transdefaultclone->toPattern() != transdefaultequal->toPattern() ||
trans1equal->toPattern() != trans1clone->toPattern() ||
trans2clone->toPattern() != trans2equal->toPattern() ){
errln("Error: equal() or clone() failed");
}
delete transdefault;
delete trans1;
delete trans2;
}
void HexToUniTransliteratorTest::TestPattern(){
logln("Testing the applyPattern() and toPattern() API of HexToUnicodeTransliterator");
UErrorCode status = U_ZERO_ERROR;
/*default transliterator has pattern \\u0000*/
HexToUnicodeTransliterator *transdefault=new HexToUnicodeTransliterator();
if(transdefault == 0){
errln("HexToUnicodeTransliterator construction failed. Error=" + (UnicodeString)u_errorName(status));
return;
}
UnicodeString defaultpattern=transdefault->toPattern();
UnicodeString pattern1("\\\\U+0000");
HexToUnicodeTransliterator *trans1=new HexToUnicodeTransliterator(pattern1, NULL, status);
if(U_FAILURE(status) ){
errln("HexToUnicodeTransliterator construction failed with pattern =" + pattern1);
status=U_ZERO_ERROR;
return;
}
/*test toPattern() */
if(transdefault->toPattern() == trans1->toPattern() ||
transdefault->toPattern() != UnicodeString("\\\\u0000;\\\\U0000;u+0000;U+0000") ||
trans1->toPattern() != pattern1 ){
errln("Error: toPattern() failed "+ transdefault->toPattern());
}
/*apply patterns for transdefault*/
UnicodeString str("abKf");
expectPattern(*transdefault, pattern1, "\\U+0061\\U+0062\\U+004B\\U+0066", str);
expectPattern(*transdefault, "\\U##00,", "U61,U62,U4B,U66,", str);
expectPattern(*transdefault, defaultpattern, "\\u0061\\u0062\\u004B\\u0066", str);
expectPattern(*trans1, "\\uni0000", "uni0061uni0062uni004Buni0066", str);
expectPattern(*trans1, "\\\\S-0000-E", "\\S-0061-E\\S-0062-E\\S-004B-E\\S-0066-E", str);
expectPattern(*trans1, "\\u##0000", "\\u##0061\\u##0062", "FAIL");
expectPattern(*trans1, "\\*0000", "*0061*0062*004B*0066", str);
expectPattern(*trans1, "\\u####", "\\u##0061\\u##0062", "FAIL");
delete trans1;
delete transdefault;
}
void HexToUniTransliteratorTest::TestSimpleTransliterate(){
logln("Testing the handleTransliterate() API of HexToUnicodeTransliterator");
UErrorCode status=U_ZERO_ERROR;
UnicodeString pattern1("\\\\U+0000");
HexToUnicodeTransliterator *trans1=new HexToUnicodeTransliterator(pattern1, NULL, status);
if(U_FAILURE(status)){
errln("HexToUnicodeTransliterator construction failed with pattern =" + pattern1 + "Error: " + (UnicodeString)u_errorName(status));
status=U_ZERO_ERROR;
return;
}
UnicodeString source("He\\U+006C\\U+006C\\U+006F");
UnicodeString rsource(source);
Transliterator::Position index(1, source.length(),2);
UnicodeString expected("Hello");
trans1->handleTransliterate(rsource, index, FALSE);
expectAux(trans1->getID() + ":handleTransliterator ", source + "-->" + rsource, rsource==expected, expected);
expect(*trans1, "", "\\U+0048\\U+0065\\U+006C\\U+006C\\U+006F", expected);
delete trans1;
HexToUnicodeTransliterator *trans2=new HexToUnicodeTransliterator(new TestHexFilter);
expect(*trans2, "with Filter(0x0061, 0x0063) ", CharsToUnicodeString("\\u0061\\u0062\\u0063"),
CharsToUnicodeString("\\u0061b\\u0063") );
delete trans2;
}
void HexToUniTransliteratorTest::TestTransliterate(){
UErrorCode status=U_ZERO_ERROR;
UnicodeString Data[]={
//pattern, source, index.start, index.limit, index.cursor, expectedResult,
"U+##00", "abU+63", "1", "7", "2", "abc",
"\\\\u0000", "a\\u0062c", "1", "7", "1", "abc",
"Uni0000", "abUni0063", "1", "9", "2", "abc",
"U[0000]", "heU[006C]U[006C]o", "0", "16", "2", "hello",
"prefix-0000-suffix", "aprefix-0062-suffixprefix-0063-suffix", "1", "39", "1", "abc",
"*##00*", "hell*6F**74**68**65*re", "1", "20", "4", "hellothere",
};
int i;
for(i=0;i<sizeof(Data)/sizeof(Data[0]);i=i+6){
HexToUnicodeTransliterator *trans1=new HexToUnicodeTransliterator(Data[i+0], NULL, status);
if(U_FAILURE(status)){
errln("HexToUnicodeTransliterator construction failed with pattern =" + Data[i+0]);
status=U_ZERO_ERROR;
continue;
}
expectTranslit(*trans1, "", Data[i+1], getInt(Data[i+2]), getInt(Data[i+3]), getInt(Data[i+4]), Data[i+5] );
delete trans1;
}
}
//======================================================================
// Support methods
//======================================================================
void HexToUniTransliteratorTest::expectTranslit(const HexToUnicodeTransliterator& t,
const UnicodeString& message,
const UnicodeString& source,
int32_t start, int32_t limit, int32_t cursor,
const UnicodeString& expectedResult){
Transliterator::Position index(start, limit, cursor);
UnicodeString rsource(source);
t.handleTransliterate(rsource, index, FALSE);
expectAux(t.getID() + ":handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource, rsource==expectedResult, expectedResult);
UnicodeString rsource2(source);
index=Transliterator::Position(start, limit, cursor);
t.handleTransliterate(rsource2, index, TRUE);
expectAux(t.getID() + ":handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult);
/*ceates a copy constructor and checks the transliteration*/
HexToUnicodeTransliterator *copy=new HexToUnicodeTransliterator(t);
rsource2.remove();
rsource2.append(source);
index=Transliterator::Position(start, limit, cursor);
copy->handleTransliterate(rsource2, index, FALSE);
expectAux(t.getID() + "COPY:handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult);
rsource2.remove();
rsource2.append(source);
index=Transliterator::Position(start, limit, cursor);
copy->handleTransliterate(rsource2, index, TRUE);
expectAux(t.getID() + "COPY:handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult);
delete copy;
/*creates a clone and tests transliteration*/
HexToUnicodeTransliterator *clone=(HexToUnicodeTransliterator*)t.clone();
rsource2.remove();
rsource2.append(source);
index=Transliterator::Position(start, limit, cursor);
clone->handleTransliterate(rsource2, index, FALSE);
expectAux(t.getID() + "CLONE:handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult);
rsource2.remove();
rsource2.append(source);
index=Transliterator::Position(start, limit, cursor);
clone->handleTransliterate(rsource2, index, TRUE);
expectAux(t.getID() + "CLONE:handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult);
/*Uses the assignment operator to create a transliterator and tests transliteration*/
HexToUnicodeTransliterator equal=t;
rsource2.remove();
rsource2.append(source);
index=Transliterator::Position(start, limit, cursor);
equal.handleTransliterate(rsource2, index, FALSE);
expectAux(t.getID() + "=OPERATOR:handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult);
rsource2.remove();
rsource2.append(source);
index=Transliterator::Position(start, limit, cursor);
equal.handleTransliterate(rsource2, index, TRUE);
expectAux(t.getID() + "=OPERATOR:handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult);
}
void HexToUniTransliteratorTest::expectPattern(HexToUnicodeTransliterator& t,
const UnicodeString& pattern,
const UnicodeString& source,
const UnicodeString& expectedResult){
UErrorCode status=U_ZERO_ERROR;
t.applyPattern(pattern, status);
if(expectedResult == "FAIL"){
if(U_FAILURE(status)){
logln("OK: calling applyPattern() with illegal pattern failed as expected. Error=" + (UnicodeString)u_errorName(status));
status=U_ZERO_ERROR;
return;
}
}
else{
if(U_FAILURE(status)){
errln("Error: applyPattern() failed with pattern =" + pattern + "--->" + (UnicodeString)u_errorName(status));
return;
}else {
if(t.toPattern() != pattern) {
errln("Error: applyPattern or toPatten failed. Expected: " + pattern + "Got: " + t.toPattern());
}
else{
logln("OK: applyPattern passed. Testing transliteration");
expect(t, " with pattern "+pattern, source, expectedResult);
}
}
}
}
void HexToUniTransliteratorTest::expect(const HexToUnicodeTransliterator& t,
const UnicodeString& message,
const UnicodeString& source,
const UnicodeString& expectedResult) {
UnicodeString rsource(source);
t.transliterate(rsource);
expectAux(t.getID() + ":Replaceable " + message, source + "->" + rsource, rsource==expectedResult, expectedResult);
// Test handleTransliterate (incremental) transliteration --
rsource.remove();
rsource.append(source);
Transliterator::Position index(0,source.length(),0);
t.handleTransliterate(rsource, index, TRUE);
expectAux(t.getID() + ":handleTransliterate " + message, source + "->" + rsource, rsource==expectedResult, expectedResult);
}
void HexToUniTransliteratorTest::expectAux(const UnicodeString& tag,
const UnicodeString& summary, UBool pass,
const UnicodeString& expectedResult) {
if (pass) {
logln(UnicodeString("(")+tag+") " + prettify(summary));
} else {
errln(UnicodeString("FAIL: (")+tag+") "
+ prettify(summary)
+ ", expected " + prettify(expectedResult));
}
}