]> git.saurik.com Git - apple/icu.git/blob - icuSources/test/cintltst/ulistfmttest.c
ICU-57166.0.1.tar.gz
[apple/icu.git] / icuSources / test / cintltst / ulistfmttest.c
1 /********************************************************************
2 * Copyright (c) 2015, International Business Machines Corporation
3 * and others. All Rights Reserved.
4 ********************************************************************/
5 /* C API TEST for UListFormatter */
6
7 #include "unicode/utypes.h"
8
9 #if !UCONFIG_NO_FORMATTING
10
11 #include "unicode/ustring.h"
12 #include "unicode/ulistformatter.h"
13 #include "cintltst.h"
14 #include "cmemory.h"
15 #include "cstring.h"
16
17 static void TestUListFmt(void);
18
19 void addUListFmtTest(TestNode** root);
20
21 #define TESTCASE(x) addTest(root, &x, "tsformat/ulistfmttest/" #x)
22
23 void addUListFmtTest(TestNode** root)
24 {
25 TESTCASE(TestUListFmt);
26 }
27
28 static const UChar str0[] = { 0x41,0 }; /* "A" */
29 static const UChar str1[] = { 0x42,0x62,0 }; /* "Bb" */
30 static const UChar str2[] = { 0x43,0x63,0x63,0 }; /* "Ccc" */
31 static const UChar str3[] = { 0x44,0x64,0x64,0x64,0 }; /* "Dddd" */
32 static const UChar str4[] = { 0x45,0x65,0x65,0x65,0x65,0 }; /* "Eeeee" */
33 static const UChar* strings[] = { str0, str1, str2, str3, str4 };
34 static const int32_t stringLengths[] = { 1, 2, 3, 4, 5 };
35 static const int32_t stringLengthsNeg[] = { -1, -1, -1, -1, -1 };
36
37 typedef struct {
38 const char * locale;
39 int32_t stringCount;
40 const char *expectedResult; /* invariant chars + escaped Unicode */
41 } ListFmtTestEntry;
42
43 static ListFmtTestEntry listFmtTestEntries[] = {
44 /* locale stringCount expectedResult */
45 { "en" , 5, "A, Bb, Ccc, Dddd, and Eeeee" },
46 { "en" , 2, "A and Bb" },
47 { "de" , 5, "A, Bb, Ccc, Dddd und Eeeee" },
48 { "de" , 2, "A und Bb" },
49 { "ja" , 5, "A\\u3001Bb\\u3001Ccc\\u3001Dddd\\u3001Eeeee" },
50 { "ja" , 2, "A\\u3001Bb" },
51 { "zh" , 5, "A\\u3001Bb\\u3001Ccc\\u3001Dddd\\u548CEeeee" },
52 { "zh" , 2, "A\\u548CBb" },
53 { NULL , 0, NULL } /* terminator */
54 };
55
56 enum {
57 kUBufMax = 128,
58 kBBufMax = 256
59 };
60
61 static void TestUListFmt() {
62 const ListFmtTestEntry * lftep;
63 for (lftep = listFmtTestEntries; lftep->locale != NULL ; lftep++ ) {
64 UErrorCode status = U_ZERO_ERROR;
65 UListFormatter *listfmt = ulistfmt_open(lftep->locale, &status);
66 if ( U_FAILURE(status) ) {
67 log_data_err("ERROR: ulistfmt_open fails for locale %s, status %s\n", lftep->locale, u_errorName(status));
68 } else {
69 UChar ubufActual[kUBufMax];
70 int32_t ulenActual = ulistfmt_format(listfmt, strings, stringLengths, lftep->stringCount, ubufActual, kUBufMax, &status);
71 if ( U_FAILURE(status) ) {
72 log_err("ERROR: ulistfmt_format fails for locale %s count %d (real lengths), status %s\n", lftep->locale, lftep->stringCount, u_errorName(status));
73 } else {
74 UChar ubufExpected[kUBufMax];
75 int32_t ulenExpected = u_unescape(lftep->expectedResult, ubufExpected, kUBufMax);
76 if (ulenActual != ulenExpected || u_strncmp(ubufActual, ubufExpected, ulenExpected) != 0) {
77 log_err("ERROR: ulistfmt_format for locale %s count %d (real lengths), actual \"%s\" != expected \"%s\"\n", lftep->locale,
78 lftep->stringCount, aescstrdup(ubufActual, ulenActual), aescstrdup(ubufExpected, ulenExpected));
79 }
80 }
81 /* try again with all lengths -1 */
82 status = U_ZERO_ERROR;
83 ulenActual = ulistfmt_format(listfmt, strings, stringLengthsNeg, lftep->stringCount, ubufActual, kUBufMax, &status);
84 if ( U_FAILURE(status) ) {
85 log_err("ERROR: ulistfmt_format fails for locale %s count %d (-1 lengths), status %s\n", lftep->locale, lftep->stringCount, u_errorName(status));
86 } else {
87 UChar ubufExpected[kUBufMax];
88 int32_t ulenExpected = u_unescape(lftep->expectedResult, ubufExpected, kUBufMax);
89 if (ulenActual != ulenExpected || u_strncmp(ubufActual, ubufExpected, ulenExpected) != 0) {
90 log_err("ERROR: ulistfmt_format for locale %s count %d (-1 lengths), actual \"%s\" != expected \"%s\"\n", lftep->locale,
91 lftep->stringCount, aescstrdup(ubufActual, ulenActual), aescstrdup(ubufExpected, ulenExpected));
92 }
93 }
94 /* try again with NULL lengths */
95 status = U_ZERO_ERROR;
96 ulenActual = ulistfmt_format(listfmt, strings, NULL, lftep->stringCount, ubufActual, kUBufMax, &status);
97 if ( U_FAILURE(status) ) {
98 log_err("ERROR: ulistfmt_format fails for locale %s count %d (NULL lengths), status %s\n", lftep->locale, lftep->stringCount, u_errorName(status));
99 } else {
100 UChar ubufExpected[kUBufMax];
101 int32_t ulenExpected = u_unescape(lftep->expectedResult, ubufExpected, kUBufMax);
102 if (ulenActual != ulenExpected || u_strncmp(ubufActual, ubufExpected, ulenExpected) != 0) {
103 log_err("ERROR: ulistfmt_format for locale %s count %d (NULL lengths), actual \"%s\" != expected \"%s\"\n", lftep->locale,
104 lftep->stringCount, aescstrdup(ubufActual, ulenActual), aescstrdup(ubufExpected, ulenExpected));
105 }
106 }
107
108 /* try calls that should return error */
109 status = U_ZERO_ERROR;
110 ulenActual = ulistfmt_format(listfmt, NULL, NULL, lftep->stringCount, ubufActual, kUBufMax, &status);
111 if (status != U_ILLEGAL_ARGUMENT_ERROR || ulenActual > 0) {
112 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,
113 lftep->stringCount, u_errorName(status), ulenActual);
114 }
115 status = U_ZERO_ERROR;
116 ulenActual = ulistfmt_format(listfmt, strings, NULL, lftep->stringCount, NULL, kUBufMax, &status);
117 if (status != U_ILLEGAL_ARGUMENT_ERROR || ulenActual > 0) {
118 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,
119 lftep->stringCount, u_errorName(status), ulenActual);
120 }
121
122 ulistfmt_close(listfmt);
123 }
124 }
125 }
126
127
128 #endif /* #if !UCONFIG_NO_FORMATTING */