1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /*
4 *******************************************************************************
5 * Copyright (C) 2013-2016, International Business Machines Corporation and
6 * others. All Rights Reserved.
7 *******************************************************************************
8 *
9 * File RELDATEFMTTEST.CPP
10 *
11 *******************************************************************************
12 */
13 #include <memory>
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <vector>
17
18 #include "intltest.h"
19
20 #if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_BREAK_ITERATION
21
22 #include "unicode/localpointer.h"
23 #include "unicode/numfmt.h"
24 #include "unicode/reldatefmt.h"
25 #include "unicode/rbnf.h"
26 #include "cmemory.h"
27 #include "itformat.h"
28
29 static const char *DirectionStr(UDateDirection direction);
30 static const char *RelativeUnitStr(UDateRelativeUnit unit);
31 static const char *RelativeDateTimeUnitStr(URelativeDateTimeUnit unit);
32 static const char *AbsoluteUnitStr(UDateAbsoluteUnit unit);
33
34 typedef struct WithQuantityExpected {
35 double value;
36 UDateDirection direction;
37 UDateRelativeUnit unit;
38 const char *expected;
39 } WithQuantityExpected;
40
41 typedef struct WithoutQuantityExpected {
42 UDateDirection direction;
43 UDateAbsoluteUnit unit;
44 const char *expected;
45 } WithoutQuantityExpected;
46
47 static WithQuantityExpected kEnglish[] = {
48 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0 seconds"},
49 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0.5 seconds"},
50 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 1 second"},
51 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 2 seconds"},
52 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 0 minutes"},
53 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 0.5 minutes"},
54 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 1 minute"},
55 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 2 minutes"},
56 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 0 hours"},
57 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 0.5 hours"},
58 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 1 hour"},
59 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 2 hours"},
60 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 0 days"},
61 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 0.5 days"},
62 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 1 day"},
63 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 2 days"},
64 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 0 weeks"},
65 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 0.5 weeks"},
66 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 1 week"},
67 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 2 weeks"},
68 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 0 months"},
69 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 0.5 months"},
70 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 1 month"},
71 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 2 months"},
72 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 0 years"},
73 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 0.5 years"},
74 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 1 year"},
75 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 2 years"},
76
77 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0 seconds ago"},
78 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0.5 seconds ago"},
79 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "1 second ago"},
80 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "2 seconds ago"},
81 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0 minutes ago"},
82 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0.5 minutes ago"},
83 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "1 minute ago"},
84 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "2 minutes ago"},
85 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0 hours ago"},
86 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0.5 hours ago"},
87 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "1 hour ago"},
88 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "2 hours ago"},
89 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0 days ago"},
90 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0.5 days ago"},
91 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "1 day ago"},
92 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "2 days ago"},
93 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0 weeks ago"},
94 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0.5 weeks ago"},
95 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "1 week ago"},
96 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "2 weeks ago"},
97 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0 months ago"},
98 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0.5 months ago"},
99 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "1 month ago"},
100 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "2 months ago"},
101 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0 years ago"},
102 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0.5 years ago"},
103 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "1 year ago"},
104 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "2 years ago"}
105 };
106
107 static WithQuantityExpected kEnglishCaps[] = {
108 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "In 0 seconds"},
109 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "In 0.5 seconds"},
110 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "In 1 second"},
111 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "In 2 seconds"},
112 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "In 0 minutes"},
113 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "In 0.5 minutes"},
114 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "In 1 minute"},
115 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "In 2 minutes"},
116 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "In 0 hours"},
117 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "In 0.5 hours"},
118 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "In 1 hour"},
119 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "In 2 hours"},
120 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "In 0 days"},
121 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "In 0.5 days"},
122 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "In 1 day"},
123 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "In 2 days"},
124 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "In 0 weeks"},
125 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "In 0.5 weeks"},
126 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "In 1 week"},
127 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "In 2 weeks"},
128 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "In 0 months"},
129 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "In 0.5 months"},
130 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "In 1 month"},
131 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "In 2 months"},
132 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "In 0 years"},
133 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "In 0.5 years"},
134 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "In 1 year"},
135 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "In 2 years"},
136
137 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0 seconds ago"},
138 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0.5 seconds ago"},
139 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "1 second ago"},
140 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "2 seconds ago"},
141 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0 minutes ago"},
142 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0.5 minutes ago"},
143 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "1 minute ago"},
144 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "2 minutes ago"},
145 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0 hours ago"},
146 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0.5 hours ago"},
147 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "1 hour ago"},
148 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "2 hours ago"},
149 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0 days ago"},
150 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0.5 days ago"},
151 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "1 day ago"},
152 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "2 days ago"},
153 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0 weeks ago"},
154 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0.5 weeks ago"},
155 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "1 week ago"},
156 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "2 weeks ago"},
157 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0 months ago"},
158 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0.5 months ago"},
159 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "1 month ago"},
160 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "2 months ago"},
161 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0 years ago"},
162 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0.5 years ago"},
163 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "1 year ago"},
164 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "2 years ago"}
165 };
166
167 static WithQuantityExpected kEnglishShort[] = {
168 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0 sec."},
169 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0.5 sec."},
170 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 1 sec."},
171 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 2 sec."},
172 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 0 min."},
173 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 0.5 min."},
174 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 1 min."},
175 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 2 min."},
176 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 0 hr."},
177 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 0.5 hr."},
178 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 1 hr."},
179 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 2 hr."},
180 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 0 days"},
181 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 0.5 days"},
182 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 1 day"},
183 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 2 days"},
184 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 0 wk."},
185 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 0.5 wk."},
186 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 1 wk."},
187 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 2 wk."},
188 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 0 mo."},
189 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 0.5 mo."},
190 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 1 mo."},
191 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 2 mo."},
192 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 0 yr."},
193 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 0.5 yr."},
194 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 1 yr."},
195 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 2 yr."},
196
197 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0 sec. ago"},
198 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0.5 sec. ago"},
199 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "1 sec. ago"},
200 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "2 sec. ago"},
201 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0 min. ago"},
202 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0.5 min. ago"},
203 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "1 min. ago"},
204 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "2 min. ago"},
205 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0 hr. ago"},
206 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0.5 hr. ago"},
207 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "1 hr. ago"},
208 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "2 hr. ago"},
209 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0 days ago"},
210 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0.5 days ago"},
211 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "1 day ago"},
212 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "2 days ago"},
213 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0 wk. ago"},
214 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0.5 wk. ago"},
215 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "1 wk. ago"},
216 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "2 wk. ago"},
217 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0 mo. ago"},
218 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0.5 mo. ago"},
219 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "1 mo. ago"},
220 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "2 mo. ago"},
221 {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0 yr. ago"},
222 {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0.5 yr. ago"},
223 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "1 yr. ago"},
224 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "2 yr. ago"}
225 };
226
227 static WithQuantityExpected kEnglishDecimal[] = {
228 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0.0 seconds"},
229 {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0.5 seconds"},
230 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 1.0 seconds"},
231 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 2.0 seconds"}
232 };
233
234 static WithQuantityExpected kSerbian[] = {
235 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "\\u0437\\u0430 0 \\u043c\\u0435\\u0441\\u0435\\u0446\\u0438"},
236 {1.2, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "\\u0437\\u0430 1,2 \\u043c\\u0435\\u0441\\u0435\\u0446\\u0430"},
237 {21.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "\\u0437\\u0430 21 \\u043c\\u0435\\u0441\\u0435\\u0446"}
238 };
239
240 static WithQuantityExpected kSerbianNarrow[] = {
241 {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "\\u0437\\u0430 0 \\u043c."},
242 {1.2, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "\\u0437\\u0430 1,2 \\u043c."},
243 {21.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "\\u0437\\u0430 21 \\u043c."}
244 };
245
246 static WithoutQuantityExpected kEnglishNoQuantity[] = {
247 {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, ""},
248
249 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, "tomorrow"},
250 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEEK, "next week"},
251 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONTH, "next month"},
252 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_QUARTER, "next quarter"},
253 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, "next year"},
254 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONDAY, "next Monday"},
255 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_TUESDAY, "next Tuesday"},
256 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEDNESDAY, "next Wednesday"},
257 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_THURSDAY, "next Thursday"},
258 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_FRIDAY, "next Friday"},
259 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SATURDAY, "next Saturday"},
260 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, "next Sunday"},
261
262 {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, ""},
263
264 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, "yesterday"},
265 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEEK, "last week"},
266 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONTH, "last month"},
267 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_QUARTER, "last quarter"},
268 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_YEAR, "last year"},
269 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONDAY, "last Monday"},
270 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_TUESDAY, "last Tuesday"},
271 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEDNESDAY, "last Wednesday"},
272 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_THURSDAY, "last Thursday"},
273 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_FRIDAY, "last Friday"},
274 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SATURDAY, "last Saturday"},
275 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, "last Sunday"},
276
277 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, "today"},
278 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEEK, "this week"},
279 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONTH, "this month"},
280 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_QUARTER, "this quarter"},
281 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_YEAR, "this year"},
282 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONDAY, "this Monday"},
283 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_TUESDAY, "this Tuesday"},
284 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEDNESDAY, "this Wednesday"},
285 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_THURSDAY, "this Thursday"},
286 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_FRIDAY, "this Friday"},
287 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SATURDAY, "this Saturday"},
288 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, "this Sunday"},
289 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_HOUR, "this hour"},
290 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MINUTE, "this minute"},
291
292 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_DAY, "day"},
293 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEEK, "week"},
294 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONTH, "month"},
295 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_QUARTER, "quarter"},
296 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_YEAR, "year"},
297 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONDAY, "Monday"},
298 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_TUESDAY, "Tuesday"},
299 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEDNESDAY, "Wednesday"},
300 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_THURSDAY, "Thursday"},
301 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_FRIDAY, "Friday"},
302 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SATURDAY, "Saturday"},
303 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, "Sunday"},
304 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_HOUR, "hour"},
305 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MINUTE, "minute"},
306
307 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "now"}
308 };
309
310 static WithoutQuantityExpected kEnglishNoQuantityCaps[] = {
311 {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, ""},
312
313 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, "Tomorrow"},
314 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEEK, "Next week"},
315 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONTH, "Next month"},
316 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_QUARTER, "Next quarter"},
317 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, "Next year"},
318 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONDAY, "Next Monday"},
319 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_TUESDAY, "Next Tuesday"},
320 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEDNESDAY, "Next Wednesday"},
321 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_THURSDAY, "Next Thursday"},
322 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_FRIDAY, "Next Friday"},
323 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SATURDAY, "Next Saturday"},
324 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, "Next Sunday"},
325
326 {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, ""},
327
328 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, "Yesterday"},
329 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEEK, "Last week"},
330 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONTH, "Last month"},
331 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_QUARTER, "Last quarter"},
332 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_YEAR, "Last year"},
333 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONDAY, "Last Monday"},
334 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_TUESDAY, "Last Tuesday"},
335 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEDNESDAY, "Last Wednesday"},
336 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_THURSDAY, "Last Thursday"},
337 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_FRIDAY, "Last Friday"},
338 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SATURDAY, "Last Saturday"},
339 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, "Last Sunday"},
340
341 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, "Today"},
342 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEEK, "This week"},
343 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONTH, "This month"},
344 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_QUARTER, "This quarter"},
345 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_YEAR, "This year"},
346 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONDAY, "This Monday"},
347 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_TUESDAY, "This Tuesday"},
348 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEDNESDAY, "This Wednesday"},
349 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_THURSDAY, "This Thursday"},
350 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_FRIDAY, "This Friday"},
351 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SATURDAY, "This Saturday"},
352 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, "This Sunday"},
353
354 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_DAY, "Day"},
355 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEEK, "Week"},
356 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONTH, "Month"},
357 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_QUARTER, "Quarter"},
358 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_YEAR, "Year"},
359 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONDAY, "Monday"},
360 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_TUESDAY, "Tuesday"},
361 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEDNESDAY, "Wednesday"},
362 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_THURSDAY, "Thursday"},
363 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_FRIDAY, "Friday"},
364 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SATURDAY, "Saturday"},
365 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, "Sunday"},
366
367 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "Now"}
368 };
369
370 static WithoutQuantityExpected kEnglishNoQuantityShort[] = {
371 {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, ""},
372
373 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, "tomorrow"},
374 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEEK, "next wk."},
375 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONTH, "next mo."},
376 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_QUARTER, "next qtr."},
377 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, "next yr."},
378 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONDAY, "next Mon."},
379 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_TUESDAY, "next Tue."},
380 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEDNESDAY, "next Wed."},
381 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_THURSDAY, "next Thu."},
382 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_FRIDAY, "next Fri."},
383 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SATURDAY, "next Sat."},
384 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, "next Sun."},
385
386 {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, ""},
387
388 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, "yesterday"},
389 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEEK, "last wk."},
390 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONTH, "last mo."},
391 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_QUARTER, "last qtr."},
392 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_YEAR, "last yr."},
393 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONDAY, "last Mon."},
394 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_TUESDAY, "last Tue."},
395 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEDNESDAY, "last Wed."},
396 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_THURSDAY, "last Thu."},
397 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_FRIDAY, "last Fri."},
398 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SATURDAY, "last Sat."},
399 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, "last Sun."},
400
401 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, "today"},
402 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEEK, "this wk."},
403 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONTH, "this mo."},
404 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_QUARTER, "this qtr."},
405 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_YEAR, "this yr."},
406 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONDAY, "this Mon."},
407 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_TUESDAY, "this Tue."},
408 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEDNESDAY, "this Wed."},
409 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_THURSDAY, "this Thu."},
410 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_FRIDAY, "this Fri."},
411 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SATURDAY, "this Sat."},
412 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, "this Sun."},
413
414 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_DAY, "day"},
415 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEEK, "wk."},
416 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONTH, "mo."},
417 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_QUARTER, "qtr."},
418 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_YEAR, "yr."},
419 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONDAY, "Mo"},
420 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_TUESDAY, "Tu"},
421 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEDNESDAY, "We"},
422 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_THURSDAY, "Th"},
423 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_FRIDAY, "Fr"},
424 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SATURDAY, "Sa"},
425 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, "Su"},
426
427 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "now"}
428 };
429
430 static WithoutQuantityExpected kEnglishNoQuantityNarrow[] = {
431 {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, ""},
432
433 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, "tomorrow"},
434 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEEK, "next wk."},
435 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONTH, "next mo."},
436 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_QUARTER, "next qtr."},
437 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, "next yr."},
438 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONDAY, "next M"},
439 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_TUESDAY, "next Tu"},
440 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEDNESDAY, "next W"},
441 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_THURSDAY, "next Th"},
442 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_FRIDAY, "next F"},
443 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SATURDAY, "next Sa"},
444 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, "next Su"},
445
446 {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, ""},
447
448 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, "yesterday"},
449 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEEK, "last wk."},
450 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONTH, "last mo."},
451 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_QUARTER, "last qtr."},
452 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_YEAR, "last yr."},
453 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONDAY, "last M"},
454 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_TUESDAY, "last Tu"},
455 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEDNESDAY, "last W"},
456 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_THURSDAY, "last Th"},
457 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_FRIDAY, "last F"},
458 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SATURDAY, "last Sa"},
459 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, "last Su"},
460
461 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, "today"},
462 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEEK, "this wk."},
463 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONTH, "this mo."},
464 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_QUARTER, "this qtr."},
465 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_YEAR, "this yr."},
466 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONDAY, "this M"},
467 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_TUESDAY, "this Tu"},
468 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEDNESDAY, "this W"},
469 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_THURSDAY, "this Th"},
470 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_FRIDAY, "this F"},
471 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SATURDAY, "this Sa"},
472 {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, "this Su"},
473
474 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_DAY, "day"},
475 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEEK, "wk."},
476 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONTH, "mo."},
477 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_QUARTER, "qtr."},
478 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_YEAR, "yr."},
479 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONDAY, "M"},
480 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_TUESDAY, "T"},
481 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEDNESDAY, "W"},
482 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_THURSDAY, "T"},
483 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_FRIDAY, "F"},
484 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SATURDAY, "S"},
485 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, "S"},
486
487 {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "now"}
488 };
489
490 static WithoutQuantityExpected kSpanishNoQuantity[] = {
491 {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, "pasado ma\\u00F1ana"},
492 {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, "anteayer"}
493 };
494
495 typedef struct WithQuantityExpectedRelativeDateTimeUnit {
496 double value;
497 URelativeDateTimeUnit unit;
498 const char *expected;
499 } WithQuantityExpectedRelativeDateTimeUnit;
500
501 static WithQuantityExpectedRelativeDateTimeUnit kEnglishFormatNumeric[] = {
502 {0.0, UDAT_REL_UNIT_SECOND, "in 0 seconds"},
503 {0.5, UDAT_REL_UNIT_SECOND, "in 0.5 seconds"},
504 {1.0, UDAT_REL_UNIT_SECOND, "in 1 second"},
505 {2.0, UDAT_REL_UNIT_SECOND, "in 2 seconds"},
506 {0.0, UDAT_REL_UNIT_MINUTE, "in 0 minutes"},
507 {0.5, UDAT_REL_UNIT_MINUTE, "in 0.5 minutes"},
508 {1.0, UDAT_REL_UNIT_MINUTE, "in 1 minute"},
509 {2.0, UDAT_REL_UNIT_MINUTE, "in 2 minutes"},
510 {0.0, UDAT_REL_UNIT_HOUR, "in 0 hours"},
511 {0.5, UDAT_REL_UNIT_HOUR, "in 0.5 hours"},
512 {1.0, UDAT_REL_UNIT_HOUR, "in 1 hour"},
513 {2.0, UDAT_REL_UNIT_HOUR, "in 2 hours"},
514 {0.0, UDAT_REL_UNIT_DAY, "in 0 days"},
515 {0.5, UDAT_REL_UNIT_DAY, "in 0.5 days"},
516 {1.0, UDAT_REL_UNIT_DAY, "in 1 day"},
517 {2.0, UDAT_REL_UNIT_DAY, "in 2 days"},
518 {0.0, UDAT_REL_UNIT_WEEK, "in 0 weeks"},
519 {0.5, UDAT_REL_UNIT_WEEK, "in 0.5 weeks"},
520 {1.0, UDAT_REL_UNIT_WEEK, "in 1 week"},
521 {2.0, UDAT_REL_UNIT_WEEK, "in 2 weeks"},
522 {0.0, UDAT_REL_UNIT_MONTH, "in 0 months"},
523 {0.5, UDAT_REL_UNIT_MONTH, "in 0.5 months"},
524 {1.0, UDAT_REL_UNIT_MONTH, "in 1 month"},
525 {2.0, UDAT_REL_UNIT_MONTH, "in 2 months"},
526 {0.0, UDAT_REL_UNIT_QUARTER, "in 0 quarters"},
527 {0.5, UDAT_REL_UNIT_QUARTER, "in 0.5 quarters"},
528 {1.0, UDAT_REL_UNIT_QUARTER, "in 1 quarter"},
529 {2.0, UDAT_REL_UNIT_QUARTER, "in 2 quarters"},
530 {0.0, UDAT_REL_UNIT_YEAR, "in 0 years"},
531 {0.5, UDAT_REL_UNIT_YEAR, "in 0.5 years"},
532 {1.0, UDAT_REL_UNIT_YEAR, "in 1 year"},
533 {2.0, UDAT_REL_UNIT_YEAR, "in 2 years"},
534 {0.0, UDAT_REL_UNIT_SUNDAY, "in 0 Sundays"},
535 {0.5, UDAT_REL_UNIT_SUNDAY, "in 0.5 Sundays"},
536 {1.0, UDAT_REL_UNIT_SUNDAY, "in 1 Sunday"},
537 {2.0, UDAT_REL_UNIT_SUNDAY, "in 2 Sundays"},
538 {0.0, UDAT_REL_UNIT_MONDAY, "in 0 Mondays"},
539 {0.5, UDAT_REL_UNIT_MONDAY, "in 0.5 Mondays"},
540 {1.0, UDAT_REL_UNIT_MONDAY, "in 1 Monday"},
541 {2.0, UDAT_REL_UNIT_MONDAY, "in 2 Mondays"},
542 {0.0, UDAT_REL_UNIT_TUESDAY, "in 0 Tuesdays"},
543 {0.5, UDAT_REL_UNIT_TUESDAY, "in 0.5 Tuesdays"},
544 {1.0, UDAT_REL_UNIT_TUESDAY, "in 1 Tuesday"},
545 {2.0, UDAT_REL_UNIT_TUESDAY, "in 2 Tuesdays"},
546 {0.0, UDAT_REL_UNIT_WEDNESDAY, "in 0 Wednesdays"},
547 {0.5, UDAT_REL_UNIT_WEDNESDAY, "in 0.5 Wednesdays"},
548 {1.0, UDAT_REL_UNIT_WEDNESDAY, "in 1 Wednesday"},
549 {2.0, UDAT_REL_UNIT_WEDNESDAY, "in 2 Wednesdays"},
550 {0.0, UDAT_REL_UNIT_THURSDAY, "in 0 Thursdays"},
551 {0.5, UDAT_REL_UNIT_THURSDAY, "in 0.5 Thursdays"},
552 {1.0, UDAT_REL_UNIT_THURSDAY, "in 1 Thursday"},
553 {2.0, UDAT_REL_UNIT_THURSDAY, "in 2 Thursdays"},
554 {0.0, UDAT_REL_UNIT_FRIDAY, "in 0 Fridays"},
555 {0.5, UDAT_REL_UNIT_FRIDAY, "in 0.5 Fridays"},
556 {1.0, UDAT_REL_UNIT_FRIDAY, "in 1 Friday"},
557 {2.0, UDAT_REL_UNIT_FRIDAY, "in 2 Fridays"},
558 {0.0, UDAT_REL_UNIT_SATURDAY, "in 0 Saturdays"},
559 {0.5, UDAT_REL_UNIT_SATURDAY, "in 0.5 Saturdays"},
560 {1.0, UDAT_REL_UNIT_SATURDAY, "in 1 Saturday"},
561 {2.0, UDAT_REL_UNIT_SATURDAY, "in 2 Saturdays"},
562
563 {-0.0, UDAT_REL_UNIT_SECOND, "0 seconds ago"},
564 {-0.5, UDAT_REL_UNIT_SECOND, "0.5 seconds ago"},
565 {-1.0, UDAT_REL_UNIT_SECOND, "1 second ago"},
566 {-2.0, UDAT_REL_UNIT_SECOND, "2 seconds ago"},
567 {-0.0, UDAT_REL_UNIT_MINUTE, "0 minutes ago"},
568 {-0.5, UDAT_REL_UNIT_MINUTE, "0.5 minutes ago"},
569 {-1.0, UDAT_REL_UNIT_MINUTE, "1 minute ago"},
570 {-2.0, UDAT_REL_UNIT_MINUTE, "2 minutes ago"},
571 {-0.0, UDAT_REL_UNIT_HOUR, "0 hours ago"},
572 {-0.5, UDAT_REL_UNIT_HOUR, "0.5 hours ago"},
573 {-1.0, UDAT_REL_UNIT_HOUR, "1 hour ago"},
574 {-2.0, UDAT_REL_UNIT_HOUR, "2 hours ago"},
575 {-0.0, UDAT_REL_UNIT_DAY, "0 days ago"},
576 {-0.5, UDAT_REL_UNIT_DAY, "0.5 days ago"},
577 {-1.0, UDAT_REL_UNIT_DAY, "1 day ago"},
578 {-2.0, UDAT_REL_UNIT_DAY, "2 days ago"},
579 {-0.0, UDAT_REL_UNIT_WEEK, "0 weeks ago"},
580 {-0.5, UDAT_REL_UNIT_WEEK, "0.5 weeks ago"},
581 {-1.0, UDAT_REL_UNIT_WEEK, "1 week ago"},
582 {-2.0, UDAT_REL_UNIT_WEEK, "2 weeks ago"},
583 {-0.0, UDAT_REL_UNIT_MONTH, "0 months ago"},
584 {-0.5, UDAT_REL_UNIT_MONTH, "0.5 months ago"},
585 {-1.0, UDAT_REL_UNIT_MONTH, "1 month ago"},
586 {-2.0, UDAT_REL_UNIT_MONTH, "2 months ago"},
587 {-0.0, UDAT_REL_UNIT_QUARTER, "0 quarters ago"},
588 {-0.5, UDAT_REL_UNIT_QUARTER, "0.5 quarters ago"},
589 {-1.0, UDAT_REL_UNIT_QUARTER, "1 quarter ago"},
590 {-2.0, UDAT_REL_UNIT_QUARTER, "2 quarters ago"},
591 {-0.0, UDAT_REL_UNIT_YEAR, "0 years ago"},
592 {-0.5, UDAT_REL_UNIT_YEAR, "0.5 years ago"},
593 {-1.0, UDAT_REL_UNIT_YEAR, "1 year ago"},
594 {-2.0, UDAT_REL_UNIT_YEAR, "2 years ago"},
595 {-0.0, UDAT_REL_UNIT_SUNDAY, "0 Sundays ago"},
596 {-0.5, UDAT_REL_UNIT_SUNDAY, "0.5 Sundays ago"},
597 {-1.0, UDAT_REL_UNIT_SUNDAY, "1 Sunday ago"},
598 {-2.0, UDAT_REL_UNIT_SUNDAY, "2 Sundays ago"},
599 {-0.0, UDAT_REL_UNIT_MONDAY, "0 Mondays ago"},
600 {-0.5, UDAT_REL_UNIT_MONDAY, "0.5 Mondays ago"},
601 {-1.0, UDAT_REL_UNIT_MONDAY, "1 Monday ago"},
602 {-2.0, UDAT_REL_UNIT_MONDAY, "2 Mondays ago"},
603 {-0.0, UDAT_REL_UNIT_TUESDAY, "0 Tuesdays ago"},
604 {-0.5, UDAT_REL_UNIT_TUESDAY, "0.5 Tuesdays ago"},
605 {-1.0, UDAT_REL_UNIT_TUESDAY, "1 Tuesday ago"},
606 {-2.0, UDAT_REL_UNIT_TUESDAY, "2 Tuesdays ago"},
607 {-0.0, UDAT_REL_UNIT_WEDNESDAY, "0 Wednesdays ago"},
608 {-0.5, UDAT_REL_UNIT_WEDNESDAY, "0.5 Wednesdays ago"},
609 {-1.0, UDAT_REL_UNIT_WEDNESDAY, "1 Wednesday ago"},
610 {-2.0, UDAT_REL_UNIT_WEDNESDAY, "2 Wednesdays ago"},
611 {-0.0, UDAT_REL_UNIT_THURSDAY, "0 Thursdays ago"},
612 {-0.5, UDAT_REL_UNIT_THURSDAY, "0.5 Thursdays ago"},
613 {-1.0, UDAT_REL_UNIT_THURSDAY, "1 Thursday ago"},
614 {-2.0, UDAT_REL_UNIT_THURSDAY, "2 Thursdays ago"},
615 {-0.0, UDAT_REL_UNIT_FRIDAY, "0 Fridays ago"},
616 {-0.5, UDAT_REL_UNIT_FRIDAY, "0.5 Fridays ago"},
617 {-1.0, UDAT_REL_UNIT_FRIDAY, "1 Friday ago"},
618 {-2.0, UDAT_REL_UNIT_FRIDAY, "2 Fridays ago"},
619 {-0.0, UDAT_REL_UNIT_SATURDAY, "0 Saturdays ago"},
620 {-0.5, UDAT_REL_UNIT_SATURDAY, "0.5 Saturdays ago"},
621 {-1.0, UDAT_REL_UNIT_SATURDAY, "1 Saturday ago"},
622 {-2.0, UDAT_REL_UNIT_SATURDAY, "2 Saturdays ago"}
623 };
624
625 static WithQuantityExpectedRelativeDateTimeUnit kEnglishFormat[] = {
626 {0.0, UDAT_REL_UNIT_SECOND, "now"},
627 {0.5, UDAT_REL_UNIT_SECOND, "in 0.5 seconds"},
628 {1.0, UDAT_REL_UNIT_SECOND, "in 1 second"},
629 {2.0, UDAT_REL_UNIT_SECOND, "in 2 seconds"},
630 {0.0, UDAT_REL_UNIT_MINUTE, "this minute"},
631 {0.5, UDAT_REL_UNIT_MINUTE, "in 0.5 minutes"},
632 {1.0, UDAT_REL_UNIT_MINUTE, "in 1 minute"},
633 {2.0, UDAT_REL_UNIT_MINUTE, "in 2 minutes"},
634 {0.0, UDAT_REL_UNIT_HOUR, "this hour"},
635 {0.5, UDAT_REL_UNIT_HOUR, "in 0.5 hours"},
636 {1.0, UDAT_REL_UNIT_HOUR, "in 1 hour"},
637 {2.0, UDAT_REL_UNIT_HOUR, "in 2 hours"},
638 {0.0, UDAT_REL_UNIT_DAY, "today"},
639 {0.5, UDAT_REL_UNIT_DAY, "in 0.5 days"},
640 {1.0, UDAT_REL_UNIT_DAY, "tomorrow"},
641 {2.0, UDAT_REL_UNIT_DAY, "in 2 days"},
642 {0.0, UDAT_REL_UNIT_WEEK, "this week"},
643 {0.5, UDAT_REL_UNIT_WEEK, "in 0.5 weeks"},
644 {1.0, UDAT_REL_UNIT_WEEK, "next week"},
645 {2.0, UDAT_REL_UNIT_WEEK, "in 2 weeks"},
646 {0.0, UDAT_REL_UNIT_MONTH, "this month"},
647 {0.5, UDAT_REL_UNIT_MONTH, "in 0.5 months"},
648 {1.0, UDAT_REL_UNIT_MONTH, "next month"},
649 {2.0, UDAT_REL_UNIT_MONTH, "in 2 months"},
650 {0.0, UDAT_REL_UNIT_QUARTER, "this quarter"},
651 {0.5, UDAT_REL_UNIT_QUARTER, "in 0.5 quarters"},
652 {1.0, UDAT_REL_UNIT_QUARTER, "next quarter"},
653 {2.0, UDAT_REL_UNIT_QUARTER, "in 2 quarters"},
654 {0.0, UDAT_REL_UNIT_YEAR, "this year"},
655 {0.5, UDAT_REL_UNIT_YEAR, "in 0.5 years"},
656 {1.0, UDAT_REL_UNIT_YEAR, "next year"},
657 {2.0, UDAT_REL_UNIT_YEAR, "in 2 years"},
658 {0.0, UDAT_REL_UNIT_SUNDAY, "this Sunday"},
659 {0.5, UDAT_REL_UNIT_SUNDAY, "in 0.5 Sundays"},
660 {1.0, UDAT_REL_UNIT_SUNDAY, "next Sunday"},
661 {2.0, UDAT_REL_UNIT_SUNDAY, "in 2 Sundays"},
662 {0.0, UDAT_REL_UNIT_MONDAY, "this Monday"},
663 {0.5, UDAT_REL_UNIT_MONDAY, "in 0.5 Mondays"},
664 {1.0, UDAT_REL_UNIT_MONDAY, "next Monday"},
665 {2.0, UDAT_REL_UNIT_MONDAY, "in 2 Mondays"},
666 {0.0, UDAT_REL_UNIT_TUESDAY, "this Tuesday"},
667 {0.5, UDAT_REL_UNIT_TUESDAY, "in 0.5 Tuesdays"},
668 {1.0, UDAT_REL_UNIT_TUESDAY, "next Tuesday"},
669 {2.0, UDAT_REL_UNIT_TUESDAY, "in 2 Tuesdays"},
670 {0.0, UDAT_REL_UNIT_WEDNESDAY, "this Wednesday"},
671 {0.5, UDAT_REL_UNIT_WEDNESDAY, "in 0.5 Wednesdays"},
672 {1.0, UDAT_REL_UNIT_WEDNESDAY, "next Wednesday"},
673 {2.0, UDAT_REL_UNIT_WEDNESDAY, "in 2 Wednesdays"},
674 {0.0, UDAT_REL_UNIT_THURSDAY, "this Thursday"},
675 {0.5, UDAT_REL_UNIT_THURSDAY, "in 0.5 Thursdays"},
676 {1.0, UDAT_REL_UNIT_THURSDAY, "next Thursday"},
677 {2.0, UDAT_REL_UNIT_THURSDAY, "in 2 Thursdays"},
678 {0.0, UDAT_REL_UNIT_FRIDAY, "this Friday"},
679 {0.5, UDAT_REL_UNIT_FRIDAY, "in 0.5 Fridays"},
680 {1.0, UDAT_REL_UNIT_FRIDAY, "next Friday"},
681 {2.0, UDAT_REL_UNIT_FRIDAY, "in 2 Fridays"},
682 {0.0, UDAT_REL_UNIT_SATURDAY, "this Saturday"},
683 {0.5, UDAT_REL_UNIT_SATURDAY, "in 0.5 Saturdays"},
684 {1.0, UDAT_REL_UNIT_SATURDAY, "next Saturday"},
685 {2.0, UDAT_REL_UNIT_SATURDAY, "in 2 Saturdays"},
686
687 {-0.0, UDAT_REL_UNIT_SECOND, "now"},
688 {-0.5, UDAT_REL_UNIT_SECOND, "0.5 seconds ago"},
689 {-1.0, UDAT_REL_UNIT_SECOND, "1 second ago"},
690 {-2.0, UDAT_REL_UNIT_SECOND, "2 seconds ago"},
691 {-0.0, UDAT_REL_UNIT_MINUTE, "this minute"},
692 {-0.5, UDAT_REL_UNIT_MINUTE, "0.5 minutes ago"},
693 {-1.0, UDAT_REL_UNIT_MINUTE, "1 minute ago"},
694 {-2.0, UDAT_REL_UNIT_MINUTE, "2 minutes ago"},
695 {-0.0, UDAT_REL_UNIT_HOUR, "this hour"},
696 {-0.5, UDAT_REL_UNIT_HOUR, "0.5 hours ago"},
697 {-1.0, UDAT_REL_UNIT_HOUR, "1 hour ago"},
698 {-2.0, UDAT_REL_UNIT_HOUR, "2 hours ago"},
699 {-0.0, UDAT_REL_UNIT_DAY, "today"},
700 {-0.5, UDAT_REL_UNIT_DAY, "0.5 days ago"},
701 {-1.0, UDAT_REL_UNIT_DAY, "yesterday"},
702 {-2.0, UDAT_REL_UNIT_DAY, "2 days ago"},
703 {-0.0, UDAT_REL_UNIT_WEEK, "this week"},
704 {-0.5, UDAT_REL_UNIT_WEEK, "0.5 weeks ago"},
705 {-1.0, UDAT_REL_UNIT_WEEK, "last week"},
706 {-2.0, UDAT_REL_UNIT_WEEK, "2 weeks ago"},
707 {-0.0, UDAT_REL_UNIT_MONTH, "this month"},
708 {-0.5, UDAT_REL_UNIT_MONTH, "0.5 months ago"},
709 {-1.0, UDAT_REL_UNIT_MONTH, "last month"},
710 {-2.0, UDAT_REL_UNIT_MONTH, "2 months ago"},
711 {-0.0, UDAT_REL_UNIT_QUARTER, "this quarter"},
712 {-0.5, UDAT_REL_UNIT_QUARTER, "0.5 quarters ago"},
713 {-1.0, UDAT_REL_UNIT_QUARTER, "last quarter"},
714 {-2.0, UDAT_REL_UNIT_QUARTER, "2 quarters ago"},
715 {-0.0, UDAT_REL_UNIT_YEAR, "this year"},
716 {-0.5, UDAT_REL_UNIT_YEAR, "0.5 years ago"},
717 {-1.0, UDAT_REL_UNIT_YEAR, "last year"},
718 {-2.0, UDAT_REL_UNIT_YEAR, "2 years ago"},
719 {-0.0, UDAT_REL_UNIT_SUNDAY, "this Sunday"},
720 {-0.5, UDAT_REL_UNIT_SUNDAY, "0.5 Sundays ago"},
721 {-1.0, UDAT_REL_UNIT_SUNDAY, "last Sunday"},
722 {-2.0, UDAT_REL_UNIT_SUNDAY, "2 Sundays ago"},
723 {-0.0, UDAT_REL_UNIT_MONDAY, "this Monday"},
724 {-0.5, UDAT_REL_UNIT_MONDAY, "0.5 Mondays ago"},
725 {-1.0, UDAT_REL_UNIT_MONDAY, "last Monday"},
726 {-2.0, UDAT_REL_UNIT_MONDAY, "2 Mondays ago"},
727 {-0.0, UDAT_REL_UNIT_TUESDAY, "this Tuesday"},
728 {-0.5, UDAT_REL_UNIT_TUESDAY, "0.5 Tuesdays ago"},
729 {-1.0, UDAT_REL_UNIT_TUESDAY, "last Tuesday"},
730 {-2.0, UDAT_REL_UNIT_TUESDAY, "2 Tuesdays ago"},
731 {-0.0, UDAT_REL_UNIT_WEDNESDAY, "this Wednesday"},
732 {-0.5, UDAT_REL_UNIT_WEDNESDAY, "0.5 Wednesdays ago"},
733 {-1.0, UDAT_REL_UNIT_WEDNESDAY, "last Wednesday"},
734 {-2.0, UDAT_REL_UNIT_WEDNESDAY, "2 Wednesdays ago"},
735 {-0.0, UDAT_REL_UNIT_THURSDAY, "this Thursday"},
736 {-0.5, UDAT_REL_UNIT_THURSDAY, "0.5 Thursdays ago"},
737 {-1.0, UDAT_REL_UNIT_THURSDAY, "last Thursday"},
738 {-2.0, UDAT_REL_UNIT_THURSDAY, "2 Thursdays ago"},
739 {-0.0, UDAT_REL_UNIT_FRIDAY, "this Friday"},
740 {-0.5, UDAT_REL_UNIT_FRIDAY, "0.5 Fridays ago"},
741 {-1.0, UDAT_REL_UNIT_FRIDAY, "last Friday"},
742 {-2.0, UDAT_REL_UNIT_FRIDAY, "2 Fridays ago"},
743 {-0.0, UDAT_REL_UNIT_SATURDAY, "this Saturday"},
744 {-0.5, UDAT_REL_UNIT_SATURDAY, "0.5 Saturdays ago"},
745 {-1.0, UDAT_REL_UNIT_SATURDAY, "last Saturday"},
746 {-2.0, UDAT_REL_UNIT_SATURDAY, "2 Saturdays ago"}
747 };
748
749 static WithQuantityExpected kAfrikaans[] = {
750 {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "oor 1 maand"},
751 {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "oor 2 maande"},
752 {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "1 maand gelede"},
753 {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "2 maande gelede"},
754 };
755
756 static WithoutQuantityExpected kAfrikaansNoQuantity[] = {
757 {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONTH, "volgende maand"},
758 {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONTH, "verlede maand"},
759 };
760
761 static WithQuantityExpectedRelativeDateTimeUnit kAfrikaansFormatNumeric[] = {
762 {0.0, UDAT_REL_UNIT_MONTH, "oor 0 maande"},
763 {1.0, UDAT_REL_UNIT_MONTH, "oor 1 maand"},
764 {2.0, UDAT_REL_UNIT_MONTH, "oor 2 maande"},
765 {-0.0, UDAT_REL_UNIT_MONTH, "0 maande gelede"},
766 {-1.0, UDAT_REL_UNIT_MONTH, "1 maand gelede"},
767 {-2.0, UDAT_REL_UNIT_MONTH, "2 maande gelede"},
768 };
769
770 class RelativeDateTimeFormatterTest : public IntlTestWithFieldPosition {
771 public:
RelativeDateTimeFormatterTest()772 RelativeDateTimeFormatterTest() {
773 }
774
775 void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0);
776 private:
777 void TestEnglish();
778 void TestEnglishCaps();
779 void TestEnglishShort();
780 void TestEnglishNarrow();
781 void TestSerbian();
782 void TestSerbianFallback();
783 void TestEnglishNoQuantity();
784 void TestEnglishNoQuantityCaps();
785 void TestEnglishNoQuantityShort();
786 void TestEnglishNoQuantityNarrow();
787 void TestSpanishNoQuantity();
788 void TestAfrikaans();
789 void TestFormatWithQuantityIllegalArgument();
790 void TestFormatWithoutQuantityIllegalArgument();
791 void TestCustomNumberFormat();
792 void TestGetters();
793 void TestCombineDateAndTime();
794 void TestBadDisplayContext();
795 void TestFormat();
796 void TestFormatNumeric();
797 void TestLocales();
798 void TestFields();
799 void TestRBNF();
800
801 void RunTest(
802 const Locale& locale,
803 const WithQuantityExpected* expectedResults,
804 int32_t expectedResultLength);
805 void RunTest(
806 const Locale& locale,
807 const WithQuantityExpectedRelativeDateTimeUnit* expectedResults,
808 int32_t expectedResultLength,
809 bool numeric);
810 void RunTest(
811 const Locale& locale,
812 UDateRelativeDateTimeFormatterStyle style,
813 const WithQuantityExpected* expectedResults,
814 int32_t expectedResultLength);
815 void RunTest(
816 const Locale& locale,
817 const WithoutQuantityExpected* expectedResults,
818 int32_t expectedResultLength);
819 void RunTest(
820 const Locale& locale,
821 UDateRelativeDateTimeFormatterStyle style,
822 const WithoutQuantityExpected* expectedResults,
823 int32_t expectedResultLength);
824 void RunTest(
825 const RelativeDateTimeFormatter& fmt,
826 const WithQuantityExpected* expectedResults,
827 int32_t expectedResultLength,
828 const char *description);
829 void RunTest(
830 const RelativeDateTimeFormatter& fmt,
831 const WithQuantityExpectedRelativeDateTimeUnit* expectedResults,
832 int32_t expectedResultLength,
833 const char *description,
834 bool numeric);
835 void RunTest(
836 const RelativeDateTimeFormatter& fmt,
837 const WithoutQuantityExpected* expectedResults,
838 int32_t expectedResultLength,
839 const char *description);
840 void CheckExpectedResult(
841 const RelativeDateTimeFormatter& fmt,
842 const WithQuantityExpected& expectedResult,
843 const char* description);
844 void CheckExpectedResult(
845 const RelativeDateTimeFormatter& fmt,
846 const WithQuantityExpectedRelativeDateTimeUnit& expectedResults,
847 const char* description,
848 bool numeric);
849 void CheckExpectedResult(
850 const RelativeDateTimeFormatter& fmt,
851 const WithoutQuantityExpected& expectedResult,
852 const char* description);
853 void VerifyIllegalArgument(
854 const RelativeDateTimeFormatter& fmt,
855 UDateDirection direction,
856 UDateRelativeUnit unit);
857 void VerifyIllegalArgument(
858 const RelativeDateTimeFormatter& fmt,
859 UDateDirection direction,
860 UDateAbsoluteUnit unit);
861 void TestSidewaysDataLoading(void);
862 };
863
runIndexedTest(int32_t index,UBool exec,const char * & name,char *)864 void RelativeDateTimeFormatterTest::runIndexedTest(
865 int32_t index, UBool exec, const char *&name, char *) {
866 if (exec) {
867 logln("TestSuite RelativeDateTimeFormatterTest: ");
868 }
869 TESTCASE_AUTO_BEGIN;
870 TESTCASE_AUTO(TestEnglish);
871 TESTCASE_AUTO(TestEnglishCaps);
872 TESTCASE_AUTO(TestEnglishShort);
873 TESTCASE_AUTO(TestEnglishNarrow);
874 TESTCASE_AUTO(TestSerbian);
875 TESTCASE_AUTO(TestSerbianFallback);
876 TESTCASE_AUTO(TestEnglishNoQuantity);
877 TESTCASE_AUTO(TestEnglishNoQuantityCaps);
878 TESTCASE_AUTO(TestEnglishNoQuantityShort);
879 TESTCASE_AUTO(TestEnglishNoQuantityNarrow);
880 TESTCASE_AUTO(TestSpanishNoQuantity);
881 TESTCASE_AUTO(TestAfrikaans);
882 TESTCASE_AUTO(TestFormatWithQuantityIllegalArgument);
883 TESTCASE_AUTO(TestFormatWithoutQuantityIllegalArgument);
884 TESTCASE_AUTO(TestCustomNumberFormat);
885 TESTCASE_AUTO(TestGetters);
886 TESTCASE_AUTO(TestCombineDateAndTime);
887 TESTCASE_AUTO(TestBadDisplayContext);
888 TESTCASE_AUTO(TestSidewaysDataLoading);
889 TESTCASE_AUTO(TestFormat);
890 TESTCASE_AUTO(TestFormatNumeric);
891 TESTCASE_AUTO(TestLocales);
892 TESTCASE_AUTO(TestFields);
893 TESTCASE_AUTO(TestRBNF);
894 TESTCASE_AUTO_END;
895 }
896
TestEnglish()897 void RelativeDateTimeFormatterTest::TestEnglish() {
898 RunTest("en", kEnglish, UPRV_LENGTHOF(kEnglish));
899 }
900
TestEnglishCaps()901 void RelativeDateTimeFormatterTest::TestEnglishCaps() {
902 UErrorCode status = U_ZERO_ERROR;
903 RelativeDateTimeFormatter fmt(
904 "en",
905 NULL,
906 UDAT_STYLE_LONG,
907 UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE,
908 status);
909 if (U_FAILURE(status)) {
910 dataerrln("Failed call to RelativeDateTimeFormatter(\"en\", NULL, UDAT_STYLE_LONG, UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, status); : %s", u_errorName(status));
911 return;
912 }
913 RelativeDateTimeFormatter fmt3(status);
914
915 // Test assignment and copy constructor with capitalization on.
916 RelativeDateTimeFormatter fmt2(fmt);
917 fmt3 = fmt2;
918 assertSuccess("", status);
919 RunTest(fmt3, kEnglishCaps, UPRV_LENGTHOF(kEnglishCaps), "en caps");
920 }
921
TestEnglishShort()922 void RelativeDateTimeFormatterTest::TestEnglishShort() {
923 RunTest("en", UDAT_STYLE_SHORT, kEnglishShort, UPRV_LENGTHOF(kEnglishShort));
924 }
925
TestEnglishNarrow()926 void RelativeDateTimeFormatterTest::TestEnglishNarrow() {
927 RunTest("en", UDAT_STYLE_NARROW, kEnglishShort, UPRV_LENGTHOF(kEnglishShort));
928 }
929
TestSerbian()930 void RelativeDateTimeFormatterTest::TestSerbian() {
931 RunTest("sr", kSerbian, UPRV_LENGTHOF(kSerbian));
932 }
933
TestSerbianFallback()934 void RelativeDateTimeFormatterTest::TestSerbianFallback() {
935 RunTest("sr", UDAT_STYLE_NARROW, kSerbianNarrow, UPRV_LENGTHOF(kSerbianNarrow));
936 }
937
TestEnglishNoQuantity()938 void RelativeDateTimeFormatterTest::TestEnglishNoQuantity() {
939 RunTest("en", kEnglishNoQuantity, UPRV_LENGTHOF(kEnglishNoQuantity));
940 }
941
TestEnglishNoQuantityCaps()942 void RelativeDateTimeFormatterTest::TestEnglishNoQuantityCaps() {
943 UErrorCode status = U_ZERO_ERROR;
944 RelativeDateTimeFormatter fmt(
945 "en",
946 NULL,
947 UDAT_STYLE_LONG,
948 UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE,
949 status);
950 if (assertSuccess("RelativeDateTimeFormatter", status, TRUE) == FALSE) {
951 return;
952 }
953 RunTest(
954 fmt,
955 kEnglishNoQuantityCaps,
956 UPRV_LENGTHOF(kEnglishNoQuantityCaps),
957 "en caps no quantity");
958 }
959
TestEnglishNoQuantityShort()960 void RelativeDateTimeFormatterTest::TestEnglishNoQuantityShort() {
961 RunTest(
962 "en",
963 UDAT_STYLE_SHORT,
964 kEnglishNoQuantityShort,
965 UPRV_LENGTHOF(kEnglishNoQuantityShort));
966 }
967
TestEnglishNoQuantityNarrow()968 void RelativeDateTimeFormatterTest::TestEnglishNoQuantityNarrow() {
969 RunTest(
970 "en",
971 UDAT_STYLE_NARROW,
972 kEnglishNoQuantityNarrow,
973 UPRV_LENGTHOF(kEnglishNoQuantityNarrow));
974 }
975
TestSpanishNoQuantity()976 void RelativeDateTimeFormatterTest::TestSpanishNoQuantity() {
977 RunTest("es", kSpanishNoQuantity, UPRV_LENGTHOF(kSpanishNoQuantity));
978 }
979
TestAfrikaans()980 void RelativeDateTimeFormatterTest::TestAfrikaans() {
981 RunTest("af", kAfrikaans, UPRV_LENGTHOF(kAfrikaans));
982 RunTest("af", kAfrikaansNoQuantity, UPRV_LENGTHOF(kAfrikaansNoQuantity));
983 RunTest("af", kAfrikaansFormatNumeric, UPRV_LENGTHOF(kAfrikaansFormatNumeric), true);
984 }
985
TestFormatWithQuantityIllegalArgument()986 void RelativeDateTimeFormatterTest::TestFormatWithQuantityIllegalArgument() {
987 UErrorCode status = U_ZERO_ERROR;
988 RelativeDateTimeFormatter fmt("en", status);
989 if (U_FAILURE(status)) {
990 dataerrln("Failure creating format object - %s", u_errorName(status));
991 return;
992 }
993 VerifyIllegalArgument(fmt, UDAT_DIRECTION_PLAIN, UDAT_RELATIVE_DAYS);
994 VerifyIllegalArgument(fmt, UDAT_DIRECTION_THIS, UDAT_RELATIVE_DAYS);
995 }
996
TestFormatWithoutQuantityIllegalArgument()997 void RelativeDateTimeFormatterTest::TestFormatWithoutQuantityIllegalArgument() {
998 UErrorCode status = U_ZERO_ERROR;
999 RelativeDateTimeFormatter fmt("en", status);
1000 if (U_FAILURE(status)) {
1001 dataerrln("Failure creating format object - %s", u_errorName(status));
1002 return;
1003 }
1004 VerifyIllegalArgument(fmt, UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_NOW);
1005 VerifyIllegalArgument(fmt, UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_NOW);
1006 VerifyIllegalArgument(fmt, UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_NOW);
1007 }
1008
TestCustomNumberFormat()1009 void RelativeDateTimeFormatterTest::TestCustomNumberFormat() {
1010 NumberFormat *nf;
1011 UErrorCode status = U_ZERO_ERROR;
1012 {
1013 RelativeDateTimeFormatter fmt("en", status);
1014 if (U_FAILURE(status)) {
1015 dataerrln(
1016 "Failure creating format object - %s", u_errorName(status));
1017 return;
1018 }
1019 nf = fmt.getNumberFormat().clone();
1020 }
1021 nf->setMinimumFractionDigits(1);
1022 nf->setMaximumFractionDigits(1);
1023 RelativeDateTimeFormatter fmt("en", nf, status);
1024
1025 // Test copy constructor.
1026 RelativeDateTimeFormatter fmt2(fmt);
1027 RunTest(fmt2, kEnglishDecimal, UPRV_LENGTHOF(kEnglishDecimal), "en decimal digits");
1028
1029 // Test assignment
1030 fmt = RelativeDateTimeFormatter("es", status);
1031 RunTest(fmt, kSpanishNoQuantity, UPRV_LENGTHOF(kSpanishNoQuantity), "assignment operator");
1032
1033 }
1034
TestGetters()1035 void RelativeDateTimeFormatterTest::TestGetters() {
1036 UErrorCode status = U_ZERO_ERROR;
1037 RelativeDateTimeFormatter fmt(
1038 "en",
1039 NULL,
1040 UDAT_STYLE_NARROW,
1041 UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE,
1042 status);
1043 if (U_FAILURE(status)) {
1044 dataerrln("Failed call to RelativeDateTimeFormatter(\"en\", NULL, UDAT_STYLE_NARROW, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, status);) : %s", u_errorName(status));
1045 return;
1046 }
1047 RelativeDateTimeFormatter fmt3(status);
1048
1049 // copy and assignment.
1050 RelativeDateTimeFormatter fmt2(fmt);
1051 fmt3 = fmt2;
1052 assertEquals("style", (int32_t)UDAT_STYLE_NARROW, fmt3.getFormatStyle());
1053 assertEquals(
1054 "context",
1055 (int32_t)UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE,
1056 fmt3.getCapitalizationContext());
1057 assertSuccess("", status);
1058 }
1059
TestCombineDateAndTime()1060 void RelativeDateTimeFormatterTest::TestCombineDateAndTime() {
1061 UErrorCode status = U_ZERO_ERROR;
1062 RelativeDateTimeFormatter fmt("en", status);
1063 if (U_FAILURE(status)) {
1064 dataerrln("Failure creating format object - %s", u_errorName(status));
1065 return;
1066 }
1067 UnicodeString actual;
1068 fmt.combineDateAndTime(
1069 UnicodeString("yesterday"),
1070 UnicodeString("3:50"),
1071 actual,
1072 status);
1073 UnicodeString expected("yesterday, 3:50");
1074 if (expected != actual) {
1075 errln("Expected "+expected+", got "+actual);
1076 }
1077 }
1078
TestBadDisplayContext()1079 void RelativeDateTimeFormatterTest::TestBadDisplayContext() {
1080 UErrorCode status = U_ZERO_ERROR;
1081 RelativeDateTimeFormatter fmt(
1082 "en", NULL, UDAT_STYLE_LONG, UDISPCTX_STANDARD_NAMES, status);
1083 if (status != U_ILLEGAL_ARGUMENT_ERROR) {
1084 errln("Expected U_ILLEGAL_ARGUMENT_ERROR, got %s", u_errorName(status));
1085 }
1086 }
1087
1088
1089
RunTest(const Locale & locale,const WithQuantityExpected * expectedResults,int32_t expectedResultLength)1090 void RelativeDateTimeFormatterTest::RunTest(
1091 const Locale& locale,
1092 const WithQuantityExpected* expectedResults,
1093 int32_t expectedResultLength) {
1094 UErrorCode status = U_ZERO_ERROR;
1095 RelativeDateTimeFormatter fmt(locale, status);
1096 if (U_FAILURE(status)) {
1097 dataerrln("Unable to create format object - %s", u_errorName(status));
1098 return;
1099 }
1100 RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
1101 }
1102
RunTest(const Locale & locale,const WithQuantityExpectedRelativeDateTimeUnit * expectedResults,int32_t expectedResultLength,bool numeric)1103 void RelativeDateTimeFormatterTest::RunTest(
1104 const Locale& locale,
1105 const WithQuantityExpectedRelativeDateTimeUnit* expectedResults,
1106 int32_t expectedResultLength,
1107 bool numeric) {
1108 UErrorCode status = U_ZERO_ERROR;
1109 RelativeDateTimeFormatter fmt(locale, status);
1110 if (U_FAILURE(status)) {
1111 dataerrln("Unable to create format object - %s", u_errorName(status));
1112 return;
1113 }
1114 RunTest(fmt, expectedResults, expectedResultLength, locale.getName(), numeric);
1115 }
1116
1117
RunTest(const Locale & locale,UDateRelativeDateTimeFormatterStyle style,const WithQuantityExpected * expectedResults,int32_t expectedResultLength)1118 void RelativeDateTimeFormatterTest::RunTest(
1119 const Locale& locale,
1120 UDateRelativeDateTimeFormatterStyle style,
1121 const WithQuantityExpected* expectedResults,
1122 int32_t expectedResultLength) {
1123 UErrorCode status = U_ZERO_ERROR;
1124 RelativeDateTimeFormatter fmt(
1125 locale, NULL, style, UDISPCTX_CAPITALIZATION_NONE, status);
1126 if (U_FAILURE(status)) {
1127 dataerrln("Unable to create format object - %s", u_errorName(status));
1128 return;
1129 }
1130 RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
1131 }
1132
RunTest(const Locale & locale,const WithoutQuantityExpected * expectedResults,int32_t expectedResultLength)1133 void RelativeDateTimeFormatterTest::RunTest(
1134 const Locale& locale,
1135 const WithoutQuantityExpected* expectedResults,
1136 int32_t expectedResultLength) {
1137 UErrorCode status = U_ZERO_ERROR;
1138 RelativeDateTimeFormatter fmt(locale, status);
1139 if (U_FAILURE(status)) {
1140 dataerrln("Unable to create format object - %s", u_errorName(status));
1141 return;
1142 }
1143 RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
1144 }
1145
RunTest(const Locale & locale,UDateRelativeDateTimeFormatterStyle style,const WithoutQuantityExpected * expectedResults,int32_t expectedResultLength)1146 void RelativeDateTimeFormatterTest::RunTest(
1147 const Locale& locale,
1148 UDateRelativeDateTimeFormatterStyle style,
1149 const WithoutQuantityExpected* expectedResults,
1150 int32_t expectedResultLength) {
1151 UErrorCode status = U_ZERO_ERROR;
1152 RelativeDateTimeFormatter fmt(
1153 locale, NULL, style, UDISPCTX_CAPITALIZATION_NONE, status);
1154 if (U_FAILURE(status)) {
1155 dataerrln("Unable to create format object - %s", u_errorName(status));
1156 return;
1157 }
1158 RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
1159 }
1160
RunTest(const RelativeDateTimeFormatter & fmt,const WithQuantityExpected * expectedResults,int32_t expectedResultLength,const char * description)1161 void RelativeDateTimeFormatterTest::RunTest(
1162 const RelativeDateTimeFormatter& fmt,
1163 const WithQuantityExpected* expectedResults,
1164 int32_t expectedResultLength,
1165 const char *description) {
1166 for (int32_t i = 0; i < expectedResultLength; ++i) {
1167 CheckExpectedResult(fmt, expectedResults[i], description);
1168 }
1169 }
1170
RunTest(const RelativeDateTimeFormatter & fmt,const WithQuantityExpectedRelativeDateTimeUnit * expectedResults,int32_t expectedResultLength,const char * description,bool numeric)1171 void RelativeDateTimeFormatterTest::RunTest(
1172 const RelativeDateTimeFormatter& fmt,
1173 const WithQuantityExpectedRelativeDateTimeUnit* expectedResults,
1174 int32_t expectedResultLength,
1175 const char *description,
1176 bool numeric) {
1177 for (int32_t i = 0; i < expectedResultLength; ++i) {
1178 CheckExpectedResult(fmt, expectedResults[i], description, numeric);
1179 }
1180 }
1181
RunTest(const RelativeDateTimeFormatter & fmt,const WithoutQuantityExpected * expectedResults,int32_t expectedResultLength,const char * description)1182 void RelativeDateTimeFormatterTest::RunTest(
1183 const RelativeDateTimeFormatter& fmt,
1184 const WithoutQuantityExpected* expectedResults,
1185 int32_t expectedResultLength,
1186 const char *description) {
1187 for (int32_t i = 0; i < expectedResultLength; ++i) {
1188 CheckExpectedResult(fmt, expectedResults[i], description);
1189 }
1190 }
1191
CheckExpectedResult(const RelativeDateTimeFormatter & fmt,const WithQuantityExpected & expectedResult,const char * description)1192 void RelativeDateTimeFormatterTest::CheckExpectedResult(
1193 const RelativeDateTimeFormatter& fmt,
1194 const WithQuantityExpected& expectedResult,
1195 const char* description) {
1196 UErrorCode status = U_ZERO_ERROR;
1197 UnicodeString actual;
1198 fmt.format(expectedResult.value, expectedResult.direction, expectedResult.unit, actual, status);
1199 UnicodeString expected(expectedResult.expected, -1, US_INV);
1200 expected = expected.unescape();
1201 char buffer[256];
1202 sprintf(
1203 buffer,
1204 "%s, %f, %s, %s",
1205 description,
1206 expectedResult.value,
1207 DirectionStr(expectedResult.direction),
1208 RelativeUnitStr(expectedResult.unit));
1209 if (actual != expected) {
1210 errln(UnicodeString("Fail: Expected: ") + expected
1211 + ", Got: " + actual
1212 + ", For: " + buffer);
1213 }
1214 }
1215
CheckExpectedResult(const RelativeDateTimeFormatter & fmt,const WithQuantityExpectedRelativeDateTimeUnit & expectedResult,const char * description,bool numeric)1216 void RelativeDateTimeFormatterTest::CheckExpectedResult(
1217 const RelativeDateTimeFormatter& fmt,
1218 const WithQuantityExpectedRelativeDateTimeUnit& expectedResult,
1219 const char* description,
1220 bool numeric) {
1221 UErrorCode status = U_ZERO_ERROR;
1222 UnicodeString actual;
1223 if (numeric) {
1224 fmt.formatNumeric(expectedResult.value, expectedResult.unit, actual, status);
1225 } else {
1226 fmt.format(expectedResult.value, expectedResult.unit, actual, status);
1227 }
1228 UnicodeString expected(expectedResult.expected, -1, US_INV);
1229 expected = expected.unescape();
1230 char buffer[256];
1231 sprintf(
1232 buffer,
1233 "%s, %f, %s",
1234 description,
1235 expectedResult.value,
1236 RelativeDateTimeUnitStr(expectedResult.unit));
1237 if (actual != expected) {
1238 errln(UnicodeString("Fail: Expected: ") + expected
1239 + ", Got: " + actual
1240 + ", For: " + buffer);
1241 }
1242 }
1243
CheckExpectedResult(const RelativeDateTimeFormatter & fmt,const WithoutQuantityExpected & expectedResult,const char * description)1244 void RelativeDateTimeFormatterTest::CheckExpectedResult(
1245 const RelativeDateTimeFormatter& fmt,
1246 const WithoutQuantityExpected& expectedResult,
1247 const char* description) {
1248 UErrorCode status = U_ZERO_ERROR;
1249 UnicodeString actual;
1250 fmt.format(expectedResult.direction, expectedResult.unit, actual, status);
1251 UnicodeString expected(expectedResult.expected, -1, US_INV);
1252 expected = expected.unescape();
1253 char buffer[256];
1254 sprintf(
1255 buffer,
1256 "%s, %s, %s",
1257 description,
1258 DirectionStr(expectedResult.direction),
1259 AbsoluteUnitStr(expectedResult.unit));
1260 if (actual != expected) {
1261 errln(UnicodeString("Fail: Expected: ") + expected
1262 + ", Got: " + actual
1263 + ", For: " + buffer);
1264 }
1265 }
1266
VerifyIllegalArgument(const RelativeDateTimeFormatter & fmt,UDateDirection direction,UDateRelativeUnit unit)1267 void RelativeDateTimeFormatterTest::VerifyIllegalArgument(
1268 const RelativeDateTimeFormatter& fmt,
1269 UDateDirection direction,
1270 UDateRelativeUnit unit) {
1271 UnicodeString appendTo;
1272 UErrorCode status = U_ZERO_ERROR;
1273 fmt.format(1.0, direction, unit, appendTo, status);
1274 if (status != U_ILLEGAL_ARGUMENT_ERROR) {
1275 errln("Expected U_ILLEGAL_ARGUMENT_ERROR, got %s", u_errorName(status));
1276 }
1277 }
1278
VerifyIllegalArgument(const RelativeDateTimeFormatter & fmt,UDateDirection direction,UDateAbsoluteUnit unit)1279 void RelativeDateTimeFormatterTest::VerifyIllegalArgument(
1280 const RelativeDateTimeFormatter& fmt,
1281 UDateDirection direction,
1282 UDateAbsoluteUnit unit) {
1283 UnicodeString appendTo;
1284 UErrorCode status = U_ZERO_ERROR;
1285 fmt.format(direction, unit, appendTo, status);
1286 if (status != U_ILLEGAL_ARGUMENT_ERROR) {
1287 errln("Expected U_ILLEGAL_ARGUMENT_ERROR, got %s", u_errorName(status));
1288 }
1289 }
1290
1291 /* Add tests to check "sideways" data loading. */
TestSidewaysDataLoading(void)1292 void RelativeDateTimeFormatterTest::TestSidewaysDataLoading(void) {
1293 UErrorCode status = U_ZERO_ERROR;
1294 UnicodeString actual;
1295 UnicodeString expected;
1296 Locale enGbLocale("en_GB");
1297
1298 RelativeDateTimeFormatter fmt(enGbLocale, NULL, UDAT_STYLE_NARROW,
1299 UDISPCTX_CAPITALIZATION_NONE, status);
1300 if (U_FAILURE(status)) {
1301 dataerrln("Unable to create RelativeDateTimeFormatter - %s", u_errorName(status));
1302 return;
1303 }
1304
1305 status = U_ZERO_ERROR;
1306 actual = "";
1307 fmt.format(3.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, actual, status);
1308 expected = "in 3 mo";
1309 assertEquals("narrow in 3 mo", expected, actual);
1310
1311 fmt.format(3.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, actual.remove(), status);
1312 expected = "3 days ago";
1313 assertEquals("3 days ago (positive 3.0): ", expected, actual);
1314
1315 expected = "-3 days ago";
1316 fmt.format(-3.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, actual.remove(), status);
1317 assertEquals("3 days ago (negative 3.0): ", expected, actual);
1318
1319 expected = "next yr";
1320 fmt.format(UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, actual.remove(), status);
1321 assertEquals("next year: ", expected, actual);
1322
1323 // Testing the SHORT style
1324 RelativeDateTimeFormatter fmtshort(enGbLocale, NULL, UDAT_STYLE_SHORT,
1325 UDISPCTX_CAPITALIZATION_NONE, status);
1326 expected = "now";
1327 fmtshort.format(0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, actual.remove(), status);
1328
1329 expected = "next yr";
1330 fmt.format(UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, actual.remove(), status);
1331 assertEquals("next year: ", expected, actual);
1332 }
1333
TestFormatNumeric()1334 void RelativeDateTimeFormatterTest::TestFormatNumeric() {
1335 RunTest("en", kEnglishFormatNumeric, UPRV_LENGTHOF(kEnglishFormatNumeric), true);
1336 }
1337
TestFormat()1338 void RelativeDateTimeFormatterTest::TestFormat() {
1339 RunTest("en", kEnglishFormat, UPRV_LENGTHOF(kEnglishFormat), false);
1340 }
1341
TestLocales()1342 void RelativeDateTimeFormatterTest::TestLocales() {
1343 int32_t numLocales = 0;
1344 const Locale *availableLocales = Locale::getAvailableLocales(numLocales);
1345 std::vector<std::unique_ptr<RelativeDateTimeFormatter>> allFormatters;
1346 for (int localeIdx=0; localeIdx<numLocales; localeIdx++) {
1347 const Locale &loc = availableLocales[localeIdx];
1348 UErrorCode status = U_ZERO_ERROR;
1349 std::unique_ptr<RelativeDateTimeFormatter> rdtf(new RelativeDateTimeFormatter(loc, status));
1350 allFormatters.push_back(std::move(rdtf));
1351 assertSuccess(loc.getName(), status);
1352 }
1353 }
1354
TestFields()1355 void RelativeDateTimeFormatterTest::TestFields() {
1356 IcuTestErrorCode status(*this, "TestFields");
1357
1358 RelativeDateTimeFormatter fmt("en-US", status);
1359
1360 {
1361 const char16_t* message = u"automatic absolute unit";
1362 FormattedRelativeDateTime fv = fmt.formatToValue(1, UDAT_REL_UNIT_DAY, status);
1363 const char16_t* expectedString = u"tomorrow";
1364 static const UFieldPositionWithCategory expectedFieldPositions[] = {
1365 {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 0, 8}};
1366 checkMixedFormattedValue(
1367 message,
1368 fv,
1369 expectedString,
1370 expectedFieldPositions,
1371 UPRV_LENGTHOF(expectedFieldPositions));
1372 }
1373 {
1374 const char16_t* message = u"automatic numeric unit";
1375 FormattedRelativeDateTime fv = fmt.formatToValue(3, UDAT_REL_UNIT_DAY, status);
1376 const char16_t* expectedString = u"in 3 days";
1377 static const UFieldPositionWithCategory expectedFieldPositions[] = {
1378 {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 0, 2},
1379 {UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD, 3, 4},
1380 {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_NUMERIC_FIELD, 3, 4},
1381 {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 5, 9}};
1382 checkMixedFormattedValue(
1383 message,
1384 fv,
1385 expectedString,
1386 expectedFieldPositions,
1387 UPRV_LENGTHOF(expectedFieldPositions));
1388 }
1389 {
1390 const char16_t* message = u"manual absolute unit";
1391 FormattedRelativeDateTime fv = fmt.formatToValue(UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONDAY, status);
1392 const char16_t* expectedString = u"next Monday";
1393 static const UFieldPositionWithCategory expectedFieldPositions[] = {
1394 {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 0, 11}};
1395 checkMixedFormattedValue(
1396 message,
1397 fv,
1398 expectedString,
1399 expectedFieldPositions,
1400 UPRV_LENGTHOF(expectedFieldPositions));
1401 }
1402 {
1403 const char16_t* message = u"manual numeric unit";
1404 FormattedRelativeDateTime fv = fmt.formatNumericToValue(1.5, UDAT_REL_UNIT_WEEK, status);
1405 const char16_t* expectedString = u"in 1.5 weeks";
1406 static const UFieldPositionWithCategory expectedFieldPositions[] = {
1407 {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 0, 2},
1408 {UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD, 3, 4},
1409 {UFIELD_CATEGORY_NUMBER, UNUM_DECIMAL_SEPARATOR_FIELD, 4, 5},
1410 {UFIELD_CATEGORY_NUMBER, UNUM_FRACTION_FIELD, 5, 6},
1411 {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_NUMERIC_FIELD, 3, 6},
1412 {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 7, 12}};
1413 checkMixedFormattedValue(
1414 message,
1415 fv,
1416 expectedString,
1417 expectedFieldPositions,
1418 UPRV_LENGTHOF(expectedFieldPositions));
1419 }
1420 {
1421 const char16_t* message = u"manual numeric resolved unit";
1422 FormattedRelativeDateTime fv = fmt.formatToValue(12, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, status);
1423 const char16_t* expectedString = u"12 hours ago";
1424 static const UFieldPositionWithCategory expectedFieldPositions[] = {
1425 {UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD, 0, 2},
1426 {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_NUMERIC_FIELD, 0, 2},
1427 {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 3, 12}};
1428 checkMixedFormattedValue(
1429 message,
1430 fv,
1431 expectedString,
1432 expectedFieldPositions,
1433 UPRV_LENGTHOF(expectedFieldPositions));
1434 }
1435
1436 // Test when the number field is at the end
1437 fmt = RelativeDateTimeFormatter("sw", status);
1438 {
1439 const char16_t* message = u"numeric field at end";
1440 FormattedRelativeDateTime fv = fmt.formatToValue(12, UDAT_REL_UNIT_HOUR, status);
1441 const char16_t* expectedString = u"baada ya saa 12";
1442 static const UFieldPositionWithCategory expectedFieldPositions[] = {
1443 {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 0, 12},
1444 {UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD, 13, 15},
1445 {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_NUMERIC_FIELD, 13, 15}};
1446 checkMixedFormattedValue(
1447 message,
1448 fv,
1449 expectedString,
1450 expectedFieldPositions,
1451 UPRV_LENGTHOF(expectedFieldPositions));
1452 }
1453 }
1454
TestRBNF()1455 void RelativeDateTimeFormatterTest::TestRBNF() {
1456 IcuTestErrorCode status(*this, "TestRBNF");
1457
1458 LocalPointer<RuleBasedNumberFormat> rbnf(new RuleBasedNumberFormat(URBNF_SPELLOUT, "en-us", status));
1459 if (status.errIfFailureAndReset()) { return; }
1460 RelativeDateTimeFormatter fmt("en-us", rbnf.orphan(), status);
1461 UnicodeString result;
1462 assertEquals("format (direction)", "in five seconds",
1463 fmt.format(5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, result, status));
1464 assertEquals("formatNumeric", "one week ago",
1465 fmt.formatNumeric(-1, UDAT_REL_UNIT_WEEK, result.remove(), status));
1466 assertEquals("format (absolute)", "yesterday",
1467 fmt.format(UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, result.remove(), status));
1468 assertEquals("format (relative)", "in forty-two months",
1469 fmt.format(42, UDAT_REL_UNIT_MONTH, result.remove(), status));
1470
1471 {
1472 const char16_t* message = u"formatToValue (relative)";
1473 FormattedRelativeDateTime fv = fmt.formatToValue(-100, UDAT_REL_UNIT_YEAR, status);
1474 const char16_t* expectedString = u"one hundred years ago";
1475 static const UFieldPositionWithCategory expectedFieldPositions[] = {
1476 {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_NUMERIC_FIELD, 0, 11},
1477 {UFIELD_CATEGORY_RELATIVE_DATETIME, UDAT_REL_LITERAL_FIELD, 12, 21}};
1478 checkMixedFormattedValue(
1479 message,
1480 fv,
1481 expectedString,
1482 expectedFieldPositions,
1483 UPRV_LENGTHOF(expectedFieldPositions));
1484 }
1485 }
1486
1487 static const char *kLast2 = "Last_2";
1488 static const char *kLast = "Last";
1489 static const char *kThis = "This";
1490 static const char *kNext = "Next";
1491 static const char *kNext2 = "Next_2";
1492 static const char *kPlain = "Plain";
1493
1494 static const char *kSeconds = "Seconds";
1495 static const char *kMinutes = "Minutes";
1496 static const char *kHours = "Hours";
1497 static const char *kDays = "Days";
1498 static const char *kWeeks = "Weeks";
1499 static const char *kMonths = "Months";
1500 static const char *kQuarters = "Quarters";
1501 static const char *kYears = "Years";
1502 static const char *kSundays = "Sundays";
1503 static const char *kMondays = "Mondays";
1504 static const char *kTuesdays = "Tuesdays";
1505 static const char *kWednesdays = "Wednesdays";
1506 static const char *kThursdays = "Thursdays";
1507 static const char *kFridays = "Fridays";
1508 static const char *kSaturdays = "Saturdays";
1509
1510 static const char *kSunday = "Sunday";
1511 static const char *kMonday = "Monday";
1512 static const char *kTuesday = "Tuesday";
1513 static const char *kWednesday = "Wednesday";
1514 static const char *kThursday = "Thursday";
1515 static const char *kFriday = "Friday";
1516 static const char *kSaturday = "Saturday";
1517 static const char *kDay = "Day";
1518 static const char *kWeek = "Week";
1519 static const char *kMonth = "Month";
1520 static const char *kQuarter = "Quarter";
1521 static const char *kYear = "Year";
1522 static const char *kNow = "Now";
1523
1524 static const char *kUndefined = "Undefined";
1525
DirectionStr(UDateDirection direction)1526 static const char *DirectionStr(
1527 UDateDirection direction) {
1528 switch (direction) {
1529 case UDAT_DIRECTION_LAST_2:
1530 return kLast2;
1531 case UDAT_DIRECTION_LAST:
1532 return kLast;
1533 case UDAT_DIRECTION_THIS:
1534 return kThis;
1535 case UDAT_DIRECTION_NEXT:
1536 return kNext;
1537 case UDAT_DIRECTION_NEXT_2:
1538 return kNext2;
1539 case UDAT_DIRECTION_PLAIN:
1540 return kPlain;
1541 default:
1542 return kUndefined;
1543 }
1544 return kUndefined;
1545 }
1546
RelativeUnitStr(UDateRelativeUnit unit)1547 static const char *RelativeUnitStr(
1548 UDateRelativeUnit unit) {
1549 switch (unit) {
1550 case UDAT_RELATIVE_SECONDS:
1551 return kSeconds;
1552 case UDAT_RELATIVE_MINUTES:
1553 return kMinutes;
1554 case UDAT_RELATIVE_HOURS:
1555 return kHours;
1556 case UDAT_RELATIVE_DAYS:
1557 return kDays;
1558 case UDAT_RELATIVE_WEEKS:
1559 return kWeeks;
1560 case UDAT_RELATIVE_MONTHS:
1561 return kMonths;
1562 case UDAT_RELATIVE_YEARS:
1563 return kYears;
1564 default:
1565 return kUndefined;
1566 }
1567 return kUndefined;
1568 }
1569
RelativeDateTimeUnitStr(URelativeDateTimeUnit unit)1570 static const char *RelativeDateTimeUnitStr(
1571 URelativeDateTimeUnit unit) {
1572 switch (unit) {
1573 case UDAT_REL_UNIT_SECOND:
1574 return kSeconds;
1575 case UDAT_REL_UNIT_MINUTE:
1576 return kMinutes;
1577 case UDAT_REL_UNIT_HOUR:
1578 return kHours;
1579 case UDAT_REL_UNIT_DAY:
1580 return kDays;
1581 case UDAT_REL_UNIT_WEEK:
1582 return kWeeks;
1583 case UDAT_REL_UNIT_MONTH:
1584 return kMonths;
1585 case UDAT_REL_UNIT_QUARTER:
1586 return kQuarters;
1587 case UDAT_REL_UNIT_YEAR:
1588 return kYears;
1589 case UDAT_REL_UNIT_SUNDAY:
1590 return kSundays;
1591 case UDAT_REL_UNIT_MONDAY:
1592 return kMondays;
1593 case UDAT_REL_UNIT_TUESDAY:
1594 return kTuesdays;
1595 case UDAT_REL_UNIT_WEDNESDAY:
1596 return kWednesdays;
1597 case UDAT_REL_UNIT_THURSDAY:
1598 return kThursdays;
1599 case UDAT_REL_UNIT_FRIDAY:
1600 return kFridays;
1601 case UDAT_REL_UNIT_SATURDAY:
1602 return kSaturdays;
1603 default:
1604 return kUndefined;
1605 }
1606 return kUndefined;
1607 }
1608
AbsoluteUnitStr(UDateAbsoluteUnit unit)1609 static const char *AbsoluteUnitStr(
1610 UDateAbsoluteUnit unit) {
1611 switch (unit) {
1612 case UDAT_ABSOLUTE_SUNDAY:
1613 return kSunday;
1614 case UDAT_ABSOLUTE_MONDAY:
1615 return kMonday;
1616 case UDAT_ABSOLUTE_TUESDAY:
1617 return kTuesday;
1618 case UDAT_ABSOLUTE_WEDNESDAY:
1619 return kWednesday;
1620 case UDAT_ABSOLUTE_THURSDAY:
1621 return kThursday;
1622 case UDAT_ABSOLUTE_FRIDAY:
1623 return kFriday;
1624 case UDAT_ABSOLUTE_SATURDAY:
1625 return kSaturday;
1626 case UDAT_ABSOLUTE_DAY:
1627 return kDay;
1628 case UDAT_ABSOLUTE_WEEK:
1629 return kWeek;
1630 case UDAT_ABSOLUTE_MONTH:
1631 return kMonth;
1632 case UDAT_ABSOLUTE_QUARTER:
1633 return kQuarter;
1634 case UDAT_ABSOLUTE_YEAR:
1635 return kYear;
1636 case UDAT_ABSOLUTE_NOW:
1637 return kNow;
1638 default:
1639 return kUndefined;
1640 }
1641 return kUndefined;
1642 }
1643
createRelativeDateTimeFormatterTest()1644 extern IntlTest *createRelativeDateTimeFormatterTest() {
1645 return new RelativeDateTimeFormatterTest();
1646 }
1647
1648 #endif
1649