// META: global=window,worker

'use strict';

// This test asserts that compressed data length is shorter than the original
// data length. If the input is extremely small, the compressed data may be
// larger than the original data.

const LARGE_FILE = '/media/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm';

async function compressArrayBuffer(input, format) {
  const cs = new CompressionStream(format);
  const writer = cs.writable.getWriter();
  writer.write(input);
  const closePromise = writer.close();
  const out = [];
  const reader = cs.readable.getReader();
  let totalSize = 0;
  while (true) {
    const { value, done } = await reader.read();
    if (done)
      break;
    out.push(value);
    totalSize += value.byteLength;
  }
  await closePromise;
  const concatenated = new Uint8Array(totalSize);
  let offset = 0;
  for (const array of out) {
    concatenated.set(array, offset);
    offset += array.byteLength;
  }
  return concatenated;
}

promise_test(async () => {
  const response = await fetch(LARGE_FILE);
  const buffer = await response.arrayBuffer();
  const bufferView = new Uint8Array(buffer);
  const originalLength = bufferView.length;
  const compressedData = await compressArrayBuffer(bufferView, 'deflate');
  const compressedLength = compressedData.length;
  assert_less_than(compressedLength, originalLength, 'output should be smaller');
}, 'the length of deflated data should be shorter than that of the original data');

promise_test(async () => {
  const response = await fetch(LARGE_FILE);
  const buffer = await response.arrayBuffer();
  const bufferView = new Uint8Array(buffer);
  const originalLength = bufferView.length;
  const compressedData = await compressArrayBuffer(bufferView, 'gzip');
  const compressedLength = compressedData.length;
  assert_less_than(compressedLength, originalLength, 'output should be smaller');
}, 'the length of gzipped data should be shorter than that of the original data');

promise_test(async () => {
  const response = await fetch(LARGE_FILE);
  const buffer = await response.arrayBuffer();
  const bufferView = new Uint8Array(buffer);
  const originalLength = bufferView.length;
  const compressedData = await compressArrayBuffer(bufferView, 'deflate-raw');
  const compressedLength = compressedData.length;
  assert_less_than(compressedLength, originalLength, 'output should be smaller');
}, 'the length of deflated (with -raw) data should be shorter than that of the original data');
