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