diff --git a/CHANGELOG.md b/CHANGELOG.md index 749eeab9d2..5a754a14d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -577,11 +577,29 @@ for the list of changes made since `v2.0.0-alpha.1`. This change is introduced for consistency with ECMAScript standard library which does the same. See [docs/Options.js](https://github.com/date-fns/date-fns/blob/master/docs/Options.js) -- **BREAKING**: all functions now handle arguments by following rules: - +- **BREAKING**: all functions now implicitly convert arguments by following rules: + + | | date | number | string | boolean | + |-----------|---------------|--------|-------------|---------| + | 0 | new Date(0) | 0 | '0' | false | + | '0' | Invalid Date | 0 | '0' | false | + | 1 | new Date(1) | 1 | '1' | true | + | '1' | Invalid Date | 1 | '1' | true | + | true | Invalid Date | NaN | 'true' | true | + | false | Invalid Date | NaN | 'false' | false | + | null | Invalid Date | NaN | 'null' | false | + | undefined | Invalid Date | NaN | 'undefined' | false | + | NaN | Invalid Date | NaN | 'NaN' | false | + + Notes: - as before, arguments expected to be `Date` are converted to `Date` using *date-fns'* `toDate` function; - - arguments expected to be numbers are converted to numbers using JavaScript's `Number` function; - - arguments expected to be strings arguments are converted to strings using JavaScript's `String` function. + - arguments expected to be numbers are converted to integer numbers using our custom `toInteger` implementation + (see [#765](https://github.com/date-fns/date-fns/pull/765)); + - arguments expected to be strings arguments are converted to strings using JavaScript's `String` function; + - arguments expected to be booleans are converted to strings using JavaScript's `Boolean` function. + + `null` and `undefined` passed to optional arguments (i.e. properties of `options` argument) + are ignored as if no argument was passed. If any of resulting arguments is invalid (i.e. `NaN` for numbers and `Invalid Date` for dates), an invalid value will be returned: @@ -591,7 +609,8 @@ for the list of changes made since `v2.0.0-alpha.1`. - `NaN` for functions that return numbers; - and `String('Invalid Date')` for functions that return strings. - See tests and PR [#460](https://github.com/date-fns/date-fns/pull/460) for exact behavior. + See tests and PRs [#460](https://github.com/date-fns/date-fns/pull/460) and + [#765](https://github.com/date-fns/date-fns/pull/765) for exact behavior. - **BREAKING**: all functions now check if the passed number of arguments is less than the number of required arguments and throw `TypeError` exception if so. diff --git a/src/_lib/addUTCMinutes/index.js b/src/_lib/addUTCMinutes/index.js index 17abdb5521..f4d7d651f0 100644 --- a/src/_lib/addUTCMinutes/index.js +++ b/src/_lib/addUTCMinutes/index.js @@ -1,3 +1,4 @@ +import toInteger from '../toInteger/index.js' import toDate from '../../toDate/index.js' // This function will be a part of public API when UTC function will be implemented. @@ -8,7 +9,7 @@ export default function addUTCMinutes (dirtyDate, dirtyAmount, dirtyOptions) { } var date = toDate(dirtyDate, dirtyOptions) - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) date.setUTCMinutes(date.getUTCMinutes() + amount) return date } diff --git a/src/_lib/addUTCMinutes/test.js b/src/_lib/addUTCMinutes/test.js index e4af326afe..6dbd77cd47 100644 --- a/src/_lib/addUTCMinutes/test.js +++ b/src/_lib/addUTCMinutes/test.js @@ -24,6 +24,11 @@ describe('addUTCMinutes', function () { assert.deepEqual(result, new Date(Date.UTC(2014, 6 /* Jul */, 10, 12, 20))) }) + it('converts a fractional number to an integer', function () { + var result = addUTCMinutes(new Date(Date.UTC(2014, 6 /* Jul */, 10, 12, 0)), 30.5) + assert.deepEqual(result, new Date(Date.UTC(2014, 6 /* Jul */, 10, 12, 30))) + }) + it('implicitly converts number arguments', function () { var result = addUTCMinutes(new Date(Date.UTC(2014, 6 /* Jul */, 10, 12, 0)), '30') assert.deepEqual(result, new Date(Date.UTC(2014, 6 /* Jul */, 10, 12, 30))) diff --git a/src/_lib/getUTCWeekYear/index.js b/src/_lib/getUTCWeekYear/index.js index 226040b887..d6889819c2 100644 --- a/src/_lib/getUTCWeekYear/index.js +++ b/src/_lib/getUTCWeekYear/index.js @@ -1,3 +1,4 @@ +import toInteger from '../toInteger/index.js' import toDate from '../../toDate/index.js' import startOfUTCWeek from '../startOfUTCWeek/index.js' @@ -17,13 +18,13 @@ export default function getUTCWeekYear (dirtyDate, dirtyOptions) { locale.options && locale.options.firstWeekContainsDate var defaultFirstWeekContainsDate = - localeFirstWeekContainsDate === undefined + localeFirstWeekContainsDate == null ? 1 - : Number(localeFirstWeekContainsDate) + : toInteger(localeFirstWeekContainsDate) var firstWeekContainsDate = - options.firstWeekContainsDate === undefined + options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate - : Number(options.firstWeekContainsDate) + : toInteger(options.firstWeekContainsDate) // Test if weekStartsOn is between 1 and 7 _and_ is not NaN if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) { diff --git a/src/_lib/setUTCDay/index.js b/src/_lib/setUTCDay/index.js index 2ef90324cd..7c7a465e24 100644 --- a/src/_lib/setUTCDay/index.js +++ b/src/_lib/setUTCDay/index.js @@ -1,3 +1,4 @@ +import toInteger from '../toInteger/index.js' import toDate from '../../toDate/index.js' // This function will be a part of public API when UTC function will be implemented. @@ -10,8 +11,8 @@ export default function setUTCDay (dirtyDate, dirtyDay, dirtyOptions) { var options = dirtyOptions || {} var locale = options.locale var localeWeekStartsOn = locale && locale.options && locale.options.weekStartsOn - var defaultWeekStartsOn = localeWeekStartsOn === undefined ? 0 : Number(localeWeekStartsOn) - var weekStartsOn = options.weekStartsOn === undefined ? defaultWeekStartsOn : Number(options.weekStartsOn) + var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn) + var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn) // Test if weekStartsOn is between 0 and 6 _and_ is not NaN if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { @@ -19,7 +20,7 @@ export default function setUTCDay (dirtyDate, dirtyDay, dirtyOptions) { } var date = toDate(dirtyDate, dirtyOptions) - var day = Number(dirtyDay) + var day = toInteger(dirtyDay) var currentDay = date.getUTCDay() diff --git a/src/_lib/setUTCDay/test.js b/src/_lib/setUTCDay/test.js index 212fa6b953..7fe918e4c0 100644 --- a/src/_lib/setUTCDay/test.js +++ b/src/_lib/setUTCDay/test.js @@ -86,6 +86,11 @@ describe('setUTCDay', function () { assert.deepEqual(result, new Date(Date.UTC(2014, 8 /* Sep */, 3))) }) + it('converts a fractional number to an integer', function () { + var result = setUTCDay(new Date(Date.UTC(2014, 8 /* Sep */, 1)), 0.9) + assert.deepEqual(result, new Date(Date.UTC(2014, 7 /* Aug */, 31))) + }) + it('implicitly converts number arguments', function () { var result = setUTCDay(new Date(Date.UTC(2014, 8 /* Sep */, 1)), '0') assert.deepEqual(result, new Date(Date.UTC(2014, 7 /* Aug */, 31))) diff --git a/src/_lib/setUTCISODay/index.js b/src/_lib/setUTCISODay/index.js index 24ebf5afa3..ea085c8ece 100644 --- a/src/_lib/setUTCISODay/index.js +++ b/src/_lib/setUTCISODay/index.js @@ -1,3 +1,4 @@ +import toInteger from '../toInteger/index.js' import toDate from '../../toDate/index.js' // This function will be a part of public API when UTC function will be implemented. @@ -7,7 +8,7 @@ export default function setUTCISODay (dirtyDate, dirtyDay, dirtyOptions) { throw new TypeError('2 arguments required, but only ' + arguments.length + ' present') } - var day = Number(dirtyDay) + var day = toInteger(dirtyDay) if (day % 7 === 0) { day = day - 7 diff --git a/src/_lib/setUTCISODay/test.js b/src/_lib/setUTCISODay/test.js index db173c5cb4..1caababfee 100644 --- a/src/_lib/setUTCISODay/test.js +++ b/src/_lib/setUTCISODay/test.js @@ -49,6 +49,11 @@ describe('setUTCISODay', function () { assert.deepEqual(result, new Date(Date.UTC(2014, 8 /* Sep */, 3))) }) + it('converts a fractional number to an integer', function () { + var result = setUTCISODay(new Date(Date.UTC(2014, 8 /* Sep */, 1)), 3.33) + assert.deepEqual(result, new Date(Date.UTC(2014, 8 /* Sep */, 3))) + }) + it('implicitly converts number arguments', function () { var result = setUTCISODay(new Date(Date.UTC(2014, 8 /* Sep */, 1)), '3') assert.deepEqual(result, new Date(Date.UTC(2014, 8 /* Sep */, 3))) diff --git a/src/_lib/setUTCISOWeek/index.js b/src/_lib/setUTCISOWeek/index.js index 18f0b4baa5..9ab569cc89 100644 --- a/src/_lib/setUTCISOWeek/index.js +++ b/src/_lib/setUTCISOWeek/index.js @@ -1,3 +1,4 @@ +import toInteger from '../toInteger/index.js' import toDate from '../../toDate/index.js' import getUTCISOWeek from '../getUTCISOWeek/index.js' @@ -9,7 +10,7 @@ export default function setUTCISOWeek (dirtyDate, dirtyISOWeek, dirtyOptions) { } var date = toDate(dirtyDate, dirtyOptions) - var isoWeek = Number(dirtyISOWeek) + var isoWeek = toInteger(dirtyISOWeek) var diff = getUTCISOWeek(date, dirtyOptions) - isoWeek date.setUTCDate(date.getUTCDate() - diff * 7) return date diff --git a/src/_lib/setUTCISOWeek/test.js b/src/_lib/setUTCISOWeek/test.js index 755596c016..983213bf05 100644 --- a/src/_lib/setUTCISOWeek/test.js +++ b/src/_lib/setUTCISOWeek/test.js @@ -20,6 +20,11 @@ describe('setUTCISOWeek', function () { assert.deepEqual(result, new Date(Date.UTC(2008, 11 /* Dec */, 31))) }) + it('converts a fractional number to an integer', function () { + var result = setUTCISOWeek(new Date(Date.UTC(2004, 7 /* Aug */, 7)), 53.53) + assert.deepEqual(result, new Date(Date.UTC(2005, 0 /* Jan */, 1))) + }) + it('implicitly converts number arguments', function () { var result = setUTCISOWeek(new Date(Date.UTC(2004, 7 /* Aug */, 7)), '53') assert.deepEqual(result, new Date(Date.UTC(2005, 0 /* Jan */, 1))) diff --git a/src/_lib/setUTCWeek/index.js b/src/_lib/setUTCWeek/index.js index a319ebc311..f7e836c32f 100644 --- a/src/_lib/setUTCWeek/index.js +++ b/src/_lib/setUTCWeek/index.js @@ -1,3 +1,4 @@ +import toInteger from '../toInteger/index.js' import toDate from '../../toDate/index.js' import getUTCWeek from '../getUTCWeek/index.js' @@ -9,7 +10,7 @@ export default function setUTCWeek (dirtyDate, dirtyWeek, dirtyOptions) { } var date = toDate(dirtyDate, dirtyOptions) - var week = Number(dirtyWeek) + var week = toInteger(dirtyWeek) var diff = getUTCWeek(date, dirtyOptions) - week date.setUTCDate(date.getUTCDate() - diff * 7) return date diff --git a/src/_lib/setUTCWeek/test.js b/src/_lib/setUTCWeek/test.js index 62eb2b94e4..8ccab93b8e 100644 --- a/src/_lib/setUTCWeek/test.js +++ b/src/_lib/setUTCWeek/test.js @@ -20,6 +20,11 @@ describe('setUTCWeek', function () { assert.deepEqual(result, new Date(Date.UTC(2008, 11 /* Dec */, 31))) }) + it('converts a fractional number to an integer', function () { + var result = setUTCWeek(new Date(Date.UTC(2005, 0 /* Jan */, 2)), 1.1) + assert.deepEqual(result, new Date(Date.UTC(2004, 11 /* Dec */, 26))) + }) + it('implicitly converts number arguments', function () { var result = setUTCWeek(new Date(Date.UTC(2004, 7 /* Aug */, 7)), '53') assert.deepEqual(result, new Date(Date.UTC(2005, 0 /* Jan */, 1))) diff --git a/src/_lib/startOfUTCWeek/index.js b/src/_lib/startOfUTCWeek/index.js index 9a62e99841..b2e3ba9607 100644 --- a/src/_lib/startOfUTCWeek/index.js +++ b/src/_lib/startOfUTCWeek/index.js @@ -1,3 +1,4 @@ +import toInteger from '../toInteger/index.js' import toDate from '../../toDate/index.js' // This function will be a part of public API when UTC function will be implemented. @@ -10,8 +11,8 @@ export default function startOfUTCWeek (dirtyDate, dirtyOptions) { var options = dirtyOptions || {} var locale = options.locale var localeWeekStartsOn = locale && locale.options && locale.options.weekStartsOn - var defaultWeekStartsOn = localeWeekStartsOn === undefined ? 0 : Number(localeWeekStartsOn) - var weekStartsOn = options.weekStartsOn === undefined ? defaultWeekStartsOn : Number(options.weekStartsOn) + var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn) + var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn) // Test if weekStartsOn is between 0 and 6 _and_ is not NaN if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { diff --git a/src/_lib/startOfUTCWeekYear/index.js b/src/_lib/startOfUTCWeekYear/index.js index 3efea81953..5a0f8b4a9b 100644 --- a/src/_lib/startOfUTCWeekYear/index.js +++ b/src/_lib/startOfUTCWeekYear/index.js @@ -1,3 +1,4 @@ +import toInteger from '../toInteger/index.js' import getUTCWeekYear from '../getUTCWeekYear/index.js' import startOfUTCWeek from '../startOfUTCWeek/index.js' @@ -14,13 +15,13 @@ export default function startOfUTCWeekYear (dirtyDate, dirtyOptions) { locale.options && locale.options.firstWeekContainsDate var defaultFirstWeekContainsDate = - localeFirstWeekContainsDate === undefined + localeFirstWeekContainsDate == null ? 1 - : Number(localeFirstWeekContainsDate) + : toInteger(localeFirstWeekContainsDate) var firstWeekContainsDate = - options.firstWeekContainsDate === undefined + options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate - : Number(options.firstWeekContainsDate) + : toInteger(options.firstWeekContainsDate) var year = getUTCWeekYear(dirtyDate, dirtyOptions) var firstWeek = new Date(0) diff --git a/src/_lib/toInteger/index.js b/src/_lib/toInteger/index.js new file mode 100644 index 0000000000..ff71484a1c --- /dev/null +++ b/src/_lib/toInteger/index.js @@ -0,0 +1,13 @@ +export default function toInteger (dirtyNumber) { + if (dirtyNumber === null || dirtyNumber === true || dirtyNumber === false) { + return NaN + } + + var number = Number(dirtyNumber) + + if (isNaN(number)) { + return number + } + + return number < 0 ? Math.ceil(number) : Math.floor(number) +} diff --git a/src/_lib/toInteger/test.js b/src/_lib/toInteger/test.js new file mode 100644 index 0000000000..65428904ee --- /dev/null +++ b/src/_lib/toInteger/test.js @@ -0,0 +1,64 @@ +// @flow +/* eslint-env mocha */ + +import assert from 'power-assert' +import toInteger from '.' + +describe('toInteger', function () { + it('truncates positive numbers', function () { + var result = toInteger(10.99) + assert(result === 10) + }) + + it('truncates negative numbers', function () { + var result = toInteger(-5.5) + assert(result === -5) + }) + + it('converts convertable strings', function () { + var result = toInteger('-10.75') + assert(result === -10) + }) + + it('returns NaN for non-convertable strings', function () { + var result = toInteger('Foobar') + assert(typeof result === 'number' && isNaN(result)) + }) + + it('returns NaN for false', function () { + var result = toInteger(false) + assert(typeof result === 'number' && isNaN(result)) + }) + + it('returns NaN for true', function () { + var result = toInteger(true) + assert(typeof result === 'number' && isNaN(result)) + }) + + it('returns NaN for null', function () { + var result = toInteger(null) + assert(typeof result === 'number' && isNaN(result)) + }) + + it('returns NaN for undefined', function () { + var result = toInteger(undefined) + assert(typeof result === 'number' && isNaN(result)) + }) + + it('returns NaN for NaN', function () { + var result = toInteger(NaN) + assert(typeof result === 'number' && isNaN(result)) + }) + + it('converts convertable objects', function () { + // eslint-disable-next-line no-new-wrappers + var result = toInteger(new Number(123)) + assert(result === 123) + }) + + it('returns NaN for non-convertable objects', function () { + // eslint-disable-next-line no-new-wrappers + var result = toInteger({}) + assert(typeof result === 'number' && isNaN(result)) + }) +}) diff --git a/src/addDays/index.js b/src/addDays/index.js index d6243d2bc3..ff70dc9e73 100644 --- a/src/addDays/index.js +++ b/src/addDays/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' /** @@ -27,7 +28,7 @@ export default function addDays (dirtyDate, dirtyAmount, dirtyOptions) { } var date = toDate(dirtyDate, dirtyOptions) - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) date.setDate(date.getDate() + amount) return date } diff --git a/src/addDays/test.js b/src/addDays/test.js index 20ba945f15..8031f05405 100644 --- a/src/addDays/test.js +++ b/src/addDays/test.js @@ -20,6 +20,11 @@ describe('addDays', function () { assert.deepEqual(result, new Date(2014, 8 /* Sep */, 11)) }) + it('converts a fractional number to an integer', function () { + var result = addDays(new Date(2014, 8 /* Sep */, 1), 10.5) + assert.deepEqual(result, new Date(2014, 8 /* Sep */, 11)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = addDays(new Date(2014, 8 /* Sep */, 1), '10') diff --git a/src/addHours/index.js b/src/addHours/index.js index 2f125c41d1..2c667256af 100644 --- a/src/addHours/index.js +++ b/src/addHours/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import addMilliseconds from '../addMilliseconds/index.js' var MILLISECONDS_IN_HOUR = 3600000 @@ -28,6 +29,6 @@ export default function addHours (dirtyDate, dirtyAmount, dirtyOptions) { throw new TypeError('2 arguments required, but only ' + arguments.length + ' present') } - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) return addMilliseconds(dirtyDate, amount * MILLISECONDS_IN_HOUR, dirtyOptions) } diff --git a/src/addHours/test.js b/src/addHours/test.js index 35c8e055e5..1f418d4e52 100644 --- a/src/addHours/test.js +++ b/src/addHours/test.js @@ -24,6 +24,11 @@ describe('addHours', function () { assert.deepEqual(result, new Date(2014, 6 /* Jul */, 12, 1, 0)) }) + it('converts a fractional number to an integer', function () { + var result = addHours(new Date(2014, 6 /* Jul */, 10, 23, 0), 2.5) + assert.deepEqual(result, new Date(2014, 6 /* Jul */, 11, 1, 0)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = addHours(new Date(2014, 6 /* Jul */, 10, 23, 0), '2') diff --git a/src/addISOWeekYears/index.js b/src/addISOWeekYears/index.js index f1a4ffde31..520c79626d 100644 --- a/src/addISOWeekYears/index.js +++ b/src/addISOWeekYears/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import getISOWeekYear from '../getISOWeekYear/index.js' import setISOWeekYear from '../setISOWeekYear/index.js' @@ -29,6 +30,6 @@ export default function addISOWeekYears (dirtyDate, dirtyAmount, dirtyOptions) { throw new TypeError('2 arguments required, but only ' + arguments.length + ' present') } - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) return setISOWeekYear(dirtyDate, getISOWeekYear(dirtyDate, dirtyOptions) + amount, dirtyOptions) } diff --git a/src/addISOWeekYears/test.js b/src/addISOWeekYears/test.js index 15c6681e2f..4d96709a9c 100644 --- a/src/addISOWeekYears/test.js +++ b/src/addISOWeekYears/test.js @@ -20,6 +20,11 @@ describe('addISOWeekYears', function () { assert.deepEqual(result, new Date(2026, 7 /* Aug */, 31)) }) + it('converts a fractional number to an integer', function () { + var result = addISOWeekYears(new Date(2010, 6 /* Jul */, 2), 5.6) + assert.deepEqual(result, new Date(2015, 5 /* Jun */, 26)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = addISOWeekYears(new Date(2010, 6 /* Jul */, 2), '5') diff --git a/src/addMilliseconds/index.js b/src/addMilliseconds/index.js index bd16f19aac..f00515625a 100644 --- a/src/addMilliseconds/index.js +++ b/src/addMilliseconds/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' /** @@ -27,6 +28,6 @@ export default function addMilliseconds (dirtyDate, dirtyAmount, dirtyOptions) { } var timestamp = toDate(dirtyDate, dirtyOptions).getTime() - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) return new Date(timestamp + amount) } diff --git a/src/addMilliseconds/test.js b/src/addMilliseconds/test.js index d9f0dcc65e..2c483660cc 100644 --- a/src/addMilliseconds/test.js +++ b/src/addMilliseconds/test.js @@ -24,6 +24,11 @@ describe('addMilliseconds', function () { assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 12, 45, 30, 500)) }) + it('converts a fractional number to an integer', function () { + var result = addMilliseconds(new Date(2014, 6 /* Jul */, 10, 12, 45, 30, 0), 750.750) + assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 12, 45, 30, 750)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = addMilliseconds(new Date(2014, 6 /* Jul */, 10, 12, 45, 30, 5), '750') diff --git a/src/addMinutes/index.js b/src/addMinutes/index.js index 557b8fc434..e9eadf2d86 100644 --- a/src/addMinutes/index.js +++ b/src/addMinutes/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import addMilliseconds from '../addMilliseconds/index.js' var MILLISECONDS_IN_MINUTE = 60000 @@ -28,6 +29,6 @@ export default function addMinutes (dirtyDate, dirtyAmount, dirtyOptions) { throw new TypeError('2 arguments required, but only ' + arguments.length + ' present') } - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) return addMilliseconds(dirtyDate, amount * MILLISECONDS_IN_MINUTE, dirtyOptions) } diff --git a/src/addMinutes/test.js b/src/addMinutes/test.js index 10c5e29410..fdacda2b88 100644 --- a/src/addMinutes/test.js +++ b/src/addMinutes/test.js @@ -24,6 +24,11 @@ describe('addMinutes', function () { assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 12, 20)) }) + it('converts a fractional number to an integer', function () { + var result = addMinutes(new Date(2014, 6 /* Jul */, 10, 12, 0), 30.99) + assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 12, 30)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = addMinutes(new Date(2014, 6 /* Jul */, 10, 12, 5), '30') diff --git a/src/addMonths/index.js b/src/addMonths/index.js index 71a24b15d6..07a1170777 100644 --- a/src/addMonths/index.js +++ b/src/addMonths/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' import getDaysInMonth from '../getDaysInMonth/index.js' @@ -28,7 +29,7 @@ export default function addMonths (dirtyDate, dirtyAmount, dirtyOptions) { } var date = toDate(dirtyDate, dirtyOptions) - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) var desiredMonth = date.getMonth() + amount var dateWithDesiredMonth = new Date(0) dateWithDesiredMonth.setFullYear(date.getFullYear(), desiredMonth, 1) diff --git a/src/addMonths/test.js b/src/addMonths/test.js index 95e295e7b2..75fa228542 100644 --- a/src/addMonths/test.js +++ b/src/addMonths/test.js @@ -20,6 +20,11 @@ describe('addMonths', function () { assert.deepEqual(result, new Date(2015, 8 /* Sep */, 1)) }) + it('converts a fractional number to an integer', function () { + var result = addMonths(new Date(2014, 8 /* Sep */, 1), 5.75) + assert.deepEqual(result, new Date(2015, 1 /* Feb */, 1)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = addMonths(new Date(2014, 8 /* Sep */, 1), '5') diff --git a/src/addQuarters/index.js b/src/addQuarters/index.js index 1375991ab1..e16f4291a8 100644 --- a/src/addQuarters/index.js +++ b/src/addQuarters/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import addMonths from '../addMonths/index.js' /** @@ -26,7 +27,7 @@ export default function addQuarters (dirtyDate, dirtyAmount, dirtyOptions) { throw new TypeError('2 arguments required, but only ' + arguments.length + ' present') } - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) var months = amount * 3 return addMonths(dirtyDate, months, dirtyOptions) } diff --git a/src/addQuarters/test.js b/src/addQuarters/test.js index 54c3b536e5..2033a8aac0 100644 --- a/src/addQuarters/test.js +++ b/src/addQuarters/test.js @@ -20,6 +20,11 @@ describe('addQuarters', function () { assert.deepEqual(result, new Date(2015, 8 /* Sep */, 1)) }) + it('converts a fractional number to an integer', function () { + var result = addQuarters(new Date(2014, 8 /* Sep */, 1), 1.91) + assert.deepEqual(result, new Date(2014, 11 /* Dec */, 1)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = addQuarters(new Date(2014, 8 /* Sep */, 1), '1') diff --git a/src/addSeconds/index.js b/src/addSeconds/index.js index 5a0ef4bd53..b97aa9a2ba 100644 --- a/src/addSeconds/index.js +++ b/src/addSeconds/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import addMilliseconds from '../addMilliseconds/index.js' /** @@ -26,6 +27,6 @@ export default function addSeconds (dirtyDate, dirtyAmount, dirtyOptions) { throw new TypeError('2 arguments required, but only ' + arguments.length + ' present') } - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) return addMilliseconds(dirtyDate, amount * 1000, dirtyOptions) } diff --git a/src/addSeconds/test.js b/src/addSeconds/test.js index 063191ad82..66be1fd617 100644 --- a/src/addSeconds/test.js +++ b/src/addSeconds/test.js @@ -24,6 +24,11 @@ describe('addSeconds', function () { assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 12, 45, 20)) }) + it('converts a fractional number to an integer', function () { + var result = addSeconds(new Date(2014, 6 /* Jul */, 10, 12, 45, 0), 30.777) + assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 12, 45, 30)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = addSeconds(new Date(2014, 6 /* Jul */, 10, 12, 45, 5), '30') diff --git a/src/addWeeks/index.js b/src/addWeeks/index.js index e1b234a2a2..a56e2c47bd 100644 --- a/src/addWeeks/index.js +++ b/src/addWeeks/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import addDays from '../addDays/index.js' /** @@ -26,7 +27,7 @@ export default function addWeeks (dirtyDate, dirtyAmount, dirtyOptions) { throw new TypeError('2 arguments required, but only ' + arguments.length + ' present') } - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) var days = amount * 7 return addDays(dirtyDate, days, dirtyOptions) } diff --git a/src/addWeeks/test.js b/src/addWeeks/test.js index e6044ce8fa..d5282810de 100644 --- a/src/addWeeks/test.js +++ b/src/addWeeks/test.js @@ -20,6 +20,11 @@ describe('addWeeks', function () { assert.deepEqual(result, new Date(2014, 8 /* Sep */, 8)) }) + it('converts a fractional number to an integer', function () { + var result = addWeeks(new Date(2014, 8 /* Sep */, 1), 4.95) + assert.deepEqual(result, new Date(2014, 8 /* Sep */, 29)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = addWeeks(new Date(2014, 8 /* Sep */, 1), '4') diff --git a/src/addYears/index.js b/src/addYears/index.js index edbc80d8fd..8867a14ef0 100644 --- a/src/addYears/index.js +++ b/src/addYears/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import addMonths from '../addMonths/index.js' /** @@ -26,6 +27,6 @@ export default function addYears (dirtyDate, dirtyAmount, dirtyOptions) { throw new TypeError('2 arguments required, but only ' + arguments.length + ' present') } - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) return addMonths(dirtyDate, amount * 12, dirtyOptions) } diff --git a/src/addYears/test.js b/src/addYears/test.js index b40b8df611..134853136d 100644 --- a/src/addYears/test.js +++ b/src/addYears/test.js @@ -20,6 +20,11 @@ describe('addYears', function () { assert.deepEqual(result, new Date(2026, 8 /* Sep */, 1)) }) + it('converts a fractional number to an integer', function () { + var result = addYears(new Date(2014, 8 /* Sep */, 1), 5.555) + assert.deepEqual(result, new Date(2019, 8 /* Sep */, 1)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = addYears(new Date(2014, 8 /* Sep */, 1), '5') diff --git a/src/closestIndexTo/index.js b/src/closestIndexTo/index.js index ac2f680607..04c393fdf0 100644 --- a/src/closestIndexTo/index.js +++ b/src/closestIndexTo/index.js @@ -66,7 +66,7 @@ export default function closestIndexTo (dirtyDateToCompare, dirtyDatesArray, dir } var distance = Math.abs(timeToCompare - currentDate.getTime()) - if (result === undefined || distance < minDistance) { + if (result == null || distance < minDistance) { result = index minDistance = distance } diff --git a/src/closestIndexTo/test.js b/src/closestIndexTo/test.js index b237df4032..c7bf341771 100644 --- a/src/closestIndexTo/test.js +++ b/src/closestIndexTo/test.js @@ -45,7 +45,7 @@ describe('closestIndexTo', function () { it('returns undefined if the given array is empty', function () { var date = new Date(2014, 6 /* Jul */, 2).getTime() var result = closestIndexTo(date, []) - assert(result === undefined) + assert(result == null) }) it('returns NaN if the given date is `Invalid Date`', function () { @@ -94,14 +94,14 @@ describe('closestIndexTo', function () { var date = new Date(2014, 6 /* Jul */, 2).getTime() // $ExpectedMistake var result = closestIndexTo(date, undefined) - assert(result === undefined) + assert(result == null) }) it('converts null into empty array', function () { var date = new Date(2014, 6 /* Jul */, 2).getTime() // $ExpectedMistake var result = closestIndexTo(date, null) - assert(result === undefined) + assert(result == null) }) it('throws `RangeError` if `options.additionalDigits` is not convertable to 0, 1, 2 or undefined', function () { diff --git a/src/closestTo/index.js b/src/closestTo/index.js index b3eada983f..41b3529f72 100644 --- a/src/closestTo/index.js +++ b/src/closestTo/index.js @@ -64,7 +64,7 @@ export default function closestTo (dirtyDateToCompare, dirtyDatesArray, dirtyOpt } var distance = Math.abs(timeToCompare - currentDate.getTime()) - if (result === undefined || distance < minDistance) { + if (result == null || distance < minDistance) { result = currentDate minDistance = distance } diff --git a/src/closestTo/test.js b/src/closestTo/test.js index 95a21e89b7..98c9376300 100644 --- a/src/closestTo/test.js +++ b/src/closestTo/test.js @@ -45,7 +45,7 @@ describe('closestTo', function () { it('returns undefined if the given array is empty', function () { var date = new Date(2014, 6 /* Jul */, 2).getTime() var result = closestTo(date, []) - assert(result === undefined) + assert(result == null) }) it('returns `Invalid Date` if the given date is `Invalid Date`', function () { @@ -104,14 +104,14 @@ describe('closestTo', function () { var date = new Date(2014, 6 /* Jul */, 2).getTime() // $ExpectedMistake var result = closestTo(date, undefined) - assert(result === undefined) + assert(result == null) }) it('converts null into empty array', function () { var date = new Date(2014, 6 /* Jul */, 2).getTime() // $ExpectedMistake var result = closestTo(date, null) - assert(result === undefined) + assert(result == null) }) it('throws `RangeError` if `options.additionalDigits` is not convertable to 0, 1, 2 or undefined', function () { diff --git a/src/endOfWeek/index.js b/src/endOfWeek/index.js index 51ef64f0dd..c35f8010ef 100644 --- a/src/endOfWeek/index.js +++ b/src/endOfWeek/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' /** @@ -38,8 +39,8 @@ export default function endOfWeek (dirtyDate, dirtyOptions) { var locale = options.locale var localeWeekStartsOn = locale && locale.options && locale.options.weekStartsOn - var defaultWeekStartsOn = localeWeekStartsOn === undefined ? 0 : Number(localeWeekStartsOn) - var weekStartsOn = options.weekStartsOn === undefined ? defaultWeekStartsOn : Number(options.weekStartsOn) + var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn) + var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn) // Test if weekStartsOn is between 0 and 6 _and_ is not NaN if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { diff --git a/src/format/index.js b/src/format/index.js index 66eea54244..01c3dc5c3f 100644 --- a/src/format/index.js +++ b/src/format/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' import isValid from '../isValid/index.js' import defaultLocale from '../locale/en-US/index.js' @@ -319,13 +320,13 @@ export default function format (dirtyDate, dirtyFormatStr, dirtyOptions) { locale.options && locale.options.firstWeekContainsDate var defaultFirstWeekContainsDate = - localeFirstWeekContainsDate === undefined + localeFirstWeekContainsDate == null ? 1 - : Number(localeFirstWeekContainsDate) + : toInteger(localeFirstWeekContainsDate) var firstWeekContainsDate = - options.firstWeekContainsDate === undefined + options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate - : Number(options.firstWeekContainsDate) + : toInteger(options.firstWeekContainsDate) // Test if weekStartsOn is between 1 and 7 _and_ is not NaN if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) { @@ -333,8 +334,8 @@ export default function format (dirtyDate, dirtyFormatStr, dirtyOptions) { } var localeWeekStartsOn = locale.options && locale.options.weekStartsOn - var defaultWeekStartsOn = localeWeekStartsOn === undefined ? 0 : Number(localeWeekStartsOn) - var weekStartsOn = options.weekStartsOn === undefined ? defaultWeekStartsOn : Number(options.weekStartsOn) + var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn) + var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn) // Test if weekStartsOn is between 0 and 6 _and_ is not NaN if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { diff --git a/src/formatDistanceStrict/index.js b/src/formatDistanceStrict/index.js index 5249b5b35e..c4451ab5fd 100644 --- a/src/formatDistanceStrict/index.js +++ b/src/formatDistanceStrict/index.js @@ -131,7 +131,7 @@ export default function formatDistanceStrict (dirtyDate, dirtyBaseDate, dirtyOpt dateRight = toDate(dirtyBaseDate, options) } - var roundingMethod = options.roundingMethod ? String(options.roundingMethod) : 'round' + var roundingMethod = options.roundingMethod == null ? 'round' : String(options.roundingMethod) var roundingMethodFn if (roundingMethod === 'floor') { @@ -149,7 +149,7 @@ export default function formatDistanceStrict (dirtyDate, dirtyBaseDate, dirtyOpt var minutes = roundingMethodFn(seconds / 60) - offset var unit - if (options.unit === undefined) { + if (options.unit == null) { if (minutes < 1) { unit = 'second' } else if (minutes < 60) { diff --git a/src/getWeekOfMonth/index.js b/src/getWeekOfMonth/index.js index 1e6e93fae1..592b062cbe 100644 --- a/src/getWeekOfMonth/index.js +++ b/src/getWeekOfMonth/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import getDate from '../getDate/index.js' import startOfMonth from '../startOfMonth/index.js' import getDay from '../getDay/index.js' @@ -31,8 +32,8 @@ export default function getWeekOfMonth (dirtyDate, dirtyOptions) { var options = dirtyOptions || {} var locale = options.locale var localeWeekStartsOn = locale && locale.options && locale.options.weekStartsOn - var defaultWeekStartsOn = localeWeekStartsOn === undefined ? 0 : Number(localeWeekStartsOn) - var weekStartsOn = options.weekStartsOn === undefined ? defaultWeekStartsOn : Number(options.weekStartsOn) + var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn) + var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn) // Test if weekStartsOn is between 0 and 6 _and_ is not NaN if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { diff --git a/src/getWeekYear/index.js b/src/getWeekYear/index.js index 9d1ba49d67..d52c0e5f90 100644 --- a/src/getWeekYear/index.js +++ b/src/getWeekYear/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' import startOfWeek from '../startOfWeek/index.js' @@ -55,13 +56,13 @@ export default function getWeekYear (dirtyDate, dirtyOptions) { locale.options && locale.options.firstWeekContainsDate var defaultFirstWeekContainsDate = - localeFirstWeekContainsDate === undefined + localeFirstWeekContainsDate == null ? 1 - : Number(localeFirstWeekContainsDate) + : toInteger(localeFirstWeekContainsDate) var firstWeekContainsDate = - options.firstWeekContainsDate === undefined + options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate - : Number(options.firstWeekContainsDate) + : toInteger(options.firstWeekContainsDate) // Test if weekStartsOn is between 1 and 7 _and_ is not NaN if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) { diff --git a/src/lastDayOfWeek/index.js b/src/lastDayOfWeek/index.js index a708007993..96a9defbfe 100644 --- a/src/lastDayOfWeek/index.js +++ b/src/lastDayOfWeek/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' /** @@ -37,8 +38,8 @@ export default function lastDayOfWeek (dirtyDate, dirtyOptions) { var options = dirtyOptions || {} var locale = options.locale var localeWeekStartsOn = locale && locale.options && locale.options.weekStartsOn - var defaultWeekStartsOn = localeWeekStartsOn === undefined ? 0 : Number(localeWeekStartsOn) - var weekStartsOn = options.weekStartsOn === undefined ? defaultWeekStartsOn : Number(options.weekStartsOn) + var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn) + var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn) // Test if weekStartsOn is between 0 and 6 _and_ is not NaN if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { diff --git a/src/parse/index.js b/src/parse/index.js index b101295511..b709f90d0f 100644 --- a/src/parse/index.js +++ b/src/parse/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' import subMinutes from '../subMinutes/index.js' import defaultLocale from '../locale/en-US/index.js' @@ -302,13 +303,13 @@ export default function parse (dirtyDateString, dirtyFormatString, dirtyBaseDate locale.options && locale.options.firstWeekContainsDate var defaultFirstWeekContainsDate = - localeFirstWeekContainsDate === undefined + localeFirstWeekContainsDate == null ? 1 - : Number(localeFirstWeekContainsDate) + : toInteger(localeFirstWeekContainsDate) var firstWeekContainsDate = - options.firstWeekContainsDate === undefined + options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate - : Number(options.firstWeekContainsDate) + : toInteger(options.firstWeekContainsDate) // Test if weekStartsOn is between 1 and 7 _and_ is not NaN if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) { @@ -316,8 +317,8 @@ export default function parse (dirtyDateString, dirtyFormatString, dirtyBaseDate } var localeWeekStartsOn = locale.options && locale.options.weekStartsOn - var defaultWeekStartsOn = localeWeekStartsOn === undefined ? 0 : Number(localeWeekStartsOn) - var weekStartsOn = options.weekStartsOn === undefined ? defaultWeekStartsOn : Number(options.weekStartsOn) + var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn) + var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn) // Test if weekStartsOn is between 0 and 6 _and_ is not NaN if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { diff --git a/src/setDate/index.js b/src/setDate/index.js index 5a84664764..b893ce94f3 100644 --- a/src/setDate/index.js +++ b/src/setDate/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' /** @@ -27,7 +28,7 @@ export default function setDate (dirtyDate, dirtyDayOfMonth, dirtyOptions) { } var date = toDate(dirtyDate, dirtyOptions) - var dayOfMonth = Number(dirtyDayOfMonth) + var dayOfMonth = toInteger(dirtyDayOfMonth) date.setDate(dayOfMonth) return date } diff --git a/src/setDate/test.js b/src/setDate/test.js index 9623513e97..91388a147a 100644 --- a/src/setDate/test.js +++ b/src/setDate/test.js @@ -20,6 +20,11 @@ describe('setDate', function () { assert.deepEqual(result, new Date(2014, 8 /* Sep */, 25)) }) + it('converts a fractional number to an integer', function () { + var result = setDate(new Date(2014, 8 /* Sep */, 1), 30.30) + assert.deepEqual(result, new Date(2014, 8 /* Sep */, 30)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = setDate(new Date(2014, 8 /* Sep */, 1), '30') diff --git a/src/setDay/index.js b/src/setDay/index.js index cd976e87f4..5ad6a5d333 100644 --- a/src/setDay/index.js +++ b/src/setDay/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' import addDays from '../addDays/index.js' @@ -38,8 +39,8 @@ export default function setDay (dirtyDate, dirtyDay, dirtyOptions) { var options = dirtyOptions || {} var locale = options.locale var localeWeekStartsOn = locale && locale.options && locale.options.weekStartsOn - var defaultWeekStartsOn = localeWeekStartsOn === undefined ? 0 : Number(localeWeekStartsOn) - var weekStartsOn = options.weekStartsOn === undefined ? defaultWeekStartsOn : Number(options.weekStartsOn) + var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn) + var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn) // Test if weekStartsOn is between 0 and 6 _and_ is not NaN if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { @@ -47,7 +48,7 @@ export default function setDay (dirtyDate, dirtyDay, dirtyOptions) { } var date = toDate(dirtyDate, options) - var day = Number(dirtyDay) + var day = toInteger(dirtyDay) var currentDay = date.getDay() var remainder = day % 7 diff --git a/src/setDay/test.js b/src/setDay/test.js index d72f7b7aa2..c7ccf5a68d 100644 --- a/src/setDay/test.js +++ b/src/setDay/test.js @@ -44,6 +44,11 @@ describe('setDay', function () { assert.deepEqual(result, new Date(2014, 8 /* Sep */, 7)) }) + it('converts a fractional number to an integer', function () { + var result = setDay(new Date(2014, 8 /* Sep */, 1), 0.5) + assert.deepEqual(result, new Date(2014, 7 /* Aug */, 31)) + }) + it('implicitly converts options', function () { // $ExpectedMistake var result = setDay(new Date(2014, 8 /* Sep */, 1), 0, {weekStartsOn: '1'}) diff --git a/src/setDayOfYear/index.js b/src/setDayOfYear/index.js index 1a999d5fff..c46e4be25e 100644 --- a/src/setDayOfYear/index.js +++ b/src/setDayOfYear/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' /** @@ -27,7 +28,7 @@ export default function setDayOfYear (dirtyDate, dirtyDayOfYear, dirtyOptions) { } var date = toDate(dirtyDate, dirtyOptions) - var dayOfYear = Number(dirtyDayOfYear) + var dayOfYear = toInteger(dirtyDayOfYear) date.setMonth(0) date.setDate(dayOfYear) return date diff --git a/src/setDayOfYear/test.js b/src/setDayOfYear/test.js index bc9fa03e42..d59bf10feb 100644 --- a/src/setDayOfYear/test.js +++ b/src/setDayOfYear/test.js @@ -20,6 +20,11 @@ describe('setDayOfYear', function () { assert.deepEqual(result, new Date(2014, 2 /* Mar */, 1)) }) + it('converts a fractional number to an integer', function () { + var result = setDayOfYear(new Date(2014, 6 /* Jul */, 2), 2.75) + assert.deepEqual(result, new Date(2014, 0 /* Jan */, 2)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = setDayOfYear(new Date(2014, 6 /* Jul */, 2), '2') diff --git a/src/setHours/index.js b/src/setHours/index.js index e7b45f96a8..3e3282caf0 100644 --- a/src/setHours/index.js +++ b/src/setHours/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' /** @@ -27,7 +28,7 @@ export default function setHours (dirtyDate, dirtyHours, dirtyOptions) { } var date = toDate(dirtyDate, dirtyOptions) - var hours = Number(dirtyHours) + var hours = toInteger(dirtyHours) date.setHours(hours) return date } diff --git a/src/setHours/test.js b/src/setHours/test.js index 91c692effc..a4d66959f5 100644 --- a/src/setHours/test.js +++ b/src/setHours/test.js @@ -20,6 +20,11 @@ describe('setHours', function () { assert.deepEqual(result, new Date(2014, 8 /* Sep */, 1, 5)) }) + it('converts a fractional number to an integer', function () { + var result = setHours(new Date(2014, 8 /* Sep */, 1, 11, 30), 4.123) + assert.deepEqual(result, new Date(2014, 8 /* Sep */, 1, 4, 30)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = setHours(new Date(2014, 8 /* Sep */, 1, 11, 30), '4') diff --git a/src/setISODay/index.js b/src/setISODay/index.js index 6a4ee50e9d..77473372b2 100644 --- a/src/setISODay/index.js +++ b/src/setISODay/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' import addDays from '../addDays/index.js' import getISODay from '../getISODay/index.js' @@ -31,7 +32,7 @@ export default function setISODay (dirtyDate, dirtyDay, dirtyOptions) { } var date = toDate(dirtyDate, dirtyOptions) - var day = Number(dirtyDay) + var day = toInteger(dirtyDay) var currentDay = getISODay(date, dirtyOptions) var diff = day - currentDay return addDays(date, diff, dirtyOptions) diff --git a/src/setISODay/test.js b/src/setISODay/test.js index dfd49d1a32..993aed65a7 100644 --- a/src/setISODay/test.js +++ b/src/setISODay/test.js @@ -49,6 +49,11 @@ describe('setISODay', function () { assert.deepEqual(result, new Date(2014, 8 /* Sep */, 3)) }) + it('converts a fractional number to an integer', function () { + var result = setISODay(new Date(2014, 8 /* Sep */, 1), 3.33) + assert.deepEqual(result, new Date(2014, 8 /* Sep */, 3)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = setISODay(new Date(2014, 8 /* Sep */, 1), '3') diff --git a/src/setISOWeek/index.js b/src/setISOWeek/index.js index 61afd0159c..024cb55dd5 100644 --- a/src/setISOWeek/index.js +++ b/src/setISOWeek/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' import getISOWeek from '../getISOWeek/index.js' @@ -30,7 +31,7 @@ export default function setISOWeek (dirtyDate, dirtyISOWeek, dirtyOptions) { } var date = toDate(dirtyDate, dirtyOptions) - var isoWeek = Number(dirtyISOWeek) + var isoWeek = toInteger(dirtyISOWeek) var diff = getISOWeek(date, dirtyOptions) - isoWeek date.setDate(date.getDate() - diff * 7) return date diff --git a/src/setISOWeek/test.js b/src/setISOWeek/test.js index 94cca1ccb3..29b078e506 100644 --- a/src/setISOWeek/test.js +++ b/src/setISOWeek/test.js @@ -20,6 +20,11 @@ describe('setISOWeek', function () { assert.deepEqual(result, new Date(2008, 11 /* Dec */, 31)) }) + it('converts a fractional number to an integer', function () { + var result = setISOWeek(new Date(2004, 7 /* Aug */, 7), 53.53) + assert.deepEqual(result, new Date(2005, 0 /* Jan */, 1)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = setISOWeek(new Date(2004, 7 /* Aug */, 7), '53') diff --git a/src/setISOWeekYear/index.js b/src/setISOWeekYear/index.js index 7cefcfecd5..5f4cc4ab2a 100644 --- a/src/setISOWeekYear/index.js +++ b/src/setISOWeekYear/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' import startOfISOWeekYear from '../startOfISOWeekYear/index.js' import differenceInCalendarDays from '../differenceInCalendarDays/index.js' @@ -32,7 +33,7 @@ export default function setISOWeekYear (dirtyDate, dirtyISOWeekYear, dirtyOption } var date = toDate(dirtyDate, dirtyOptions) - var isoWeekYear = Number(dirtyISOWeekYear) + var isoWeekYear = toInteger(dirtyISOWeekYear) var diff = differenceInCalendarDays(date, startOfISOWeekYear(date, dirtyOptions), dirtyOptions) var fourthOfJanuary = new Date(0) fourthOfJanuary.setFullYear(isoWeekYear, 0, 4) diff --git a/src/setISOWeekYear/test.js b/src/setISOWeekYear/test.js index ac9d7c7e9e..a49ba17bc3 100644 --- a/src/setISOWeekYear/test.js +++ b/src/setISOWeekYear/test.js @@ -20,6 +20,11 @@ describe('setISOWeekYear', function () { assert.deepEqual(result, new Date(2005, 0 /* Jan */, 1)) }) + it('converts a fractional number to an integer', function () { + var result = setISOWeekYear(new Date(2008, 11 /* Dec */, 29), 2007.7002) + assert.deepEqual(result, new Date(2007, 0 /* Jan */, 1)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = setISOWeekYear(new Date(2008, 11 /* Dec */, 29), '2007') diff --git a/src/setMilliseconds/index.js b/src/setMilliseconds/index.js index 261f57c0bd..623ddab983 100644 --- a/src/setMilliseconds/index.js +++ b/src/setMilliseconds/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' /** @@ -27,7 +28,7 @@ export default function setMilliseconds (dirtyDate, dirtyMilliseconds, dirtyOpti } var date = toDate(dirtyDate, dirtyOptions) - var milliseconds = Number(dirtyMilliseconds) + var milliseconds = toInteger(dirtyMilliseconds) date.setMilliseconds(milliseconds) return date } diff --git a/src/setMilliseconds/test.js b/src/setMilliseconds/test.js index 8fdfe8c246..6ea683237f 100644 --- a/src/setMilliseconds/test.js +++ b/src/setMilliseconds/test.js @@ -20,6 +20,11 @@ describe('setMilliseconds', function () { assert.deepEqual(result, new Date(2014, 8 /* Sep */, 1, 11, 30, 15, 755)) }) + it('converts a fractional number to an integer', function () { + var result = setMilliseconds(new Date(2014, 8 /* Sep */, 1, 11, 30, 40, 500), 300.999) + assert.deepEqual(result, new Date(2014, 8 /* Sep */, 1, 11, 30, 40, 300)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = setMilliseconds(new Date(2014, 8 /* Sep */, 1, 11, 30, 40, 500), '300') diff --git a/src/setMinutes/index.js b/src/setMinutes/index.js index 90b091e1b8..148772485c 100644 --- a/src/setMinutes/index.js +++ b/src/setMinutes/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' /** @@ -27,7 +28,7 @@ export default function setMinutes (dirtyDate, dirtyMinutes, dirtyOptions) { } var date = toDate(dirtyDate, dirtyOptions) - var minutes = Number(dirtyMinutes) + var minutes = toInteger(dirtyMinutes) date.setMinutes(minutes) return date } diff --git a/src/setMinutes/test.js b/src/setMinutes/test.js index 799fa8620e..75332402e2 100644 --- a/src/setMinutes/test.js +++ b/src/setMinutes/test.js @@ -20,6 +20,11 @@ describe('setMinutes', function () { assert.deepEqual(result, new Date(2014, 8 /* Sep */, 1, 11, 5)) }) + it('converts a fractional number to an integer', function () { + var result = setMinutes(new Date(2014, 8 /* Sep */, 1, 11, 30, 40), 45.54) + assert.deepEqual(result, new Date(2014, 8 /* Sep */, 1, 11, 45, 40)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = setMinutes(new Date(2014, 8 /* Sep */, 1, 11, 30, 40), '45') diff --git a/src/setMonth/index.js b/src/setMonth/index.js index 5ec9265c57..9ad771b9bf 100644 --- a/src/setMonth/index.js +++ b/src/setMonth/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' import getDaysInMonth from '../getDaysInMonth/index.js' @@ -28,7 +29,7 @@ export default function setMonth (dirtyDate, dirtyMonth, dirtyOptions) { } var date = toDate(dirtyDate, dirtyOptions) - var month = Number(dirtyMonth) + var month = toInteger(dirtyMonth) var year = date.getFullYear() var day = date.getDate() diff --git a/src/setMonth/test.js b/src/setMonth/test.js index 341dca247b..e1753d5832 100644 --- a/src/setMonth/test.js +++ b/src/setMonth/test.js @@ -25,6 +25,11 @@ describe('setMonth', function () { assert.deepEqual(result, new Date(2014, 11 /* Dec */, 1)) }) + it('converts a fractional number to an integer', function () { + var result = setMonth(new Date(2014, 8 /* Sep */, 1), 1.5) + assert.deepEqual(result, new Date(2014, 1 /* Feb */, 1)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = setMonth(new Date(2014, 8 /* Sep */, 1), '1') diff --git a/src/setQuarter/index.js b/src/setQuarter/index.js index 6954e87890..f54e1d6ae3 100644 --- a/src/setQuarter/index.js +++ b/src/setQuarter/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' import setMonth from '../setMonth/index.js' @@ -28,7 +29,7 @@ export default function setQuarter (dirtyDate, dirtyQuarter, dirtyOptions) { } var date = toDate(dirtyDate, dirtyOptions) - var quarter = Number(dirtyQuarter) + var quarter = toInteger(dirtyQuarter) var oldQuarter = Math.floor(date.getMonth() / 3) + 1 var diff = quarter - oldQuarter return setMonth(date, date.getMonth() + diff * 3, dirtyOptions) diff --git a/src/setQuarter/test.js b/src/setQuarter/test.js index 41bdc77318..9c52acb489 100644 --- a/src/setQuarter/test.js +++ b/src/setQuarter/test.js @@ -25,6 +25,11 @@ describe('setQuarter', function () { assert.deepEqual(result, new Date(2014, 9 /* Oct */, 1)) }) + it('converts a fractional number to an integer', function () { + var result = setQuarter(new Date(2014, 6 /* Jul */, 2), 1.951) + assert.deepEqual(result, new Date(2014, 0 /* Jan */, 2)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = setQuarter(new Date(2014, 6 /* Jul */, 2), '1') diff --git a/src/setSeconds/index.js b/src/setSeconds/index.js index e3d87d5d25..1f743d4e7d 100644 --- a/src/setSeconds/index.js +++ b/src/setSeconds/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' /** @@ -27,7 +28,7 @@ export default function setSeconds (dirtyDate, dirtySeconds, dirtyOptions) { } var date = toDate(dirtyDate, dirtyOptions) - var seconds = Number(dirtySeconds) + var seconds = toInteger(dirtySeconds) date.setSeconds(seconds) return date } diff --git a/src/setSeconds/test.js b/src/setSeconds/test.js index 221804b5a2..aa11a0cb7c 100644 --- a/src/setSeconds/test.js +++ b/src/setSeconds/test.js @@ -20,6 +20,11 @@ describe('setSeconds', function () { assert.deepEqual(result, new Date(2014, 8 /* Sep */, 1, 11, 30, 45)) }) + it('converts a fractional number to an integer', function () { + var result = setSeconds(new Date(2014, 8 /* Sep */, 1, 11, 30, 40, 500), 45.54) + assert.deepEqual(result, new Date(2014, 8 /* Sep */, 1, 11, 30, 45, 500)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = setSeconds(new Date(2014, 8 /* Sep */, 1, 11, 30, 40, 500), '45') diff --git a/src/setWeek/index.js b/src/setWeek/index.js index 471951d0a2..f1aed60980 100644 --- a/src/setWeek/index.js +++ b/src/setWeek/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' import getWeek from '../getWeek/index.js' @@ -45,7 +46,7 @@ export default function setWeek (dirtyDate, dirtyWeek, dirtyOptions) { } var date = toDate(dirtyDate, dirtyOptions) - var week = Number(dirtyWeek) + var week = toInteger(dirtyWeek) var diff = getWeek(date, dirtyOptions) - week date.setDate(date.getDate() - diff * 7) return date diff --git a/src/setWeek/test.js b/src/setWeek/test.js index 6c9e6ae57d..b1d10a10c2 100644 --- a/src/setWeek/test.js +++ b/src/setWeek/test.js @@ -20,6 +20,11 @@ describe('setWeek', function () { assert.deepEqual(result, new Date(2008, 11 /* Dec */, 31)) }) + it('converts a fractional number to an integer', function () { + var result = setWeek(new Date(2005, 0 /* Jan */, 2), 1.9) + assert.deepEqual(result, new Date(2004, 11 /* Dec */, 26)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = setWeek(new Date(2004, 7 /* Aug */, 7), '53') diff --git a/src/setWeekYear/index.js b/src/setWeekYear/index.js index 88a993e9e3..2ba344dd6b 100644 --- a/src/setWeekYear/index.js +++ b/src/setWeekYear/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' import startOfWeekYear from '../startOfWeekYear/index.js' import differenceInCalendarDays from '../differenceInCalendarDays/index.js' @@ -52,16 +53,16 @@ export default function setWeekYear (dirtyDate, dirtyWeekYear, dirtyOptions) { locale.options && locale.options.firstWeekContainsDate var defaultFirstWeekContainsDate = - localeFirstWeekContainsDate === undefined + localeFirstWeekContainsDate == null ? 1 - : Number(localeFirstWeekContainsDate) + : toInteger(localeFirstWeekContainsDate) var firstWeekContainsDate = - options.firstWeekContainsDate === undefined + options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate - : Number(options.firstWeekContainsDate) + : toInteger(options.firstWeekContainsDate) var date = toDate(dirtyDate, dirtyOptions) - var weekYear = Number(dirtyWeekYear) + var weekYear = toInteger(dirtyWeekYear) var diff = differenceInCalendarDays(date, startOfWeekYear(date, dirtyOptions), dirtyOptions) var firstWeek = new Date(0) firstWeek.setFullYear(weekYear, 0, firstWeekContainsDate) diff --git a/src/setWeekYear/test.js b/src/setWeekYear/test.js index fd467178f8..9afcc0abd9 100644 --- a/src/setWeekYear/test.js +++ b/src/setWeekYear/test.js @@ -20,6 +20,11 @@ describe('setWeekYear', function () { assert.deepEqual(result, new Date(2007, 0 /* Jan */, 1)) }) + it('converts a fractional number to an integer', function () { + var result = setWeekYear(new Date(2010, 0 /* Jan */, 2), 2004.2004) + assert.deepEqual(result, new Date(2004, 0 /* Jan */, 3)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = setWeekYear(new Date(2008, 11 /* Dec */, 29), '2007') diff --git a/src/setYear/index.js b/src/setYear/index.js index bef79e3996..1d521f2345 100644 --- a/src/setYear/index.js +++ b/src/setYear/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' /** @@ -27,7 +28,7 @@ export default function setYear (dirtyDate, dirtyYear, dirtyOptions) { } var date = toDate(dirtyDate, dirtyOptions) - var year = Number(dirtyYear) + var year = toInteger(dirtyYear) // Check if date is Invalid Date because Date.prototype.setFullYear ignores the value of Invalid Date if (isNaN(date)) { diff --git a/src/setYear/test.js b/src/setYear/test.js index 0c29776f83..428cb85d5b 100644 --- a/src/setYear/test.js +++ b/src/setYear/test.js @@ -20,6 +20,11 @@ describe('setYear', function () { assert.deepEqual(result, new Date(2016, 8 /* Sep */, 1)) }) + it('converts a fractional number to an integer', function () { + var result = setYear(new Date(2014, 8 /* Sep */, 1), 2013.987654321) + assert.deepEqual(result, new Date(2013, 8 /* Sep */, 1)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = setYear(new Date(2014, 8 /* Sep */, 1), '2013') diff --git a/src/startOfWeek/index.js b/src/startOfWeek/index.js index 434a6ab723..5273cdcc1d 100644 --- a/src/startOfWeek/index.js +++ b/src/startOfWeek/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import toDate from '../toDate/index.js' /** @@ -37,8 +38,8 @@ export default function startOfWeek (dirtyDate, dirtyOptions) { var options = dirtyOptions || {} var locale = options.locale var localeWeekStartsOn = locale && locale.options && locale.options.weekStartsOn - var defaultWeekStartsOn = localeWeekStartsOn === undefined ? 0 : Number(localeWeekStartsOn) - var weekStartsOn = options.weekStartsOn === undefined ? defaultWeekStartsOn : Number(options.weekStartsOn) + var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn) + var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn) // Test if weekStartsOn is between 0 and 6 _and_ is not NaN if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { diff --git a/src/startOfWeekYear/index.js b/src/startOfWeekYear/index.js index f9f215b3a9..56e2790073 100644 --- a/src/startOfWeekYear/index.js +++ b/src/startOfWeekYear/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import getWeekYear from '../getWeekYear/index.js' import startOfWeek from '../startOfWeek/index.js' @@ -49,13 +50,13 @@ export default function startOfWeekYear (dirtyDate, dirtyOptions) { locale.options && locale.options.firstWeekContainsDate var defaultFirstWeekContainsDate = - localeFirstWeekContainsDate === undefined + localeFirstWeekContainsDate == null ? 1 - : Number(localeFirstWeekContainsDate) + : toInteger(localeFirstWeekContainsDate) var firstWeekContainsDate = - options.firstWeekContainsDate === undefined + options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate - : Number(options.firstWeekContainsDate) + : toInteger(options.firstWeekContainsDate) var year = getWeekYear(dirtyDate, dirtyOptions) var firstWeek = new Date(0) diff --git a/src/subDays/index.js b/src/subDays/index.js index e5f9954e6e..d09e8294c8 100644 --- a/src/subDays/index.js +++ b/src/subDays/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import addDays from '../addDays/index.js' /** @@ -26,6 +27,6 @@ export default function subDays (dirtyDate, dirtyAmount, dirtyOptions) { throw new TypeError('2 arguments required, but only ' + arguments.length + ' present') } - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) return addDays(dirtyDate, -amount, dirtyOptions) } diff --git a/src/subDays/test.js b/src/subDays/test.js index fd173c1030..773d682131 100644 --- a/src/subDays/test.js +++ b/src/subDays/test.js @@ -20,6 +20,11 @@ describe('subDays', function () { assert.deepEqual(result, new Date(2014, 7 /* Aug */, 22)) }) + it('converts a fractional number to an integer', function () { + var result = subDays(new Date(2014, 8 /* Sep */, 1), 10.85) + assert.deepEqual(result, new Date(2014, 7 /* Aug */, 22)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = subDays(new Date(2014, 8 /* Sep */, 1), '10') diff --git a/src/subHours/index.js b/src/subHours/index.js index 19cea6d03b..c1b3722b57 100644 --- a/src/subHours/index.js +++ b/src/subHours/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import addHours from '../addHours/index.js' /** @@ -26,6 +27,6 @@ export default function subHours (dirtyDate, dirtyAmount, dirtyOptions) { throw new TypeError('2 arguments required, but only ' + arguments.length + ' present') } - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) return addHours(dirtyDate, -amount, dirtyOptions) } diff --git a/src/subHours/test.js b/src/subHours/test.js index 3b8df56ef5..83591a8bca 100644 --- a/src/subHours/test.js +++ b/src/subHours/test.js @@ -24,6 +24,11 @@ describe('subHours', function () { assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 23, 0)) }) + it('converts a fractional number to an integer', function () { + var result = subHours(new Date(2014, 6 /* Jul */, 11, 1, 0), 2.22) + assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 23, 0)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = subHours(new Date(2014, 6 /* Jul */, 11, 1, 0), '2') diff --git a/src/subISOWeekYears/index.js b/src/subISOWeekYears/index.js index 3117084e30..b26ac7230f 100644 --- a/src/subISOWeekYears/index.js +++ b/src/subISOWeekYears/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import addISOWeekYears from '../addISOWeekYears/index.js' /** @@ -28,6 +29,6 @@ export default function subISOWeekYears (dirtyDate, dirtyAmount, dirtyOptions) { throw new TypeError('2 arguments required, but only ' + arguments.length + ' present') } - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) return addISOWeekYears(dirtyDate, -amount, dirtyOptions) } diff --git a/src/subISOWeekYears/test.js b/src/subISOWeekYears/test.js index 30a1741301..837168c525 100644 --- a/src/subISOWeekYears/test.js +++ b/src/subISOWeekYears/test.js @@ -20,6 +20,11 @@ describe('subISOWeekYears', function () { assert.deepEqual(result, new Date(2002, 8 /* Sep */, 2)) }) + it('converts a fractional number to an integer', function () { + var result = subISOWeekYears(new Date(2014, 8 /* Sep */, 1), 5.555) + assert.deepEqual(result, new Date(2009, 7 /* Aug */, 31)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = subISOWeekYears(new Date(2014, 8 /* Sep */, 1), '5') diff --git a/src/subMilliseconds/index.js b/src/subMilliseconds/index.js index 230acac836..2ef716dc54 100644 --- a/src/subMilliseconds/index.js +++ b/src/subMilliseconds/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import addMilliseconds from '../addMilliseconds/index.js' /** @@ -26,6 +27,6 @@ export default function subMilliseconds (dirtyDate, dirtyAmount, dirtyOptions) { throw new TypeError('2 arguments required, but only ' + arguments.length + ' present') } - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) return addMilliseconds(dirtyDate, -amount, dirtyOptions) } diff --git a/src/subMilliseconds/test.js b/src/subMilliseconds/test.js index e9224d27e8..59ef889d94 100644 --- a/src/subMilliseconds/test.js +++ b/src/subMilliseconds/test.js @@ -24,6 +24,11 @@ describe('subMilliseconds', function () { assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 12, 45, 29, 500)) }) + it('converts a fractional number to an integer', function () { + var result = subMilliseconds(new Date(2014, 6 /* Jul */, 10, 12, 45, 30, 0), 750.750) + assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 12, 45, 29, 250)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = subMilliseconds(new Date(2014, 6 /* Jul */, 10, 12, 45, 30, 0), '750') diff --git a/src/subMinutes/index.js b/src/subMinutes/index.js index 15f4f4dbf6..1af961f0de 100644 --- a/src/subMinutes/index.js +++ b/src/subMinutes/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import addMinutes from '../addMinutes/index.js' /** @@ -26,6 +27,6 @@ export default function subMinutes (dirtyDate, dirtyAmount, dirtyOptions) { throw new TypeError('2 arguments required, but only ' + arguments.length + ' present') } - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) return addMinutes(dirtyDate, -amount, dirtyOptions) } diff --git a/src/subMinutes/test.js b/src/subMinutes/test.js index 3ec4263f1f..909a33345e 100644 --- a/src/subMinutes/test.js +++ b/src/subMinutes/test.js @@ -24,6 +24,11 @@ describe('subMinutes', function () { assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 11, 40)) }) + it('converts a fractional number to an integer', function () { + var result = subMinutes(new Date(2014, 6 /* Jul */, 10, 12, 0), 30.4) + assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 11, 30)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = subMinutes(new Date(2014, 6 /* Jul */, 10, 12, 0), '30') diff --git a/src/subMonths/index.js b/src/subMonths/index.js index cd959223a5..6085b7ed2e 100644 --- a/src/subMonths/index.js +++ b/src/subMonths/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import addMonths from '../addMonths/index.js' /** @@ -26,6 +27,6 @@ export default function subMonths (dirtyDate, dirtyAmount, dirtyOptions) { throw new TypeError('2 arguments required, but only ' + arguments.length + ' present') } - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) return addMonths(dirtyDate, -amount, dirtyOptions) } diff --git a/src/subMonths/test.js b/src/subMonths/test.js index dbbe7a66be..b2070c1caa 100644 --- a/src/subMonths/test.js +++ b/src/subMonths/test.js @@ -20,6 +20,11 @@ describe('subMonths', function () { assert.deepEqual(result, new Date(2014, 8 /* Sep */, 1)) }) + it('converts a fractional number to an integer', function () { + var result = subMonths(new Date(2015, 1 /* Feb */, 1), 5.999) + assert.deepEqual(result, new Date(2014, 8 /* Sep */, 1)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = subMonths(new Date(2015, 1 /* Feb */, 1), '5') diff --git a/src/subQuarters/index.js b/src/subQuarters/index.js index 8a04578002..bfd09ce7b9 100644 --- a/src/subQuarters/index.js +++ b/src/subQuarters/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import addQuarters from '../addQuarters/index.js' /** @@ -26,6 +27,6 @@ export default function subQuarters (dirtyDate, dirtyAmount, dirtyOptions) { throw new TypeError('2 arguments required, but only ' + arguments.length + ' present') } - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) return addQuarters(dirtyDate, -amount, dirtyOptions) } diff --git a/src/subQuarters/test.js b/src/subQuarters/test.js index 3180abb209..ec9f6f9313 100644 --- a/src/subQuarters/test.js +++ b/src/subQuarters/test.js @@ -20,6 +20,11 @@ describe('subQuarters', function () { assert.deepEqual(result, new Date(2013, 8 /* Sep */, 1)) }) + it('converts a fractional number to an integer', function () { + var result = subQuarters(new Date(2014, 8 /* Sep */, 1), 3.33) + assert.deepEqual(result, new Date(2013, 11 /* Dec */, 1)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = subQuarters(new Date(2014, 8 /* Sep */, 1), '3') diff --git a/src/subSeconds/index.js b/src/subSeconds/index.js index 8b4261bac2..51239b7f73 100644 --- a/src/subSeconds/index.js +++ b/src/subSeconds/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import addSeconds from '../addSeconds/index.js' /** @@ -26,6 +27,6 @@ export default function subSeconds (dirtyDate, dirtyAmount, dirtyOptions) { throw new TypeError('2 arguments required, but only ' + arguments.length + ' present') } - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) return addSeconds(dirtyDate, -amount, dirtyOptions) } diff --git a/src/subSeconds/test.js b/src/subSeconds/test.js index 7f129e50dd..16285c0c0a 100644 --- a/src/subSeconds/test.js +++ b/src/subSeconds/test.js @@ -24,6 +24,11 @@ describe('subSeconds', function () { assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 12, 44, 40)) }) + it('converts a fractional number to an integer', function () { + var result = subSeconds(new Date(2014, 6 /* Jul */, 10, 12, 45, 0), 30.5) + assert.deepEqual(result, new Date(2014, 6 /* Jul */, 10, 12, 44, 30)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = subSeconds(new Date(2014, 6 /* Jul */, 10, 12, 45, 0), '30') diff --git a/src/subWeeks/index.js b/src/subWeeks/index.js index 9457ac860f..97f0f6c23e 100644 --- a/src/subWeeks/index.js +++ b/src/subWeeks/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import addWeeks from '../addWeeks/index.js' /** @@ -26,6 +27,6 @@ export default function subWeeks (dirtyDate, dirtyAmount, dirtyOptions) { throw new TypeError('2 arguments required, but only ' + arguments.length + ' present') } - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) return addWeeks(dirtyDate, -amount, dirtyOptions) } diff --git a/src/subWeeks/test.js b/src/subWeeks/test.js index 356eb36462..609f0670e7 100644 --- a/src/subWeeks/test.js +++ b/src/subWeeks/test.js @@ -20,6 +20,11 @@ describe('subWeeks', function () { assert.deepEqual(result, new Date(2014, 7 /* Aug */, 25)) }) + it('converts a fractional number to an integer', function () { + var result = subWeeks(new Date(2014, 8 /* Sep */, 1), 4.2) + assert.deepEqual(result, new Date(2014, 7 /* Aug */, 4)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = subWeeks(new Date(2014, 8 /* Sep */, 1), '4') diff --git a/src/subYears/index.js b/src/subYears/index.js index e55cf4b708..fbbb41f8fc 100644 --- a/src/subYears/index.js +++ b/src/subYears/index.js @@ -1,3 +1,4 @@ +import toInteger from '../_lib/toInteger/index.js' import addYears from '../addYears/index.js' /** @@ -26,6 +27,6 @@ export default function subYears (dirtyDate, dirtyAmount, dirtyOptions) { throw new TypeError('2 arguments required, but only ' + arguments.length + ' present') } - var amount = Number(dirtyAmount) + var amount = toInteger(dirtyAmount) return addYears(dirtyDate, -amount, dirtyOptions) } diff --git a/src/subYears/test.js b/src/subYears/test.js index 35af6fd53f..bdcff843a6 100644 --- a/src/subYears/test.js +++ b/src/subYears/test.js @@ -20,6 +20,11 @@ describe('subYears', function () { assert.deepEqual(result, new Date(2002, 8 /* Sep */, 1)) }) + it('converts a fractional number to an integer', function () { + var result = subYears(new Date(2014, 8 /* Sep */, 1), 5.1) + assert.deepEqual(result, new Date(2009, 8 /* Sep */, 1)) + }) + it('implicitly converts number arguments', function () { // $ExpectedMistake var result = subYears(new Date(2014, 8 /* Sep */, 1), '5') diff --git a/src/toDate/index.js b/src/toDate/index.js index 2d31ba6eae..1bb1b378a7 100644 --- a/src/toDate/index.js +++ b/src/toDate/index.js @@ -1,3 +1,5 @@ +import toInteger from '../_lib/toInteger/index.js' + var MILLISECONDS_IN_HOUR = 3600000 var MILLISECONDS_IN_MINUTE = 60000 var DEFAULT_ADDITIONAL_DIGITS = 2 @@ -90,7 +92,7 @@ export default function toDate (argument, dirtyOptions) { var options = dirtyOptions || {} - var additionalDigits = options.additionalDigits === undefined ? DEFAULT_ADDITIONAL_DIGITS : Number(options.additionalDigits) + var additionalDigits = options.additionalDigits == null ? DEFAULT_ADDITIONAL_DIGITS : toInteger(options.additionalDigits) if (additionalDigits !== 2 && additionalDigits !== 1 && additionalDigits !== 0) { throw new RangeError('additionalDigits must be 0, 1 or 2') }