blob: 18a8c4ee627d220c260bb5598e9b3128ef6f5ad4 [file] [log] [blame]
/*****************************************************************************************
* *
* 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/20/2000 Madhu Creation.
************************************************************************/
#include "ittrans.h"
#include "hajatrts.h"
#include "unicode/utypes.h"
#include "unicode/translit.h"
#include "unicode/hangjamo.h"
#include "unicode/unifilt.h"
#include "intltest.h"
#include "cmemory.h"
#include <stdio.h>
#include <string.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 HangToJamoTransliteratorTest::runIndexedTest( int32_t index, UBool exec, char* &name, char* par )
{
if (exec) logln((UnicodeString)"TestSuite HangToJamoul Transliterator API ");
switch (index) {
case 0: name = "TestConstruction"; if (exec) TestConstruction(); break;
case 1: name = "TestCloneEqual"; if (exec) TestCloneEqual(); break;
case 2: name = "TestSimpleTransliterate"; if (exec) TestSimpleTransliterate(); break;
case 3: name = "TestTransliterate"; if (exec) TestTransliterate(); break;
case 4: name = "TestTransliterate2"; if (exec) TestTransliterate2(); break;
default: name = ""; break; /*needed to end loop*/
}
}
/**
* Used by TestConstruction() and TestTransliterate.
*/
class TestHangulFilter : public UnicodeFilter {
virtual UnicodeFilter* clone() const {
return new TestHangulFilter(*this);
}
virtual UBool contains(UChar c) const {
if(c == 0xae4c )
return FALSE;
else
return TRUE;
}
};
void HangToJamoTransliteratorTest::TestConstruction(){
logln("Testing the construction HangulJamoTransliterator()");
HangulJamoTransliterator *trans1=new HangulJamoTransliterator();
if(trans1 == 0){
errln("HangulJamoTransliterator() construction failed.");
return;
}
HangulJamoTransliterator *trans2=new HangulJamoTransliterator(new TestHangulFilter);
if(trans2 == 0){
errln("HangulJamoTransliterator(UnicodeFilter) construction failed.");
return;
}
logln("Testing copy construction");
HangulJamoTransliterator *trans2copy=new HangulJamoTransliterator(*trans2);
if(trans2copy == 0){
errln("HangulJamoTransliterator copy construction failed");
delete trans2;
}
if(trans2copy->getID() != trans2->getID() ||
trans2copy->getFilter() == NULL ||
trans2copy->getFilter()->contains(0xae4c) != trans2->getFilter()->contains(0xae4c) ) {
errln("Copy construction failed");
}
delete trans1;
delete trans2copy;
delete trans2;
}
void HangToJamoTransliteratorTest::TestCloneEqual(){
logln("Testing the clone and =operator of HangulJamoTransliterator");
HangulJamoTransliterator *trans1=new HangulJamoTransliterator();
if(trans1 == 0){
errln("HangulJamoTransliterator() construction failed.");
return;
}
HangulJamoTransliterator *trans2=new HangulJamoTransliterator(new TestHangulFilter);
if(trans2 == 0){
errln("HangulJamoTransliterator(UnicodeFilter) construction failed.");
return;
}
HangulJamoTransliterator *trans1equal=new HangulJamoTransliterator();
HangulJamoTransliterator *trans2equal=new HangulJamoTransliterator();
*trans1equal=*trans1;
*trans2equal=*trans2;
if(trans1equal == 0 || trans2equal==0 ){
errln("=Operator failed");
delete trans1;
delete trans2;
return;
}
if(trans1->getID() != trans1equal->getID() ||
trans1equal->getFilter() != NULL ||
trans2->getID() != trans2equal->getID() ||
trans2equal->getFilter() == NULL ||
trans2equal->getFilter()->contains(0xae4c) != trans2->getFilter()->contains(0xae4c) ) {
errln("=Operator failed");
}
HangulJamoTransliterator *trans1clone=(HangulJamoTransliterator*)trans1->clone();
HangulJamoTransliterator *trans2clone=(HangulJamoTransliterator*)trans2->clone();
if(trans1clone == 0 || trans2clone==0 ){
errln("clone() failed");
delete trans1;
delete trans2;
return;
}
if(trans1->getID() != trans1clone->getID() ||
trans1clone->getFilter() != NULL ||
trans2->getID() != trans2clone->getID() ||
trans2clone->getFilter() == NULL ||
trans2clone->getFilter()->contains(0x1101) != trans2->getFilter()->contains(0x1101) ) {
errln("=Operator failed");
}
delete trans1;
delete trans2;
}
void HangToJamoTransliteratorTest::TestSimpleTransliterate(){
logln("Testing the handleTransliterate() API of HangulJamoTransliterator()");
HangulJamoTransliterator *trans1=new HangulJamoTransliterator();
if(trans1==0){
errln("HangulJamoTransliterator construction failed");
return;
}
UChar src[]={ 0xae4c, 0xc139, 0xc54a, 0xc694, 0};
UnicodeString source(src);
UnicodeString expected(CharsToUnicodeString("\\u1101\\u1161\\u1109\\u1166\\u11a8\\u110b\\u1161\\u11ad\\u110b\\u116d"));
expect(*trans1, "", source, expected);
HangulJamoTransliterator *trans2=new HangulJamoTransliterator(new TestHangulFilter);
if(trans2==0){
errln("HangulJamoTransliterator(UnicodeFilter) construction failed");
return;
}
expect(*trans2, " with Filter(0xae4c) ", source, CharsToUnicodeString("\\uae4c\\u1109\\u1166\\u11a8\\u110b\\u1161\\u11ad\\u110b\\u116d"));
}
void HangToJamoTransliteratorTest::TestTransliterate2(){
logln("Testing the handleTransliterate() API HangulJamoTransliterator()");
HangulJamoTransliterator *trans1=new HangulJamoTransliterator();
if(trans1==0){
errln("HangulJamoTransliterator construction failed");
return;
}
UnicodeString source, expected, temp;
UChar choseong=0x1100;
UChar jungseong=0x1161;
UChar jongseong=0x11a8;
for(UChar c=0xac01;c<0xacff;++c){
source.append(c);
expected.append(choseong);
if(jongseong > 0x11c2){
jongseong=0x11a8;
jungseong++;
expected.append(jungseong);
}
else {
expected.append(jungseong);
expected.append(jongseong++);
}
expect(*trans1, "", source, expected);
source.remove();
expected.remove();
}
}
void HangToJamoTransliteratorTest::TestTransliterate(){
UnicodeString Data[]={
// source, index.contextStart, index.contextLimit, index.start, expectedResult, expectedResult using Filter(TestHangulFilter)
CharsToUnicodeString("\\u1100\\uae4c\\ub098"), "1", "3", "1",
CharsToUnicodeString("\\u1100\\u1101\\u1161\\u1102\\u1161"), CharsToUnicodeString("\\u1100\\uae4c\\u1102\\u1161"),
CharsToUnicodeString("\\uc5ec\\u1101"), "0", "1", "0",
CharsToUnicodeString("\\u110b\\u1167\\u1101"), CharsToUnicodeString("\\u110b\\u1167\\u1101"),
CharsToUnicodeString("\\uc5ec\\uae4c"), "0", "2", "0",
CharsToUnicodeString("\\u110b\\u1167\\u1101\\u1161"), CharsToUnicodeString("\\u110b\\u1167\\uae4c"),
};
int i;
HangulJamoTransliterator *trans1=new HangulJamoTransliterator();
if(trans1 == 0){
errln("HangulJamoTransliterator construction failed");
return;
}
HangulJamoTransliterator *trans2=new HangulJamoTransliterator(new TestHangulFilter);
if(trans2 == 0){
errln("HangulJamoTransliterator(UnicodeFilter) construction failed");
return;
}
for(i=0;i<sizeof(Data)/sizeof(Data[0]);i=i+6){
expectTranslit(*trans1, ":", Data[i+0], getInt(Data[i+1]), getInt(Data[i+2]), getInt(Data[i+3]), Data[i+4] );
expectTranslit(*trans2, " with Filter(0xae4c):", Data[i+0], getInt(Data[i+1]), getInt(Data[i+2]), getInt(Data[i+3]), Data[i+5] );
}
delete trans1;
delete trans2;
}
//======================================================================
// Support methods
//======================================================================
void HangToJamoTransliteratorTest::expectTranslit(const HangulJamoTransliterator& t,
const UnicodeString& message,
const UnicodeString& source,
int32_t start, int32_t limit, int32_t cursor,
const UnicodeString& expectedResult){
UTransPosition index={start, limit, cursor, limit};
UnicodeString rsource(source);
t.handleTransliterate(rsource, index, FALSE);
expectAux(t.getID() + ":handleTransliterator(increment=FALSE) " + message, source + "-->" + rsource, rsource==expectedResult, expectedResult);
UnicodeString rsource2(source);
UTransPosition _index={start, limit, cursor, limit};
uprv_memcpy(&index, &_index, sizeof(index));
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*/
HangulJamoTransliterator *copy=new HangulJamoTransliterator(t);
rsource2.remove();
rsource2.append(source);
uprv_memcpy(&index, &_index, sizeof(index));
copy->handleTransliterate(rsource2, index, FALSE);
expectAux(t.getID() + "COPY:handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult);
rsource2.remove();
rsource2.append(source);
uprv_memcpy(&index, &_index, sizeof(index));
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*/
HangulJamoTransliterator *clone=(HangulJamoTransliterator*)t.clone();
rsource2.remove();
rsource2.append(source);
uprv_memcpy(&index, &_index, sizeof(index));
clone->handleTransliterate(rsource2, index, FALSE);
expectAux(t.getID() + "CLONE:handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult);
rsource2.remove();
rsource2.append(source);
uprv_memcpy(&index, &_index, sizeof(index));
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*/
HangulJamoTransliterator equal=t;
rsource2.remove();
rsource2.append(source);
uprv_memcpy(&index, &_index, sizeof(index));
equal.handleTransliterate(rsource2, index, FALSE);
expectAux(t.getID() + "=OPERATOR:handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult);
rsource2.remove();
rsource2.append(source);
uprv_memcpy(&index, &_index, sizeof(index));
equal.handleTransliterate(rsource2, index, TRUE);
expectAux(t.getID() + "=OPERATOR:handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult);
delete clone;
}
void HangToJamoTransliteratorTest::expect(const HangulJamoTransliterator& 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);
UTransPosition index={0,source.length(),0,source.length()};
t.handleTransliterate(rsource, index, TRUE);
expectAux(t.getID() + ":handleTransliterate " + message, source + "->" + rsource, rsource==expectedResult, expectedResult);
}
void HangToJamoTransliteratorTest::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));
}
}