import { iterate, match, same } from '../src/utils';

const stringify = val => JSON.stringify(val);


describe('@bbob/core utils', () => {
  test('iterate', () => {
    const testArr = [{
      one: true,
      content: [{ oneInside: true }]
    }, {
      two: true,
      content: [{ twoInside: true }]
    }];

    const resultArr = iterate(testArr, node => {
      node.pass = 1;

      return node;
    });

    const expected = [
      {
        one: true,
        content: [{ oneInside: true, pass: 1, }],
        pass: 1,
      }, {
        two: true,
        content: [{ twoInside: true, pass: 1, }],
        pass: 1,
      }
    ];

    expect(stringify(resultArr)).toEqual(stringify(expected));
  });
  test('match', () => {
    const testArr = [
      { tag: 'mytag1', one: 1 },
      { tag: 'mytag2', two: 1 },
      { tag: 'mytag3', three: 1 },
      { tag: 'mytag4', four: 1 },
      { tag: 'mytag5', five: 1 },
      { tag: 'mytag6', six: 1 },
    ];

    testArr.match = match;

    const resultArr = testArr.match([{ tag: 'mytag1' }, { tag: 'mytag2' }], node => {
      node.pass = 1;

      return node;
    });

    const expected = [
      { tag: 'mytag1', one: 1, pass: 1 },
      { tag: 'mytag2', two: 1, pass: 1 },
      { tag: 'mytag3', three: 1 },
      { tag: 'mytag4', four: 1 },
      { tag: 'mytag5', five: 1 },
      { tag: 'mytag6', six: 1 },
    ];

    expect(stringify(resultArr)).toEqual(stringify(expected))
  })

  describe('same', () => {
    test('same not same typeof', () => {
      expect(same(1, {})).toBe(false)
    })
    test('same boolean', () => {
      expect(same(true, true)).toBe(true)
    })
    test('same null', () => {
      expect(same(null, null)).toBe(true)
    })
    test('same array', () => {
      expect(same([1, 2, 3], [1, 2, 3, 4])).toBe(true)
    })
    test('same object', () => {
      expect(same({ foo: true, bar: 'test' }, { foo: true, bar: 'test', ext: true })).toBe(true)
    })
  })
});
