'use strict';

const common = require('../common');
const { hijackStderr, restoreStderr } = require('../common/hijackstdio');
const assert = require('assert');
const { startNewREPLServer } = require('../common/repl');

const { replServer, input } = startNewREPLServer();

for (const type of [
  Array,
  Buffer,

  Uint8Array,
  Uint16Array,
  Uint32Array,

  Uint8ClampedArray,
  Int8Array,
  Int16Array,
  Int32Array,
  Float32Array,
  Float64Array,
]) {
  input.run(['.clear']);

  if (type === Array) {
    input.run([
      'var ele = [];',
      'for (let i = 0; i < 1e6 + 1; i++) ele[i] = 0;',
      'ele.biu = 1;',
    ]);
  } else if (type === Buffer) {
    input.run(['var ele = Buffer.alloc(1e6 + 1); ele.biu = 1;']);
  } else {
    input.run([`var ele = new ${type.name}(1e6 + 1); ele.biu = 1;`]);
  }

  hijackStderr(common.mustNotCall());
  replServer.complete(
    'ele.',
    common.mustCall((err, data) => {
      restoreStderr();
      assert.ifError(err);

      const ele =
        type === Array ? [] : type === Buffer ? Buffer.alloc(0) : new type(0);

      assert.strictEqual(data[0].includes('ele.biu'), true);

      data[0].forEach((key) => {
        if (!key || key === 'ele.biu') return;
        assert.notStrictEqual(ele[key.slice(4)], undefined);
      });
    })
  );
}

// check Buffer.prototype.length not crashing.
// Refs: https://github.com/nodejs/node/pull/11961
input.run(['.clear']);
replServer.complete('Buffer.prototype.', common.mustCall());
