11cb0ef41Sopenharmony_ci'use strict';
21cb0ef41Sopenharmony_ci
31cb0ef41Sopenharmony_cirequire('../common');
41cb0ef41Sopenharmony_ciconst assert = require('assert');
51cb0ef41Sopenharmony_ci
61cb0ef41Sopenharmony_ciconst LENGTH = 16;
71cb0ef41Sopenharmony_ci
81cb0ef41Sopenharmony_ciconst ab = new ArrayBuffer(LENGTH);
91cb0ef41Sopenharmony_ciconst dv = new DataView(ab);
101cb0ef41Sopenharmony_ciconst ui = new Uint8Array(ab);
111cb0ef41Sopenharmony_ciconst buf = Buffer.from(ab);
121cb0ef41Sopenharmony_ci
131cb0ef41Sopenharmony_ci
141cb0ef41Sopenharmony_ciassert.ok(buf instanceof Buffer);
151cb0ef41Sopenharmony_ciassert.strictEqual(buf.parent, buf.buffer);
161cb0ef41Sopenharmony_ciassert.strictEqual(buf.buffer, ab);
171cb0ef41Sopenharmony_ciassert.strictEqual(buf.length, ab.byteLength);
181cb0ef41Sopenharmony_ci
191cb0ef41Sopenharmony_ci
201cb0ef41Sopenharmony_cibuf.fill(0xC);
211cb0ef41Sopenharmony_cifor (let i = 0; i < LENGTH; i++) {
221cb0ef41Sopenharmony_ci  assert.strictEqual(ui[i], 0xC);
231cb0ef41Sopenharmony_ci  ui[i] = 0xF;
241cb0ef41Sopenharmony_ci  assert.strictEqual(buf[i], 0xF);
251cb0ef41Sopenharmony_ci}
261cb0ef41Sopenharmony_ci
271cb0ef41Sopenharmony_cibuf.writeUInt32LE(0xF00, 0);
281cb0ef41Sopenharmony_cibuf.writeUInt32BE(0xB47, 4);
291cb0ef41Sopenharmony_cibuf.writeDoubleLE(3.1415, 8);
301cb0ef41Sopenharmony_ci
311cb0ef41Sopenharmony_ciassert.strictEqual(dv.getUint32(0, true), 0xF00);
321cb0ef41Sopenharmony_ciassert.strictEqual(dv.getUint32(4), 0xB47);
331cb0ef41Sopenharmony_ciassert.strictEqual(dv.getFloat64(8, true), 3.1415);
341cb0ef41Sopenharmony_ci
351cb0ef41Sopenharmony_ci
361cb0ef41Sopenharmony_ci// Now test protecting users from doing stupid things
371cb0ef41Sopenharmony_ci
381cb0ef41Sopenharmony_ciassert.throws(function() {
391cb0ef41Sopenharmony_ci  function AB() { }
401cb0ef41Sopenharmony_ci  Object.setPrototypeOf(AB, ArrayBuffer);
411cb0ef41Sopenharmony_ci  Object.setPrototypeOf(AB.prototype, ArrayBuffer.prototype);
421cb0ef41Sopenharmony_ci  Buffer.from(new AB());
431cb0ef41Sopenharmony_ci}, {
441cb0ef41Sopenharmony_ci  code: 'ERR_INVALID_ARG_TYPE',
451cb0ef41Sopenharmony_ci  name: 'TypeError',
461cb0ef41Sopenharmony_ci  message: 'The first argument must be of type string or an instance of ' +
471cb0ef41Sopenharmony_ci           'Buffer, ArrayBuffer, or Array or an Array-like Object. Received ' +
481cb0ef41Sopenharmony_ci           'an instance of AB'
491cb0ef41Sopenharmony_ci});
501cb0ef41Sopenharmony_ci
511cb0ef41Sopenharmony_ci// Test the byteOffset and length arguments
521cb0ef41Sopenharmony_ci{
531cb0ef41Sopenharmony_ci  const ab = new Uint8Array(5);
541cb0ef41Sopenharmony_ci  ab[0] = 1;
551cb0ef41Sopenharmony_ci  ab[1] = 2;
561cb0ef41Sopenharmony_ci  ab[2] = 3;
571cb0ef41Sopenharmony_ci  ab[3] = 4;
581cb0ef41Sopenharmony_ci  ab[4] = 5;
591cb0ef41Sopenharmony_ci  const buf = Buffer.from(ab.buffer, 1, 3);
601cb0ef41Sopenharmony_ci  assert.strictEqual(buf.length, 3);
611cb0ef41Sopenharmony_ci  assert.strictEqual(buf[0], 2);
621cb0ef41Sopenharmony_ci  assert.strictEqual(buf[1], 3);
631cb0ef41Sopenharmony_ci  assert.strictEqual(buf[2], 4);
641cb0ef41Sopenharmony_ci  buf[0] = 9;
651cb0ef41Sopenharmony_ci  assert.strictEqual(ab[1], 9);
661cb0ef41Sopenharmony_ci
671cb0ef41Sopenharmony_ci  assert.throws(() => Buffer.from(ab.buffer, 6), {
681cb0ef41Sopenharmony_ci    code: 'ERR_BUFFER_OUT_OF_BOUNDS',
691cb0ef41Sopenharmony_ci    name: 'RangeError',
701cb0ef41Sopenharmony_ci    message: '"offset" is outside of buffer bounds'
711cb0ef41Sopenharmony_ci  });
721cb0ef41Sopenharmony_ci  assert.throws(() => Buffer.from(ab.buffer, 3, 6), {
731cb0ef41Sopenharmony_ci    code: 'ERR_BUFFER_OUT_OF_BOUNDS',
741cb0ef41Sopenharmony_ci    name: 'RangeError',
751cb0ef41Sopenharmony_ci    message: '"length" is outside of buffer bounds'
761cb0ef41Sopenharmony_ci  });
771cb0ef41Sopenharmony_ci}
781cb0ef41Sopenharmony_ci
791cb0ef41Sopenharmony_ci// Test the deprecated Buffer() version also
801cb0ef41Sopenharmony_ci{
811cb0ef41Sopenharmony_ci  const ab = new Uint8Array(5);
821cb0ef41Sopenharmony_ci  ab[0] = 1;
831cb0ef41Sopenharmony_ci  ab[1] = 2;
841cb0ef41Sopenharmony_ci  ab[2] = 3;
851cb0ef41Sopenharmony_ci  ab[3] = 4;
861cb0ef41Sopenharmony_ci  ab[4] = 5;
871cb0ef41Sopenharmony_ci  const buf = Buffer(ab.buffer, 1, 3);
881cb0ef41Sopenharmony_ci  assert.strictEqual(buf.length, 3);
891cb0ef41Sopenharmony_ci  assert.strictEqual(buf[0], 2);
901cb0ef41Sopenharmony_ci  assert.strictEqual(buf[1], 3);
911cb0ef41Sopenharmony_ci  assert.strictEqual(buf[2], 4);
921cb0ef41Sopenharmony_ci  buf[0] = 9;
931cb0ef41Sopenharmony_ci  assert.strictEqual(ab[1], 9);
941cb0ef41Sopenharmony_ci
951cb0ef41Sopenharmony_ci  assert.throws(() => Buffer(ab.buffer, 6), {
961cb0ef41Sopenharmony_ci    code: 'ERR_BUFFER_OUT_OF_BOUNDS',
971cb0ef41Sopenharmony_ci    name: 'RangeError',
981cb0ef41Sopenharmony_ci    message: '"offset" is outside of buffer bounds'
991cb0ef41Sopenharmony_ci  });
1001cb0ef41Sopenharmony_ci  assert.throws(() => Buffer(ab.buffer, 3, 6), {
1011cb0ef41Sopenharmony_ci    code: 'ERR_BUFFER_OUT_OF_BOUNDS',
1021cb0ef41Sopenharmony_ci    name: 'RangeError',
1031cb0ef41Sopenharmony_ci    message: '"length" is outside of buffer bounds'
1041cb0ef41Sopenharmony_ci  });
1051cb0ef41Sopenharmony_ci}
1061cb0ef41Sopenharmony_ci
1071cb0ef41Sopenharmony_ci{
1081cb0ef41Sopenharmony_ci  // If byteOffset is not numeric, it defaults to 0.
1091cb0ef41Sopenharmony_ci  const ab = new ArrayBuffer(10);
1101cb0ef41Sopenharmony_ci  const expected = Buffer.from(ab, 0);
1111cb0ef41Sopenharmony_ci  assert.deepStrictEqual(Buffer.from(ab, 'fhqwhgads'), expected);
1121cb0ef41Sopenharmony_ci  assert.deepStrictEqual(Buffer.from(ab, NaN), expected);
1131cb0ef41Sopenharmony_ci  assert.deepStrictEqual(Buffer.from(ab, {}), expected);
1141cb0ef41Sopenharmony_ci  assert.deepStrictEqual(Buffer.from(ab, []), expected);
1151cb0ef41Sopenharmony_ci
1161cb0ef41Sopenharmony_ci  // If byteOffset can be converted to a number, it will be.
1171cb0ef41Sopenharmony_ci  assert.deepStrictEqual(Buffer.from(ab, [1]), Buffer.from(ab, 1));
1181cb0ef41Sopenharmony_ci
1191cb0ef41Sopenharmony_ci  // If byteOffset is Infinity, throw.
1201cb0ef41Sopenharmony_ci  assert.throws(() => {
1211cb0ef41Sopenharmony_ci    Buffer.from(ab, Infinity);
1221cb0ef41Sopenharmony_ci  }, {
1231cb0ef41Sopenharmony_ci    code: 'ERR_BUFFER_OUT_OF_BOUNDS',
1241cb0ef41Sopenharmony_ci    name: 'RangeError',
1251cb0ef41Sopenharmony_ci    message: '"offset" is outside of buffer bounds'
1261cb0ef41Sopenharmony_ci  });
1271cb0ef41Sopenharmony_ci}
1281cb0ef41Sopenharmony_ci
1291cb0ef41Sopenharmony_ci{
1301cb0ef41Sopenharmony_ci  // If length is not numeric, it defaults to 0.
1311cb0ef41Sopenharmony_ci  const ab = new ArrayBuffer(10);
1321cb0ef41Sopenharmony_ci  const expected = Buffer.from(ab, 0, 0);
1331cb0ef41Sopenharmony_ci  assert.deepStrictEqual(Buffer.from(ab, 0, 'fhqwhgads'), expected);
1341cb0ef41Sopenharmony_ci  assert.deepStrictEqual(Buffer.from(ab, 0, NaN), expected);
1351cb0ef41Sopenharmony_ci  assert.deepStrictEqual(Buffer.from(ab, 0, {}), expected);
1361cb0ef41Sopenharmony_ci  assert.deepStrictEqual(Buffer.from(ab, 0, []), expected);
1371cb0ef41Sopenharmony_ci
1381cb0ef41Sopenharmony_ci  // If length can be converted to a number, it will be.
1391cb0ef41Sopenharmony_ci  assert.deepStrictEqual(Buffer.from(ab, 0, [1]), Buffer.from(ab, 0, 1));
1401cb0ef41Sopenharmony_ci
1411cb0ef41Sopenharmony_ci  // If length is Infinity, throw.
1421cb0ef41Sopenharmony_ci  assert.throws(() => {
1431cb0ef41Sopenharmony_ci    Buffer.from(ab, 0, Infinity);
1441cb0ef41Sopenharmony_ci  }, {
1451cb0ef41Sopenharmony_ci    code: 'ERR_BUFFER_OUT_OF_BOUNDS',
1461cb0ef41Sopenharmony_ci    name: 'RangeError',
1471cb0ef41Sopenharmony_ci    message: '"length" is outside of buffer bounds'
1481cb0ef41Sopenharmony_ci  });
1491cb0ef41Sopenharmony_ci}
1501cb0ef41Sopenharmony_ci
1511cb0ef41Sopenharmony_ci// Test an array like entry with the length set to NaN.
1521cb0ef41Sopenharmony_ciassert.deepStrictEqual(Buffer.from({ length: NaN }), Buffer.alloc(0));
153