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);