// META: global=worker
// META: script=resources/readable-stream-from-array.js
// META: script=resources/readable-stream-to-array.js

const cases = [
    {encoding: 'utf-8', bytes: [0xEF, 0xBB, 0xBF, 0x61, 0x62, 0x63]},
    {encoding: 'utf-16le', bytes: [0xFF, 0xFE, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00]},
    {encoding: 'utf-16be', bytes: [0xFE, 0xFF, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63]}
];
const BOM = '\uFEFF';

// |inputChunks| is an array of chunks, each represented by an array of
// integers. |ignoreBOM| is true or false. The result value is the output of the
// pipe, concatenated into a single string.
async function pipeAndAssemble(inputChunks, encoding, ignoreBOM) {
  const chunksAsUint8 = inputChunks.map(values => new Uint8Array(values));
  const readable = readableStreamFromArray(chunksAsUint8);
  const outputArray = await readableStreamToArray(readable.pipeThrough(
      new TextDecoderStream(encoding, {ignoreBOM})));
  return outputArray.join('');
}

for (const testCase of cases) {
  for (let splitPoint = 0; splitPoint < 4; ++splitPoint) {
    promise_test(async () => {
      const inputChunks = [testCase.bytes.slice(0, splitPoint),
                           testCase.bytes.slice(splitPoint)];
      const withIgnoreBOM =
            await pipeAndAssemble(inputChunks, testCase.encoding, true);
      assert_equals(withIgnoreBOM, BOM + 'abc', 'BOM should be preserved');

      const withoutIgnoreBOM =
            await pipeAndAssemble(inputChunks, testCase.encoding, false);
      assert_equals(withoutIgnoreBOM, 'abc', 'BOM should be stripped')
    }, `ignoreBOM should work for encoding ${testCase.encoding}, split at ` +
       `character ${splitPoint}`);
  }
}
