1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
function GenericPartCreator(type) {
return str => ({ type, value: str });
}
const NumberFormatParts = {
Nan: GenericPartCreator("nan"),
Inf: GenericPartCreator("infinity"),
Integer: GenericPartCreator("integer"),
Group: GenericPartCreator("group"),
Decimal: GenericPartCreator("decimal"),
Fraction: GenericPartCreator("fraction"),
MinusSign: GenericPartCreator("minusSign"),
PlusSign: GenericPartCreator("plusSign"),
PercentSign: GenericPartCreator("percentSign"),
Currency: GenericPartCreator("currency"),
Literal: GenericPartCreator("literal"),
ExponentSeparator: GenericPartCreator("exponentSeparator"),
ExponentMinusSign: GenericPartCreator("exponentMinusSign"),
ExponentInteger: GenericPartCreator("exponentInteger"),
Compact: GenericPartCreator("compact"),
Unit: GenericPartCreator("unit"),
};
function NumberRangeFormatParts(source) {
let entries = Object.entries(NumberFormatParts)
entries.push(["Approx", GenericPartCreator("approximatelySign")]);
return Object.fromEntries(entries.map(([key, part]) => {
let partWithSource = str => {
return Object.defineProperty(part(str), "source", {
value: source, writable: true, enumerable: true, configurable: true
});
};
return [key, partWithSource];
}));
}
function assertParts(nf, x, expected) {
var parts = nf.formatToParts(x);
assertEq(parts.map(part => part.value).join(""), nf.format(x),
"formatToParts and format must agree");
var len = parts.length;
assertEq(len, expected.length, "parts count mismatch");
for (var i = 0; i < len; i++) {
assertEq(parts[i].type, expected[i].type, "type mismatch at " + i);
assertEq(parts[i].value, expected[i].value, "value mismatch at " + i);
}
}
function assertRangeParts(nf, start, end, expected) {
var parts = nf.formatRangeToParts(start, end);
assertEq(parts.map(part => part.value).join(""), nf.formatRange(start, end),
"formatRangeToParts and formatRange must agree");
var len = parts.length;
assertEq(len, expected.length, "parts count mismatch");
for (var i = 0; i < len; i++) {
assertEq(parts[i].type, expected[i].type, "type mismatch at " + i);
assertEq(parts[i].value, expected[i].value, "value mismatch at " + i);
assertEq(parts[i].source, expected[i].source, "source mismatch at " + i);
}
}
function runNumberFormattingTestcases(testcases) {
for (let {locale, options, values} of testcases) {
let nf = new Intl.NumberFormat(locale, options);
for (let {value, string, parts} of values) {
assertEq(nf.format(value), string,
`locale=${locale}, options=${JSON.stringify(options)}, value=${value}`);
assertParts(nf, value, parts);
}
}
}
|