From f28b4cfe69fda1a880b87a9531c61261db8006f5 Mon Sep 17 00:00:00 2001 From: Alan Liu Date: Tue, 27 Jun 2000 16:27:02 +0000 Subject: [PATCH] ICU-450 transliterator C api X-SVN-Rev: 1650 --- icu4c/source/test/cintltst/calltest.c | 2 + icu4c/source/test/cintltst/cintltst.dsp | 4 + icu4c/source/test/cintltst/utransts.c | 191 ++++++++++++++++++++++++ 3 files changed, 197 insertions(+) create mode 100644 icu4c/source/test/cintltst/utransts.c diff --git a/icu4c/source/test/cintltst/calltest.c b/icu4c/source/test/cintltst/calltest.c index 43bde3f2af3..a53499bbe36 100644 --- a/icu4c/source/test/cintltst/calltest.c +++ b/icu4c/source/test/cintltst/calltest.c @@ -24,6 +24,7 @@ void addCollTest(TestNode** root); void addComplexTest(TestNode** root); void addUDataTest(TestNode** root); void addUTF16Test(TestNode** root); +void addUTransTest(TestNode** root); void addAllTests(TestNode** root) { @@ -35,4 +36,5 @@ void addAllTests(TestNode** root) addCollTest(root); addComplexTest(root); addUDataTest(root); + addUTransTest(root); } diff --git a/icu4c/source/test/cintltst/cintltst.dsp b/icu4c/source/test/cintltst/cintltst.dsp index ecae9a56a13..7ec13e96b33 100644 --- a/icu4c/source/test/cintltst/cintltst.dsp +++ b/icu4c/source/test/cintltst/cintltst.dsp @@ -262,6 +262,10 @@ SOURCE=.\udatatst.c SOURCE=.\utf16tst.c # End Source File +# Begin Source File + +SOURCE=.\utransts.c +# End Source File # End Group # Begin Group "Header Files" diff --git a/icu4c/source/test/cintltst/utransts.c b/icu4c/source/test/cintltst/utransts.c new file mode 100644 index 00000000000..797021d76aa --- /dev/null +++ b/icu4c/source/test/cintltst/utransts.c @@ -0,0 +1,191 @@ +/* +******************************************************************************* +* Copyright (C) 1997-2000, International Business Machines +* Corporation and others. All Rights Reserved. +******************************************************************************* +* Date Name Description +* 06/23/00 aliu Creation. +******************************************************************************* +*/ + +#include "unicode/utrans.h" +#include "cmemory.h" +#include "cstring.h" +#include "filestrm.h" +#include "cintltst.h" +#include "unicode/ustring.h" +#include + +#define TEST(x) addTest(root, &x, "utrans/" # x) + +void TestAPI(); +void TestSimpleRules(); +static void _expectRules(const char*, const char*, const char*); + +void +addUTransTest(TestNode** root) { + TEST(TestAPI); + TEST(TestSimpleRules); +} + +void TestAPI() { + enum { BUF_CAP = 128 }; + char buf[BUF_CAP], buf2[BUF_CAP]; + UErrorCode status = U_ZERO_ERROR; + UTransliterator* trans = NULL; + int32_t i, n; + + /* Test getAvailableIDs */ + n = utrans_countAvailableIDs(); + if (n < 1) { + log_err("FAIL: utrans_countAvailableIDs() returned %d\n", n); + } else { + log_verbose("System ID count: %d\n", n); + } + for (i=0; ix|y + * 2. yc>z + * + * []|eabcd start - no match, copy e to tranlated buffer + * [e]|abcd match rule 1 - copy output & adjust cursor + * [ex|y]cd match rule 2 - copy output & adjust cursor + * [exz]|d no match, copy d to transliterated buffer + * [exzd]| done + */ + _expectRules("ab>x|y;" + "yc>z", + "eabcd", "exzd"); + + /* Another set of rules: + * 1. ab>x|yzacw + * 2. za>q + * 3. qc>r + * 4. cw>n + * + * []|ab Rule 1 + * [x|yzacw] No match + * [xy|zacw] Rule 2 + * [xyq|cw] Rule 4 + * [xyqn]| Done + */ + _expectRules("ab>x|yzacw;" + "za>q;" + "qc>r;" + "cw>n", + "ab", "xyqn"); + + /* Test categories + */ + _expectRules("$dummy=" "\\uE100" ";" /* careful here with E100 */ + "$vowel=[aeiouAEIOU];" + "$lu=[:Lu:];" + "$vowel } $lu > '!';" + "$vowel > '&';" + "'!' { $lu > '^';" + "$lu > '*';" + "a > ERROR", + "abcdefgABCDEFGU", "&bcd&fg!^**!^*&"); +} + +void _expectRules(const char* crules, + const char* cfrom, + const char* cto) { + /* u_uastrcpy has no capacity param for the buffer -- so just + * make all buffers way too big */ + enum { CAP = 256 }; + UChar rules[CAP]; + UChar from[CAP]; + UChar to[CAP]; + UChar buf[CAP]; + UTransliterator *trans; + UErrorCode status = U_ZERO_ERROR; + UParseError parseErr; + int32_t limit; + UTransPosition pos; + + u_uastrcpy(rules, crules); + u_uastrcpy(from, cfrom); + u_uastrcpy(to, cto); + + trans = utrans_openRules("ID", rules, -1, UTRANS_FORWARD, + &parseErr, &status); + if (U_FAILURE(status)) { + utrans_close(trans); + log_err("FAIL: utrans_openRules(%s) failed, error=%s\n", + crules, u_errorName(status)); + return; + } + + /* utrans_transUChars() */ + u_strcpy(buf, from); + limit = u_strlen(buf); + utrans_transUChars(trans, buf, NULL, CAP, 0, &limit, &status); + if (U_FAILURE(status)) { + utrans_close(trans); + log_err("FAIL: utrans_transUChars() failed, error=%s\n", + u_errorName(status)); + return; + } + + if (0 == u_strcmp(buf, to)) { + log_verbose("Ok: utrans_transUChars(%s) x %s -> %s\n", + crules, cfrom, cto); + } else { + char actual[CAP]; + u_austrcpy(actual, buf); + log_err("FAIL: utrans_transUChars(%s) x %s -> %s, expected %s\n", + crules, cfrom, actual, cto); + } + + /* utrans_transIncrementalUChars() */ + u_strcpy(buf, from); + pos.start = pos.cursor = 0; + pos.end = pos.limit = u_strlen(buf); + utrans_transIncrementalUChars(trans, buf, NULL, CAP, &pos, &status); + utrans_transUChars(trans, buf, NULL, CAP, pos.start, &pos.end, &status); + if (U_FAILURE(status)) { + utrans_close(trans); + log_err("FAIL: utrans_transIncrementalUChars() failed, error=%s\n", + u_errorName(status)); + return; + } + + if (0 == u_strcmp(buf, to)) { + log_verbose("Ok: utrans_transIncrementalUChars(%s) x %s -> %s\n", + crules, cfrom, cto); + } else { + char actual[CAP]; + u_austrcpy(actual, buf); + log_err("FAIL: utrans_transIncrementalUChars(%s) x %s -> %s, expected %s\n", + crules, cfrom, actual, cto); + } + + utrans_close(trans); +}