OLD | NEW |
1 /* | 1 /* |
2 ******************************************************************************* | 2 ******************************************************************************* |
3 * Copyright (C) 2014, International Business Machines Corporation and * | 3 * Copyright (C) 2014, International Business Machines Corporation and * |
4 * others. All Rights Reserved. * | 4 * others. All Rights Reserved. * |
5 ******************************************************************************* | 5 ******************************************************************************* |
6 * | 6 * |
7 * File SIMPLEPATTERNFORMATTERTEST.CPP | 7 * File SIMPLEPATTERNFORMATTERTEST.CPP |
8 * | 8 * |
9 ******************************************************************************** | 9 ******************************************************************************** |
10 */ | 10 */ |
11 #include "cstring.h" | 11 #include "cstring.h" |
12 #include "intltest.h" | 12 #include "intltest.h" |
13 #include "simplepatternformatter.h" | 13 #include "simplepatternformatter.h" |
14 | 14 |
15 class SimplePatternFormatterTest : public IntlTest { | 15 class SimplePatternFormatterTest : public IntlTest { |
16 public: | 16 public: |
17 SimplePatternFormatterTest() { | 17 SimplePatternFormatterTest() { |
18 } | 18 } |
19 void TestNoPlaceholders(); | 19 void TestNoPlaceholders(); |
20 void TestOnePlaceholder(); | 20 void TestOnePlaceholder(); |
21 void TestManyPlaceholders(); | 21 void TestManyPlaceholders(); |
| 22 void TestTooFewPlaceholderValues(); |
| 23 void TestBadArguments(); |
22 void TestGetPatternWithNoPlaceholders(); | 24 void TestGetPatternWithNoPlaceholders(); |
23 void TestOptimization(); | 25 void TestFormatReplaceNoOptimization(); |
| 26 void TestFormatReplaceNoOptimizationLeadingText(); |
| 27 void TestFormatReplaceOptimization(); |
| 28 void TestFormatReplaceNoOptimizationLeadingPlaceholderUsedTwice(); |
| 29 void TestFormatReplaceOptimizationNoOffsets(); |
| 30 void TestFormatReplaceNoOptimizationNoOffsets(); |
24 void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=
0); | 31 void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=
0); |
25 private: | 32 private: |
| 33 void verifyOffsets( |
| 34 const int32_t *expected, |
| 35 const int32_t *actual, |
| 36 int32_t count); |
26 }; | 37 }; |
27 | 38 |
28 void SimplePatternFormatterTest::runIndexedTest(int32_t index, UBool exec, const
char* &name, char* /*par*/) { | 39 void SimplePatternFormatterTest::runIndexedTest(int32_t index, UBool exec, const
char* &name, char* /*par*/) { |
29 TESTCASE_AUTO_BEGIN; | 40 TESTCASE_AUTO_BEGIN; |
30 TESTCASE_AUTO(TestNoPlaceholders); | 41 TESTCASE_AUTO(TestNoPlaceholders); |
31 TESTCASE_AUTO(TestOnePlaceholder); | 42 TESTCASE_AUTO(TestOnePlaceholder); |
32 TESTCASE_AUTO(TestManyPlaceholders); | 43 TESTCASE_AUTO(TestManyPlaceholders); |
| 44 TESTCASE_AUTO(TestTooFewPlaceholderValues); |
| 45 TESTCASE_AUTO(TestBadArguments); |
33 TESTCASE_AUTO(TestGetPatternWithNoPlaceholders); | 46 TESTCASE_AUTO(TestGetPatternWithNoPlaceholders); |
34 TESTCASE_AUTO(TestOptimization); | 47 TESTCASE_AUTO(TestFormatReplaceNoOptimization); |
| 48 TESTCASE_AUTO(TestFormatReplaceNoOptimizationLeadingText); |
| 49 TESTCASE_AUTO(TestFormatReplaceOptimization); |
| 50 TESTCASE_AUTO(TestFormatReplaceNoOptimizationLeadingPlaceholderUsedTwice); |
| 51 TESTCASE_AUTO(TestFormatReplaceOptimizationNoOffsets); |
| 52 TESTCASE_AUTO(TestFormatReplaceNoOptimizationNoOffsets); |
35 TESTCASE_AUTO_END; | 53 TESTCASE_AUTO_END; |
36 } | 54 } |
37 | 55 |
38 void SimplePatternFormatterTest::TestNoPlaceholders() { | 56 void SimplePatternFormatterTest::TestNoPlaceholders() { |
39 UErrorCode status = U_ZERO_ERROR; | 57 UErrorCode status = U_ZERO_ERROR; |
40 SimplePatternFormatter fmt("This doesn''t have templates '{0}"); | 58 SimplePatternFormatter fmt("This doesn''t have templates '{0}"); |
41 assertEquals("PlaceholderCount", 0, fmt.getPlaceholderCount()); | 59 assertEquals("PlaceholderCount", 0, fmt.getPlaceholderCount()); |
42 UnicodeString appendTo; | 60 UnicodeString appendTo; |
43 assertEquals( | 61 assertEquals( |
44 "format", | 62 "format", |
45 "This doesn't have templates {0}", | 63 "This doesn't have templates {0}", |
46 fmt.format("unused", appendTo, status)); | 64 fmt.format("unused", appendTo, status)); |
47 fmt.compile("This has {} bad {012d placeholders", status); | 65 fmt.compile("This has {} bad {012d placeholders", status); |
48 assertEquals("PlaceholderCount", 0, fmt.getPlaceholderCount()); | 66 assertEquals("PlaceholderCount", 0, fmt.getPlaceholderCount()); |
49 appendTo.remove(); | 67 appendTo.remove(); |
50 assertEquals( | 68 assertEquals( |
51 "format", | 69 "format", |
52 "This has {} bad {012d placeholders", | 70 "This has {} bad {012d placeholders", |
53 fmt.format("unused", appendTo, status)); | 71 fmt.format("unused", appendTo, status)); |
54 assertSuccess("Status", status); | 72 assertSuccess("Status", status); |
55 } | 73 } |
56 | 74 |
57 void SimplePatternFormatterTest::TestOnePlaceholder() { | 75 void SimplePatternFormatterTest::TestOnePlaceholder() { |
58 UErrorCode status = U_ZERO_ERROR; | 76 UErrorCode status = U_ZERO_ERROR; |
59 SimplePatternFormatter fmt; | 77 SimplePatternFormatter fmt; |
60 fmt.compile("{0} meter", status); | 78 fmt.compile("{0} meter", status); |
| 79 if (!assertSuccess("Status", status)) { |
| 80 return; |
| 81 } |
61 assertEquals("PlaceholderCount", 1, fmt.getPlaceholderCount()); | 82 assertEquals("PlaceholderCount", 1, fmt.getPlaceholderCount()); |
62 UnicodeString appendTo; | 83 UnicodeString appendTo; |
63 assertEquals( | 84 assertEquals( |
64 "format", | 85 "format", |
65 "1 meter", | 86 "1 meter", |
66 fmt.format("1", appendTo, status)); | 87 fmt.format("1", appendTo, status)); |
67 assertSuccess("Status", status); | |
68 | 88 |
69 // assignment | 89 // assignment |
70 SimplePatternFormatter s; | 90 SimplePatternFormatter s; |
71 s = fmt; | 91 s = fmt; |
72 appendTo.remove(); | 92 appendTo.remove(); |
73 assertEquals( | 93 assertEquals( |
74 "Assignment", | 94 "Assignment", |
75 "1 meter", | 95 "1 meter", |
76 s.format("1", appendTo, status)); | 96 s.format("1", appendTo, status)); |
77 | 97 |
78 // Copy constructor | 98 // Copy constructor |
79 SimplePatternFormatter r(fmt); | 99 SimplePatternFormatter r(fmt); |
80 appendTo.remove(); | 100 appendTo.remove(); |
81 assertEquals( | 101 assertEquals( |
82 "Copy constructor", | 102 "Copy constructor", |
83 "1 meter", | 103 "1 meter", |
84 r.format("1", appendTo, status)); | 104 r.format("1", appendTo, status)); |
85 assertSuccess("Status", status); | 105 assertSuccess("Status", status); |
86 } | 106 } |
87 | 107 |
88 void SimplePatternFormatterTest::TestManyPlaceholders() { | 108 void SimplePatternFormatterTest::TestManyPlaceholders() { |
89 UErrorCode status = U_ZERO_ERROR; | 109 UErrorCode status = U_ZERO_ERROR; |
90 SimplePatternFormatter fmt; | 110 SimplePatternFormatter fmt; |
91 fmt.compile( | 111 fmt.compile( |
92 "Templates {2}{1}{5} and {4} are out of order.", status); | 112 "Templates {2}{1}{5} and {4} are out of order.", status); |
93 assertSuccess("Status", status); | 113 if (!assertSuccess("Status", status)) { |
94 assertFalse("startsWithPlaceholder", fmt.startsWithPlaceholder(2)); | 114 return; |
| 115 } |
95 assertEquals("PlaceholderCount", 6, fmt.getPlaceholderCount()); | 116 assertEquals("PlaceholderCount", 6, fmt.getPlaceholderCount()); |
96 UnicodeString values[] = { | 117 UnicodeString values[] = { |
97 "freddy", "tommy", "frog", "billy", "leg", "{0}"}; | 118 "freddy", "tommy", "frog", "billy", "leg", "{0}"}; |
98 UnicodeString *params[] = { | 119 UnicodeString *params[] = { |
99 &values[0], &values[1], &values[2], &values[3], &values[4], &values[5
]}; | 120 &values[0], &values[1], &values[2], &values[3], &values[4], &values[5
]}; |
100 int32_t offsets[6]; | 121 int32_t offsets[6]; |
101 int32_t expectedOffsets[6] = {-1, 22, 18, -1, 35, 27}; | 122 int32_t expectedOffsets[6] = {-1, 22, 18, -1, 35, 27}; |
102 UnicodeString appendTo("Prefix: "); | 123 UnicodeString appendTo("Prefix: "); |
103 assertEquals( | 124 assertEquals( |
104 "format", | 125 "format", |
105 "Prefix: Templates frogtommy{0} and leg are out of order.", | 126 "Prefix: Templates frogtommy{0} and leg are out of order.", |
106 fmt.format( | 127 fmt.formatAndAppend( |
107 params, | 128 params, |
108 UPRV_LENGTHOF(params), | 129 UPRV_LENGTHOF(params), |
109 appendTo, | 130 appendTo, |
110 offsets, | 131 offsets, |
111 UPRV_LENGTHOF(offsets), | 132 UPRV_LENGTHOF(offsets), |
112 status)); | 133 status)); |
113 assertSuccess("Status", status); | 134 if (!assertSuccess("Status", status)) { |
114 for (int32_t i = 0; i < UPRV_LENGTHOF(expectedOffsets); ++i) { | 135 return; |
115 if (expectedOffsets[i] != offsets[i]) { | |
116 errln("Expected %d, got %d", expectedOffsets[i], offsets[i]); | |
117 } | |
118 } | 136 } |
| 137 verifyOffsets(expectedOffsets, offsets, UPRV_LENGTHOF(expectedOffsets)); |
119 appendTo.remove(); | 138 appendTo.remove(); |
120 | 139 |
121 // Not having enough placeholder params results in error. | |
122 fmt.format( | |
123 params, | |
124 UPRV_LENGTHOF(params) - 1, | |
125 appendTo, | |
126 offsets, | |
127 UPRV_LENGTHOF(offsets), | |
128 status); | |
129 if (status != U_ILLEGAL_ARGUMENT_ERROR) { | |
130 errln("Expected U_ILLEGAL_ARGUMENT_ERROR"); | |
131 } | |
132 | |
133 // Ensure we don't write to offsets array beyond its length. | 140 // Ensure we don't write to offsets array beyond its length. |
134 status = U_ZERO_ERROR; | 141 status = U_ZERO_ERROR; |
135 offsets[UPRV_LENGTHOF(offsets) - 1] = 289; | 142 offsets[UPRV_LENGTHOF(offsets) - 1] = 289; |
136 appendTo.remove(); | 143 appendTo.remove(); |
137 fmt.format( | 144 fmt.formatAndAppend( |
138 params, | 145 params, |
139 UPRV_LENGTHOF(params), | 146 UPRV_LENGTHOF(params), |
140 appendTo, | 147 appendTo, |
141 offsets, | 148 offsets, |
142 UPRV_LENGTHOF(offsets) - 1, | 149 UPRV_LENGTHOF(offsets) - 1, |
143 status); | 150 status); |
144 assertEquals("Offsets buffer length", 289, offsets[UPRV_LENGTHOF(offsets) -
1]); | 151 assertEquals("Offsets buffer length", 289, offsets[UPRV_LENGTHOF(offsets) -
1]); |
145 | 152 |
146 // Test assignment | 153 // Test assignment |
147 SimplePatternFormatter s; | 154 SimplePatternFormatter s; |
148 s = fmt; | 155 s = fmt; |
149 appendTo.remove(); | 156 appendTo.remove(); |
150 assertEquals( | 157 assertEquals( |
151 "Assignment", | 158 "Assignment", |
152 "Templates frogtommy{0} and leg are out of order.", | 159 "Templates frogtommy{0} and leg are out of order.", |
153 s.format( | 160 s.formatAndAppend( |
154 params, | 161 params, |
155 UPRV_LENGTHOF(params), | 162 UPRV_LENGTHOF(params), |
156 appendTo, | 163 appendTo, |
157 NULL, | 164 NULL, |
158 0, | 165 0, |
159 status)); | 166 status)); |
160 | 167 |
161 // Copy constructor | 168 // Copy constructor |
162 SimplePatternFormatter r(fmt); | 169 SimplePatternFormatter r(fmt); |
163 appendTo.remove(); | 170 appendTo.remove(); |
164 assertEquals( | 171 assertEquals( |
165 "Copy constructor", | 172 "Copy constructor", |
166 "Templates frogtommy{0} and leg are out of order.", | 173 "Templates frogtommy{0} and leg are out of order.", |
167 r.format( | 174 r.formatAndAppend( |
168 params, | 175 params, |
169 UPRV_LENGTHOF(params), | 176 UPRV_LENGTHOF(params), |
170 appendTo, | 177 appendTo, |
171 NULL, | 178 NULL, |
172 0, | 179 0, |
173 status)); | 180 status)); |
174 r.compile("{0} meter", status); | 181 r.compile("{0} meter", status); |
175 assertEquals("PlaceholderCount", 1, r.getPlaceholderCount()); | 182 assertEquals("PlaceholderCount", 1, r.getPlaceholderCount()); |
176 appendTo.remove(); | 183 appendTo.remove(); |
177 assertEquals( | 184 assertEquals( |
(...skipping 10 matching lines...) Expand all Loading... |
188 r.compile("{0}, {1} and {2}", status); | 195 r.compile("{0}, {1} and {2}", status); |
189 assertEquals("PlaceholderCount", 3, r.getPlaceholderCount()); | 196 assertEquals("PlaceholderCount", 3, r.getPlaceholderCount()); |
190 appendTo.remove(); | 197 appendTo.remove(); |
191 assertEquals( | 198 assertEquals( |
192 "3 arg", | 199 "3 arg", |
193 "foo, bar and baz", | 200 "foo, bar and baz", |
194 r.format("foo", "bar", "baz", appendTo, status)); | 201 r.format("foo", "bar", "baz", appendTo, status)); |
195 assertSuccess("Status", status); | 202 assertSuccess("Status", status); |
196 } | 203 } |
197 | 204 |
| 205 void SimplePatternFormatterTest::TestTooFewPlaceholderValues() { |
| 206 SimplePatternFormatter fmt("{0} and {1}"); |
| 207 UnicodeString appendTo; |
| 208 UnicodeString firstValue; |
| 209 UnicodeString *params[] = {&firstValue}; |
| 210 |
| 211 UErrorCode status = U_ZERO_ERROR; |
| 212 fmt.format( |
| 213 firstValue, appendTo, status); |
| 214 if (status != U_ILLEGAL_ARGUMENT_ERROR) { |
| 215 errln("Expected U_ILLEGAL_ARGUMENT_ERROR"); |
| 216 } |
| 217 |
| 218 status = U_ZERO_ERROR; |
| 219 fmt.formatAndAppend( |
| 220 params, UPRV_LENGTHOF(params), appendTo, NULL, 0, status); |
| 221 if (status != U_ILLEGAL_ARGUMENT_ERROR) { |
| 222 errln("Expected U_ILLEGAL_ARGUMENT_ERROR"); |
| 223 } |
| 224 |
| 225 status = U_ZERO_ERROR; |
| 226 fmt.formatAndReplace( |
| 227 params, UPRV_LENGTHOF(params), appendTo, NULL, 0, status); |
| 228 if (status != U_ILLEGAL_ARGUMENT_ERROR) { |
| 229 errln("Expected U_ILLEGAL_ARGUMENT_ERROR"); |
| 230 } |
| 231 } |
| 232 |
| 233 void SimplePatternFormatterTest::TestBadArguments() { |
| 234 SimplePatternFormatter fmt("pickle"); |
| 235 UnicodeString appendTo; |
| 236 UErrorCode status = U_ZERO_ERROR; |
| 237 |
| 238 // These succeed |
| 239 fmt.formatAndAppend( |
| 240 NULL, 0, appendTo, NULL, 0, status); |
| 241 fmt.formatAndReplace( |
| 242 NULL, 0, appendTo, NULL, 0, status); |
| 243 assertSuccess("", status); |
| 244 status = U_ZERO_ERROR; |
| 245 |
| 246 // fails |
| 247 fmt.formatAndAppend( |
| 248 NULL, 1, appendTo, NULL, 0, status); |
| 249 if (status != U_ILLEGAL_ARGUMENT_ERROR) { |
| 250 errln("Expected U_ILLEGAL_ARGUMENT_ERROR"); |
| 251 } |
| 252 status = U_ZERO_ERROR; |
| 253 |
| 254 // fails |
| 255 fmt.formatAndAppend( |
| 256 NULL, 0, appendTo, NULL, 1, status); |
| 257 if (status != U_ILLEGAL_ARGUMENT_ERROR) { |
| 258 errln("Expected U_ILLEGAL_ARGUMENT_ERROR"); |
| 259 } |
| 260 status = U_ZERO_ERROR; |
| 261 |
| 262 // fails because appendTo used as a parameter value |
| 263 const UnicodeString *params[] = {&appendTo}; |
| 264 fmt.formatAndAppend( |
| 265 params, UPRV_LENGTHOF(params), appendTo, NULL, 0, status); |
| 266 if (status != U_ILLEGAL_ARGUMENT_ERROR) { |
| 267 errln("Expected U_ILLEGAL_ARGUMENT_ERROR"); |
| 268 } |
| 269 status = U_ZERO_ERROR; |
| 270 |
| 271 |
| 272 // fails |
| 273 fmt.formatAndReplace( |
| 274 NULL, 1, appendTo, NULL, 0, status); |
| 275 if (status != U_ILLEGAL_ARGUMENT_ERROR) { |
| 276 errln("Expected U_ILLEGAL_ARGUMENT_ERROR"); |
| 277 } |
| 278 status = U_ZERO_ERROR; |
| 279 |
| 280 // fails |
| 281 fmt.formatAndReplace( |
| 282 NULL, 0, appendTo, NULL, 1, status); |
| 283 if (status != U_ILLEGAL_ARGUMENT_ERROR) { |
| 284 errln("Expected U_ILLEGAL_ARGUMENT_ERROR"); |
| 285 } |
| 286 } |
| 287 |
198 void SimplePatternFormatterTest::TestGetPatternWithNoPlaceholders() { | 288 void SimplePatternFormatterTest::TestGetPatternWithNoPlaceholders() { |
199 SimplePatternFormatter fmt("{0} has no {1} placeholders."); | 289 SimplePatternFormatter fmt("{0} has no {1} placeholders."); |
200 assertEquals( | 290 assertEquals( |
201 "", " has no placeholders.", fmt.getPatternWithNoPlaceholders()); | 291 "", " has no placeholders.", fmt.getPatternWithNoPlaceholders()); |
202 } | 292 } |
203 | 293 |
204 void SimplePatternFormatterTest::TestOptimization() { | 294 void SimplePatternFormatterTest::TestFormatReplaceNoOptimization() { |
205 UErrorCode status = U_ZERO_ERROR; | 295 UErrorCode status = U_ZERO_ERROR; |
206 SimplePatternFormatter fmt; | 296 SimplePatternFormatter fmt; |
207 fmt.compile("{2}, {0}, {1} and {3}", status); | 297 fmt.compile("{2}, {0}, {1} and {3}", status); |
| 298 if (!assertSuccess("Status", status)) { |
| 299 return; |
| 300 } |
| 301 UnicodeString result("original"); |
| 302 int offsets[4]; |
| 303 UnicodeString freddy("freddy"); |
| 304 UnicodeString frog("frog"); |
| 305 UnicodeString by("by"); |
| 306 const UnicodeString *params[] = {&result, &freddy, &frog, &by}; |
| 307 assertEquals( |
| 308 "", |
| 309 "frog, original, freddy and by", |
| 310 fmt.formatAndReplace( |
| 311 params, |
| 312 UPRV_LENGTHOF(params), |
| 313 result, |
| 314 offsets, |
| 315 UPRV_LENGTHOF(offsets), |
| 316 status)); |
| 317 if (!assertSuccess("Status", status)) { |
| 318 return; |
| 319 } |
| 320 int32_t expectedOffsets[] = {6, 16, 0, 27}; |
| 321 verifyOffsets(expectedOffsets, offsets, UPRV_LENGTHOF(expectedOffsets)); |
| 322 } |
| 323 |
| 324 void SimplePatternFormatterTest::TestFormatReplaceNoOptimizationLeadingText() { |
| 325 UErrorCode status = U_ZERO_ERROR; |
| 326 SimplePatternFormatter fmt; |
| 327 fmt.compile("boo {2}, {0}, {1} and {3}", status); |
| 328 if (!assertSuccess("Status", status)) { |
| 329 return; |
| 330 } |
| 331 UnicodeString result("original"); |
| 332 int offsets[4]; |
| 333 UnicodeString freddy("freddy"); |
| 334 UnicodeString frog("frog"); |
| 335 UnicodeString by("by"); |
| 336 const UnicodeString *params[] = {&freddy, &frog, &result, &by}; |
| 337 assertEquals( |
| 338 "", |
| 339 "boo original, freddy, frog and by", |
| 340 fmt.formatAndReplace( |
| 341 params, |
| 342 UPRV_LENGTHOF(params), |
| 343 result, |
| 344 offsets, |
| 345 UPRV_LENGTHOF(offsets), |
| 346 status)); |
| 347 if (!assertSuccess("Status", status)) { |
| 348 return; |
| 349 } |
| 350 int32_t expectedOffsets[] = {14, 22, 4, 31}; |
| 351 verifyOffsets(expectedOffsets, offsets, UPRV_LENGTHOF(expectedOffsets)); |
| 352 } |
| 353 |
| 354 void SimplePatternFormatterTest::TestFormatReplaceOptimization() { |
| 355 UErrorCode status = U_ZERO_ERROR; |
| 356 SimplePatternFormatter fmt; |
| 357 fmt.compile("{2}, {0}, {1} and {3}", status); |
| 358 if (!assertSuccess("Status", status)) { |
| 359 return; |
| 360 } |
| 361 UnicodeString result("original"); |
| 362 int offsets[4]; |
| 363 UnicodeString freddy("freddy"); |
| 364 UnicodeString frog("frog"); |
| 365 UnicodeString by("by"); |
| 366 const UnicodeString *params[] = {&freddy, &frog, &result, &by}; |
| 367 assertEquals( |
| 368 "", |
| 369 "original, freddy, frog and by", |
| 370 fmt.formatAndReplace( |
| 371 params, |
| 372 UPRV_LENGTHOF(params), |
| 373 result, |
| 374 offsets, |
| 375 UPRV_LENGTHOF(offsets), |
| 376 status)); |
| 377 if (!assertSuccess("Status", status)) { |
| 378 return; |
| 379 } |
| 380 int32_t expectedOffsets[] = {10, 18, 0, 27}; |
| 381 verifyOffsets(expectedOffsets, offsets, UPRV_LENGTHOF(expectedOffsets)); |
| 382 } |
| 383 |
| 384 void SimplePatternFormatterTest::TestFormatReplaceNoOptimizationLeadingPlacehold
erUsedTwice() { |
| 385 UErrorCode status = U_ZERO_ERROR; |
| 386 SimplePatternFormatter fmt; |
| 387 fmt.compile("{2}, {0}, {1} and {3} {2}", status); |
| 388 if (!assertSuccess("Status", status)) { |
| 389 return; |
| 390 } |
| 391 UnicodeString result("original"); |
| 392 int offsets[4]; |
| 393 UnicodeString freddy("freddy"); |
| 394 UnicodeString frog("frog"); |
| 395 UnicodeString by("by"); |
| 396 const UnicodeString *params[] = {&freddy, &frog, &result, &by}; |
| 397 assertEquals( |
| 398 "", |
| 399 "original, freddy, frog and by original", |
| 400 fmt.formatAndReplace( |
| 401 params, |
| 402 UPRV_LENGTHOF(params), |
| 403 result, |
| 404 offsets, |
| 405 UPRV_LENGTHOF(offsets), |
| 406 status)); |
| 407 if (!assertSuccess("Status", status)) { |
| 408 return; |
| 409 } |
| 410 int32_t expectedOffsets[] = {10, 18, 30, 27}; |
| 411 verifyOffsets(expectedOffsets, offsets, UPRV_LENGTHOF(expectedOffsets)); |
| 412 } |
| 413 |
| 414 void SimplePatternFormatterTest::TestFormatReplaceOptimizationNoOffsets() { |
| 415 UErrorCode status = U_ZERO_ERROR; |
| 416 SimplePatternFormatter fmt; |
| 417 fmt.compile("{2}, {0}, {1} and {3}", status); |
| 418 if (!assertSuccess("Status", status)) { |
| 419 return; |
| 420 } |
| 421 UnicodeString result("original"); |
| 422 UnicodeString freddy("freddy"); |
| 423 UnicodeString frog("frog"); |
| 424 UnicodeString by("by"); |
| 425 const UnicodeString *params[] = {&freddy, &frog, &result, &by}; |
| 426 assertEquals( |
| 427 "", |
| 428 "original, freddy, frog and by", |
| 429 fmt.formatAndReplace( |
| 430 params, |
| 431 UPRV_LENGTHOF(params), |
| 432 result, |
| 433 NULL, |
| 434 0, |
| 435 status)); |
208 assertSuccess("Status", status); | 436 assertSuccess("Status", status); |
209 assertTrue("startsWithPlaceholder", fmt.startsWithPlaceholder(2)); | 437 } |
210 assertFalse("startsWithPlaceholder", fmt.startsWithPlaceholder(0)); | 438 |
211 UnicodeString values[] = { | 439 void SimplePatternFormatterTest::TestFormatReplaceNoOptimizationNoOffsets() { |
212 "freddy", "frog", "leg", "by"}; | 440 UErrorCode status = U_ZERO_ERROR; |
213 UnicodeString *params[] = { | 441 SimplePatternFormatter fmt("Placeholders {0} and {1}"); |
214 &values[0], &values[1], &values[2], &values[3]}; | 442 UnicodeString result("previous:"); |
215 int32_t offsets[4]; | 443 UnicodeString frog("frog"); |
216 int32_t expectedOffsets[4] = {5, 13, 0, 22}; | 444 const UnicodeString *params[] = {&result, &frog}; |
217 | 445 assertEquals( |
218 // The pattern starts with {2}, so format should append the result of | 446 "", |
219 // the rest of the pattern to values[2], the value for {2}. | 447 "Placeholders previous: and frog", |
220 assertEquals( | 448 fmt.formatAndReplace( |
221 "format", | 449 params, |
222 "leg, freddy, frog and by", | 450 UPRV_LENGTHOF(params), |
223 fmt.format( | 451 result, |
224 params, | 452 NULL, |
225 UPRV_LENGTHOF(params), | 453 0, |
226 values[2], | |
227 offsets, | |
228 UPRV_LENGTHOF(offsets), | |
229 status)); | 454 status)); |
230 assertSuccess("Status", status); | 455 assertSuccess("Status", status); |
231 for (int32_t i = 0; i < UPRV_LENGTHOF(expectedOffsets); ++i) { | 456 } |
232 if (expectedOffsets[i] != offsets[i]) { | 457 |
233 errln("Expected %d, got %d", expectedOffsets[i], offsets[i]); | 458 void SimplePatternFormatterTest::verifyOffsets( |
| 459 const int32_t *expected, const int32_t *actual, int32_t count) { |
| 460 for (int32_t i = 0; i < count; ++i) { |
| 461 if (expected[i] != actual[i]) { |
| 462 errln("Expected %d, got %d", expected[i], actual[i]); |
234 } | 463 } |
235 } | 464 } |
236 } | 465 } |
237 | 466 |
238 extern IntlTest *createSimplePatternFormatterTest() { | 467 extern IntlTest *createSimplePatternFormatterTest() { |
239 return new SimplePatternFormatterTest(); | 468 return new SimplePatternFormatterTest(); |
240 } | 469 } |
| 470 |
OLD | NEW |