2015-06-17 10:43:13 -06:00
|
|
|
'use strict';
|
|
|
|
|
2015-12-23 16:02:12 -08:00
|
|
|
require('../common');
|
2015-06-17 10:43:13 -06:00
|
|
|
const assert = require('assert');
|
|
|
|
|
|
|
|
const Buffer = require('buffer').Buffer;
|
|
|
|
const LENGTH = 16;
|
|
|
|
|
|
|
|
const ab = new ArrayBuffer(LENGTH);
|
|
|
|
const dv = new DataView(ab);
|
|
|
|
const ui = new Uint8Array(ab);
|
2016-01-25 15:00:06 -08:00
|
|
|
const buf = Buffer.from(ab);
|
2015-06-17 10:43:13 -06:00
|
|
|
|
|
|
|
|
|
|
|
assert.ok(buf instanceof Buffer);
|
2016-08-28 21:21:23 +05:30
|
|
|
assert.equal(buf.parent, buf.buffer);
|
2015-06-17 10:43:13 -06:00
|
|
|
assert.equal(buf.buffer, ab);
|
|
|
|
assert.equal(buf.length, ab.byteLength);
|
|
|
|
|
|
|
|
|
|
|
|
buf.fill(0xC);
|
|
|
|
for (let i = 0; i < LENGTH; i++) {
|
2016-08-26 11:19:43 -07:00
|
|
|
assert.strictEqual(ui[i], 0xC);
|
2015-06-17 10:43:13 -06:00
|
|
|
ui[i] = 0xF;
|
2016-08-26 11:19:43 -07:00
|
|
|
assert.strictEqual(buf[i], 0xF);
|
2015-06-17 10:43:13 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
buf.writeUInt32LE(0xF00, 0);
|
|
|
|
buf.writeUInt32BE(0xB47, 4);
|
|
|
|
buf.writeDoubleLE(3.1415, 8);
|
|
|
|
|
2016-08-26 11:19:43 -07:00
|
|
|
assert.strictEqual(dv.getUint32(0, true), 0xF00);
|
|
|
|
assert.strictEqual(dv.getUint32(4), 0xB47);
|
|
|
|
assert.strictEqual(dv.getFloat64(8, true), 3.1415);
|
2015-06-17 10:43:13 -06:00
|
|
|
|
|
|
|
|
|
|
|
// Now test protecting users from doing stupid things
|
|
|
|
|
|
|
|
assert.throws(function() {
|
|
|
|
function AB() { }
|
2016-02-08 21:12:09 +08:00
|
|
|
Object.setPrototypeOf(AB, ArrayBuffer);
|
|
|
|
Object.setPrototypeOf(AB.prototype, ArrayBuffer.prototype);
|
2016-01-25 15:00:06 -08:00
|
|
|
Buffer.from(new AB());
|
2015-06-17 10:43:13 -06:00
|
|
|
}, TypeError);
|
2015-11-16 10:59:07 +08:00
|
|
|
|
|
|
|
// write{Double,Float}{LE,BE} with noAssert should not crash, cf. #3766
|
2016-01-25 15:00:06 -08:00
|
|
|
var b = Buffer.allocUnsafe(1);
|
2015-11-16 10:59:07 +08:00
|
|
|
b.writeFloatLE(11.11, 0, true);
|
|
|
|
b.writeFloatBE(11.11, 0, true);
|
|
|
|
b.writeDoubleLE(11.11, 0, true);
|
|
|
|
b.writeDoubleBE(11.11, 0, true);
|
2016-01-25 15:00:06 -08:00
|
|
|
|
|
|
|
// Test the byteOffset and length arguments
|
|
|
|
{
|
|
|
|
const ab = new Uint8Array(5);
|
|
|
|
ab[0] = 1;
|
|
|
|
ab[1] = 2;
|
|
|
|
ab[2] = 3;
|
|
|
|
ab[3] = 4;
|
|
|
|
ab[4] = 5;
|
|
|
|
const buf = Buffer.from(ab.buffer, 1, 3);
|
2016-08-26 11:19:43 -07:00
|
|
|
assert.strictEqual(buf.length, 3);
|
|
|
|
assert.strictEqual(buf[0], 2);
|
|
|
|
assert.strictEqual(buf[1], 3);
|
|
|
|
assert.strictEqual(buf[2], 4);
|
2016-01-25 15:00:06 -08:00
|
|
|
buf[0] = 9;
|
2016-08-26 11:19:43 -07:00
|
|
|
assert.strictEqual(ab[1], 9);
|
2016-01-25 15:00:06 -08:00
|
|
|
|
|
|
|
assert.throws(() => Buffer.from(ab.buffer, 6), (err) => {
|
|
|
|
assert(err instanceof RangeError);
|
|
|
|
assert(/'offset' is out of bounds/.test(err.message));
|
|
|
|
return true;
|
|
|
|
});
|
|
|
|
assert.throws(() => Buffer.from(ab.buffer, 3, 6), (err) => {
|
|
|
|
assert(err instanceof RangeError);
|
|
|
|
assert(/'length' is out of bounds/.test(err.message));
|
|
|
|
return true;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// Test the deprecated Buffer() version also
|
|
|
|
{
|
|
|
|
const ab = new Uint8Array(5);
|
|
|
|
ab[0] = 1;
|
|
|
|
ab[1] = 2;
|
|
|
|
ab[2] = 3;
|
|
|
|
ab[3] = 4;
|
|
|
|
ab[4] = 5;
|
|
|
|
const buf = Buffer(ab.buffer, 1, 3);
|
2016-08-26 11:19:43 -07:00
|
|
|
assert.strictEqual(buf.length, 3);
|
|
|
|
assert.strictEqual(buf[0], 2);
|
|
|
|
assert.strictEqual(buf[1], 3);
|
|
|
|
assert.strictEqual(buf[2], 4);
|
2016-01-25 15:00:06 -08:00
|
|
|
buf[0] = 9;
|
2016-08-26 11:19:43 -07:00
|
|
|
assert.strictEqual(ab[1], 9);
|
2016-01-25 15:00:06 -08:00
|
|
|
|
|
|
|
assert.throws(() => Buffer(ab.buffer, 6), (err) => {
|
|
|
|
assert(err instanceof RangeError);
|
|
|
|
assert(/'offset' is out of bounds/.test(err.message));
|
|
|
|
return true;
|
|
|
|
});
|
|
|
|
assert.throws(() => Buffer(ab.buffer, 3, 6), (err) => {
|
|
|
|
assert(err instanceof RangeError);
|
|
|
|
assert(/'length' is out of bounds/.test(err.message));
|
|
|
|
return true;
|
|
|
|
});
|
|
|
|
}
|