]> git.saurik.com Git - apple/icu.git/blob - icuSources/test/intltest/reldatefmttest.cpp
ICU-551.41.tar.gz
[apple/icu.git] / icuSources / test / intltest / reldatefmttest.cpp
1 /*
2 *******************************************************************************
3 * Copyright (C) 2013-2015, International Business Machines Corporation and *
4 * others. All Rights Reserved. *
5 *******************************************************************************
6 *
7 * File RELDATEFMTTEST.CPP
8 *
9 *******************************************************************************
10 */
11 #include <stdio.h>
12 #include <stdlib.h>
13
14 #include "intltest.h"
15
16 #if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_BREAK_ITERATION
17
18 #include "unicode/localpointer.h"
19 #include "unicode/numfmt.h"
20 #include "unicode/reldatefmt.h"
21 #include "cmemory.h"
22
23 static const char *DirectionStr(UDateDirection direction);
24 static const char *RelativeUnitStr(UDateRelativeUnit unit);
25 static const char *AbsoluteUnitStr(UDateAbsoluteUnit unit);
26
27 typedef struct WithQuantityExpected {
28 double value;
29 UDateDirection direction;
30 UDateRelativeUnit unit;
31 const char *expected;
32 } WithQuantityExpected;
33
34 typedef struct WithoutQuantityExpected {
35 UDateDirection direction;
36 UDateAbsoluteUnit unit;
37 const char *expected;
38 } WithoutQuantityExpected;
39
40 static WithQuantityExpected kEnglish[] = {
41 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0 seconds"},
42 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0.5 seconds"},
43 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 1 second"},
44 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 2 seconds"},
45 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 0 minutes"},
46 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 0.5 minutes"},
47 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 1 minute"},
48 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 2 minutes"},
49 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 0 hours"},
50 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 0.5 hours"},
51 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 1 hour"},
52 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 2 hours"},
53 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 0 days"},
54 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 0.5 days"},
55 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 1 day"},
56 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 2 days"},
57 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 0 weeks"},
58 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 0.5 weeks"},
59 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 1 week"},
60 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 2 weeks"},
61 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 0 months"},
62 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 0.5 months"},
63 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 1 month"},
64 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 2 months"},
65 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 0 years"},
66 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 0.5 years"},
67 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 1 year"},
68 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 2 years"},
69
70 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0 seconds ago"},
71 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0.5 seconds ago"},
72 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "1 second ago"},
73 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "2 seconds ago"},
74 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0 minutes ago"},
75 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0.5 minutes ago"},
76 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "1 minute ago"},
77 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "2 minutes ago"},
78 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0 hours ago"},
79 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0.5 hours ago"},
80 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "1 hour ago"},
81 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "2 hours ago"},
82 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0 days ago"},
83 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0.5 days ago"},
84 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "1 day ago"},
85 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "2 days ago"},
86 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0 weeks ago"},
87 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0.5 weeks ago"},
88 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "1 week ago"},
89 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "2 weeks ago"},
90 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0 months ago"},
91 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0.5 months ago"},
92 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "1 month ago"},
93 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "2 months ago"},
94 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0 years ago"},
95 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0.5 years ago"},
96 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "1 year ago"},
97 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "2 years ago"}
98 };
99
100 static WithQuantityExpected kEnglishCaps[] = {
101 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "In 0 seconds"},
102 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "In 0.5 seconds"},
103 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "In 1 second"},
104 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "In 2 seconds"},
105 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "In 0 minutes"},
106 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "In 0.5 minutes"},
107 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "In 1 minute"},
108 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "In 2 minutes"},
109 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "In 0 hours"},
110 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "In 0.5 hours"},
111 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "In 1 hour"},
112 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "In 2 hours"},
113 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "In 0 days"},
114 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "In 0.5 days"},
115 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "In 1 day"},
116 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "In 2 days"},
117 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "In 0 weeks"},
118 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "In 0.5 weeks"},
119 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "In 1 week"},
120 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "In 2 weeks"},
121 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "In 0 months"},
122 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "In 0.5 months"},
123 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "In 1 month"},
124 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "In 2 months"},
125 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "In 0 years"},
126 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "In 0.5 years"},
127 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "In 1 year"},
128 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "In 2 years"},
129
130 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0 seconds ago"},
131 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0.5 seconds ago"},
132 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "1 second ago"},
133 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "2 seconds ago"},
134 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0 minutes ago"},
135 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0.5 minutes ago"},
136 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "1 minute ago"},
137 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "2 minutes ago"},
138 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0 hours ago"},
139 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0.5 hours ago"},
140 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "1 hour ago"},
141 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "2 hours ago"},
142 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0 days ago"},
143 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0.5 days ago"},
144 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "1 day ago"},
145 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "2 days ago"},
146 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0 weeks ago"},
147 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0.5 weeks ago"},
148 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "1 week ago"},
149 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "2 weeks ago"},
150 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0 months ago"},
151 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0.5 months ago"},
152 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "1 month ago"},
153 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "2 months ago"},
154 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0 years ago"},
155 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0.5 years ago"},
156 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "1 year ago"},
157 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "2 years ago"}
158 };
159
160 static WithQuantityExpected kEnglishShort[] = {
161 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0 sec."},
162 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0.5 sec."},
163 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 1 sec."},
164 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 2 sec."},
165 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 0 min."},
166 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 0.5 min."},
167 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 1 min."},
168 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 2 min."},
169 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 0 hr."},
170 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 0.5 hr."},
171 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 1 hr."},
172 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 2 hr."},
173 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 0 days"},
174 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 0.5 days"},
175 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 1 day"},
176 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 2 days"},
177 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 0 wk."},
178 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 0.5 wk."},
179 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 1 wk."},
180 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 2 wk."},
181 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 0 mo."},
182 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 0.5 mo."},
183 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 1 mo."},
184 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 2 mo."},
185 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 0 yr."},
186 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 0.5 yr."},
187 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 1 yr."},
188 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 2 yr."},
189
190 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0 sec. ago"},
191 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0.5 sec. ago"},
192 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "1 sec. ago"},
193 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "2 sec. ago"},
194 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0 min. ago"},
195 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0.5 min. ago"},
196 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "1 min. ago"},
197 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "2 min. ago"},
198 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0 hr. ago"},
199 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0.5 hr. ago"},
200 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "1 hr. ago"},
201 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "2 hr. ago"},
202 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0 days ago"},
203 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0.5 days ago"},
204 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "1 day ago"},
205 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "2 days ago"},
206 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0 wk. ago"},
207 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0.5 wk. ago"},
208 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "1 wk. ago"},
209 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "2 wk. ago"},
210 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0 mo. ago"},
211 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0.5 mo. ago"},
212 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "1 mo. ago"},
213 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "2 mo. ago"},
214 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0 yr. ago"},
215 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0.5 yr. ago"},
216 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "1 yr. ago"},
217 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "2 yr. ago"}
218 };
219
220 static WithQuantityExpected kEnglishDecimal[] = {
221 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0.0 seconds"},
222 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0.5 seconds"},
223 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 1.0 seconds"},
224 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 2.0 seconds"}
225 };
226
227 static WithQuantityExpected kSerbian[] = {
228 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "\\u0437\\u0430 0 \\u043c\\u0435\\u0441\\u0435\\u0446\\u0438"},
229 {1.2, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "\\u0437\\u0430 1,2 \\u043c\\u0435\\u0441\\u0435\\u0446\\u0430"},
230 {21.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "\\u0437\\u0430 21 \\u043c\\u0435\\u0441\\u0435\\u0446"}
231 };
232
233 static WithQuantityExpected kSerbianNarrow[] = {
234 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "\\u0437\\u0430 0 \\u043c\\u0435\\u0441."},
235 {1.2, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "\\u0437\\u0430 1,2 \\u043c\\u0435\\u0441."},
236 {21.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "\\u0437\\u0430 21 \\u043c\\u0435\\u0441."}
237 };
238
239 static WithoutQuantityExpected kEnglishNoQuantity[] = {
240 {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, ""},
241
242 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, "tomorrow"},
243 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEEK, "next week"},
244 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONTH, "next month"},
245 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, "next year"},
246 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONDAY, "next Monday"},
247 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_TUESDAY, "next Tuesday"},
248 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEDNESDAY, "next Wednesday"},
249 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_THURSDAY, "next Thursday"},
250 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_FRIDAY, "next Friday"},
251 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SATURDAY, "next Saturday"},
252 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, "next Sunday"},
253
254 {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, ""},
255
256 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, "yesterday"},
257 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEEK, "last week"},
258 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONTH, "last month"},
259 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_YEAR, "last year"},
260 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONDAY, "last Monday"},
261 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_TUESDAY, "last Tuesday"},
262 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEDNESDAY, "last Wednesday"},
263 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_THURSDAY, "last Thursday"},
264 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_FRIDAY, "last Friday"},
265 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SATURDAY, "last Saturday"},
266 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, "last Sunday"},
267
268 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, "today"},
269 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEEK, "this week"},
270 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONTH, "this month"},
271 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_YEAR, "this year"},
272 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONDAY, "this Monday"},
273 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_TUESDAY, "this Tuesday"},
274 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEDNESDAY, "this Wednesday"},
275 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_THURSDAY, "this Thursday"},
276 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_FRIDAY, "this Friday"},
277 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SATURDAY, "this Saturday"},
278 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, "this Sunday"},
279
280 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_DAY, "day"},
281 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEEK, "week"},
282 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONTH, "month"},
283 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_YEAR, "year"},
284 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONDAY, "Monday"},
285 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_TUESDAY, "Tuesday"},
286 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEDNESDAY, "Wednesday"},
287 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_THURSDAY, "Thursday"},
288 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_FRIDAY, "Friday"},
289 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SATURDAY, "Saturday"},
290 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, "Sunday"},
291
292 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "now"}
293 };
294
295 static WithoutQuantityExpected kEnglishNoQuantityCaps[] = {
296 {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, ""},
297
298 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, "Tomorrow"},
299 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEEK, "Next week"},
300 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONTH, "Next month"},
301 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, "Next year"},
302 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONDAY, "Next Monday"},
303 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_TUESDAY, "Next Tuesday"},
304 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEDNESDAY, "Next Wednesday"},
305 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_THURSDAY, "Next Thursday"},
306 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_FRIDAY, "Next Friday"},
307 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SATURDAY, "Next Saturday"},
308 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, "Next Sunday"},
309
310 {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, ""},
311
312 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, "Yesterday"},
313 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEEK, "Last week"},
314 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONTH, "Last month"},
315 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_YEAR, "Last year"},
316 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONDAY, "Last Monday"},
317 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_TUESDAY, "Last Tuesday"},
318 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEDNESDAY, "Last Wednesday"},
319 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_THURSDAY, "Last Thursday"},
320 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_FRIDAY, "Last Friday"},
321 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SATURDAY, "Last Saturday"},
322 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, "Last Sunday"},
323
324 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, "Today"},
325 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEEK, "This week"},
326 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONTH, "This month"},
327 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_YEAR, "This year"},
328 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONDAY, "This Monday"},
329 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_TUESDAY, "This Tuesday"},
330 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEDNESDAY, "This Wednesday"},
331 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_THURSDAY, "This Thursday"},
332 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_FRIDAY, "This Friday"},
333 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SATURDAY, "This Saturday"},
334 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, "This Sunday"},
335
336 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_DAY, "Day"},
337 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEEK, "Week"},
338 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONTH, "Month"},
339 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_YEAR, "Year"},
340 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONDAY, "Monday"},
341 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_TUESDAY, "Tuesday"},
342 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEDNESDAY, "Wednesday"},
343 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_THURSDAY, "Thursday"},
344 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_FRIDAY, "Friday"},
345 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SATURDAY, "Saturday"},
346 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, "Sunday"},
347
348 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "Now"}
349 };
350
351 static WithoutQuantityExpected kEnglishNoQuantityShort[] = {
352 {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, ""},
353
354 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, "tomorrow"},
355 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEEK, "next wk."},
356 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONTH, "next mo."},
357 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, "next yr."},
358 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONDAY, "next Mon."},
359 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_TUESDAY, "next Tue."},
360 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEDNESDAY, "next Wed."},
361 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_THURSDAY, "next Thu."},
362 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_FRIDAY, "next Fri."},
363 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SATURDAY, "next Sat."},
364 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, "next Sun."},
365
366 {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, ""},
367
368 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, "yesterday"},
369 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEEK, "last wk."},
370 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONTH, "last mo."},
371 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_YEAR, "last yr."},
372 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONDAY, "last Mon."},
373 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_TUESDAY, "last Tue."},
374 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEDNESDAY, "last Wed."},
375 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_THURSDAY, "last Thu."},
376 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_FRIDAY, "last Fri."},
377 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SATURDAY, "last Sat."},
378 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, "last Sun."},
379
380 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, "today"},
381 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEEK, "this wk."},
382 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONTH, "this mo."},
383 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_YEAR, "this yr."},
384 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONDAY, "this Mon."},
385 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_TUESDAY, "this Tue."},
386 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEDNESDAY, "this Wed."},
387 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_THURSDAY, "this Thu."},
388 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_FRIDAY, "this Fri."},
389 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SATURDAY, "this Sat."},
390 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, "this Sun."},
391
392 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_DAY, "day"},
393 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEEK, "wk."},
394 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONTH, "mo."},
395 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_YEAR, "yr."},
396 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONDAY, "Mo"},
397 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_TUESDAY, "Tu"},
398 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEDNESDAY, "We"},
399 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_THURSDAY, "Th"},
400 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_FRIDAY, "Fr"},
401 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SATURDAY, "Sa"},
402 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, "Su"},
403
404 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "now"}
405 };
406
407 static WithoutQuantityExpected kEnglishNoQuantityNarrow[] = {
408 {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, ""},
409
410 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, "tomorrow"},
411 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEEK, "next wk."},
412 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONTH, "next mo."},
413 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, "next yr."},
414 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONDAY, "next M"},
415 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_TUESDAY, "next Tu"},
416 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEDNESDAY, "next W"},
417 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_THURSDAY, "next Th"},
418 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_FRIDAY, "next F"},
419 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SATURDAY, "next Sa"},
420 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, "next Su"},
421
422 {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, ""},
423
424 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, "yesterday"},
425 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEEK, "last wk."},
426 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONTH, "last mo."},
427 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_YEAR, "last yr."},
428 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONDAY, "last M"},
429 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_TUESDAY, "last Tu"},
430 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEDNESDAY, "last W"},
431 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_THURSDAY, "last Th"},
432 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_FRIDAY, "last F"},
433 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SATURDAY, "last Sa"},
434 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, "last Su"},
435
436 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, "today"},
437 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEEK, "this wk."},
438 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONTH, "this mo."},
439 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_YEAR, "this yr."},
440 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONDAY, "this M"},
441 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_TUESDAY, "this Tu"},
442 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEDNESDAY, "this W"},
443 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_THURSDAY, "this Th"},
444 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_FRIDAY, "this F"},
445 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SATURDAY, "this Sa"},
446 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, "this Su"},
447
448 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_DAY, "day"},
449 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEEK, "wk."},
450 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONTH, "mo."},
451 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_YEAR, "yr."},
452 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONDAY, "M"},
453 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_TUESDAY, "T"},
454 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEDNESDAY, "W"},
455 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_THURSDAY, "T"},
456 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_FRIDAY, "F"},
457 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SATURDAY, "S"},
458 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, "S"},
459
460 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "now"}
461 };
462
463 static WithoutQuantityExpected kSpanishNoQuantity[] = {
464 {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, "pasado ma\\u00F1ana"},
465 {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, "anteayer"}
466 };
467
468 class RelativeDateTimeFormatterTest : public IntlTest {
469 public:
470 RelativeDateTimeFormatterTest() {
471 }
472
473 void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0);
474 private:
475 void TestEnglish();
476 void TestEnglishCaps();
477 void TestEnglishShort();
478 void TestEnglishNarrow();
479 void TestSerbian();
480 void TestSerbianFallback();
481 void TestEnglishNoQuantity();
482 void TestEnglishNoQuantityCaps();
483 void TestEnglishNoQuantityShort();
484 void TestEnglishNoQuantityNarrow();
485 void TestSpanishNoQuantity();
486 void TestFormatWithQuantityIllegalArgument();
487 void TestFormatWithoutQuantityIllegalArgument();
488 void TestCustomNumberFormat();
489 void TestGetters();
490 void TestCombineDateAndTime();
491 void TestBadDisplayContext();
492 void RunTest(
493 const Locale& locale,
494 const WithQuantityExpected* expectedResults,
495 int32_t expectedResultLength);
496 void RunTest(
497 const Locale& locale,
498 UDateRelativeDateTimeFormatterStyle style,
499 const WithQuantityExpected* expectedResults,
500 int32_t expectedResultLength);
501 void RunTest(
502 const Locale& locale,
503 const WithoutQuantityExpected* expectedResults,
504 int32_t expectedResultLength);
505 void RunTest(
506 const Locale& locale,
507 UDateRelativeDateTimeFormatterStyle style,
508 const WithoutQuantityExpected* expectedResults,
509 int32_t expectedResultLength);
510 void RunTest(
511 const RelativeDateTimeFormatter& fmt,
512 const WithQuantityExpected* expectedResults,
513 int32_t expectedResultLength,
514 const char *description);
515 void RunTest(
516 const RelativeDateTimeFormatter& fmt,
517 const WithoutQuantityExpected* expectedResults,
518 int32_t expectedResultLength,
519 const char *description);
520 void CheckExpectedResult(
521 const RelativeDateTimeFormatter& fmt,
522 const WithQuantityExpected& expectedResult,
523 const char* description);
524 void CheckExpectedResult(
525 const RelativeDateTimeFormatter& fmt,
526 const WithoutQuantityExpected& expectedResult,
527 const char* description);
528 void VerifyIllegalArgument(
529 const RelativeDateTimeFormatter& fmt,
530 UDateDirection direction,
531 UDateRelativeUnit unit);
532 void VerifyIllegalArgument(
533 const RelativeDateTimeFormatter& fmt,
534 UDateDirection direction,
535 UDateAbsoluteUnit unit);
536 };
537
538 void RelativeDateTimeFormatterTest::runIndexedTest(
539 int32_t index, UBool exec, const char *&name, char *) {
540 if (exec) {
541 logln("TestSuite RelativeDateTimeFormatterTest: ");
542 }
543 TESTCASE_AUTO_BEGIN;
544 TESTCASE_AUTO(TestEnglish);
545 TESTCASE_AUTO(TestEnglishCaps);
546 TESTCASE_AUTO(TestEnglishShort);
547 TESTCASE_AUTO(TestEnglishNarrow);
548 TESTCASE_AUTO(TestSerbian);
549 TESTCASE_AUTO(TestSerbianFallback);
550 TESTCASE_AUTO(TestEnglishNoQuantity);
551 TESTCASE_AUTO(TestEnglishNoQuantityCaps);
552 TESTCASE_AUTO(TestEnglishNoQuantityShort);
553 TESTCASE_AUTO(TestEnglishNoQuantityNarrow);
554 TESTCASE_AUTO(TestSpanishNoQuantity);
555 TESTCASE_AUTO(TestFormatWithQuantityIllegalArgument);
556 TESTCASE_AUTO(TestFormatWithoutQuantityIllegalArgument);
557 TESTCASE_AUTO(TestCustomNumberFormat);
558 TESTCASE_AUTO(TestGetters);
559 TESTCASE_AUTO(TestCombineDateAndTime);
560 TESTCASE_AUTO(TestBadDisplayContext);
561 TESTCASE_AUTO_END;
562 }
563
564 void RelativeDateTimeFormatterTest::TestEnglish() {
565 RunTest("en", kEnglish, UPRV_LENGTHOF(kEnglish));
566 }
567
568 void RelativeDateTimeFormatterTest::TestEnglishCaps() {
569 UErrorCode status = U_ZERO_ERROR;
570 RelativeDateTimeFormatter fmt(
571 "en",
572 NULL,
573 UDAT_STYLE_LONG,
574 UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE,
575 status);
576 if (U_FAILURE(status)) {
577 dataerrln("Failed call to RelativeDateTimeFormatter(\"en\", NULL, UDAT_STYLE_LONG, UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, status); : %s", u_errorName(status));
578 return;
579 }
580 RelativeDateTimeFormatter fmt3(status);
581
582 // Test assignment and copy constructor with capitalization on.
583 RelativeDateTimeFormatter fmt2(fmt);
584 fmt3 = fmt2;
585 assertSuccess("", status);
586 RunTest(fmt3, kEnglishCaps, UPRV_LENGTHOF(kEnglishCaps), "en caps");
587 }
588
589 void RelativeDateTimeFormatterTest::TestEnglishShort() {
590 RunTest("en", UDAT_STYLE_SHORT, kEnglishShort, UPRV_LENGTHOF(kEnglishShort));
591 }
592
593 void RelativeDateTimeFormatterTest::TestEnglishNarrow() {
594 RunTest("en", UDAT_STYLE_NARROW, kEnglishShort, UPRV_LENGTHOF(kEnglishShort));
595 }
596
597 void RelativeDateTimeFormatterTest::TestSerbian() {
598 RunTest("sr", kSerbian, UPRV_LENGTHOF(kSerbian));
599 }
600
601 void RelativeDateTimeFormatterTest::TestSerbianFallback() {
602 RunTest("sr", UDAT_STYLE_NARROW, kSerbianNarrow, UPRV_LENGTHOF(kSerbianNarrow));
603 }
604
605 void RelativeDateTimeFormatterTest::TestEnglishNoQuantity() {
606 RunTest("en", kEnglishNoQuantity, UPRV_LENGTHOF(kEnglishNoQuantity));
607 }
608
609 void RelativeDateTimeFormatterTest::TestEnglishNoQuantityCaps() {
610 UErrorCode status = U_ZERO_ERROR;
611 RelativeDateTimeFormatter fmt(
612 "en",
613 NULL,
614 UDAT_STYLE_LONG,
615 UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE,
616 status);
617 if (assertSuccess("RelativeDateTimeFormatter", status, TRUE) == FALSE) {
618 return;
619 }
620 RunTest(
621 fmt,
622 kEnglishNoQuantityCaps,
623 UPRV_LENGTHOF(kEnglishNoQuantityCaps),
624 "en caps no quantity");
625 }
626
627 void RelativeDateTimeFormatterTest::TestEnglishNoQuantityShort() {
628 RunTest(
629 "en",
630 UDAT_STYLE_SHORT,
631 kEnglishNoQuantityShort,
632 UPRV_LENGTHOF(kEnglishNoQuantityShort));
633 }
634
635 void RelativeDateTimeFormatterTest::TestEnglishNoQuantityNarrow() {
636 RunTest(
637 "en",
638 UDAT_STYLE_NARROW,
639 kEnglishNoQuantityNarrow,
640 UPRV_LENGTHOF(kEnglishNoQuantityNarrow));
641 }
642
643 void RelativeDateTimeFormatterTest::TestSpanishNoQuantity() {
644 RunTest("es", kSpanishNoQuantity, UPRV_LENGTHOF(kSpanishNoQuantity));
645 }
646
647 void RelativeDateTimeFormatterTest::TestFormatWithQuantityIllegalArgument() {
648 UErrorCode status = U_ZERO_ERROR;
649 RelativeDateTimeFormatter fmt("en", status);
650 if (U_FAILURE(status)) {
651 dataerrln("Failure creating format object - %s", u_errorName(status));
652 return;
653 }
654 VerifyIllegalArgument(fmt, UDAT_DIRECTION_PLAIN, UDAT_RELATIVE_DAYS);
655 VerifyIllegalArgument(fmt, UDAT_DIRECTION_THIS, UDAT_RELATIVE_DAYS);
656 }
657
658 void RelativeDateTimeFormatterTest::TestFormatWithoutQuantityIllegalArgument() {
659 UErrorCode status = U_ZERO_ERROR;
660 RelativeDateTimeFormatter fmt("en", status);
661 if (U_FAILURE(status)) {
662 dataerrln("Failure creating format object - %s", u_errorName(status));
663 return;
664 }
665 VerifyIllegalArgument(fmt, UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_NOW);
666 VerifyIllegalArgument(fmt, UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_NOW);
667 VerifyIllegalArgument(fmt, UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_NOW);
668 }
669
670 void RelativeDateTimeFormatterTest::TestCustomNumberFormat() {
671 NumberFormat *nf;
672 UErrorCode status = U_ZERO_ERROR;
673 {
674 RelativeDateTimeFormatter fmt("en", status);
675 if (U_FAILURE(status)) {
676 dataerrln(
677 "Failure creating format object - %s", u_errorName(status));
678 return;
679 }
680 nf = (NumberFormat *) fmt.getNumberFormat().clone();
681 }
682 nf->setMinimumFractionDigits(1);
683 nf->setMaximumFractionDigits(1);
684 RelativeDateTimeFormatter fmt("en", nf, status);
685
686 // Test copy constructor.
687 RelativeDateTimeFormatter fmt2(fmt);
688 RunTest(fmt2, kEnglishDecimal, UPRV_LENGTHOF(kEnglishDecimal), "en decimal digits");
689
690 // Test assignment
691 fmt = RelativeDateTimeFormatter("es", status);
692 RunTest(fmt, kSpanishNoQuantity, UPRV_LENGTHOF(kSpanishNoQuantity), "assignment operator");
693
694 }
695
696 void RelativeDateTimeFormatterTest::TestGetters() {
697 UErrorCode status = U_ZERO_ERROR;
698 RelativeDateTimeFormatter fmt(
699 "en",
700 NULL,
701 UDAT_STYLE_NARROW,
702 UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE,
703 status);
704 if (U_FAILURE(status)) {
705 dataerrln("Failed call to RelativeDateTimeFormatter(\"en\", NULL, UDAT_STYLE_NARROW, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, status);) : %s", u_errorName(status));
706 return;
707 }
708 RelativeDateTimeFormatter fmt3(status);
709
710 // copy and assignment.
711 RelativeDateTimeFormatter fmt2(fmt);
712 fmt3 = fmt2;
713 assertEquals("style", UDAT_STYLE_NARROW, fmt3.getFormatStyle());
714 assertEquals(
715 "context",
716 UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE,
717 fmt3.getCapitalizationContext());
718 assertSuccess("", status);
719 }
720
721 void RelativeDateTimeFormatterTest::TestCombineDateAndTime() {
722 UErrorCode status = U_ZERO_ERROR;
723 RelativeDateTimeFormatter fmt("en", status);
724 if (U_FAILURE(status)) {
725 dataerrln("Failure creating format object - %s", u_errorName(status));
726 return;
727 }
728 UnicodeString actual;
729 fmt.combineDateAndTime(
730 UnicodeString("yesterday"),
731 UnicodeString("3:50"),
732 actual,
733 status);
734 UnicodeString expected("yesterday, 3:50");
735 if (expected != actual) {
736 errln("Expected "+expected+", got "+actual);
737 }
738 }
739
740 void RelativeDateTimeFormatterTest::TestBadDisplayContext() {
741 UErrorCode status = U_ZERO_ERROR;
742 RelativeDateTimeFormatter fmt(
743 "en", NULL, UDAT_STYLE_LONG, UDISPCTX_STANDARD_NAMES, status);
744 if (status != U_ILLEGAL_ARGUMENT_ERROR) {
745 errln("Expected U_ILLEGAL_ARGUMENT_ERROR, got %s", u_errorName(status));
746 }
747 }
748
749
750
751 void RelativeDateTimeFormatterTest::RunTest(
752 const Locale& locale,
753 const WithQuantityExpected* expectedResults,
754 int32_t expectedResultLength) {
755 UErrorCode status = U_ZERO_ERROR;
756 RelativeDateTimeFormatter fmt(locale, status);
757 if (U_FAILURE(status)) {
758 dataerrln("Unable to create format object - %s", u_errorName(status));
759 return;
760 }
761 RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
762 }
763
764 void RelativeDateTimeFormatterTest::RunTest(
765 const Locale& locale,
766 UDateRelativeDateTimeFormatterStyle style,
767 const WithQuantityExpected* expectedResults,
768 int32_t expectedResultLength) {
769 UErrorCode status = U_ZERO_ERROR;
770 RelativeDateTimeFormatter fmt(
771 locale, NULL, style, UDISPCTX_CAPITALIZATION_NONE, status);
772 if (U_FAILURE(status)) {
773 dataerrln("Unable to create format object - %s", u_errorName(status));
774 return;
775 }
776 RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
777 }
778
779 void RelativeDateTimeFormatterTest::RunTest(
780 const Locale& locale,
781 const WithoutQuantityExpected* expectedResults,
782 int32_t expectedResultLength) {
783 UErrorCode status = U_ZERO_ERROR;
784 RelativeDateTimeFormatter fmt(locale, status);
785 if (U_FAILURE(status)) {
786 dataerrln("Unable to create format object - %s", u_errorName(status));
787 return;
788 }
789 RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
790 }
791
792 void RelativeDateTimeFormatterTest::RunTest(
793 const Locale& locale,
794 UDateRelativeDateTimeFormatterStyle style,
795 const WithoutQuantityExpected* expectedResults,
796 int32_t expectedResultLength) {
797 UErrorCode status = U_ZERO_ERROR;
798 RelativeDateTimeFormatter fmt(
799 locale, NULL, style, UDISPCTX_CAPITALIZATION_NONE, status);
800 if (U_FAILURE(status)) {
801 dataerrln("Unable to create format object - %s", u_errorName(status));
802 return;
803 }
804 RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
805 }
806
807 void RelativeDateTimeFormatterTest::RunTest(
808 const RelativeDateTimeFormatter& fmt,
809 const WithQuantityExpected* expectedResults,
810 int32_t expectedResultLength,
811 const char *description) {
812 for (int32_t i = 0; i < expectedResultLength; ++i) {
813 CheckExpectedResult(fmt, expectedResults[i], description);
814 }
815 }
816
817 void RelativeDateTimeFormatterTest::RunTest(
818 const RelativeDateTimeFormatter& fmt,
819 const WithoutQuantityExpected* expectedResults,
820 int32_t expectedResultLength,
821 const char *description) {
822 for (int32_t i = 0; i < expectedResultLength; ++i) {
823 CheckExpectedResult(fmt, expectedResults[i], description);
824 }
825 }
826
827 void RelativeDateTimeFormatterTest::CheckExpectedResult(
828 const RelativeDateTimeFormatter& fmt,
829 const WithQuantityExpected& expectedResult,
830 const char* description) {
831 UErrorCode status = U_ZERO_ERROR;
832 UnicodeString actual;
833 fmt.format(expectedResult.value, expectedResult.direction, expectedResult.unit, actual, status);
834 UnicodeString expected(expectedResult.expected, -1, US_INV);
835 expected = expected.unescape();
836 char buffer[256];
837 sprintf(
838 buffer,
839 "%s, %f, %s, %s",
840 description,
841 expectedResult.value,
842 DirectionStr(expectedResult.direction),
843 RelativeUnitStr(expectedResult.unit));
844 if (actual != expected) {
845 errln(UnicodeString("Fail: Expected: ") + expected
846 + ", Got: " + actual
847 + ", For: " + buffer);
848 }
849 }
850
851 void RelativeDateTimeFormatterTest::CheckExpectedResult(
852 const RelativeDateTimeFormatter& fmt,
853 const WithoutQuantityExpected& expectedResult,
854 const char* description) {
855 UErrorCode status = U_ZERO_ERROR;
856 UnicodeString actual;
857 fmt.format(expectedResult.direction, expectedResult.unit, actual, status);
858 UnicodeString expected(expectedResult.expected, -1, US_INV);
859 expected = expected.unescape();
860 char buffer[256];
861 sprintf(
862 buffer,
863 "%s, %s, %s",
864 description,
865 DirectionStr(expectedResult.direction),
866 AbsoluteUnitStr(expectedResult.unit));
867 if (actual != expected) {
868 errln(UnicodeString("Fail: Expected: ") + expected
869 + ", Got: " + actual
870 + ", For: " + buffer);
871 }
872 }
873
874 void RelativeDateTimeFormatterTest::VerifyIllegalArgument(
875 const RelativeDateTimeFormatter& fmt,
876 UDateDirection direction,
877 UDateRelativeUnit unit) {
878 UnicodeString appendTo;
879 UErrorCode status = U_ZERO_ERROR;
880 fmt.format(1.0, direction, unit, appendTo, status);
881 if (status != U_ILLEGAL_ARGUMENT_ERROR) {
882 errln("Expected U_ILLEGAL_ARGUMENT_ERROR, got %s", u_errorName(status));
883 }
884 }
885
886 void RelativeDateTimeFormatterTest::VerifyIllegalArgument(
887 const RelativeDateTimeFormatter& fmt,
888 UDateDirection direction,
889 UDateAbsoluteUnit unit) {
890 UnicodeString appendTo;
891 UErrorCode status = U_ZERO_ERROR;
892 fmt.format(direction, unit, appendTo, status);
893 if (status != U_ILLEGAL_ARGUMENT_ERROR) {
894 errln("Expected U_ILLEGAL_ARGUMENT_ERROR, got %s", u_errorName(status));
895 }
896 }
897
898 static const char *kLast2 = "Last_2";
899 static const char *kLast = "Last";
900 static const char *kThis = "This";
901 static const char *kNext = "Next";
902 static const char *kNext2 = "Next_2";
903 static const char *kPlain = "Plain";
904
905 static const char *kSeconds = "Seconds";
906 static const char *kMinutes = "Minutes";
907 static const char *kHours = "Hours";
908 static const char *kDays = "Days";
909 static const char *kWeeks = "Weeks";
910 static const char *kMonths = "Months";
911 static const char *kYears = "Years";
912
913 static const char *kSunday = "Sunday";
914 static const char *kMonday = "Monday";
915 static const char *kTuesday = "Tuesday";
916 static const char *kWednesday = "Wednesday";
917 static const char *kThursday = "Thursday";
918 static const char *kFriday = "Friday";
919 static const char *kSaturday = "Saturday";
920 static const char *kDay = "Day";
921 static const char *kWeek = "Week";
922 static const char *kMonth = "Month";
923 static const char *kYear = "Year";
924 static const char *kNow = "Now";
925
926 static const char *kUndefined = "Undefined";
927
928 static const char *DirectionStr(
929 UDateDirection direction) {
930 switch (direction) {
931 case UDAT_DIRECTION_LAST_2:
932 return kLast2;
933 case UDAT_DIRECTION_LAST:
934 return kLast;
935 case UDAT_DIRECTION_THIS:
936 return kThis;
937 case UDAT_DIRECTION_NEXT:
938 return kNext;
939 case UDAT_DIRECTION_NEXT_2:
940 return kNext2;
941 case UDAT_DIRECTION_PLAIN:
942 return kPlain;
943 default:
944 return kUndefined;
945 }
946 return kUndefined;
947 }
948
949 static const char *RelativeUnitStr(
950 UDateRelativeUnit unit) {
951 switch (unit) {
952 case UDAT_RELATIVE_SECONDS:
953 return kSeconds;
954 case UDAT_RELATIVE_MINUTES:
955 return kMinutes;
956 case UDAT_RELATIVE_HOURS:
957 return kHours;
958 case UDAT_RELATIVE_DAYS:
959 return kDays;
960 case UDAT_RELATIVE_WEEKS:
961 return kWeeks;
962 case UDAT_RELATIVE_MONTHS:
963 return kMonths;
964 case UDAT_RELATIVE_YEARS:
965 return kYears;
966 default:
967 return kUndefined;
968 }
969 return kUndefined;
970 }
971
972 static const char *AbsoluteUnitStr(
973 UDateAbsoluteUnit unit) {
974 switch (unit) {
975 case UDAT_ABSOLUTE_SUNDAY:
976 return kSunday;
977 case UDAT_ABSOLUTE_MONDAY:
978 return kMonday;
979 case UDAT_ABSOLUTE_TUESDAY:
980 return kTuesday;
981 case UDAT_ABSOLUTE_WEDNESDAY:
982 return kWednesday;
983 case UDAT_ABSOLUTE_THURSDAY:
984 return kThursday;
985 case UDAT_ABSOLUTE_FRIDAY:
986 return kFriday;
987 case UDAT_ABSOLUTE_SATURDAY:
988 return kSaturday;
989 case UDAT_ABSOLUTE_DAY:
990 return kDay;
991 case UDAT_ABSOLUTE_WEEK:
992 return kWeek;
993 case UDAT_ABSOLUTE_MONTH:
994 return kMonth;
995 case UDAT_ABSOLUTE_YEAR:
996 return kYear;
997 case UDAT_ABSOLUTE_NOW:
998 return kNow;
999 default:
1000 return kUndefined;
1001 }
1002 return kUndefined;
1003 }
1004
1005 extern IntlTest *createRelativeDateTimeFormatterTest() {
1006 return new RelativeDateTimeFormatterTest();
1007 }
1008
1009 #endif