1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 14:47:46 +00:00

LibJS+LibUnicode: Generate missing patterns with fractionalSecondDigits

TR-35's Matching Skeleton algorithm dictates how user requests including
fractional second digits should be handled when the CLDR format pattern
does not include that field. When the format pattern contains {second},
but does not contain {fractionalSecondDigits}, generate a second pattern
which appends "{decimal}{fractionalSecondDigits}" to the {second} field.
This commit is contained in:
Timothy Flynn 2021-12-06 22:50:54 -05:00 committed by Linus Groh
parent 6ace4000bf
commit 9f7c727720
3 changed files with 46 additions and 7 deletions

View file

@ -659,9 +659,18 @@ Optional<Unicode::CalendarPattern> basic_format_matcher(Unicode::CalendarPattern
//
// Rather than generating an prohibitively large amount of nearly-duplicate patterns, which only
// differ by field length, we expand the field lengths here.
best_format->for_each_calendar_field_zipped_with(options, [](auto& best_format_field, auto const& option_field, auto) {
if (best_format_field.has_value() && option_field.has_value())
best_format_field = option_field;
best_format->for_each_calendar_field_zipped_with(options, [&](auto& best_format_field, auto const& option_field, auto field_type) {
switch (field_type) {
case Unicode::CalendarPattern::Field::FractionalSecondDigits:
if (best_format->second.has_value() && option_field.has_value())
best_format_field = option_field;
break;
default:
if (best_format_field.has_value() && option_field.has_value())
best_format_field = option_field;
break;
}
});
// 11. Return bestFormat.

View file

@ -1,6 +1,3 @@
// NOTE: We cannot yet test the fractionalSecondDigits option. There aren't any patterns in the CLDR
// with this field ('S' in https://unicode.org/reports/tr35/tr35-dates.html#dfst-second). We
// will need to figure out how this field should be generated.
describe("correct behavior", () => {
test("length is 0", () => {
expect(Intl.DateTimeFormat.prototype.resolvedOptions).toHaveLength(0);
@ -179,6 +176,15 @@ describe("correct behavior", () => {
});
});
test("fractionalSecondDigits", () => {
[1, 2, 3].forEach(fractionalSecondDigits => {
const en = new Intl.DateTimeFormat("en", {
fractionalSecondDigits: fractionalSecondDigits,
});
expect(en.resolvedOptions().fractionalSecondDigits).toBe(fractionalSecondDigits);
});
});
test("timeZoneName", () => {
["short", "long"].forEach(timeZoneName => {
const en = new Intl.DateTimeFormat("en", { timeZoneName: timeZoneName });