summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/Intl/NumberFormat/shell.js
blob: 471fdad71b6813ce915ed12cb44ea712e835a87e (plain)
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);
        }
    }
}