import { module, test } from 'qunit';
import { decode } from 'nomad-ui/utils/stream-frames';
import { TextEncoderLite } from 'text-encoder-lite';
import base64js from 'base64-js';

const Encoder = new TextEncoderLite('utf-8');
const encode = (str) => base64js.fromByteArray(Encoder.encode(str));

module('Unit | Util | stream-frames', function () {
  const { btoa } = window;
  const decodeTestCases = [
    {
      name: 'Single frame',
      in: `{"Offset":100,"Data":"${btoa('Hello World')}"}`,
      out: {
        offset: 100,
        message: 'Hello World',
      },
    },
    {
      name: 'Multiple frames',
      // prettier-ignore
      in: `{"Offset":1,"Data":"${btoa('One fish,')}"}{"Offset":2,"Data":"${btoa( ' Two fish.')}"}{"Offset":3,"Data":"${btoa(' Red fish, ')}"}{"Offset":4,"Data":"${btoa('Blue fish.')}"}`,
      out: {
        offset: 4,
        message: 'One fish, Two fish. Red fish, Blue fish.',
      },
    },
    {
      name: 'Empty frames',
      in: '{}{}{}',
      out: {},
    },
    {
      name: 'Empty string',
      in: '',
      out: {},
    },
    {
      name: 'Multi-byte unicode',
      in: `{"Offset":1,"Data":"${encode('ワンワン 🐶')}"}`,
      out: {
        offset: 1,
        message: 'ワンワン 🐶',
      },
    },
  ];

  decodeTestCases.forEach((testCase) => {
    test(`decode: ${testCase.name}`, function (assert) {
      assert.deepEqual(decode(testCase.in), testCase.out);
    });
  });
});
