formatRange-hour-cycle.js (10537B)
1 // |reftest| skip-if(!this.hasOwnProperty("Intl")) 2 3 // Test formatRange supports the different hour-cycle options. 4 // 5 // ICU bugs: 6 // https://unicode-org.atlassian.net/browse/ICU-21154 7 // https://unicode-org.atlassian.net/browse/ICU-21155 8 // https://unicode-org.atlassian.net/browse/ICU-21156 9 // https://unicode-org.atlassian.net/browse/ICU-21342 10 // https://unicode-org.atlassian.net/browse/ICU-21343 11 12 // Test locales which default to a 12-hour and a 24-hour clock. 13 14 let tests = { 15 "en": [ 16 // Midnight to morning. 17 { 18 start: 0, 19 end: 10, 20 data: [ 21 "12 – 10 AM", 22 "0 – 10 AM", 23 "12 – 10 AM", 24 "00 – 10", 25 "24 – 10", 26 ], 27 }, 28 // Midnight to noon. 29 { 30 start: 0, 31 end: 12, 32 data: [ 33 "12 AM – 12 PM", 34 "0 AM – 0 PM", 35 "12 AM – 12 PM", 36 "00 – 12", 37 "24 – 12", 38 ], 39 }, 40 // Midnight to evening. 41 { 42 start: 0, 43 end: 22, 44 data: [ 45 "12 AM – 10 PM", 46 "0 AM – 10 PM", 47 "12 AM – 10 PM", 48 "00 – 22", 49 "24 – 22", 50 ], 51 }, 52 // Midnight to midnight. 53 { 54 start: 0, 55 end: 24, 56 data: [ 57 "1/1/1970, 12 AM – 1/2/1970, 12 AM", 58 "1/1/1970, 0 AM – 1/2/1970, 0 AM", 59 "1/1/1970, 12 AM – 1/2/1970, 12 AM", 60 "1/1/1970, 00 – 1/2/1970, 00", 61 "1/1/1970, 24 – 1/2/1970, 24", 62 ], 63 }, 64 65 // Morning to morning. 66 { 67 start: 1, 68 end: 10, 69 data: [ 70 "1 – 10 AM", 71 "1 – 10 AM", 72 "1 – 10 AM", 73 "01 – 10", 74 "01 – 10", 75 ], 76 }, 77 // Morning to noon. 78 { 79 start: 1, 80 end: 12, 81 data: [ 82 "1 AM – 12 PM", 83 "1 AM – 0 PM", 84 "1 AM – 12 PM", 85 "01 – 12", 86 "01 – 12", 87 ], 88 }, 89 // Morning to evening. 90 { 91 start: 1, 92 end: 22, 93 data: [ 94 "1 AM – 10 PM", 95 "1 AM – 10 PM", 96 "1 AM – 10 PM", 97 "01 – 22", 98 "01 – 22", 99 ], 100 }, 101 // Morning to midnight. 102 { 103 start: 1, 104 end: 24, 105 data: [ 106 "1/1/1970, 1 AM – 1/2/1970, 12 AM", 107 "1/1/1970, 1 AM – 1/2/1970, 0 AM", 108 "1/1/1970, 1 AM – 1/2/1970, 12 AM", 109 "1/1/1970, 01 – 1/2/1970, 00", 110 "1/1/1970, 01 – 1/2/1970, 24", 111 ], 112 }, 113 114 // Noon to morning. 115 { 116 start: 12, 117 end: 24 + 1, 118 data: [ 119 "1/1/1970, 12 PM – 1/2/1970, 1 AM", 120 "1/1/1970, 0 PM – 1/2/1970, 1 AM", 121 "1/1/1970, 12 PM – 1/2/1970, 1 AM", 122 "1/1/1970, 12 – 1/2/1970, 01", 123 "1/1/1970, 12 – 1/2/1970, 01", 124 ], 125 }, 126 // Noon to noon. 127 { 128 start: 12, 129 end: 24 + 12, 130 data: [ 131 "1/1/1970, 12 PM – 1/2/1970, 12 PM", 132 "1/1/1970, 0 PM – 1/2/1970, 0 PM", 133 "1/1/1970, 12 PM – 1/2/1970, 12 PM", 134 "1/1/1970, 12 – 1/2/1970, 12", 135 "1/1/1970, 12 – 1/2/1970, 12", 136 ], 137 }, 138 // Noon to evening. 139 { 140 start: 12, 141 end: 22, 142 data: [ 143 "12 – 10 PM", 144 "0 – 10 PM", 145 "12 – 10 PM", 146 "12 – 22", 147 "12 – 22", 148 ], 149 }, 150 // Noon to midnight. 151 { 152 start: 12, 153 end: 24, 154 data: [ 155 "1/1/1970, 12 PM – 1/2/1970, 12 AM", 156 "1/1/1970, 0 PM – 1/2/1970, 0 AM", 157 "1/1/1970, 12 PM – 1/2/1970, 12 AM", 158 "1/1/1970, 12 – 1/2/1970, 00", 159 "1/1/1970, 12 – 1/2/1970, 24", 160 ], 161 }, 162 163 // Evening to morning. 164 { 165 start: 22, 166 end: 24 + 1, 167 data: [ 168 "1/1/1970, 10 PM – 1/2/1970, 1 AM", 169 "1/1/1970, 10 PM – 1/2/1970, 1 AM", 170 "1/1/1970, 10 PM – 1/2/1970, 1 AM", 171 "1/1/1970, 22 – 1/2/1970, 01", 172 "1/1/1970, 22 – 1/2/1970, 01", 173 ], 174 }, 175 // Evening to noon. 176 { 177 start: 22, 178 end: 24 + 12, 179 data: [ 180 "1/1/1970, 10 PM – 1/2/1970, 12 PM", 181 "1/1/1970, 10 PM – 1/2/1970, 0 PM", 182 "1/1/1970, 10 PM – 1/2/1970, 12 PM", 183 "1/1/1970, 22 – 1/2/1970, 12", 184 "1/1/1970, 22 – 1/2/1970, 12", 185 ], 186 }, 187 // Evening to evening. 188 { 189 start: 22, 190 end: 23, 191 data: [ 192 "10 – 11 PM", 193 "10 – 11 PM", 194 "10 – 11 PM", 195 "22 – 23", 196 "22 – 23", 197 ], 198 }, 199 // Evening to midnight. 200 { 201 start: 22, 202 end: 24, 203 data: [ 204 "1/1/1970, 10 PM – 1/2/1970, 12 AM", 205 "1/1/1970, 10 PM – 1/2/1970, 0 AM", 206 "1/1/1970, 10 PM – 1/2/1970, 12 AM", 207 "1/1/1970, 22 – 1/2/1970, 00", 208 "1/1/1970, 22 – 1/2/1970, 24", 209 ], 210 }, 211 ], 212 213 "de": [ 214 // Midnight to morning. 215 { 216 start: 0, 217 end: 10, 218 data: [ 219 "00–10 Uhr", 220 "0 – 10 AM", 221 "12 – 10 AM", 222 "00–10 Uhr", 223 "24–10 Uhr", 224 ], 225 }, 226 // Midnight to noon. 227 { 228 start: 0, 229 end: 12, 230 data: [ 231 "00–12 Uhr", 232 "0 AM – 0 PM", 233 "12 AM – 12 PM", 234 "00–12 Uhr", 235 "24–12 Uhr", 236 ], 237 }, 238 // Midnight to evening. 239 { 240 start: 0, 241 end: 22, 242 data: [ 243 "00–22 Uhr", 244 "0 AM – 10 PM", 245 "12 AM – 10 PM", 246 "00–22 Uhr", 247 "24–22 Uhr", 248 ], 249 }, 250 // Midnight to midnight. 251 { 252 start: 0, 253 end: 24, 254 data: [ 255 "1.1.1970, 00 Uhr – 2.1.1970, 00 Uhr", 256 "1.1.1970, 0 AM – 2.1.1970, 0 AM", 257 "1.1.1970, 12 AM – 2.1.1970, 12 AM", 258 "1.1.1970, 00 Uhr – 2.1.1970, 00 Uhr", 259 "1.1.1970, 24 Uhr – 2.1.1970, 24 Uhr", 260 ], 261 }, 262 263 // Morning to morning. 264 { 265 start: 1, 266 end: 10, 267 data: [ 268 "01–10 Uhr", 269 "1 – 10 AM", 270 "1 – 10 AM", 271 "01–10 Uhr", 272 "01–10 Uhr", 273 ], 274 }, 275 // Morning to noon. 276 { 277 start: 1, 278 end: 12, 279 data: [ 280 "01–12 Uhr", 281 "1 AM – 0 PM", 282 "1 AM – 12 PM", 283 "01–12 Uhr", 284 "01–12 Uhr", 285 ], 286 }, 287 // Morning to evening. 288 { 289 start: 1, 290 end: 22, 291 data: [ 292 "01–22 Uhr", 293 "1 AM – 10 PM", 294 "1 AM – 10 PM", 295 "01–22 Uhr", 296 "01–22 Uhr", 297 ], 298 }, 299 // Morning to midnight. 300 { 301 start: 1, 302 end: 24, 303 data: [ 304 "1.1.1970, 01 Uhr – 2.1.1970, 00 Uhr", 305 "1.1.1970, 1 AM – 2.1.1970, 0 AM", 306 "1.1.1970, 1 AM – 2.1.1970, 12 AM", 307 "1.1.1970, 01 Uhr – 2.1.1970, 00 Uhr", 308 "1.1.1970, 01 Uhr – 2.1.1970, 24 Uhr", 309 ], 310 }, 311 312 // Noon to morning. 313 { 314 start: 12, 315 end: 24 + 1, 316 data: [ 317 "1.1.1970, 12 Uhr – 2.1.1970, 01 Uhr", 318 "1.1.1970, 0 PM – 2.1.1970, 1 AM", 319 "1.1.1970, 12 PM – 2.1.1970, 1 AM", 320 "1.1.1970, 12 Uhr – 2.1.1970, 01 Uhr", 321 "1.1.1970, 12 Uhr – 2.1.1970, 01 Uhr", 322 ], 323 }, 324 // Noon to noon. 325 { 326 start: 12, 327 end: 24 + 12, 328 data: [ 329 "1.1.1970, 12 Uhr – 2.1.1970, 12 Uhr", 330 "1.1.1970, 0 PM – 2.1.1970, 0 PM", 331 "1.1.1970, 12 PM – 2.1.1970, 12 PM", 332 "1.1.1970, 12 Uhr – 2.1.1970, 12 Uhr", 333 "1.1.1970, 12 Uhr – 2.1.1970, 12 Uhr", 334 ], 335 }, 336 // Noon to evening. 337 { 338 start: 12, 339 end: 22, 340 data: [ 341 "12–22 Uhr", 342 "0 – 10 PM", 343 "12 – 10 PM", 344 "12–22 Uhr", 345 "12–22 Uhr", 346 ], 347 }, 348 // Noon to midnight. 349 { 350 start: 12, 351 end: 24, 352 data: [ 353 "1.1.1970, 12 Uhr – 2.1.1970, 00 Uhr", 354 "1.1.1970, 0 PM – 2.1.1970, 0 AM", 355 "1.1.1970, 12 PM – 2.1.1970, 12 AM", 356 "1.1.1970, 12 Uhr – 2.1.1970, 00 Uhr", 357 "1.1.1970, 12 Uhr – 2.1.1970, 24 Uhr", 358 ], 359 }, 360 361 // Evening to morning. 362 { 363 start: 22, 364 end: 24 + 1, 365 data: [ 366 "1.1.1970, 22 Uhr – 2.1.1970, 01 Uhr", 367 "1.1.1970, 10 PM – 2.1.1970, 1 AM", 368 "1.1.1970, 10 PM – 2.1.1970, 1 AM", 369 "1.1.1970, 22 Uhr – 2.1.1970, 01 Uhr", 370 "1.1.1970, 22 Uhr – 2.1.1970, 01 Uhr", 371 ], 372 }, 373 // Evening to noon. 374 { 375 start: 22, 376 end: 24 + 12, 377 data: [ 378 "1.1.1970, 22 Uhr – 2.1.1970, 12 Uhr", 379 "1.1.1970, 10 PM – 2.1.1970, 0 PM", 380 "1.1.1970, 10 PM – 2.1.1970, 12 PM", 381 "1.1.1970, 22 Uhr – 2.1.1970, 12 Uhr", 382 "1.1.1970, 22 Uhr – 2.1.1970, 12 Uhr", 383 ], 384 }, 385 // Evening to evening. 386 { 387 start: 22, 388 end: 23, 389 data: [ 390 "22–23 Uhr", 391 "10 – 11 PM", 392 "10 – 11 PM", 393 "22–23 Uhr", 394 "22–23 Uhr", 395 ], 396 }, 397 // Evening to midnight. 398 { 399 start: 22, 400 end: 24, 401 data: [ 402 "1.1.1970, 22 Uhr – 2.1.1970, 00 Uhr", 403 "1.1.1970, 10 PM – 2.1.1970, 0 AM", 404 "1.1.1970, 10 PM – 2.1.1970, 12 AM", 405 "1.1.1970, 22 Uhr – 2.1.1970, 00 Uhr", 406 "1.1.1970, 22 Uhr – 2.1.1970, 24 Uhr", 407 ], 408 }, 409 ], 410 }; 411 412 const hourCycles = [undefined, "h11", "h12", "h23", "h24"]; 413 const hour12Values = [true, false]; 414 const options = {hour: "2-digit", timeZone: "UTC"}; 415 const hourToMillis = 60 * 60 * 1000; 416 417 for (let [locale, test] of Object.entries(tests)) { 418 // Find the matching hourCycle for each hour12 value. 419 let hour12Cycles = hour12Values.map(hour12 => { 420 let {hourCycle} = new Intl.DateTimeFormat(locale, {...options, hour12}).resolvedOptions(); 421 return hourCycles.indexOf(hourCycle); 422 }); 423 424 for (let {start, end, data} of Object.values(test)) { 425 assertEq(data.length, hourCycles.length); 426 427 // Test all possible "hourCycle" values, including |undefined|. 428 for (let i = 0; i < hourCycles.length; i++) { 429 let hourCycle = hourCycles[i]; 430 let expected = data[i]; 431 let dtf = new Intl.DateTimeFormat(locale, {...options, hourCycle}); 432 433 assertEq(dtf.formatRange(start * hourToMillis, end * hourToMillis), expected, 434 `hourCycle: ${hourCycle}`); 435 } 436 437 // Test all possible "hour12" values. 438 for (let i = 0; i < hour12Values.length; i++) { 439 let hour12 = hour12Values[i]; 440 let dtf = new Intl.DateTimeFormat(locale, {...options, hour12}); 441 let expected = data[hour12Cycles[i]]; 442 443 assertEq(dtf.formatRange(start * hourToMillis, end * hourToMillis), expected, 444 `hour12: ${hour12}`); 445 } 446 } 447 } 448 449 if (typeof reportCompare === "function") 450 reportCompare(0, 0);