OLD | NEW |
| (Empty) |
1 /* | |
2 ******************************************************************************* | |
3 * Copyright (C) 2014, International Business Machines Corporation and * | |
4 * others. All Rights Reserved. * | |
5 ******************************************************************************* | |
6 * | |
7 * File SIMPLEPATTERNFORMATTERTEST.CPP | |
8 * | |
9 ******************************************************************************** | |
10 */ | |
11 #include "cstring.h" | |
12 #include "intltest.h" | |
13 #include "simplepatternformatter.h" | |
14 | |
15 class SimplePatternFormatterTest : public IntlTest { | |
16 public: | |
17 SimplePatternFormatterTest() { | |
18 } | |
19 void TestNoPlaceholders(); | |
20 void TestOnePlaceholder(); | |
21 void TestManyPlaceholders(); | |
22 void TestTooFewPlaceholderValues(); | |
23 void TestBadArguments(); | |
24 void TestGetPatternWithNoPlaceholders(); | |
25 void TestFormatReplaceNoOptimization(); | |
26 void TestFormatReplaceNoOptimizationLeadingText(); | |
27 void TestFormatReplaceOptimization(); | |
28 void TestFormatReplaceNoOptimizationLeadingPlaceholderUsedTwice(); | |
29 void TestFormatReplaceOptimizationNoOffsets(); | |
30 void TestFormatReplaceNoOptimizationNoOffsets(); | |
31 void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=
0); | |
32 private: | |
33 void verifyOffsets( | |
34 const int32_t *expected, | |
35 const int32_t *actual, | |
36 int32_t count); | |
37 }; | |
38 | |
39 void SimplePatternFormatterTest::runIndexedTest(int32_t index, UBool exec, const
char* &name, char* /*par*/) { | |
40 TESTCASE_AUTO_BEGIN; | |
41 TESTCASE_AUTO(TestNoPlaceholders); | |
42 TESTCASE_AUTO(TestOnePlaceholder); | |
43 TESTCASE_AUTO(TestManyPlaceholders); | |
44 TESTCASE_AUTO(TestTooFewPlaceholderValues); | |
45 TESTCASE_AUTO(TestBadArguments); | |
46 TESTCASE_AUTO(TestGetPatternWithNoPlaceholders); | |
47 TESTCASE_AUTO(TestFormatReplaceNoOptimization); | |
48 TESTCASE_AUTO(TestFormatReplaceNoOptimizationLeadingText); | |
49 TESTCASE_AUTO(TestFormatReplaceOptimization); | |
50 TESTCASE_AUTO(TestFormatReplaceNoOptimizationLeadingPlaceholderUsedTwice); | |
51 TESTCASE_AUTO(TestFormatReplaceOptimizationNoOffsets); | |
52 TESTCASE_AUTO(TestFormatReplaceNoOptimizationNoOffsets); | |
53 TESTCASE_AUTO_END; | |
54 } | |
55 | |
56 void SimplePatternFormatterTest::TestNoPlaceholders() { | |
57 UErrorCode status = U_ZERO_ERROR; | |
58 SimplePatternFormatter fmt("This doesn''t have templates '{0}"); | |
59 assertEquals("PlaceholderCount", 0, fmt.getPlaceholderCount()); | |
60 UnicodeString appendTo; | |
61 assertEquals( | |
62 "format", | |
63 "This doesn't have templates {0}", | |
64 fmt.format("unused", appendTo, status)); | |
65 fmt.compile("This has {} bad {012d placeholders", status); | |
66 assertEquals("PlaceholderCount", 0, fmt.getPlaceholderCount()); | |
67 appendTo.remove(); | |
68 assertEquals( | |
69 "format", | |
70 "This has {} bad {012d placeholders", | |
71 fmt.format("unused", appendTo, status)); | |
72 assertSuccess("Status", status); | |
73 } | |
74 | |
75 void SimplePatternFormatterTest::TestOnePlaceholder() { | |
76 UErrorCode status = U_ZERO_ERROR; | |
77 SimplePatternFormatter fmt; | |
78 fmt.compile("{0} meter", status); | |
79 if (!assertSuccess("Status", status)) { | |
80 return; | |
81 } | |
82 assertEquals("PlaceholderCount", 1, fmt.getPlaceholderCount()); | |
83 UnicodeString appendTo; | |
84 assertEquals( | |
85 "format", | |
86 "1 meter", | |
87 fmt.format("1", appendTo, status)); | |
88 | |
89 // assignment | |
90 SimplePatternFormatter s; | |
91 s = fmt; | |
92 appendTo.remove(); | |
93 assertEquals( | |
94 "Assignment", | |
95 "1 meter", | |
96 s.format("1", appendTo, status)); | |
97 | |
98 // Copy constructor | |
99 SimplePatternFormatter r(fmt); | |
100 appendTo.remove(); | |
101 assertEquals( | |
102 "Copy constructor", | |
103 "1 meter", | |
104 r.format("1", appendTo, status)); | |
105 assertSuccess("Status", status); | |
106 } | |
107 | |
108 void SimplePatternFormatterTest::TestManyPlaceholders() { | |
109 UErrorCode status = U_ZERO_ERROR; | |
110 SimplePatternFormatter fmt; | |
111 fmt.compile( | |
112 "Templates {2}{1}{5} and {4} are out of order.", status); | |
113 if (!assertSuccess("Status", status)) { | |
114 return; | |
115 } | |
116 assertEquals("PlaceholderCount", 6, fmt.getPlaceholderCount()); | |
117 UnicodeString values[] = { | |
118 "freddy", "tommy", "frog", "billy", "leg", "{0}"}; | |
119 UnicodeString *params[] = { | |
120 &values[0], &values[1], &values[2], &values[3], &values[4], &values[5
]}; | |
121 int32_t offsets[6]; | |
122 int32_t expectedOffsets[6] = {-1, 22, 18, -1, 35, 27}; | |
123 UnicodeString appendTo("Prefix: "); | |
124 assertEquals( | |
125 "format", | |
126 "Prefix: Templates frogtommy{0} and leg are out of order.", | |
127 fmt.formatAndAppend( | |
128 params, | |
129 UPRV_LENGTHOF(params), | |
130 appendTo, | |
131 offsets, | |
132 UPRV_LENGTHOF(offsets), | |
133 status)); | |
134 if (!assertSuccess("Status", status)) { | |
135 return; | |
136 } | |
137 verifyOffsets(expectedOffsets, offsets, UPRV_LENGTHOF(expectedOffsets)); | |
138 appendTo.remove(); | |
139 | |
140 // Ensure we don't write to offsets array beyond its length. | |
141 status = U_ZERO_ERROR; | |
142 offsets[UPRV_LENGTHOF(offsets) - 1] = 289; | |
143 appendTo.remove(); | |
144 fmt.formatAndAppend( | |
145 params, | |
146 UPRV_LENGTHOF(params), | |
147 appendTo, | |
148 offsets, | |
149 UPRV_LENGTHOF(offsets) - 1, | |
150 status); | |
151 assertEquals("Offsets buffer length", 289, offsets[UPRV_LENGTHOF(offsets) -
1]); | |
152 | |
153 // Test assignment | |
154 SimplePatternFormatter s; | |
155 s = fmt; | |
156 appendTo.remove(); | |
157 assertEquals( | |
158 "Assignment", | |
159 "Templates frogtommy{0} and leg are out of order.", | |
160 s.formatAndAppend( | |
161 params, | |
162 UPRV_LENGTHOF(params), | |
163 appendTo, | |
164 NULL, | |
165 0, | |
166 status)); | |
167 | |
168 // Copy constructor | |
169 SimplePatternFormatter r(fmt); | |
170 appendTo.remove(); | |
171 assertEquals( | |
172 "Copy constructor", | |
173 "Templates frogtommy{0} and leg are out of order.", | |
174 r.formatAndAppend( | |
175 params, | |
176 UPRV_LENGTHOF(params), | |
177 appendTo, | |
178 NULL, | |
179 0, | |
180 status)); | |
181 r.compile("{0} meter", status); | |
182 assertEquals("PlaceholderCount", 1, r.getPlaceholderCount()); | |
183 appendTo.remove(); | |
184 assertEquals( | |
185 "Replace with new compile", | |
186 "freddy meter", | |
187 r.format("freddy", appendTo, status)); | |
188 r.compile("{0}, {1}", status); | |
189 assertEquals("PlaceholderCount", 2, r.getPlaceholderCount()); | |
190 appendTo.remove(); | |
191 assertEquals( | |
192 "2 arg", | |
193 "foo, bar", | |
194 r.format("foo", "bar", appendTo, status)); | |
195 r.compile("{0}, {1} and {2}", status); | |
196 assertEquals("PlaceholderCount", 3, r.getPlaceholderCount()); | |
197 appendTo.remove(); | |
198 assertEquals( | |
199 "3 arg", | |
200 "foo, bar and baz", | |
201 r.format("foo", "bar", "baz", appendTo, status)); | |
202 assertSuccess("Status", status); | |
203 } | |
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 | |
288 void SimplePatternFormatterTest::TestGetPatternWithNoPlaceholders() { | |
289 SimplePatternFormatter fmt("{0} has no {1} placeholders."); | |
290 assertEquals( | |
291 "", " has no placeholders.", fmt.getPatternWithNoPlaceholders()); | |
292 } | |
293 | |
294 void SimplePatternFormatterTest::TestFormatReplaceNoOptimization() { | |
295 UErrorCode status = U_ZERO_ERROR; | |
296 SimplePatternFormatter fmt; | |
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)); | |
436 assertSuccess("Status", status); | |
437 } | |
438 | |
439 void SimplePatternFormatterTest::TestFormatReplaceNoOptimizationNoOffsets() { | |
440 UErrorCode status = U_ZERO_ERROR; | |
441 SimplePatternFormatter fmt("Placeholders {0} and {1}"); | |
442 UnicodeString result("previous:"); | |
443 UnicodeString frog("frog"); | |
444 const UnicodeString *params[] = {&result, &frog}; | |
445 assertEquals( | |
446 "", | |
447 "Placeholders previous: and frog", | |
448 fmt.formatAndReplace( | |
449 params, | |
450 UPRV_LENGTHOF(params), | |
451 result, | |
452 NULL, | |
453 0, | |
454 status)); | |
455 assertSuccess("Status", status); | |
456 } | |
457 | |
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]); | |
463 } | |
464 } | |
465 } | |
466 | |
467 extern IntlTest *createSimplePatternFormatterTest() { | |
468 return new SimplePatternFormatterTest(); | |
469 } | |
470 | |
OLD | NEW |