'use strict';

if (self.importScripts) {
  self.importScripts('/resources/testharness.js');
  self.importScripts('../resources/test-utils.js');
  self.importScripts('../resources/rs-test-templates.js');
}

// Run the readable stream test templates against readable streams created directly using the constructor

const theError = { name: 'boo!' };
const chunks = ['a', 'b'];

templatedRSEmpty('ReadableStream (empty)', () => {
  return new ReadableStream();
});

templatedRSEmptyReader('ReadableStream (empty) reader', () => {
  return streamAndDefaultReader(new ReadableStream());
});

templatedRSClosed('ReadableStream (closed via call in start)', () => {
  return new ReadableStream({
    start(c) {
      c.close();
    }
  });
});

templatedRSClosedReader('ReadableStream reader (closed before getting reader)', () => {
  let controller;
  const stream = new ReadableStream({
    start(c) {
      controller = c;
    }
  });
  controller.close();
  const result = streamAndDefaultReader(stream);
  return result;
});

templatedRSClosedReader('ReadableStream reader (closed after getting reader)', () => {
  let controller;
  const stream = new ReadableStream({
    start(c) {
      controller = c;
    }
  });
  const result = streamAndDefaultReader(stream);
  controller.close();
  return result;
});

templatedRSClosed('ReadableStream (closed via cancel)', () => {
  const stream = new ReadableStream();
  stream.cancel();
  return stream;
});

templatedRSClosedReader('ReadableStream reader (closed via cancel after getting reader)', () => {
  const stream = new ReadableStream();
  const result = streamAndDefaultReader(stream);
  result.reader.cancel();
  return result;
});

templatedRSErrored('ReadableStream (errored via call in start)', () => {
  return new ReadableStream({
    start(c) {
      c.error(theError);
    }
  });
}, theError);

templatedRSErroredSyncOnly('ReadableStream (errored via call in start)', () => {
  return new ReadableStream({
    start(c) {
      c.error(theError);
    }
  });
}, theError);

templatedRSErrored('ReadableStream (errored via returning a rejected promise in start)', () => {
  return new ReadableStream({
    start() {
      return Promise.reject(theError);
    }
  });
}, theError);

templatedRSErroredReader('ReadableStream (errored via returning a rejected promise in start) reader', () => {
  return streamAndDefaultReader(new ReadableStream({
    start() {
      return Promise.reject(theError);
    }
  }));
}, theError);

templatedRSErroredReader('ReadableStream reader (errored before getting reader)', () => {
  let controller;
  const stream = new ReadableStream({
    start(c) {
      controller = c;
    }
  });
  controller.error(theError);
  return streamAndDefaultReader(stream);
}, theError);

templatedRSErroredReader('ReadableStream reader (errored after getting reader)', () => {
  let controller;
  const result = streamAndDefaultReader(new ReadableStream({
    start(c) {
      controller = c;
    }
  }));
  controller.error(theError);
  return result;
}, theError);

templatedRSTwoChunksOpenReader('ReadableStream (two chunks enqueued, still open) reader', () => {
  return streamAndDefaultReader(new ReadableStream({
    start(c) {
      c.enqueue(chunks[0]);
      c.enqueue(chunks[1]);
    }
  }));
}, chunks);

templatedRSTwoChunksClosedReader('ReadableStream (two chunks enqueued, then closed) reader', () => {
  let doClose;
  const stream = new ReadableStream({
    start(c) {
      c.enqueue(chunks[0]);
      c.enqueue(chunks[1]);
      doClose = c.close.bind(c);
    }
  });
  const result = streamAndDefaultReader(stream);
  doClose();
  return result;
}, chunks);

function streamAndDefaultReader(stream) {
  return { stream, reader: stream.getReader() };
}

done();
