166 lines
5.5 KiB
JavaScript
166 lines
5.5 KiB
JavaScript
|
'use strict';
|
||
|
const assert = require('assert');
|
||
|
const ref = require('../');
|
||
|
|
||
|
describe('int64', function() {
|
||
|
const JS_MAX_INT = +Number.MAX_SAFE_INTEGER;
|
||
|
const JS_MIN_INT = -Number.MIN_SAFE_INTEGER;
|
||
|
|
||
|
it('should allow simple ints to be written and read', function() {
|
||
|
const buf = Buffer.alloc(ref.sizeof.int64);
|
||
|
const val = 123456789;
|
||
|
ref.writeInt64(buf, 0, val);
|
||
|
const rtn = ref.readInt64(buf, 0);
|
||
|
assert.strictEqual(val, rtn);
|
||
|
});
|
||
|
|
||
|
it('should allow INT64_MAX to be written and read', function() {
|
||
|
const buf = Buffer.alloc(ref.sizeof.int64);
|
||
|
const val = '9223372036854775807';
|
||
|
ref.writeInt64(buf, 0, val);
|
||
|
const rtn = ref.readInt64(buf, 0);
|
||
|
assert.strictEqual(val, rtn);
|
||
|
});
|
||
|
|
||
|
it('should allow a hex String to be input (signed)', function() {
|
||
|
const buf = Buffer.alloc(ref.sizeof.int64);
|
||
|
const val = '-0x1234567890';
|
||
|
ref.writeInt64(buf, 0, val);
|
||
|
const rtn = ref.readInt64(buf, 0);
|
||
|
assert.strictEqual(parseInt(val, 16), rtn);
|
||
|
});
|
||
|
|
||
|
it('should allow an octal String to be input (signed)', function() {
|
||
|
const buf = Buffer.alloc(ref.sizeof.int64);
|
||
|
const val = '-0777';
|
||
|
ref.writeInt64(buf, 0, val);
|
||
|
const rtn = ref.readInt64(buf, 0);
|
||
|
assert.strictEqual(parseInt(val, 8), rtn);
|
||
|
});
|
||
|
|
||
|
it('should allow a hex String to be input (unsigned)', function() {
|
||
|
const buf = Buffer.alloc(ref.sizeof.uint64);
|
||
|
const val = '0x1234567890';
|
||
|
ref.writeUInt64(buf, 0, val);
|
||
|
const rtn = ref.readUInt64(buf, 0);
|
||
|
assert.strictEqual(parseInt(val, 16), rtn);
|
||
|
});
|
||
|
|
||
|
it('should allow an octal String to be input (unsigned)', function() {
|
||
|
const buf = Buffer.alloc(ref.sizeof.uint64);
|
||
|
const val = '0777';
|
||
|
ref.writeUInt64(buf, 0, val);
|
||
|
const rtn = ref.readUInt64(buf, 0);
|
||
|
assert.strictEqual(parseInt(val, 8), rtn);
|
||
|
});
|
||
|
|
||
|
it('should return a Number when reading JS_MIN_INT', function() {
|
||
|
const buf = Buffer.alloc(ref.sizeof.int64);
|
||
|
ref.writeInt64(buf, 0, JS_MIN_INT);
|
||
|
const rtn = ref.readInt64(buf, 0);
|
||
|
assert.strictEqual('number', typeof rtn);
|
||
|
assert.strictEqual(JS_MIN_INT, rtn);
|
||
|
});
|
||
|
|
||
|
it('should return a Number when reading JS_MAX_INT', function() {
|
||
|
const buf = Buffer.alloc(ref.sizeof.int64);
|
||
|
ref.writeInt64(buf, 0, JS_MAX_INT);
|
||
|
const rtn = ref.readInt64(buf, 0);
|
||
|
assert.strictEqual('number', typeof rtn);
|
||
|
assert.strictEqual(JS_MAX_INT, rtn);
|
||
|
});
|
||
|
|
||
|
it('should return a String when reading JS_MAX_INT+1', function() {
|
||
|
const buf = Buffer.alloc(ref.sizeof.int64);
|
||
|
const plus_one = '9007199254740993';
|
||
|
ref.writeInt64(buf, 0, plus_one);
|
||
|
const rtn = ref.readInt64(buf, 0);
|
||
|
assert.strictEqual('string', typeof rtn);
|
||
|
assert.strictEqual(plus_one, rtn);
|
||
|
});
|
||
|
|
||
|
it('should return a String when reading JS_MIN_INT-1', function() {
|
||
|
const buf = Buffer.alloc(ref.sizeof.int64);
|
||
|
const minus_one = '-9007199254740993';
|
||
|
ref.writeInt64(buf, 0, minus_one);
|
||
|
const rtn = ref.readInt64(buf, 0);
|
||
|
assert.strictEqual('string', typeof rtn);
|
||
|
assert.strictEqual(minus_one, rtn);
|
||
|
});
|
||
|
|
||
|
it('should return a Number when reading 0, even when written as a String', function() {
|
||
|
const buf = Buffer.alloc(ref.sizeof.int64);
|
||
|
const zero = '0';
|
||
|
ref.writeInt64(buf, 0, zero);
|
||
|
const rtn = ref.readInt64(buf, 0);
|
||
|
assert.strictEqual('number', typeof rtn);
|
||
|
assert.strictEqual(0, rtn);
|
||
|
});
|
||
|
|
||
|
it('should throw a "no digits" Error when writing an invalid String (signed)', function() {
|
||
|
assert.throws(() => {
|
||
|
const buf = Buffer.alloc(ref.sizeof.int64);
|
||
|
ref.writeInt64(buf, 0, 'foo');
|
||
|
}, /no digits we found in input String/);
|
||
|
});
|
||
|
|
||
|
it('should throw a "no digits" Error when writing an invalid String (unsigned)', function() {
|
||
|
assert.throws(() => {
|
||
|
const buf = Buffer.alloc(ref.sizeof.uint64);
|
||
|
ref.writeUInt64(buf, 0, 'foo');
|
||
|
}, /no digits we found in input String/);
|
||
|
});
|
||
|
|
||
|
it('should throw an "out of range" Error when writing an invalid String (signed)', function() {
|
||
|
let e;
|
||
|
try {
|
||
|
const buf = Buffer.alloc(ref.sizeof.int64)
|
||
|
ref.writeInt64(buf, 0, '10000000000000000000000000')
|
||
|
} catch (_e) {
|
||
|
e = _e;
|
||
|
}
|
||
|
assert(/input String numerical value out of range/.test(e.message));
|
||
|
});
|
||
|
|
||
|
it('should throw an "out of range" Error when writing an invalid String (unsigned)', function() {
|
||
|
let e;
|
||
|
try {
|
||
|
const buf = Buffer.alloc(ref.sizeof.uint64);
|
||
|
ref.writeUInt64(buf, 0, '10000000000000000000000000');
|
||
|
} catch (_e) {
|
||
|
e = _e;
|
||
|
}
|
||
|
assert(/input String numerical value out of range/.test(e.message));
|
||
|
});
|
||
|
|
||
|
it('should throw an Error when reading an int64_t from the NULL pointer', function() {
|
||
|
assert.throws(() => {
|
||
|
ref.readInt64(ref.NULL);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('should throw an Error when reading an uint64_t from the NULL pointer', function() {
|
||
|
assert.throws(() => {
|
||
|
ref.readUInt64(ref.NULL);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
['LE', 'BE'].forEach((endianness) => {
|
||
|
describe(endianness, function() {
|
||
|
it('should read and write a signed ' + endianness + ' 64-bit integer', function() {
|
||
|
const val = -123456789;
|
||
|
const buf = Buffer.alloc(ref.sizeof.int64);
|
||
|
ref['writeInt64' + endianness](buf, 0, val);
|
||
|
assert.strictEqual(val, ref['readInt64' + endianness](buf, 0));
|
||
|
});
|
||
|
|
||
|
it('should read and write an unsigned ' + endianness + ' 64-bit integer', function() {
|
||
|
const val = 123456789;
|
||
|
const buf = Buffer.alloc(ref.sizeof.uint64);
|
||
|
ref['writeUInt64' + endianness](buf, 0, val);
|
||
|
assert.strictEqual(val, ref['readUInt64' + endianness](buf, 0));
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|