tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

shell.js (2847B)


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