| 'use strict'; |
| const common = require('../../common'); |
| const assert = require('assert'); |
| const test_number = require(`./build/${common.buildType}/test_number`); |
| |
| |
| // Testing api calls for number |
| function testNumber(num) { |
| assert.strictEqual(num, test_number.Test(num)); |
| } |
| |
| testNumber(0); |
| testNumber(-0); |
| testNumber(1); |
| testNumber(-1); |
| testNumber(100); |
| testNumber(2121); |
| testNumber(-1233); |
| testNumber(986583); |
| testNumber(-976675); |
| |
| /* eslint-disable no-loss-of-precision */ |
| testNumber( |
| 98765432213456789876546896323445679887645323232436587988766545658); |
| testNumber( |
| -4350987086545760976737453646576078997096876957864353245245769809); |
| /* eslint-enable no-loss-of-precision */ |
| testNumber(Number.MIN_SAFE_INTEGER); |
| testNumber(Number.MAX_SAFE_INTEGER); |
| testNumber(Number.MAX_SAFE_INTEGER + 10); |
| |
| testNumber(Number.MIN_VALUE); |
| testNumber(Number.MAX_VALUE); |
| testNumber(Number.MAX_VALUE + 10); |
| |
| testNumber(Number.POSITIVE_INFINITY); |
| testNumber(Number.NEGATIVE_INFINITY); |
| testNumber(Number.NaN); |
| |
| function testUint32(input, expected = input) { |
| assert.strictEqual(expected, test_number.TestUint32Truncation(input)); |
| } |
| |
| // Test zero |
| testUint32(0.0, 0); |
| testUint32(-0.0, 0); |
| |
| // Test overflow scenarios |
| testUint32(4294967295); |
| testUint32(4294967296, 0); |
| testUint32(4294967297, 1); |
| testUint32(17 * 4294967296 + 1, 1); |
| testUint32(-1, 0xffffffff); |
| |
| // Validate documented behavior when value is retrieved as 32-bit integer with |
| // `napi_get_value_int32` |
| function testInt32(input, expected = input) { |
| assert.strictEqual(expected, test_number.TestInt32Truncation(input)); |
| } |
| |
| // Test zero |
| testInt32(0.0, 0); |
| testInt32(-0.0, 0); |
| |
| // Test min/max int32 range |
| testInt32(-Math.pow(2, 31)); |
| testInt32(Math.pow(2, 31) - 1); |
| |
| // Test overflow scenarios |
| testInt32(4294967297, 1); |
| testInt32(4294967296, 0); |
| testInt32(4294967295, -1); |
| testInt32(4294967296 * 5 + 3, 3); |
| |
| // Test min/max safe integer range |
| testInt32(Number.MIN_SAFE_INTEGER, 1); |
| testInt32(Number.MAX_SAFE_INTEGER, -1); |
| |
| // Test within int64_t range (with precision loss) |
| testInt32(-Math.pow(2, 63) + (Math.pow(2, 9) + 1), 1024); |
| testInt32(Math.pow(2, 63) - (Math.pow(2, 9) + 1), -1024); |
| |
| // Test min/max double value |
| testInt32(-Number.MIN_VALUE, 0); |
| testInt32(Number.MIN_VALUE, 0); |
| testInt32(-Number.MAX_VALUE, 0); |
| testInt32(Number.MAX_VALUE, 0); |
| |
| // Test outside int64_t range |
| testInt32(-Math.pow(2, 63) + (Math.pow(2, 9)), 0); |
| testInt32(Math.pow(2, 63) - (Math.pow(2, 9)), 0); |
| |
| // Test non-finite numbers |
| testInt32(Number.POSITIVE_INFINITY, 0); |
| testInt32(Number.NEGATIVE_INFINITY, 0); |
| testInt32(Number.NaN, 0); |
| |
| // Validate documented behavior when value is retrieved as 64-bit integer with |
| // `napi_get_value_int64` |
| function testInt64(input, expected = input) { |
| assert.strictEqual(expected, test_number.TestInt64Truncation(input)); |
| } |
| |
| // Both V8 and ChakraCore return a sentinel value of `0x8000000000000000` when |
| // the conversion goes out of range, but V8 treats it as unsigned in some cases. |
| const RANGEERROR_POSITIVE = Math.pow(2, 63); |
| const RANGEERROR_NEGATIVE = -Math.pow(2, 63); |
| |
| // Test zero |
| testInt64(0.0, 0); |
| testInt64(-0.0, 0); |
| |
| // Test min/max safe integer range |
| testInt64(Number.MIN_SAFE_INTEGER); |
| testInt64(Number.MAX_SAFE_INTEGER); |
| |
| // Test within int64_t range (with precision loss) |
| testInt64(-Math.pow(2, 63) + (Math.pow(2, 9) + 1)); |
| testInt64(Math.pow(2, 63) - (Math.pow(2, 9) + 1)); |
| |
| // Test min/max double value |
| testInt64(-Number.MIN_VALUE, 0); |
| testInt64(Number.MIN_VALUE, 0); |
| testInt64(-Number.MAX_VALUE, RANGEERROR_NEGATIVE); |
| testInt64(Number.MAX_VALUE, RANGEERROR_POSITIVE); |
| |
| // Test outside int64_t range |
| testInt64(-Math.pow(2, 63) + (Math.pow(2, 9)), RANGEERROR_NEGATIVE); |
| testInt64(Math.pow(2, 63) - (Math.pow(2, 9)), RANGEERROR_POSITIVE); |
| |
| // Test non-finite numbers |
| testInt64(Number.POSITIVE_INFINITY, 0); |
| testInt64(Number.NEGATIVE_INFINITY, 0); |
| testInt64(Number.NaN, 0); |