From: Will Dembinski Date: Fri, 6 Jan 2017 05:03:08 +0000 (-0800) Subject: Added helper 'isNumeric' to test values for validity in setters X-Git-Tag: 2.19.0~48^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ab08b1ebee2a62a8e597ab7fab462cd5a2eea22d;p=thirdparty%2Fmoment.git Added helper 'isNumeric' to test values for validity in setters --- diff --git a/src/lib/moment/get-set.js b/src/lib/moment/get-set.js index 0d9fe5dfe..9bbbaae27 100644 --- a/src/lib/moment/get-set.js +++ b/src/lib/moment/get-set.js @@ -2,7 +2,7 @@ import { normalizeUnits, normalizeObjectUnits } from '../units/aliases'; import { getPrioritizedUnits } from '../units/priorities'; import { hooks } from '../utils/hooks'; import isFunction from '../utils/is-function'; - +import isNumeric from '../utils/is-numeric'; export function makeGetSet (unit, keepTime) { return function (value) { @@ -22,7 +22,7 @@ export function get (mom, unit) { } export function set (mom, unit, value) { - if (mom.isValid()) { + if (mom.isValid() && isNumeric(value)) { mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); } } diff --git a/src/lib/utils/is-numeric.js b/src/lib/utils/is-numeric.js new file mode 100644 index 000000000..21e093eb2 --- /dev/null +++ b/src/lib/utils/is-numeric.js @@ -0,0 +1,6 @@ +export default function isNumeric(val) { + var _val = +val; + return (val !== val + 1) && //infinity check + ( _val === +val ) && //Cute coercion check + (typeof val !== 'object') //Array/object check +} \ No newline at end of file diff --git a/src/test/moment/getters_setters.js b/src/test/moment/getters_setters.js index 50b23bb48..de2f0e284 100644 --- a/src/test/moment/getters_setters.js +++ b/src/test/moment/getters_setters.js @@ -101,6 +101,35 @@ test('setters', function (assert) { assert.equal(a.month(), 3, 'month edge case'); }); +test('setters should handle garbage input', function (assert) { + var a = moment(); + a.set('year', 2011); + a.set('month', 9); + a.set('date', 12); + a.set('hours', 6); + a.set('minutes', 7); + a.set('seconds', 8); + a.set('milliseconds', 9); + + a.year(undefined); + a.month(null); + a.date([1]); + a.day(-Infinity); + a.hours(new Date()); + a.minutes({a:1,b:2}); + a.seconds("foo"); + a.milliseconds(Infinity); + + assert.equal(a.year(), 2011, 'year'); + assert.equal(a.month(), 9, 'month'); + assert.equal(a.date(), 12, 'date'); + assert.equal(a.day(), 3, 'day'); + assert.equal(a.hours(), 6, 'hour'); + assert.equal(a.minutes(), 7, 'minute'); + assert.equal(a.seconds(), 8, 'second'); + assert.equal(a.milliseconds(), 9, 'milliseconds'); +}); + test('setter programmatic', function (assert) { var a = moment(); a.set('year', 2011); diff --git a/src/test/moment/is_numeric.js b/src/test/moment/is_numeric.js new file mode 100644 index 000000000..ac7af2235 --- /dev/null +++ b/src/test/moment/is_numeric.js @@ -0,0 +1,26 @@ +import { module, test } from '../qunit'; +import isNumeric from '../../lib/utils/is-numeric.js'; + +test('isNumeric recognizes numeric things', function (assert) { + assert.ok(isNumeric(1), 'simple integer'); + assert.ok(isNumeric(0), 'simple number'); + assert.ok(isNumeric(-0), 'silly number'); + assert.ok(isNumeric(1010010293029), 'large number'); + assert.ok(isNumeric(1.100393830000), 'decimal numbers'); + assert.ok(isNumeric(Math.LN2), 'natural log of two'); + assert.ok(isNumeric(Math.PI), 'delicious number'); + assert.ok(isNumeric(5e10), 'scientifically notated number'); +}); + +test('isNumeric rejects non-numeric things', function (assert) { + assert.ok(!isNumeric(NaN), 'not number'); + assert.ok(!isNumeric(Infinity), 'largest number'); + assert.ok(!isNumeric(-Infinity), 'smallest number'); + assert.ok(!isNumeric(), 'nothing'); + assert.ok(!isNumeric(undefined), 'undefined'); + assert.ok(!isNumeric(null), 'null'); + assert.ok(!isNumeric([1]), 'array'); + assert.ok(!isNumeric('[1,2,3]'), 'string'); + assert.ok(!isNumeric(new Date()), 'date'); + assert.ok(!isNumeric({a:1,b:2}), 'object'); +});