| Index: source/test/cintltst/ulistfmttest.c
|
| diff --git a/source/test/cintltst/ulistfmttest.c b/source/test/cintltst/ulistfmttest.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ae4dc2d064a4eefb693c9ae60507a4a1b1d641eb
|
| --- /dev/null
|
| +++ b/source/test/cintltst/ulistfmttest.c
|
| @@ -0,0 +1,128 @@
|
| +/********************************************************************
|
| + * Copyright (c) 2015, International Business Machines Corporation
|
| + * and others. All Rights Reserved.
|
| + ********************************************************************/
|
| +/* C API TEST for UListFormatter */
|
| +
|
| +#include "unicode/utypes.h"
|
| +
|
| +#if !UCONFIG_NO_FORMATTING
|
| +
|
| +#include "unicode/ustring.h"
|
| +#include "unicode/ulistformatter.h"
|
| +#include "cintltst.h"
|
| +#include "cmemory.h"
|
| +#include "cstring.h"
|
| +
|
| +static void TestUListFmt(void);
|
| +
|
| +void addUListFmtTest(TestNode** root);
|
| +
|
| +#define TESTCASE(x) addTest(root, &x, "tsformat/ulistfmttest/" #x)
|
| +
|
| +void addUListFmtTest(TestNode** root)
|
| +{
|
| + TESTCASE(TestUListFmt);
|
| +}
|
| +
|
| +static const UChar str0[] = { 0x41,0 }; /* "A" */
|
| +static const UChar str1[] = { 0x42,0x62,0 }; /* "Bb" */
|
| +static const UChar str2[] = { 0x43,0x63,0x63,0 }; /* "Ccc" */
|
| +static const UChar str3[] = { 0x44,0x64,0x64,0x64,0 }; /* "Dddd" */
|
| +static const UChar str4[] = { 0x45,0x65,0x65,0x65,0x65,0 }; /* "Eeeee" */
|
| +static const UChar* strings[] = { str0, str1, str2, str3, str4 };
|
| +static const int32_t stringLengths[] = { 1, 2, 3, 4, 5 };
|
| +static const int32_t stringLengthsNeg[] = { -1, -1, -1, -1, -1 };
|
| +
|
| +typedef struct {
|
| + const char * locale;
|
| + int32_t stringCount;
|
| + const char *expectedResult; /* invariant chars + escaped Unicode */
|
| +} ListFmtTestEntry;
|
| +
|
| +static ListFmtTestEntry listFmtTestEntries[] = {
|
| + /* locale stringCount expectedResult */
|
| + { "en" , 5, "A, Bb, Ccc, Dddd, and Eeeee" },
|
| + { "en" , 2, "A and Bb" },
|
| + { "de" , 5, "A, Bb, Ccc, Dddd und Eeeee" },
|
| + { "de" , 2, "A und Bb" },
|
| + { "ja" , 5, "A\\u3001Bb\\u3001Ccc\\u3001Dddd\\u3001Eeeee" },
|
| + { "ja" , 2, "A\\u3001Bb" },
|
| + { "zh" , 5, "A\\u3001Bb\\u3001Ccc\\u3001Dddd\\u548CEeeee" },
|
| + { "zh" , 2, "A\\u548CBb" },
|
| + { NULL , 0, NULL } /* terminator */
|
| + };
|
| +
|
| +enum {
|
| + kUBufMax = 128,
|
| + kBBufMax = 256
|
| +};
|
| +
|
| +static void TestUListFmt() {
|
| + const ListFmtTestEntry * lftep;
|
| + for (lftep = listFmtTestEntries; lftep->locale != NULL ; lftep++ ) {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + UListFormatter *listfmt = ulistfmt_open(lftep->locale, &status);
|
| + if ( U_FAILURE(status) ) {
|
| + log_data_err("ERROR: ulistfmt_open fails for locale %s, status %s\n", lftep->locale, u_errorName(status));
|
| + } else {
|
| + UChar ubufActual[kUBufMax];
|
| + int32_t ulenActual = ulistfmt_format(listfmt, strings, stringLengths, lftep->stringCount, ubufActual, kUBufMax, &status);
|
| + if ( U_FAILURE(status) ) {
|
| + log_err("ERROR: ulistfmt_format fails for locale %s count %d (real lengths), status %s\n", lftep->locale, lftep->stringCount, u_errorName(status));
|
| + } else {
|
| + UChar ubufExpected[kUBufMax];
|
| + int32_t ulenExpected = u_unescape(lftep->expectedResult, ubufExpected, kUBufMax);
|
| + if (ulenActual != ulenExpected || u_strncmp(ubufActual, ubufExpected, ulenExpected) != 0) {
|
| + log_err("ERROR: ulistfmt_format for locale %s count %d (real lengths), actual \"%s\" != expected \"%s\"\n", lftep->locale,
|
| + lftep->stringCount, aescstrdup(ubufActual, ulenActual), aescstrdup(ubufExpected, ulenExpected));
|
| + }
|
| + }
|
| + /* try again with all lengths -1 */
|
| + status = U_ZERO_ERROR;
|
| + ulenActual = ulistfmt_format(listfmt, strings, stringLengthsNeg, lftep->stringCount, ubufActual, kUBufMax, &status);
|
| + if ( U_FAILURE(status) ) {
|
| + log_err("ERROR: ulistfmt_format fails for locale %s count %d (-1 lengths), status %s\n", lftep->locale, lftep->stringCount, u_errorName(status));
|
| + } else {
|
| + UChar ubufExpected[kUBufMax];
|
| + int32_t ulenExpected = u_unescape(lftep->expectedResult, ubufExpected, kUBufMax);
|
| + if (ulenActual != ulenExpected || u_strncmp(ubufActual, ubufExpected, ulenExpected) != 0) {
|
| + log_err("ERROR: ulistfmt_format for locale %s count %d (-1 lengths), actual \"%s\" != expected \"%s\"\n", lftep->locale,
|
| + lftep->stringCount, aescstrdup(ubufActual, ulenActual), aescstrdup(ubufExpected, ulenExpected));
|
| + }
|
| + }
|
| + /* try again with NULL lengths */
|
| + status = U_ZERO_ERROR;
|
| + ulenActual = ulistfmt_format(listfmt, strings, NULL, lftep->stringCount, ubufActual, kUBufMax, &status);
|
| + if ( U_FAILURE(status) ) {
|
| + log_err("ERROR: ulistfmt_format fails for locale %s count %d (NULL lengths), status %s\n", lftep->locale, lftep->stringCount, u_errorName(status));
|
| + } else {
|
| + UChar ubufExpected[kUBufMax];
|
| + int32_t ulenExpected = u_unescape(lftep->expectedResult, ubufExpected, kUBufMax);
|
| + if (ulenActual != ulenExpected || u_strncmp(ubufActual, ubufExpected, ulenExpected) != 0) {
|
| + log_err("ERROR: ulistfmt_format for locale %s count %d (NULL lengths), actual \"%s\" != expected \"%s\"\n", lftep->locale,
|
| + lftep->stringCount, aescstrdup(ubufActual, ulenActual), aescstrdup(ubufExpected, ulenExpected));
|
| + }
|
| + }
|
| +
|
| + /* try calls that should return error */
|
| + status = U_ZERO_ERROR;
|
| + ulenActual = ulistfmt_format(listfmt, NULL, NULL, lftep->stringCount, ubufActual, kUBufMax, &status);
|
| + if (status != U_ILLEGAL_ARGUMENT_ERROR || ulenActual > 0) {
|
| + log_err("ERROR: ulistfmt_format for locale %s count %d with NULL strings, expected U_ILLEGAL_ARGUMENT_ERROR, got %s, result %d\n", lftep->locale,
|
| + lftep->stringCount, u_errorName(status), ulenActual);
|
| + }
|
| + status = U_ZERO_ERROR;
|
| + ulenActual = ulistfmt_format(listfmt, strings, NULL, lftep->stringCount, NULL, kUBufMax, &status);
|
| + if (status != U_ILLEGAL_ARGUMENT_ERROR || ulenActual > 0) {
|
| + log_err("ERROR: ulistfmt_format for locale %s count %d with NULL result, expected U_ILLEGAL_ARGUMENT_ERROR, got %s, result %d\n", lftep->locale,
|
| + lftep->stringCount, u_errorName(status), ulenActual);
|
| + }
|
| +
|
| + ulistfmt_close(listfmt);
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| +#endif /* #if !UCONFIG_NO_FORMATTING */
|
|
|