1// Flags: --expose-internals 2'use strict'; 3 4require('../common'); 5const assert = require('assert'); 6const { convertToInt, evenRound } = require('internal/webidl'); 7 8assert.strictEqual(evenRound(-0.5), 0); 9assert.strictEqual(evenRound(0.5), 0); 10assert.strictEqual(evenRound(-1.5), -2); 11assert.strictEqual(evenRound(1.5), 2); 12assert.strictEqual(evenRound(3.4), 3); 13assert.strictEqual(evenRound(4.6), 5); 14assert.strictEqual(evenRound(5), 5); 15assert.strictEqual(evenRound(6), 6); 16 17// https://webidl.spec.whatwg.org/#abstract-opdef-converttoint 18assert.strictEqual(convertToInt('x', 0, 64), 0); 19assert.strictEqual(convertToInt('x', 1, 64), 1); 20assert.strictEqual(convertToInt('x', -0.5, 64), 0); 21assert.strictEqual(convertToInt('x', -0.5, 64, { signed: true }), 0); 22assert.strictEqual(convertToInt('x', -1.5, 64, { signed: true }), -1); 23 24// EnforceRange 25const OutOfRangeValues = [ NaN, Infinity, -Infinity, 2 ** 53, -(2 ** 53) ]; 26for (const value of OutOfRangeValues) { 27 assert.throws(() => convertToInt('x', value, 64, { enforceRange: true }), { 28 name: 'TypeError', 29 code: 'ERR_INVALID_ARG_VALUE', 30 }); 31} 32 33// Out of range: clamp 34assert.strictEqual(convertToInt('x', NaN, 64, { clamp: true }), 0); 35assert.strictEqual(convertToInt('x', Infinity, 64, { clamp: true }), Number.MAX_SAFE_INTEGER); 36assert.strictEqual(convertToInt('x', -Infinity, 64, { clamp: true }), 0); 37assert.strictEqual(convertToInt('x', -Infinity, 64, { signed: true, clamp: true }), Number.MIN_SAFE_INTEGER); 38assert.strictEqual(convertToInt('x', 0x1_0000_0000, 32, { clamp: true }), 0xFFFF_FFFF); 39assert.strictEqual(convertToInt('x', 0xFFFF_FFFF, 32, { clamp: true }), 0xFFFF_FFFF); 40assert.strictEqual(convertToInt('x', 0x8000_0000, 32, { clamp: true, signed: true }), 0x7FFF_FFFF); 41assert.strictEqual(convertToInt('x', 0xFFFF_FFFF, 32, { clamp: true, signed: true }), 0x7FFF_FFFF); 42assert.strictEqual(convertToInt('x', 0.5, 64, { clamp: true }), 0); 43assert.strictEqual(convertToInt('x', 1.5, 64, { clamp: true }), 2); 44assert.strictEqual(convertToInt('x', -0.5, 64, { clamp: true }), 0); 45assert.strictEqual(convertToInt('x', -0.5, 64, { signed: true, clamp: true }), 0); 46assert.strictEqual(convertToInt('x', -1.5, 64, { signed: true, clamp: true }), -2); 47 48// Out of range, step 8. 49assert.strictEqual(convertToInt('x', NaN, 64), 0); 50assert.strictEqual(convertToInt('x', Infinity, 64), 0); 51assert.strictEqual(convertToInt('x', -Infinity, 64), 0); 52assert.strictEqual(convertToInt('x', 0x1_0000_0000, 32), 0); 53assert.strictEqual(convertToInt('x', 0x1_0000_0001, 32), 1); 54assert.strictEqual(convertToInt('x', 0xFFFF_FFFF, 32), 0xFFFF_FFFF); 55 56// Out of range, step 11. 57assert.strictEqual(convertToInt('x', 0x8000_0000, 32, { signed: true }), -0x8000_0000); 58assert.strictEqual(convertToInt('x', 0xFFF_FFFF, 32, { signed: true }), 0xFFF_FFFF); 59