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