]> git.saurik.com Git - apple/icu.git/blob - icuSources/test/intltest/reldatefmttest.cpp
ICU-57131.0.1.tar.gz
[apple/icu.git] / icuSources / test / intltest / reldatefmttest.cpp
1 /*
2 *******************************************************************************
3 * Copyright (C) 2013-2016, 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."},
235 {1.2, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "\\u0437\\u0430 1,2 \\u043c."},
236 {21.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "\\u0437\\u0430 21 \\u043c."}
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 void TestSidewaysDataLoading(void);
537 };
538
539 void RelativeDateTimeFormatterTest::runIndexedTest(
540 int32_t index, UBool exec, const char *&name, char *) {
541 if (exec) {
542 logln("TestSuite RelativeDateTimeFormatterTest: ");
543 }
544 TESTCASE_AUTO_BEGIN;
545 TESTCASE_AUTO(TestEnglish);
546 TESTCASE_AUTO(TestEnglishCaps);
547 TESTCASE_AUTO(TestEnglishShort);
548 TESTCASE_AUTO(TestEnglishNarrow);
549 TESTCASE_AUTO(TestSerbian);
550 TESTCASE_AUTO(TestSerbianFallback);
551 TESTCASE_AUTO(TestEnglishNoQuantity);
552 TESTCASE_AUTO(TestEnglishNoQuantityCaps);
553 TESTCASE_AUTO(TestEnglishNoQuantityShort);
554 TESTCASE_AUTO(TestEnglishNoQuantityNarrow);
555 TESTCASE_AUTO(TestSpanishNoQuantity);
556 TESTCASE_AUTO(TestFormatWithQuantityIllegalArgument);
557 TESTCASE_AUTO(TestFormatWithoutQuantityIllegalArgument);
558 TESTCASE_AUTO(TestCustomNumberFormat);
559 TESTCASE_AUTO(TestGetters);
560 TESTCASE_AUTO(TestCombineDateAndTime);
561 TESTCASE_AUTO(TestBadDisplayContext);
562 TESTCASE_AUTO(TestSidewaysDataLoading);
563 TESTCASE_AUTO_END;
564 }
565
566 void RelativeDateTimeFormatterTest::TestEnglish() {
567 RunTest("en", kEnglish, UPRV_LENGTHOF(kEnglish));
568 }
569
570 void RelativeDateTimeFormatterTest::TestEnglishCaps() {
571 UErrorCode status = U_ZERO_ERROR;
572 RelativeDateTimeFormatter fmt(
573 "en",
574 NULL,
575 UDAT_STYLE_LONG,
576 UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE,
577 status);
578 if (U_FAILURE(status)) {
579 dataerrln("Failed call to RelativeDateTimeFormatter(\"en\", NULL, UDAT_STYLE_LONG, UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, status); : %s", u_errorName(status));
580 return;
581 }
582 RelativeDateTimeFormatter fmt3(status);
583
584 // Test assignment and copy constructor with capitalization on.
585 RelativeDateTimeFormatter fmt2(fmt);
586 fmt3 = fmt2;
587 assertSuccess("", status);
588 RunTest(fmt3, kEnglishCaps, UPRV_LENGTHOF(kEnglishCaps), "en caps");
589 }
590
591 void RelativeDateTimeFormatterTest::TestEnglishShort() {
592 RunTest("en", UDAT_STYLE_SHORT, kEnglishShort, UPRV_LENGTHOF(kEnglishShort));
593 }
594
595 void RelativeDateTimeFormatterTest::TestEnglishNarrow() {
596 RunTest("en", UDAT_STYLE_NARROW, kEnglishShort, UPRV_LENGTHOF(kEnglishShort));
597 }
598
599 void RelativeDateTimeFormatterTest::TestSerbian() {
600 RunTest("sr", kSerbian, UPRV_LENGTHOF(kSerbian));
601 }
602
603 void RelativeDateTimeFormatterTest::TestSerbianFallback() {
604 RunTest("sr", UDAT_STYLE_NARROW, kSerbianNarrow, UPRV_LENGTHOF(kSerbianNarrow));
605 }
606
607 void RelativeDateTimeFormatterTest::TestEnglishNoQuantity() {
608 RunTest("en", kEnglishNoQuantity, UPRV_LENGTHOF(kEnglishNoQuantity));
609 }
610
611 void RelativeDateTimeFormatterTest::TestEnglishNoQuantityCaps() {
612 UErrorCode status = U_ZERO_ERROR;
613 RelativeDateTimeFormatter fmt(
614 "en",
615 NULL,
616 UDAT_STYLE_LONG,
617 UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE,
618 status);
619 if (assertSuccess("RelativeDateTimeFormatter", status, TRUE) == FALSE) {
620 return;
621 }
622 RunTest(
623 fmt,
624 kEnglishNoQuantityCaps,
625 UPRV_LENGTHOF(kEnglishNoQuantityCaps),
626 "en caps no quantity");
627 }
628
629 void RelativeDateTimeFormatterTest::TestEnglishNoQuantityShort() {
630 RunTest(
631 "en",
632 UDAT_STYLE_SHORT,
633 kEnglishNoQuantityShort,
634 UPRV_LENGTHOF(kEnglishNoQuantityShort));
635 }
636
637 void RelativeDateTimeFormatterTest::TestEnglishNoQuantityNarrow() {
638 RunTest(
639 "en",
640 UDAT_STYLE_NARROW,
641 kEnglishNoQuantityNarrow,
642 UPRV_LENGTHOF(kEnglishNoQuantityNarrow));
643 }
644
645 void RelativeDateTimeFormatterTest::TestSpanishNoQuantity() {
646 RunTest("es", kSpanishNoQuantity, UPRV_LENGTHOF(kSpanishNoQuantity));
647 }
648
649 void RelativeDateTimeFormatterTest::TestFormatWithQuantityIllegalArgument() {
650 UErrorCode status = U_ZERO_ERROR;
651 RelativeDateTimeFormatter fmt("en", status);
652 if (U_FAILURE(status)) {
653 dataerrln("Failure creating format object - %s", u_errorName(status));
654 return;
655 }
656 VerifyIllegalArgument(fmt, UDAT_DIRECTION_PLAIN, UDAT_RELATIVE_DAYS);
657 VerifyIllegalArgument(fmt, UDAT_DIRECTION_THIS, UDAT_RELATIVE_DAYS);
658 }
659
660 void RelativeDateTimeFormatterTest::TestFormatWithoutQuantityIllegalArgument() {
661 UErrorCode status = U_ZERO_ERROR;
662 RelativeDateTimeFormatter fmt("en", status);
663 if (U_FAILURE(status)) {
664 dataerrln("Failure creating format object - %s", u_errorName(status));
665 return;
666 }
667 VerifyIllegalArgument(fmt, UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_NOW);
668 VerifyIllegalArgument(fmt, UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_NOW);
669 VerifyIllegalArgument(fmt, UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_NOW);
670 }
671
672 void RelativeDateTimeFormatterTest::TestCustomNumberFormat() {
673 NumberFormat *nf;
674 UErrorCode status = U_ZERO_ERROR;
675 {
676 RelativeDateTimeFormatter fmt("en", status);
677 if (U_FAILURE(status)) {
678 dataerrln(
679 "Failure creating format object - %s", u_errorName(status));
680 return;
681 }
682 nf = (NumberFormat *) fmt.getNumberFormat().clone();
683 }
684 nf->setMinimumFractionDigits(1);
685 nf->setMaximumFractionDigits(1);
686 RelativeDateTimeFormatter fmt("en", nf, status);
687
688 // Test copy constructor.
689 RelativeDateTimeFormatter fmt2(fmt);
690 RunTest(fmt2, kEnglishDecimal, UPRV_LENGTHOF(kEnglishDecimal), "en decimal digits");
691
692 // Test assignment
693 fmt = RelativeDateTimeFormatter("es", status);
694 RunTest(fmt, kSpanishNoQuantity, UPRV_LENGTHOF(kSpanishNoQuantity), "assignment operator");
695
696 }
697
698 void RelativeDateTimeFormatterTest::TestGetters() {
699 UErrorCode status = U_ZERO_ERROR;
700 RelativeDateTimeFormatter fmt(
701 "en",
702 NULL,
703 UDAT_STYLE_NARROW,
704 UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE,
705 status);
706 if (U_FAILURE(status)) {
707 dataerrln("Failed call to RelativeDateTimeFormatter(\"en\", NULL, UDAT_STYLE_NARROW, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, status);) : %s", u_errorName(status));
708 return;
709 }
710 RelativeDateTimeFormatter fmt3(status);
711
712 // copy and assignment.
713 RelativeDateTimeFormatter fmt2(fmt);
714 fmt3 = fmt2;
715 assertEquals("style", UDAT_STYLE_NARROW, fmt3.getFormatStyle());
716 assertEquals(
717 "context",
718 UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE,
719 fmt3.getCapitalizationContext());
720 assertSuccess("", status);
721 }
722
723 void RelativeDateTimeFormatterTest::TestCombineDateAndTime() {
724 UErrorCode status = U_ZERO_ERROR;
725 RelativeDateTimeFormatter fmt("en", status);
726 if (U_FAILURE(status)) {
727 dataerrln("Failure creating format object - %s", u_errorName(status));
728 return;
729 }
730 UnicodeString actual;
731 fmt.combineDateAndTime(
732 UnicodeString("yesterday"),
733 UnicodeString("3:50"),
734 actual,
735 status);
736 UnicodeString expected("yesterday, 3:50");
737 if (expected != actual) {
738 errln("Expected "+expected+", got "+actual);
739 }
740 }
741
742 void RelativeDateTimeFormatterTest::TestBadDisplayContext() {
743 UErrorCode status = U_ZERO_ERROR;
744 RelativeDateTimeFormatter fmt(
745 "en", NULL, UDAT_STYLE_LONG, UDISPCTX_STANDARD_NAMES, status);
746 if (status != U_ILLEGAL_ARGUMENT_ERROR) {
747 errln("Expected U_ILLEGAL_ARGUMENT_ERROR, got %s", u_errorName(status));
748 }
749 }
750
751
752
753 void RelativeDateTimeFormatterTest::RunTest(
754 const Locale& locale,
755 const WithQuantityExpected* expectedResults,
756 int32_t expectedResultLength) {
757 UErrorCode status = U_ZERO_ERROR;
758 RelativeDateTimeFormatter fmt(locale, status);
759 if (U_FAILURE(status)) {
760 dataerrln("Unable to create format object - %s", u_errorName(status));
761 return;
762 }
763 RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
764 }
765
766 void RelativeDateTimeFormatterTest::RunTest(
767 const Locale& locale,
768 UDateRelativeDateTimeFormatterStyle style,
769 const WithQuantityExpected* expectedResults,
770 int32_t expectedResultLength) {
771 UErrorCode status = U_ZERO_ERROR;
772 RelativeDateTimeFormatter fmt(
773 locale, NULL, style, UDISPCTX_CAPITALIZATION_NONE, status);
774 if (U_FAILURE(status)) {
775 dataerrln("Unable to create format object - %s", u_errorName(status));
776 return;
777 }
778 RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
779 }
780
781 void RelativeDateTimeFormatterTest::RunTest(
782 const Locale& locale,
783 const WithoutQuantityExpected* expectedResults,
784 int32_t expectedResultLength) {
785 UErrorCode status = U_ZERO_ERROR;
786 RelativeDateTimeFormatter fmt(locale, status);
787 if (U_FAILURE(status)) {
788 dataerrln("Unable to create format object - %s", u_errorName(status));
789 return;
790 }
791 RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
792 }
793
794 void RelativeDateTimeFormatterTest::RunTest(
795 const Locale& locale,
796 UDateRelativeDateTimeFormatterStyle style,
797 const WithoutQuantityExpected* expectedResults,
798 int32_t expectedResultLength) {
799 UErrorCode status = U_ZERO_ERROR;
800 RelativeDateTimeFormatter fmt(
801 locale, NULL, style, UDISPCTX_CAPITALIZATION_NONE, status);
802 if (U_FAILURE(status)) {
803 dataerrln("Unable to create format object - %s", u_errorName(status));
804 return;
805 }
806 RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
807 }
808
809 void RelativeDateTimeFormatterTest::RunTest(
810 const RelativeDateTimeFormatter& fmt,
811 const WithQuantityExpected* expectedResults,
812 int32_t expectedResultLength,
813 const char *description) {
814 for (int32_t i = 0; i < expectedResultLength; ++i) {
815 CheckExpectedResult(fmt, expectedResults[i], description);
816 }
817 }
818
819 void RelativeDateTimeFormatterTest::RunTest(
820 const RelativeDateTimeFormatter& fmt,
821 const WithoutQuantityExpected* expectedResults,
822 int32_t expectedResultLength,
823 const char *description) {
824 for (int32_t i = 0; i < expectedResultLength; ++i) {
825 CheckExpectedResult(fmt, expectedResults[i], description);
826 }
827 }
828
829 void RelativeDateTimeFormatterTest::CheckExpectedResult(
830 const RelativeDateTimeFormatter& fmt,
831 const WithQuantityExpected& expectedResult,
832 const char* description) {
833 UErrorCode status = U_ZERO_ERROR;
834 UnicodeString actual;
835 fmt.format(expectedResult.value, expectedResult.direction, expectedResult.unit, actual, status);
836 UnicodeString expected(expectedResult.expected, -1, US_INV);
837 expected = expected.unescape();
838 char buffer[256];
839 sprintf(
840 buffer,
841 "%s, %f, %s, %s",
842 description,
843 expectedResult.value,
844 DirectionStr(expectedResult.direction),
845 RelativeUnitStr(expectedResult.unit));
846 if (actual != expected) {
847 errln(UnicodeString("Fail: Expected: ") + expected
848 + ", Got: " + actual
849 + ", For: " + buffer);
850 }
851 }
852
853 void RelativeDateTimeFormatterTest::CheckExpectedResult(
854 const RelativeDateTimeFormatter& fmt,
855 const WithoutQuantityExpected& expectedResult,
856 const char* description) {
857 UErrorCode status = U_ZERO_ERROR;
858 UnicodeString actual;
859 fmt.format(expectedResult.direction, expectedResult.unit, actual, status);
860 UnicodeString expected(expectedResult.expected, -1, US_INV);
861 expected = expected.unescape();
862 char buffer[256];
863 sprintf(
864 buffer,
865 "%s, %s, %s",
866 description,
867 DirectionStr(expectedResult.direction),
868 AbsoluteUnitStr(expectedResult.unit));
869 if (actual != expected) {
870 errln(UnicodeString("Fail: Expected: ") + expected
871 + ", Got: " + actual
872 + ", For: " + buffer);
873 }
874 }
875
876 void RelativeDateTimeFormatterTest::VerifyIllegalArgument(
877 const RelativeDateTimeFormatter& fmt,
878 UDateDirection direction,
879 UDateRelativeUnit unit) {
880 UnicodeString appendTo;
881 UErrorCode status = U_ZERO_ERROR;
882 fmt.format(1.0, direction, unit, appendTo, status);
883 if (status != U_ILLEGAL_ARGUMENT_ERROR) {
884 errln("Expected U_ILLEGAL_ARGUMENT_ERROR, got %s", u_errorName(status));
885 }
886 }
887
888 void RelativeDateTimeFormatterTest::VerifyIllegalArgument(
889 const RelativeDateTimeFormatter& fmt,
890 UDateDirection direction,
891 UDateAbsoluteUnit unit) {
892 UnicodeString appendTo;
893 UErrorCode status = U_ZERO_ERROR;
894 fmt.format(direction, unit, appendTo, status);
895 if (status != U_ILLEGAL_ARGUMENT_ERROR) {
896 errln("Expected U_ILLEGAL_ARGUMENT_ERROR, got %s", u_errorName(status));
897 }
898 }
899
900 /* Add tests to check "sideways" data loading. */
901 void RelativeDateTimeFormatterTest::TestSidewaysDataLoading(void) {
902 UErrorCode status = U_ZERO_ERROR;
903 UnicodeString actual;
904 UnicodeString expected;
905 Locale enGbLocale("en_GB");
906
907 RelativeDateTimeFormatter fmt(enGbLocale, NULL, UDAT_STYLE_NARROW,
908 UDISPCTX_CAPITALIZATION_NONE, status);
909 if (U_FAILURE(status)) {
910 dataerrln("Unable to create RelativeDateTimeFormatter - %s", u_errorName(status));
911 return;
912 }
913
914 status = U_ZERO_ERROR;
915 actual = "";
916 fmt.format(3.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, actual, status);
917 expected = "in 3 mo";
918 assertEquals("narrow in 3 mo", expected, actual);
919
920 fmt.format(3.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, actual.remove(), status);
921 expected = "3 days ago";
922 assertEquals("3 days ago (positive 3.0): ", expected, actual);
923
924 expected = "-3 days ago";
925 fmt.format(-3.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, actual.remove(), status);
926 assertEquals("3 days ago (negative 3.0): ", expected, actual);
927
928 expected = "next yr.";
929 fmt.format(UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, actual.remove(), status);
930 assertEquals("next year: ", expected, actual);
931
932 // Testing the SHORT style
933 RelativeDateTimeFormatter fmtshort(enGbLocale, NULL, UDAT_STYLE_SHORT,
934 UDISPCTX_CAPITALIZATION_NONE, status);
935 expected = "now";
936 fmtshort.format(0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, actual.remove(), status);
937
938 expected = "next yr.";
939 fmt.format(UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, actual.remove(), status);
940 assertEquals("next year: ", expected, actual);
941 }
942
943 static const char *kLast2 = "Last_2";
944 static const char *kLast = "Last";
945 static const char *kThis = "This";
946 static const char *kNext = "Next";
947 static const char *kNext2 = "Next_2";
948 static const char *kPlain = "Plain";
949
950 static const char *kSeconds = "Seconds";
951 static const char *kMinutes = "Minutes";
952 static const char *kHours = "Hours";
953 static const char *kDays = "Days";
954 static const char *kWeeks = "Weeks";
955 static const char *kMonths = "Months";
956 static const char *kYears = "Years";
957
958 static const char *kSunday = "Sunday";
959 static const char *kMonday = "Monday";
960 static const char *kTuesday = "Tuesday";
961 static const char *kWednesday = "Wednesday";
962 static const char *kThursday = "Thursday";
963 static const char *kFriday = "Friday";
964 static const char *kSaturday = "Saturday";
965 static const char *kDay = "Day";
966 static const char *kWeek = "Week";
967 static const char *kMonth = "Month";
968 static const char *kYear = "Year";
969 static const char *kNow = "Now";
970
971 static const char *kUndefined = "Undefined";
972
973 static const char *DirectionStr(
974 UDateDirection direction) {
975 switch (direction) {
976 case UDAT_DIRECTION_LAST_2:
977 return kLast2;
978 case UDAT_DIRECTION_LAST:
979 return kLast;
980 case UDAT_DIRECTION_THIS:
981 return kThis;
982 case UDAT_DIRECTION_NEXT:
983 return kNext;
984 case UDAT_DIRECTION_NEXT_2:
985 return kNext2;
986 case UDAT_DIRECTION_PLAIN:
987 return kPlain;
988 default:
989 return kUndefined;
990 }
991 return kUndefined;
992 }
993
994 static const char *RelativeUnitStr(
995 UDateRelativeUnit unit) {
996 switch (unit) {
997 case UDAT_RELATIVE_SECONDS:
998 return kSeconds;
999 case UDAT_RELATIVE_MINUTES:
1000 return kMinutes;
1001 case UDAT_RELATIVE_HOURS:
1002 return kHours;
1003 case UDAT_RELATIVE_DAYS:
1004 return kDays;
1005 case UDAT_RELATIVE_WEEKS:
1006 return kWeeks;
1007 case UDAT_RELATIVE_MONTHS:
1008 return kMonths;
1009 case UDAT_RELATIVE_YEARS:
1010 return kYears;
1011 default:
1012 return kUndefined;
1013 }
1014 return kUndefined;
1015 }
1016
1017 static const char *AbsoluteUnitStr(
1018 UDateAbsoluteUnit unit) {
1019 switch (unit) {
1020 case UDAT_ABSOLUTE_SUNDAY:
1021 return kSunday;
1022 case UDAT_ABSOLUTE_MONDAY:
1023 return kMonday;
1024 case UDAT_ABSOLUTE_TUESDAY:
1025 return kTuesday;
1026 case UDAT_ABSOLUTE_WEDNESDAY:
1027 return kWednesday;
1028 case UDAT_ABSOLUTE_THURSDAY:
1029 return kThursday;
1030 case UDAT_ABSOLUTE_FRIDAY:
1031 return kFriday;
1032 case UDAT_ABSOLUTE_SATURDAY:
1033 return kSaturday;
1034 case UDAT_ABSOLUTE_DAY:
1035 return kDay;
1036 case UDAT_ABSOLUTE_WEEK:
1037 return kWeek;
1038 case UDAT_ABSOLUTE_MONTH:
1039 return kMonth;
1040 case UDAT_ABSOLUTE_YEAR:
1041 return kYear;
1042 case UDAT_ABSOLUTE_NOW:
1043 return kNow;
1044 default:
1045 return kUndefined;
1046 }
1047 return kUndefined;
1048 }
1049
1050 extern IntlTest *createRelativeDateTimeFormatterTest() {
1051 return new RelativeDateTimeFormatterTest();
1052 }
1053
1054 #endif