|
| 1 | +'use strict'; |
| 2 | + |
| 3 | +const buildType = process.config.target_defaults.default_configuration; |
| 4 | +const assert = require('assert'); |
| 5 | + |
| 6 | +test(require(`../build/${buildType}/binding.node`)); |
| 7 | +test(require(`../build/${buildType}/binding_noexcept.node`)); |
| 8 | + |
| 9 | +function test(binding) { |
| 10 | + const MIN_INT32 = -2147483648; |
| 11 | + const MAX_INT32 = 2147483647; |
| 12 | + const MIN_UINT32 = 0; |
| 13 | + const MAX_UINT32 = 4294967295; |
| 14 | + const MIN_INT64 = Number.MIN_SAFE_INTEGER; |
| 15 | + const MAX_INT64 = Number.MAX_SAFE_INTEGER; |
| 16 | + const MIN_FLOAT = binding.basic_types_number.minFloat(); |
| 17 | + const MAX_FLOAT = binding.basic_types_number.maxFloat(); |
| 18 | + const MIN_DOUBLE = binding.basic_types_number.minDouble(); |
| 19 | + const MAX_DOUBLE = binding.basic_types_number.maxDouble(); |
| 20 | + |
| 21 | + function randomRangeTestForInteger(min, max, converter) { |
| 22 | + for (let i = min; i < max; i+= Math.floor(Math.random() * max / 100)) { |
| 23 | + assert.strictEqual(i, converter(i)); |
| 24 | + } |
| 25 | + } |
| 26 | + |
| 27 | + // Test for 32bit signed integer [-2147483648, 2147483647] |
| 28 | + { |
| 29 | + // Range tests |
| 30 | + randomRangeTestForInteger(MIN_INT32, MAX_INT32, binding.basic_types_number.toInt32); |
| 31 | + assert.strictEqual(MIN_INT32, binding.basic_types_number.toInt32(MIN_INT32)); |
| 32 | + assert.strictEqual(MAX_INT32, binding.basic_types_number.toInt32(MAX_INT32)); |
| 33 | + |
| 34 | + // Overflow tests |
| 35 | + assert.notStrictEqual(MAX_INT32 + 1, binding.basic_types_number.toInt32(MAX_INT32 + 1)); |
| 36 | + assert.notStrictEqual(MIN_INT32 - 1, binding.basic_types_number.toInt32(MIN_INT32 - 1)); |
| 37 | + } |
| 38 | + |
| 39 | + // Test for 32bit unsigned integer [0, 4294967295] |
| 40 | + { |
| 41 | + // Range tests |
| 42 | + randomRangeTestForInteger(MIN_UINT32, MAX_UINT32, binding.basic_types_number.toUint32); |
| 43 | + assert.strictEqual(MIN_UINT32, binding.basic_types_number.toUint32(MIN_UINT32)); |
| 44 | + assert.strictEqual(MAX_UINT32, binding.basic_types_number.toUint32(MAX_UINT32)); |
| 45 | + |
| 46 | + // Overflow tests |
| 47 | + assert.notStrictEqual(MAX_UINT32 + 1, binding.basic_types_number.toUint32(MAX_UINT32 + 1)); |
| 48 | + assert.notStrictEqual(MIN_UINT32 - 1, binding.basic_types_number.toUint32(MIN_UINT32 - 1)); |
| 49 | + } |
| 50 | + |
| 51 | + // Test for 64bit signed integer |
| 52 | + { |
| 53 | + // Range tests |
| 54 | + randomRangeTestForInteger(MIN_INT64, MAX_INT64, binding.basic_types_number.toInt64); |
| 55 | + assert.strictEqual(MIN_INT64, binding.basic_types_number.toInt64(MIN_INT64)); |
| 56 | + assert.strictEqual(MAX_INT64, binding.basic_types_number.toInt64(MAX_INT64)); |
| 57 | + |
| 58 | + // The int64 type can't be represented with full precision in JavaScript. |
| 59 | + // So, we are not able to do overflow test here. |
| 60 | + // Please see https://tc39.github.io/ecma262/#sec-ecmascript-language-types-number-type. |
| 61 | + } |
| 62 | + |
| 63 | + // Test for float type (might be single-precision 32bit IEEE 754 floating point number) |
| 64 | + { |
| 65 | + // Range test |
| 66 | + assert.strictEqual(MIN_FLOAT, binding.basic_types_number.toFloat(MIN_FLOAT)); |
| 67 | + assert.strictEqual(MAX_FLOAT, binding.basic_types_number.toFloat(MAX_FLOAT)); |
| 68 | + |
| 69 | + // Overflow test |
| 70 | + assert.strictEqual(0, binding.basic_types_number.toFloat(MIN_FLOAT * MIN_FLOAT)); |
| 71 | + assert.strictEqual(Infinity, binding.basic_types_number.toFloat(MAX_FLOAT * MAX_FLOAT)); |
| 72 | + } |
| 73 | + |
| 74 | + // Test for double type (is double-precision 64 bit IEEE 754 floating point number) |
| 75 | + { |
| 76 | + assert.strictEqual(MIN_DOUBLE, binding.basic_types_number.toDouble(MIN_DOUBLE)); |
| 77 | + assert.strictEqual(MAX_DOUBLE, binding.basic_types_number.toDouble(MAX_DOUBLE)); |
| 78 | + |
| 79 | + // Overflow test |
| 80 | + assert.strictEqual(0, binding.basic_types_number.toDouble(MIN_DOUBLE * MIN_DOUBLE)); |
| 81 | + assert.strictEqual(Infinity, binding.basic_types_number.toDouble(MAX_DOUBLE * MAX_DOUBLE)); |
| 82 | + } |
| 83 | +} |
0 commit comments