tor-browser

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

rounding-mode.js (5797B)


      1 // |reftest| skip-if(!this.hasOwnProperty("Intl"))
      2 
      3 const tests = [
      4  // Special values: Zeros and non-finite values.
      5  {
      6    value: 0,
      7    options: {},
      8    roundingModes: {
      9      ceil: "0",
     10      floor: "0",
     11      expand: "0",
     12      trunc: "0",
     13      halfCeil: "0",
     14      halfFloor: "0",
     15      halfExpand: "0",
     16      halfTrunc: "0",
     17      halfEven: "0",
     18    },
     19  },
     20  {
     21    value: -0,
     22    options: {},
     23    roundingModes: {
     24      ceil: "-0",
     25      floor: "-0",
     26      expand: "-0",
     27      trunc: "-0",
     28      halfCeil: "-0",
     29      halfFloor: "-0",
     30      halfExpand: "-0",
     31      halfTrunc: "-0",
     32      halfEven: "-0",
     33    },
     34  },
     35  {
     36    value: -Infinity,
     37    options: {},
     38    roundingModes: {
     39      ceil: "-∞",
     40      floor: "-∞",
     41      expand: "-∞",
     42      trunc: "-∞",
     43      halfCeil: "-∞",
     44      halfFloor: "-∞",
     45      halfExpand: "-∞",
     46      halfTrunc: "-∞",
     47      halfEven: "-∞",
     48    },
     49  },
     50  {
     51    value: Infinity,
     52    options: {},
     53    roundingModes: {
     54      ceil: "∞",
     55      floor: "∞",
     56      expand: "∞",
     57      trunc: "∞",
     58      halfCeil: "∞",
     59      halfFloor: "∞",
     60      halfExpand: "∞",
     61      halfTrunc: "∞",
     62      halfEven: "∞",
     63    },
     64  },
     65  {
     66    value: NaN,
     67    options: {},
     68    roundingModes: {
     69      ceil: "NaN",
     70      floor: "NaN",
     71      expand: "NaN",
     72      trunc: "NaN",
     73      halfCeil: "NaN",
     74      halfFloor: "NaN",
     75      halfExpand: "NaN",
     76      halfTrunc: "NaN",
     77      halfEven: "NaN",
     78    },
     79  },
     80 
     81  // Integer rounding with positive values.
     82  {
     83    value: 0.4,
     84    options: {maximumFractionDigits: 0},
     85    roundingModes: {
     86      ceil: "1",
     87      floor: "0",
     88      expand: "1",
     89      trunc: "0",
     90      halfCeil: "0",
     91      halfFloor: "0",
     92      halfExpand: "0",
     93      halfTrunc: "0",
     94      halfEven: "0",
     95    },
     96  },
     97  {
     98    value: 0.5,
     99    options: {maximumFractionDigits: 0},
    100    roundingModes: {
    101      ceil: "1",
    102      floor: "0",
    103      expand: "1",
    104      trunc: "0",
    105      halfCeil: "1",
    106      halfFloor: "0",
    107      halfExpand: "1",
    108      halfTrunc: "0",
    109      halfEven: "0",
    110    },
    111  },
    112  {
    113    value: 0.6,
    114    options: {maximumFractionDigits: 0},
    115    roundingModes: {
    116      ceil: "1",
    117      floor: "0",
    118      expand: "1",
    119      trunc: "0",
    120      halfCeil: "1",
    121      halfFloor: "1",
    122      halfExpand: "1",
    123      halfTrunc: "1",
    124      halfEven: "1",
    125    },
    126  },
    127 
    128  // Integer rounding with negative values.
    129  {
    130    value: -0.4,
    131    options: {maximumFractionDigits: 0},
    132    roundingModes: {
    133      ceil: "-0",
    134      floor: "-1",
    135      expand: "-1",
    136      trunc: "-0",
    137      halfCeil: "-0",
    138      halfFloor: "-0",
    139      halfExpand: "-0",
    140      halfTrunc: "-0",
    141      halfEven: "-0",
    142    },
    143  },
    144  {
    145    value: -0.5,
    146    options: {maximumFractionDigits: 0},
    147    roundingModes: {
    148      ceil: "-0",
    149      floor: "-1",
    150      expand: "-1",
    151      trunc: "-0",
    152      halfCeil: "-0",
    153      halfFloor: "-1",
    154      halfExpand: "-1",
    155      halfTrunc: "-0",
    156      halfEven: "-0",
    157    },
    158  },
    159  {
    160    value: -0.6,
    161    options: {maximumFractionDigits: 0},
    162    roundingModes: {
    163      ceil: "-0",
    164      floor: "-1",
    165      expand: "-1",
    166      trunc: "-0",
    167      halfCeil: "-1",
    168      halfFloor: "-1",
    169      halfExpand: "-1",
    170      halfTrunc: "-1",
    171      halfEven: "-1",
    172    },
    173  },
    174 
    175  // Fractional digits rounding with positive values.
    176  {
    177    value: 0.04,
    178    options: {maximumFractionDigits: 1},
    179    roundingModes: {
    180      ceil: "0.1",
    181      floor: "0",
    182      expand: "0.1",
    183      trunc: "0",
    184      halfCeil: "0",
    185      halfFloor: "0",
    186      halfExpand: "0",
    187      halfTrunc: "0",
    188      halfEven: "0",
    189    },
    190  },
    191  {
    192    value: 0.05,
    193    options: {maximumFractionDigits: 1},
    194    roundingModes: {
    195      ceil: "0.1",
    196      floor: "0",
    197      expand: "0.1",
    198      trunc: "0",
    199      halfCeil: "0.1",
    200      halfFloor: "0",
    201      halfExpand: "0.1",
    202      halfTrunc: "0",
    203      halfEven: "0",
    204    },
    205  },
    206  {
    207    value: 0.06,
    208    options: {maximumFractionDigits: 1},
    209    roundingModes: {
    210      ceil: "0.1",
    211      floor: "0",
    212      expand: "0.1",
    213      trunc: "0",
    214      halfCeil: "0.1",
    215      halfFloor: "0.1",
    216      halfExpand: "0.1",
    217      halfTrunc: "0.1",
    218      halfEven: "0.1",
    219    },
    220  },
    221 
    222  // Fractional digits rounding with negative values.
    223  {
    224    value: -0.04,
    225    options: {maximumFractionDigits: 1},
    226    roundingModes: {
    227      ceil: "-0",
    228      floor: "-0.1",
    229      expand: "-0.1",
    230      trunc: "-0",
    231      halfCeil: "-0",
    232      halfFloor: "-0",
    233      halfExpand: "-0",
    234      halfTrunc: "-0",
    235      halfEven: "-0",
    236    },
    237  },
    238  {
    239    value: -0.05,
    240    options: {maximumFractionDigits: 1},
    241    roundingModes: {
    242      ceil: "-0",
    243      floor: "-0.1",
    244      expand: "-0.1",
    245      trunc: "-0",
    246      halfCeil: "-0",
    247      halfFloor: "-0.1",
    248      halfExpand: "-0.1",
    249      halfTrunc: "-0",
    250      halfEven: "-0",
    251    },
    252  },
    253  {
    254    value: -0.06,
    255    options: {maximumFractionDigits: 1},
    256    roundingModes: {
    257      ceil: "-0",
    258      floor: "-0.1",
    259      expand: "-0.1",
    260      trunc: "-0",
    261      halfCeil: "-0.1",
    262      halfFloor: "-0.1",
    263      halfExpand: "-0.1",
    264      halfTrunc: "-0.1",
    265      halfEven: "-0.1",
    266    },
    267  },
    268 ];
    269 
    270 for (let {value, options, roundingModes} of tests) {
    271  for (let [roundingMode, expected] of Object.entries(roundingModes)) {
    272    let nf = new Intl.NumberFormat("en", {...options, roundingMode});
    273    assertEq(nf.format(value), expected, `value=${value}, roundingMode=${roundingMode}`);
    274    assertEq(nf.resolvedOptions().roundingMode, roundingMode);
    275  }
    276 }
    277 
    278 // Default value is "halfExpand".
    279 assertEq(new Intl.NumberFormat().resolvedOptions().roundingMode, "halfExpand");
    280 
    281 // Invalid values.
    282 for (let roundingMode of ["", null, "halfOdd", "halfUp", "Up", "up"]){
    283  assertThrowsInstanceOf(() => new Intl.NumberFormat("en", {roundingMode}), RangeError);
    284 }
    285 
    286 if (typeof reportCompare === "function")
    287  reportCompare(true, true);