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