'use strict';
// Flags: --expose-internals
const common = require('../common');
const assert = require('assert');
const test = require('node:test');
const { Blob } = require('buffer');
const { ReadableStream } = require('stream/web');

const sab = new SharedArrayBuffer(8);
const sabView = new Uint8Array(sab);
const sabDataView = new DataView(sab);

// -- ReadableStreamBYOBReader.read() --

test('ReadableStreamBYOBReader.read() rejects SAB-backed Uint8Array', async () => {
  const rs = new ReadableStream({
    type: 'bytes',
    pull(controller) {
      controller.enqueue(new Uint8Array([1, 2, 3]));
    },
  });
  const reader = rs.getReader({ mode: 'byob' });
  await assert.rejects(
    reader.read(new Uint8Array(sab)),
    { code: 'ERR_INVALID_ARG_VALUE' },
  );
  reader.releaseLock();
});

test('ReadableStreamBYOBReader.read() rejects SAB-backed DataView', async () => {
  const rs = new ReadableStream({
    type: 'bytes',
    pull(controller) {
      controller.enqueue(new Uint8Array([1, 2, 3]));
    },
  });
  const reader = rs.getReader({ mode: 'byob' });
  await assert.rejects(
    reader.read(sabDataView),
    { code: 'ERR_INVALID_ARG_VALUE' },
  );
  reader.releaseLock();
});

test('ReadableStreamBYOBReader.read() accepts regular view', async () => {
  const rs = new ReadableStream({
    type: 'bytes',
    pull(controller) {
      controller.enqueue(new Uint8Array([1, 2, 3]));
    },
  });
  const reader = rs.getReader({ mode: 'byob' });
  const { value, done } = await reader.read(new Uint8Array(3));
  assert.strictEqual(done, false);
  assert.deepStrictEqual(value, new Uint8Array([1, 2, 3]));
  reader.releaseLock();
});

// -- ReadableByteStreamController.enqueue() --

test('ReadableByteStreamController.enqueue() rejects SAB-backed Uint8Array', async () => {
  const sabForEnqueue = new SharedArrayBuffer(4);
  const sabViewForEnqueue = new Uint8Array(sabForEnqueue);
  sabViewForEnqueue[0] = 42;

  const rs = new ReadableStream({
    type: 'bytes',
    pull: common.mustCall((controller) => {
      assert.throws(
        () => controller.enqueue(sabViewForEnqueue),
        { code: 'ERR_INVALID_ARG_VALUE' },
      );
      controller.enqueue(new Uint8Array([1]));
    }),
  });
  const reader = rs.getReader();
  const { value } = await reader.read();
  assert.deepStrictEqual(value, new Uint8Array([1]));
  reader.releaseLock();
});

test('ReadableByteStreamController.enqueue() rejects SAB-backed DataView', async () => {
  const sabForDv = new SharedArrayBuffer(4);
  const dvForEnqueue = new DataView(sabForDv);

  const rs = new ReadableStream({
    type: 'bytes',
    pull: common.mustCall((controller) => {
      assert.throws(
        () => controller.enqueue(dvForEnqueue),
        { code: 'ERR_INVALID_ARG_VALUE' },
      );
      controller.enqueue(new Uint8Array([2]));
    }),
  });
  const reader = rs.getReader();
  const { value } = await reader.read();
  assert.deepStrictEqual(value, new Uint8Array([2]));
  reader.releaseLock();
});

// -- Blob --

test('Blob rejects SharedArrayBuffer part', () => {
  assert.throws(
    () => new Blob([sab]),
    { code: 'ERR_INVALID_ARG_TYPE' },
  );
});

test('Blob rejects SAB-backed Uint8Array part', () => {
  assert.throws(
    () => new Blob([sabView]),
    { code: 'ERR_INVALID_ARG_TYPE' },
  );
});

test('Blob rejects SAB-backed DataView part', () => {
  assert.throws(
    () => new Blob([sabDataView]),
    { code: 'ERR_INVALID_ARG_TYPE' },
  );
});

// -- SharedWebIDL converters --

const { converters } = require('internal/webidl');

test('webidl converters.BufferSource rejects SharedArrayBuffer', () => {
  assert.throws(
    () => converters.BufferSource(sab),
    { code: 'ERR_INVALID_ARG_TYPE' },
  );
});

test('webidl converters.BufferSource rejects SAB-backed Uint8Array', () => {
  assert.throws(
    () => converters.BufferSource(sabView),
    { code: 'ERR_INVALID_ARG_TYPE' },
  );
});

test('webidl converters.BufferSource rejects SAB-backed DataView', () => {
  assert.throws(
    () => converters.BufferSource(sabDataView),
    { code: 'ERR_INVALID_ARG_TYPE' },
  );
});

test('webidl converters.BufferSource accepts ArrayBuffer', () => {
  const ab = new ArrayBuffer(4);
  assert.strictEqual(converters.BufferSource(ab), ab);
});

test('webidl converters.BufferSource accepts regular TypedArray', () => {
  const ta = new Uint8Array(4);
  assert.strictEqual(converters.BufferSource(ta), ta);
});

test('webidl converters.Uint8Array rejects SAB-backed Uint8Array', () => {
  assert.throws(
    () => converters.Uint8Array(sabView),
    { code: 'ERR_INVALID_ARG_TYPE' },
  );
});

test('webidl converters.Uint8Array rejects DataView', () => {
  assert.throws(
    () => converters.Uint8Array(sabDataView),
    { code: 'ERR_INVALID_ARG_TYPE' },
  );
});

test('webidl converters.Uint8Array rejects non-view', () => {
  assert.throws(
    () => converters.Uint8Array('not a view'),
    { code: 'ERR_INVALID_ARG_TYPE' },
  );
});

test('webidl converters.Uint8Array accepts regular Uint8Array', () => {
  const ta = new Uint8Array(4);
  assert.strictEqual(converters.Uint8Array(ta), ta);
});
