diff --git a/src/calc/Calc.js b/src/calc/Calc.js index 4e637da..da611ec 100644 --- a/src/calc/Calc.js +++ b/src/calc/Calc.js @@ -270,11 +270,18 @@ exports.relativeDate = function( data, value ) // months case 'm': date_new.setMonth( date_new.getMonth() + +tval ); + // when adding a month to the last day of the month + // make sure the new date is also the last day of the month + // and not the first day of the next + if( date_new.getUTCDate() !== now_day ) + { + date_new.setUTCDate(0); + } break; // days case 'd': - date_new.setDate( date_new.getUTCDate() + +tval ); + date_new.setUTCDate( date_new.getUTCDate() + +tval ); break; // seconds diff --git a/test/calc/CalcTest.js b/test/calc/CalcTest.js new file mode 100644 index 0000000..dbec665 --- /dev/null +++ b/test/calc/CalcTest.js @@ -0,0 +1,72 @@ +/** + * Tests Calc + * + * Copyright (C) 2017 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 . + */ + +var liza = require( '../..' ), + relativeDate = liza.calc.Calc.relativeDate, + 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'] ); + }); +});