const { maxProductof3Numbers, maxProductof3NumbersII } = require('.');

describe('Maximum Product of three numbers', () => {
  it('throws an error with no Array is passed', () => {
    expect(() => {
      maxProductof3Numbers('xunda');
    }).toThrowError();
    expect(() => {
      maxProductof3NumbersII('xunda');
    }).toThrowError();
  });

  it('returns the product of an array with 3 numbers', () => {
    expect(maxProductof3Numbers([1, 2, 3])).toEqual(6);
    expect(maxProductof3NumbersII([1, 2, 3])).toEqual(6);
  });

  it('returns the product of an array with positive and negative numbers', () => {
    expect(maxProductof3Numbers([-10, -10, 2, 3])).toEqual(300);
    expect(maxProductof3NumbersII([-10, -10, 2, 3])).toEqual(300);
  });

  it('returns the product of an array with negative numbers', () => {
    expect(maxProductof3Numbers([-10, -1, -2, -10])).toEqual(-20);
    expect(maxProductof3NumbersII([-10, -1, -2, -10])).toEqual(-20);
  });

  it('returns the proper calculation if the array is large', () => {
    const largeArray = [
      100, 100, 100, 12, 3, 45, 4, 3, 7, 8, 1, 3, 7, 8, 1, 4, 3, 7, 8, 1, 3, 7, 8, 1, 12, 3, 45, 4, 3, 7, 8, 1, 3, 7, 8,
      1, 4, 3, 7, 8, 1, 3, 7, 8, 1, 4, 3, 7, 8, 1, 3, 7, 8, 1, 12, 3, 45, 4, 3, 7, 8, 1, 3, 7, 8, 1, 4, 3, 7, 8, 1, 3,
      7, 8, 45, 4, 3, 7, 8, 1, 3, 7, 8, 3, 45, 4, 3, 7, 8, 1, 3, 7, 8, 1, 4, 3, 7, 8, 1, 3, 7, 8, 1, 12, 3, 45, 4, 3, 7,
      8, 1, 3, 7, 8, 1, 4, 3, 7, 8, 1, 3, 7, 8, 1, 4, 3, 7, 8, 1, 3, 7, 8, 1, 12, 3, 45, 4, 3, 7, 8, 1, 3, 7, 8, 1, 4,
      3, 7, 8, 1, 3, 7, 8, 45, 4, 3, 7, 8, 1, 3, 7, 8,
    ];
    expect(maxProductof3Numbers(largeArray)).toEqual(100 * 100 * 100);
    expect(maxProductof3NumbersII(largeArray)).toEqual(100 * 100 * 100);
  });

  it('returns an error if there are less than 3 numbers', () => {
    expect(() => {
      maxProductof3Numbers([-10, -1]);
    }).toThrowError();
  });
});