import { bundle, aggregate, assemble } from './arrow';

describe('Unit: lib/arrow', function () {
  describe('bundle', function () {
    it('', () => {
      const a = (s: string) => s;
      const b = (n: number) => n * 2;
      const c = () => undefined;
      assert.deepStrictEqual(
        bundle(a)(''),
        ['']);
      assert.deepStrictEqual(
        bundle(a, b)('1', 2),
        ['1', 4]);
      assert.deepStrictEqual(
        bundle(a, b, c, s => s)('1', 2, undefined, ''),
        ['1', 4, undefined, '']);
      assert.deepStrictEqual(
        bundle(c, c)(undefined, undefined),
        [undefined, undefined]);
    });

  });

  describe('aggregate', function () {
    it('', () => {
      const a = (s: string) => s;
      const b = (s: '1') => s.length * 2;
      const c = (_?: '1') => undefined;
      const d = () => undefined;
      assert.deepStrictEqual(
        aggregate(a)(''),
        ['']);
      assert.deepStrictEqual(
        aggregate(a, b)('1'),
        ['1', 2]);
      assert.deepStrictEqual(
        aggregate(a, b, c, d, s => s)('1'),
        ['1', 2, undefined, undefined, '1']);
      assert.deepStrictEqual(
        aggregate(c, d)(),
        [undefined, undefined]);
      assert.deepStrictEqual(
        aggregate(c, a)('1'),
        [undefined, '1']);
      assert.deepStrictEqual(
        aggregate(...aggregate(
          () => () => 0,
          () => () => 1,
        )())(),
        [0, 1]);
    });

  });

  describe('assemble', function () {
    it('', () => {
      assert.deepStrictEqual(
        assemble(
          () => () => 0,
          () => () => 1,
        )()(),
        [
          { value: 0, done: true },
          { value: 1, done: true },
        ]);
      assert.deepStrictEqual(
        assemble(assemble(
          () => () => 0,
          () => () => 1,
        ))()(),
        [
          { value: [{ value: 0, done: true }, { value: 1, done: true }], done: true },
        ]);
      assert.deepStrictEqual(
        assemble(
          () => () => 0,
          (_: number) => (_?: Error) => 1,
        )(0)(new Error()),
        [
          { value: 0, done: true },
          { value: 1, done: true },
        ]);
      assert.deepStrictEqual(
        assemble(
          () => () => 0,
          () => () => 1,
          () => () => 2,
          () => () => 3,
          () => () => 4,
          () => () => 5,
          () => () => 6,
          () => () => 7,
          () => () => 8,
          () => () => 9,
        )()(),
        [
          { value: 0, done: true },
          { value: 1, done: true },
          { value: 2, done: true },
          { value: 3, done: true },
          { value: 4, done: true },
          { value: 5, done: true },
          { value: 6, done: true },
          { value: 7, done: true },
          { value: 8, done: true },
          { value: 9, done: true },
        ]);
    });

  });

});
