/**
 * Tests Calc
 *
 *  Copyright (C) 2010-2019 R-T Specialty, LLC.
 *
 *  This file is part of liza.
 *
 *  liza is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

var liza = require('../..'),
  relativeDate = liza.calc.Calc.relativeDate,
  uniq = liza.calc.Calc.uniq,
  expect = require('chai').expect;

describe('relativeDate', function () {
  //returns a date relative to another date by adding a given value

  it("assert 10 days is added, the date's month changes", function () {
    expect(relativeDate(['2019-11-25'], ['10d'])).to.have.all.members([
      '2019-12-05',
    ]);
  });

  it("assert 10 days is added, the date's month and year changes", function () {
    expect(relativeDate(['2019-12-28'], ['10d'])).to.have.all.members([
      '2020-01-07',
    ]);
  });

  it('assert edge case 6 months is added, the date does not go into the 7th month', function () {
    expect(relativeDate(['2019-12-31'], ['6m'])).to.have.all.members([
      '2020-06-30',
    ]);
  });

  it('assert edge case 3 months is added, the date does not go into the 4th month', function () {
    expect(relativeDate(['2019-08-31'], ['3m'])).to.have.all.members([
      '2019-11-30',
    ]);
  });

  it('assert 2 years is added', function () {
    expect(relativeDate(['2019-12-31'], ['2y'])).to.have.all.members([
      '2021-12-31',
    ]);
  });

  it('assert edge case february', function () {
    expect(relativeDate(['2018-12-31'], ['2m'])).to.have.all.members([
      '2019-02-28',
    ]);
  });

  it('assert edge case february leap year', function () {
    expect(relativeDate(['2019-12-31'], ['2m'])).to.have.all.members([
      '2020-02-29',
    ]);
  });
});

describe('uniq', function () {
  //returns an array of unique values in same order they are given

  it('returns same element', function () {
    expect(uniq(['AL'])).to.deep.equal(['AL']);
  });

  it('returns unique element', function () {
    expect(uniq(['AL', 'AL'])).to.deep.equal(['AL']);
  });

  it('returns unique element with three duplicates', function () {
    expect(uniq(['NY', 'NY', 'NY'])).to.deep.equal(['NY']);
  });

  it('returns unique elements, one duplicate', function () {
    expect(uniq(['TX', 'NY', 'NY'])).to.deep.equal(['TX', 'NY']);
  });

  it('returns unique elements, two duplicates', function () {
    expect(uniq(['TX', 'NY', 'NY', 'TX'])).to.deep.equal(['TX', 'NY']);
  });

  it('returns unique with mixed duplicates', function () {
    expect(
      uniq(['CA', 'NY', 'TX', 'OH', 'TX', 'NY', 'AL', 'LA', 'LA', 'CA'])
    ).to.deep.equal(['CA', 'NY', 'TX', 'OH', 'AL', 'LA']);
  });
});
