98c0cd9f8f
This is to fix an assertion failure in formatToParts when Chinese calendar is specified with 'u-ca-chinese'. See https://github.com/tc39/ecma402/issues/225 . This CL is a temporary work-around to get v8 match the spec in terms of the external behavior, but it's not taking the steps in the spec, yet. Moreover, the spec may have to be revised as to how to pick the best match pattern when the default calendar for a locale is different from the calendar specified via 'u-ca'. How to handle 'related year' part also needs to be specified. Bug: chromium:826549 Test: intl/date-format/format-with-extensions Cq-Include-Trybots: luci.v8.try:v8_linux_noi18n_rel_ng Change-Id: I1f9a2467e86e71e024bc9babe18f16e49746008e Reviewed-on: https://chromium-review.googlesource.com/1006915 Reviewed-by: Sathya Gunasekaran <gsathya@chromium.org> Reviewed-by: Jakob Kummerow <jkummerow@chromium.org> Commit-Queue: Jungshik Shin <jshin@chromium.org> Cr-Commit-Position: refs/heads/master@{#52556}
62 lines
2.4 KiB
JavaScript
62 lines
2.4 KiB
JavaScript
// Copyright 2018 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
const d = new Date(2018, 5, 21); // 2018-06-21
|
|
|
|
function checkFormat(locale, options, expected) {
|
|
let df = new Intl.DateTimeFormat(locale, options);
|
|
let resolvedOptions = df.resolvedOptions();
|
|
assertEquals(expected.cal, resolvedOptions.calendar);
|
|
assertEquals(expected.numSys, resolvedOptions.numberingSystem);
|
|
|
|
let formattedParts = df.formatToParts(d);
|
|
let formattedReconstructedFromParts = formattedParts.map((part) => part.value)
|
|
.reduce((accumulated, part) => accumulated + part);
|
|
let formatted = df.format(d);
|
|
|
|
assertEquals(formatted, formattedReconstructedFromParts);
|
|
assertEquals(expected.types, formattedParts.map((part) => part.type));
|
|
assertEquals(expected.formatted, formatted);
|
|
}
|
|
|
|
// Even though the calendar is Chinese, the best pattern search for formatting
|
|
// should be done in the base locale (i.e. en or en-GB instead of
|
|
// en-u-ca-chinese or en-GB-u-ca-chinese). Otherwise, {year: 'numeric'} would
|
|
// results in '35 (wu-su)' where 'wu-su' is the designation for year 35 in the
|
|
// 60-year cycle. See https://github.com/tc39/ecma402/issues/225 .
|
|
[
|
|
["en", "gregory", "latn", "2018"],
|
|
["en-GB", "gregory", "latn", "2018"],
|
|
["en-u-ca-chinese", "chinese", "latn", "35"],
|
|
["en-GB-u-ca-chinese", "chinese", "latn", "35"],
|
|
["en-u-ca-chinese-nu-deva", "chinese", "deva", "३५"],
|
|
["en-GB-u-ca-chinese-nu-deva", "chinese", "deva", "३५"],
|
|
].forEach(function(entry) {
|
|
checkFormat(entry[0], {year: 'numeric'},
|
|
{ cal: entry[1],
|
|
numSys: entry[2],
|
|
formatted: entry[3],
|
|
types: ["year"],
|
|
});
|
|
});
|
|
|
|
const enUSTypes = ["month", "literal", "day", "literal", "year"];
|
|
const enGBTypes = ["day", "literal", "month", "literal", "year"];
|
|
|
|
[
|
|
["en", "gregory", "latn", "6/21/2018", enUSTypes],
|
|
["en-GB", "gregory", "latn", "21/06/2018", enGBTypes],
|
|
["en-u-nu-deva", "gregory", "deva", "६/२१/२०१८", enUSTypes],
|
|
["en-u-ca-chinese", "chinese", "latn", "5/8/35", enUSTypes],
|
|
["en-GB-u-ca-chinese", "chinese", "latn", "08/05/35", enGBTypes],
|
|
["en-u-ca-chinese-nu-deva", "chinese", "deva", "५/८/३५", enUSTypes],
|
|
].forEach(function(entry) {
|
|
checkFormat(entry[0], {},
|
|
{ cal: entry[1],
|
|
numSys: entry[2],
|
|
formatted: entry[3],
|
|
types: entry[4],
|
|
});
|
|
});
|