mirror of
https://github.com/tc39/test262.git
synced 2025-07-26 23:44:27 +02:00
Add helper functions to retrieve all calendars, collations, numberingSystems, and simple sanctioned units
And then use these helpers to replace hard-coded lists in other tests.
This commit is contained in:
parent
4a7830beec
commit
71460edfeb
@ -19,7 +19,12 @@ defines:
|
|||||||
- getInvalidLocaleArguments
|
- getInvalidLocaleArguments
|
||||||
- testOption
|
- testOption
|
||||||
- testForUnwantedRegExpChanges
|
- testForUnwantedRegExpChanges
|
||||||
|
- allCalendars
|
||||||
|
- allCollations
|
||||||
|
- allNumberingSystems
|
||||||
- isValidNumberingSystem
|
- isValidNumberingSystem
|
||||||
|
- numberingSystemDigits
|
||||||
|
- allSimpleSanctionedUnits
|
||||||
- testNumberFormat
|
- testNumberFormat
|
||||||
- getDateTimeComponents
|
- getDateTimeComponents
|
||||||
- getDateTimeComponentValues
|
- getDateTimeComponentValues
|
||||||
@ -2029,17 +2034,71 @@ function testForUnwantedRegExpChanges(testFunc) {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests whether name is a valid BCP 47 numbering system name
|
* Returns an array of all known calendars.
|
||||||
* and not excluded from use in the ECMAScript Internationalization API.
|
|
||||||
* @param {string} name the name to be tested.
|
|
||||||
* @return {boolean} whether name is a valid BCP 47 numbering system name and
|
|
||||||
* allowed for use in the ECMAScript Internationalization API.
|
|
||||||
*/
|
*/
|
||||||
|
function allCalendars() {
|
||||||
|
// source: CLDR file common/bcp47/number.xml; version CLDR 39.
|
||||||
|
// https://github.com/unicode-org/cldr/blob/master/common/bcp47/calendar.xml
|
||||||
|
return [
|
||||||
|
"buddhist",
|
||||||
|
"chinese",
|
||||||
|
"coptic",
|
||||||
|
"dangi",
|
||||||
|
"ethioaa",
|
||||||
|
"ethiopic",
|
||||||
|
"gregory",
|
||||||
|
"hebrew",
|
||||||
|
"indian",
|
||||||
|
"islamic",
|
||||||
|
"islamic-umalqura",
|
||||||
|
"islamic-tbla",
|
||||||
|
"islamic-civil",
|
||||||
|
"islamic-rgsa",
|
||||||
|
"iso8601",
|
||||||
|
"japanese",
|
||||||
|
"persian",
|
||||||
|
"roc",
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
function isValidNumberingSystem(name) {
|
|
||||||
|
|
||||||
// source: CLDR file common/bcp47/number.xml; version CLDR 36.1.
|
/**
|
||||||
var numberingSystems = [
|
* Returns an array of all known collations.
|
||||||
|
*/
|
||||||
|
function allCollations() {
|
||||||
|
// source: CLDR file common/bcp47/collation.xml; version CLDR 39.
|
||||||
|
// https://github.com/unicode-org/cldr/blob/master/common/bcp47/collation.xml
|
||||||
|
return [
|
||||||
|
"big5han",
|
||||||
|
"compat",
|
||||||
|
"dict",
|
||||||
|
"direct",
|
||||||
|
"ducet",
|
||||||
|
"emoji",
|
||||||
|
"eor",
|
||||||
|
"gb2312",
|
||||||
|
"phonebk",
|
||||||
|
"phonetic",
|
||||||
|
"pinyin",
|
||||||
|
"reformed",
|
||||||
|
"search",
|
||||||
|
"searchjl",
|
||||||
|
"standard",
|
||||||
|
"stroke",
|
||||||
|
"trad",
|
||||||
|
"unihan",
|
||||||
|
"zhuyin",
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array of all known numbering systems.
|
||||||
|
*/
|
||||||
|
function allNumberingSystems() {
|
||||||
|
// source: CLDR file common/bcp47/number.xml; version CLDR 39.
|
||||||
|
// https://github.com/unicode-org/cldr/blob/master/common/bcp47/number.xml
|
||||||
|
return [
|
||||||
"adlm",
|
"adlm",
|
||||||
"ahom",
|
"ahom",
|
||||||
"arab",
|
"arab",
|
||||||
@ -2128,6 +2187,20 @@ function isValidNumberingSystem(name) {
|
|||||||
"wara",
|
"wara",
|
||||||
"wcho",
|
"wcho",
|
||||||
];
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests whether name is a valid BCP 47 numbering system name
|
||||||
|
* and not excluded from use in the ECMAScript Internationalization API.
|
||||||
|
* @param {string} name the name to be tested.
|
||||||
|
* @return {boolean} whether name is a valid BCP 47 numbering system name and
|
||||||
|
* allowed for use in the ECMAScript Internationalization API.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function isValidNumberingSystem(name) {
|
||||||
|
|
||||||
|
var numberingSystems = allNumberingSystems();
|
||||||
|
|
||||||
var excluded = [
|
var excluded = [
|
||||||
"finance",
|
"finance",
|
||||||
@ -2215,6 +2288,59 @@ var numberingSystemDigits = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array of all simple, sanctioned unit identifiers.
|
||||||
|
*/
|
||||||
|
function allSimpleSanctionedUnits() {
|
||||||
|
// https://tc39.es/ecma402/#table-sanctioned-simple-unit-identifiers
|
||||||
|
return [
|
||||||
|
"acre",
|
||||||
|
"bit",
|
||||||
|
"byte",
|
||||||
|
"celsius",
|
||||||
|
"centimeter",
|
||||||
|
"day",
|
||||||
|
"degree",
|
||||||
|
"fahrenheit",
|
||||||
|
"fluid-ounce",
|
||||||
|
"foot",
|
||||||
|
"gallon",
|
||||||
|
"gigabit",
|
||||||
|
"gigabyte",
|
||||||
|
"gram",
|
||||||
|
"hectare",
|
||||||
|
"hour",
|
||||||
|
"inch",
|
||||||
|
"kilobit",
|
||||||
|
"kilobyte",
|
||||||
|
"kilogram",
|
||||||
|
"kilometer",
|
||||||
|
"liter",
|
||||||
|
"megabit",
|
||||||
|
"megabyte",
|
||||||
|
"meter",
|
||||||
|
"mile",
|
||||||
|
"mile-scandinavian",
|
||||||
|
"milliliter",
|
||||||
|
"millimeter",
|
||||||
|
"millisecond",
|
||||||
|
"minute",
|
||||||
|
"month",
|
||||||
|
"ounce",
|
||||||
|
"percent",
|
||||||
|
"petabyte",
|
||||||
|
"pound",
|
||||||
|
"second",
|
||||||
|
"stone",
|
||||||
|
"terabit",
|
||||||
|
"terabyte",
|
||||||
|
"week",
|
||||||
|
"yard",
|
||||||
|
"year",
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests that number formatting is handled correctly. The function checks that the
|
* Tests that number formatting is handled correctly. The function checks that the
|
||||||
* digit sequences in formatted output are as specified, converted to the
|
* digit sequences in formatted output are as specified, converted to the
|
||||||
|
@ -15,29 +15,7 @@ var actual = new Intl.Collator().resolvedOptions();
|
|||||||
var actual2 = new Intl.Collator().resolvedOptions();
|
var actual2 = new Intl.Collator().resolvedOptions();
|
||||||
assert.notSameValue(actual2, actual, "resolvedOptions returned the same object twice.");
|
assert.notSameValue(actual2, actual, "resolvedOptions returned the same object twice.");
|
||||||
|
|
||||||
// source: CLDR file common/bcp47/collation.xml; version CLDR 32.
|
var collations = ["default", ...allCollations()];
|
||||||
var collations = [
|
|
||||||
"default", // added
|
|
||||||
"big5han",
|
|
||||||
"compat",
|
|
||||||
"dict",
|
|
||||||
"direct",
|
|
||||||
"ducet",
|
|
||||||
"emoji",
|
|
||||||
"eor",
|
|
||||||
"gb2312",
|
|
||||||
"phonebk",
|
|
||||||
"phonetic",
|
|
||||||
"pinyin",
|
|
||||||
"reformed",
|
|
||||||
// "search", // excluded
|
|
||||||
"searchjl",
|
|
||||||
// "standard", // excluded
|
|
||||||
"stroke",
|
|
||||||
"trad",
|
|
||||||
"unihan",
|
|
||||||
"zhuyin",
|
|
||||||
];
|
|
||||||
|
|
||||||
// this assumes the default values where the specification provides them
|
// this assumes the default values where the specification provides them
|
||||||
assert(isCanonicalizedStructurallyValidLanguageTag(actual.locale),
|
assert(isCanonicalizedStructurallyValidLanguageTag(actual.locale),
|
||||||
@ -45,6 +23,8 @@ assert(isCanonicalizedStructurallyValidLanguageTag(actual.locale),
|
|||||||
assert.sameValue(actual.usage, "sort");
|
assert.sameValue(actual.usage, "sort");
|
||||||
assert.sameValue(actual.sensitivity, "variant");
|
assert.sameValue(actual.sensitivity, "variant");
|
||||||
assert.sameValue(actual.ignorePunctuation, false);
|
assert.sameValue(actual.ignorePunctuation, false);
|
||||||
|
assert.notSameValue(actual.collation, "search");
|
||||||
|
assert.notSameValue(actual.collation, "standard");
|
||||||
assert.notSameValue(collations.indexOf(actual.collation), -1,
|
assert.notSameValue(collations.indexOf(actual.collation), -1,
|
||||||
"Invalid collation: " + actual.collation);
|
"Invalid collation: " + actual.collation);
|
||||||
|
|
||||||
|
@ -6,29 +6,12 @@ esid: sec-initializedatetimeformat
|
|||||||
description: >
|
description: >
|
||||||
Checks the DateTimeFormat choose different patterns based
|
Checks the DateTimeFormat choose different patterns based
|
||||||
on calendar.
|
on calendar.
|
||||||
|
includes: [testIntl.js]
|
||||||
features: [Intl.DateTimeFormat-formatRange]
|
features: [Intl.DateTimeFormat-formatRange]
|
||||||
locale: [en]
|
locale: [en]
|
||||||
---*/
|
---*/
|
||||||
|
|
||||||
let calendars = [
|
let calendars = allCalendars();
|
||||||
"buddhist",
|
|
||||||
"chinese",
|
|
||||||
"coptic",
|
|
||||||
"dangi",
|
|
||||||
"ethiopic",
|
|
||||||
"ethioaa",
|
|
||||||
"gregory",
|
|
||||||
"hebrew",
|
|
||||||
"indian",
|
|
||||||
"islamic",
|
|
||||||
"islamic-civil",
|
|
||||||
"islamic-rgsa",
|
|
||||||
"islamic-tbla",
|
|
||||||
"islamic-umalqura",
|
|
||||||
"japanese",
|
|
||||||
"persian",
|
|
||||||
"roc"
|
|
||||||
];
|
|
||||||
let date1 = new Date(2017, 3, 12);
|
let date1 = new Date(2017, 3, 12);
|
||||||
let date2 = new Date();
|
let date2 = new Date();
|
||||||
|
|
||||||
|
@ -6,28 +6,11 @@ esid: sec-initializedatetimeformat
|
|||||||
description: >
|
description: >
|
||||||
Checks the DateTimeFormat choose different patterns based
|
Checks the DateTimeFormat choose different patterns based
|
||||||
on calendar.
|
on calendar.
|
||||||
|
includes: [testIntl.js]
|
||||||
locale: [en]
|
locale: [en]
|
||||||
---*/
|
---*/
|
||||||
|
|
||||||
let calendars = [
|
let calendars = allCalendars();
|
||||||
"buddhist",
|
|
||||||
"chinese",
|
|
||||||
"coptic",
|
|
||||||
"dangi",
|
|
||||||
"ethiopic",
|
|
||||||
"ethioaa",
|
|
||||||
"gregory",
|
|
||||||
"hebrew",
|
|
||||||
"indian",
|
|
||||||
"islamic",
|
|
||||||
"islamic-civil",
|
|
||||||
"islamic-rgsa",
|
|
||||||
"islamic-tbla",
|
|
||||||
"islamic-umalqura",
|
|
||||||
"japanese",
|
|
||||||
"persian",
|
|
||||||
"roc"
|
|
||||||
];
|
|
||||||
let date = new Date();
|
let date = new Date();
|
||||||
|
|
||||||
// serialize parts to a string by considering only the type and literal.
|
// serialize parts to a string by considering only the type and literal.
|
||||||
|
@ -16,29 +16,7 @@ var actual = new Intl.DateTimeFormat().resolvedOptions();
|
|||||||
var actual2 = new Intl.DateTimeFormat().resolvedOptions();
|
var actual2 = new Intl.DateTimeFormat().resolvedOptions();
|
||||||
assert.notSameValue(actual2, actual, "resolvedOptions returned the same object twice.");
|
assert.notSameValue(actual2, actual, "resolvedOptions returned the same object twice.");
|
||||||
|
|
||||||
// source: CLDR file common/bcp47/calendar.xml; version CLDR 32.
|
var calendars = allCalendars();
|
||||||
var calendars = [
|
|
||||||
"buddhist",
|
|
||||||
"chinese",
|
|
||||||
"coptic",
|
|
||||||
"dangi",
|
|
||||||
"ethioaa",
|
|
||||||
"ethiopic-amete-alem",
|
|
||||||
"ethiopic",
|
|
||||||
"gregory",
|
|
||||||
"hebrew",
|
|
||||||
"indian",
|
|
||||||
"islamic",
|
|
||||||
"islamic-umalqura",
|
|
||||||
"islamic-tbla",
|
|
||||||
"islamic-civil",
|
|
||||||
"islamic-rgsa",
|
|
||||||
"iso8601",
|
|
||||||
"japanese",
|
|
||||||
"persian",
|
|
||||||
"roc",
|
|
||||||
"islamicc",
|
|
||||||
];
|
|
||||||
|
|
||||||
// this assumes the default values where the specification provides them
|
// this assumes the default values where the specification provides them
|
||||||
assert(isCanonicalizedStructurallyValidLanguageTag(actual.locale),
|
assert(isCanonicalizedStructurallyValidLanguageTag(actual.locale),
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
/*---
|
/*---
|
||||||
esid: sec-initializenumberformat
|
esid: sec-initializenumberformat
|
||||||
description: Checks handling of the unit style.
|
description: Checks handling of the unit style.
|
||||||
|
includes: [testIntl.js]
|
||||||
features: [Intl.NumberFormat-unified]
|
features: [Intl.NumberFormat-unified]
|
||||||
---*/
|
---*/
|
||||||
|
|
||||||
@ -51,51 +52,7 @@ function check(unit) {
|
|||||||
assert.sameValue(options.unit, unit);
|
assert.sameValue(options.unit, unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
const units = [
|
const units = allSimpleSanctionedUnits();
|
||||||
"acre",
|
|
||||||
"bit",
|
|
||||||
"byte",
|
|
||||||
"celsius",
|
|
||||||
"centimeter",
|
|
||||||
"day",
|
|
||||||
"degree",
|
|
||||||
"fahrenheit",
|
|
||||||
"fluid-ounce",
|
|
||||||
"foot",
|
|
||||||
"gallon",
|
|
||||||
"gigabit",
|
|
||||||
"gigabyte",
|
|
||||||
"gram",
|
|
||||||
"hectare",
|
|
||||||
"hour",
|
|
||||||
"inch",
|
|
||||||
"kilobit",
|
|
||||||
"kilobyte",
|
|
||||||
"kilogram",
|
|
||||||
"kilometer",
|
|
||||||
"liter",
|
|
||||||
"megabit",
|
|
||||||
"megabyte",
|
|
||||||
"meter",
|
|
||||||
"mile",
|
|
||||||
"mile-scandinavian",
|
|
||||||
"millimeter",
|
|
||||||
"milliliter",
|
|
||||||
"millisecond",
|
|
||||||
"minute",
|
|
||||||
"month",
|
|
||||||
"ounce",
|
|
||||||
"percent",
|
|
||||||
"petabyte",
|
|
||||||
"pound",
|
|
||||||
"second",
|
|
||||||
"stone",
|
|
||||||
"terabit",
|
|
||||||
"terabyte",
|
|
||||||
"week",
|
|
||||||
"yard",
|
|
||||||
"year",
|
|
||||||
];
|
|
||||||
|
|
||||||
for (const simpleUnit of units) {
|
for (const simpleUnit of units) {
|
||||||
check(simpleUnit);
|
check(simpleUnit);
|
||||||
|
@ -7,93 +7,17 @@ description: >
|
|||||||
Tests that Intl.NumberFormat.prototype.format supports all
|
Tests that Intl.NumberFormat.prototype.format supports all
|
||||||
numbering systems with simple digit mappings.
|
numbering systems with simple digit mappings.
|
||||||
author: Roozbeh Pournader
|
author: Roozbeh Pournader
|
||||||
|
includes: [testIntl.js]
|
||||||
---*/
|
---*/
|
||||||
|
|
||||||
const numberingSystems = {
|
for (let [numberingSystem, digits] of Object.entries(numberingSystemDigits)) {
|
||||||
adlm: 0x1E950,
|
let digitList = [...digits];
|
||||||
ahom: 0x11730,
|
|
||||||
arab: 0x0660,
|
|
||||||
arabext: 0x06F0,
|
|
||||||
bali: 0x1B50,
|
|
||||||
beng: 0x09E6,
|
|
||||||
bhks: 0x11C50,
|
|
||||||
brah: 0x11066,
|
|
||||||
cakm: 0x11136,
|
|
||||||
cham: 0xAA50,
|
|
||||||
deva: 0x0966,
|
|
||||||
diak: 0x11950,
|
|
||||||
fullwide: 0xFF10,
|
|
||||||
gong: 0x11DA0,
|
|
||||||
gonm: 0x11D50,
|
|
||||||
gujr: 0x0AE6,
|
|
||||||
guru: 0x0A66,
|
|
||||||
hanidec: [0x3007, 0x4E00, 0x4E8C, 0x4E09, 0x56DB,
|
|
||||||
0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D],
|
|
||||||
hmng: 0x16B50,
|
|
||||||
hmnp: 0x1E140,
|
|
||||||
java: 0xA9D0,
|
|
||||||
kali: 0xA900,
|
|
||||||
khmr: 0x17E0,
|
|
||||||
knda: 0x0CE6,
|
|
||||||
lana: 0x1A80,
|
|
||||||
lanatham: 0x1A90,
|
|
||||||
laoo: 0x0ED0,
|
|
||||||
latn: 0x0030,
|
|
||||||
lepc: 0x1C40,
|
|
||||||
limb: 0x1946,
|
|
||||||
mathbold: 0x1D7CE,
|
|
||||||
mathdbl: 0x1D7D8,
|
|
||||||
mathmono: 0x1D7F6,
|
|
||||||
mathsanb: 0x1D7EC,
|
|
||||||
mathsans: 0x1D7E2,
|
|
||||||
mlym: 0x0D66,
|
|
||||||
modi: 0x11650,
|
|
||||||
mong: 0x1810,
|
|
||||||
mroo: 0x16A60,
|
|
||||||
mtei: 0xABF0,
|
|
||||||
mymr: 0x1040,
|
|
||||||
mymrshan: 0x1090,
|
|
||||||
mymrtlng: 0xA9F0,
|
|
||||||
newa: 0x11450,
|
|
||||||
nkoo: 0x07C0,
|
|
||||||
olck: 0x1C50,
|
|
||||||
orya: 0x0B66,
|
|
||||||
osma: 0x104A0,
|
|
||||||
rohg: 0x10D30,
|
|
||||||
saur: 0xA8D0,
|
|
||||||
segment: 0x1FBF0,
|
|
||||||
shrd: 0x111D0,
|
|
||||||
sind: 0x112F0,
|
|
||||||
sinh: 0x0DE6,
|
|
||||||
sora: 0x110F0,
|
|
||||||
sund: 0x1BB0,
|
|
||||||
takr: 0x116C0,
|
|
||||||
talu: 0x19D0,
|
|
||||||
tamldec: 0x0BE6,
|
|
||||||
telu: 0x0C66,
|
|
||||||
thai: 0x0E50,
|
|
||||||
tibt: 0x0F20,
|
|
||||||
tirh: 0x114D0,
|
|
||||||
vaii: 0xA620,
|
|
||||||
wara: 0x118E0,
|
|
||||||
wcho: 0x1E2F0,
|
|
||||||
};
|
|
||||||
|
|
||||||
for (let [numberingSystem, digitList] of Object.entries(numberingSystems)) {
|
|
||||||
if (typeof digitList === 'number') {
|
|
||||||
let zeroCode = digitList;
|
|
||||||
digitList = [];
|
|
||||||
for (let i = 0; i <= 9; ++i) {
|
|
||||||
digitList[i] = zeroCode + i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
assert.sameValue(digitList.length, 10);
|
assert.sameValue(digitList.length, 10);
|
||||||
|
|
||||||
let nf = new Intl.NumberFormat(undefined, {numberingSystem});
|
let nf = new Intl.NumberFormat(undefined, {numberingSystem});
|
||||||
|
|
||||||
for (let i = 0; i <= 9; ++i) {
|
for (let i = 0; i <= 9; ++i) {
|
||||||
assert.sameValue(nf.format(i), String.fromCodePoint(digitList[i]),
|
assert.sameValue(nf.format(i), digitList[i],
|
||||||
`numberingSystem: ${numberingSystem}, digit: ${i}`);
|
`numberingSystem: ${numberingSystem}, digit: ${i}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
/*---
|
/*---
|
||||||
esid: sec-intl.numberformat.prototype.format
|
esid: sec-intl.numberformat.prototype.format
|
||||||
description: Checks handling of units.
|
description: Checks handling of units.
|
||||||
|
includes: [testIntl.js]
|
||||||
features: [Intl.NumberFormat-unified]
|
features: [Intl.NumberFormat-unified]
|
||||||
---*/
|
---*/
|
||||||
|
|
||||||
@ -13,51 +14,7 @@ function check(unit) {
|
|||||||
assert.notSameValue(s1, s2);
|
assert.notSameValue(s1, s2);
|
||||||
}
|
}
|
||||||
|
|
||||||
const units = [
|
const units = allSimpleSanctionedUnits();
|
||||||
"acre",
|
|
||||||
"bit",
|
|
||||||
"byte",
|
|
||||||
"celsius",
|
|
||||||
"centimeter",
|
|
||||||
"day",
|
|
||||||
"degree",
|
|
||||||
"fahrenheit",
|
|
||||||
"fluid-ounce",
|
|
||||||
"foot",
|
|
||||||
"gallon",
|
|
||||||
"gigabit",
|
|
||||||
"gigabyte",
|
|
||||||
"gram",
|
|
||||||
"hectare",
|
|
||||||
"hour",
|
|
||||||
"inch",
|
|
||||||
"kilobit",
|
|
||||||
"kilobyte",
|
|
||||||
"kilogram",
|
|
||||||
"kilometer",
|
|
||||||
"liter",
|
|
||||||
"megabit",
|
|
||||||
"megabyte",
|
|
||||||
"meter",
|
|
||||||
"mile",
|
|
||||||
"mile-scandinavian",
|
|
||||||
"millimeter",
|
|
||||||
"milliliter",
|
|
||||||
"millisecond",
|
|
||||||
"minute",
|
|
||||||
"month",
|
|
||||||
"ounce",
|
|
||||||
"percent",
|
|
||||||
"petabyte",
|
|
||||||
"pound",
|
|
||||||
"second",
|
|
||||||
"stone",
|
|
||||||
"terabit",
|
|
||||||
"terabyte",
|
|
||||||
"week",
|
|
||||||
"yard",
|
|
||||||
"year",
|
|
||||||
];
|
|
||||||
|
|
||||||
for (const simpleUnit of units) {
|
for (const simpleUnit of units) {
|
||||||
check(simpleUnit);
|
check(simpleUnit);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user