From: Kunal Marwaha Date: Sun, 26 Feb 2017 03:18:49 +0000 (-0500) Subject: Force day-of-year to nonzero parsing X-Git-Tag: 2.18.0~30^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ac5f4f2d2cb06557f95b693ae5376f88be92fe9b;p=thirdparty%2Fmoment.git Force day-of-year to nonzero parsing --- diff --git a/src/lib/parse/regex.js b/src/lib/parse/regex.js index b1dc7529e..2d62cf9cb 100644 --- a/src/lib/parse/regex.js +++ b/src/lib/parse/regex.js @@ -10,6 +10,9 @@ export var match1to3 = /\d{1,3}/; // 0 - 999 export var match1to4 = /\d{1,4}/; // 0 - 9999 export var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 +export var match1to3nonzero = /[1-9]\d{0,2}|\d[1-9]\d{0,1}|\d{0,2}[1-9]/; // 1 - 999 +export var match3nonzero = /[1-9]\d\d|\d[1-9]\d|\d\d[1-9]/; // 001 - 999 + export var matchUnsigned = /\d+/; // 0 - inf export var matchSigned = /[+-]?\d+/; // -inf - inf diff --git a/src/lib/units/day-of-year.js b/src/lib/units/day-of-year.js index 6fe931c1e..3f0aa0ab6 100644 --- a/src/lib/units/day-of-year.js +++ b/src/lib/units/day-of-year.js @@ -1,7 +1,7 @@ import { addFormatToken } from '../format/format'; import { addUnitAlias } from './aliases'; import { addUnitPriority } from './priorities'; -import { addRegexToken, match3, match1to3 } from '../parse/regex'; +import { addRegexToken, match3nonzero, match1to3nonzero } from '../parse/regex'; import { daysInYear } from './year'; import { createUTCDate } from '../create/date-from-array'; import { addParseToken } from '../parse/token'; @@ -20,8 +20,8 @@ addUnitPriority('dayOfYear', 4); // PARSING -addRegexToken('DDD', match1to3); -addRegexToken('DDDD', match3); +addRegexToken('DDD', match1to3nonzero); +addRegexToken('DDDD', match3nonzero); addParseToken(['DDD', 'DDDD'], function (input, array, config) { config._dayOfYear = toInt(input); }); diff --git a/src/test/moment/regex.js b/src/test/moment/regex.js new file mode 100644 index 000000000..04c83209c --- /dev/null +++ b/src/test/moment/regex.js @@ -0,0 +1,34 @@ +import { module, test } from '../qunit'; +import moment from '../../moment'; +import {match1to3nonzero} from '../../lib/parse/regex'; + +module('regex'); + +test('match1to3nonzero works properly', function (assert) { + assert.equal('0'.match(match1to3nonzero), null); + assert.equal('00'.match(match1to3nonzero), null); + assert.equal('000'.match(match1to3nonzero), null); + + for (var i = 1; i < 1000; i++) { + assert.notEqual(String(i).match(match1to3nonzero), null); + if (i < 100) { + assert.notEqual('0' + String(i).match(match1to3nonzero), null); + if (i < 10) { + assert.notEqual('00' + String(i).match(match1to3nonzero), null); + } + } + } +}); + +// https://github.com/moment/moment/issues/3717 +test('YYYYDDD should not parse DDD=000 (strict mode)', function (assert) { + assert.equal(moment(7000000, moment.ISO_8601, true).isValid(), false); + assert.equal(moment('7000000', moment.ISO_8601, true).isValid(), false); +}); + +// https://github.com/moment/moment/issues/3717 +test('YYYYDDD will parse DDD=000 (non-strict mode)', function (assert) { + assert.equal(moment(7000000, moment.ISO_8601, false).isValid(), true); + assert.equal(moment(7000000, moment.ISO_8601, false)._pf.unusedTokens.length, 1); + assert.equal(moment(7000000, moment.ISO_8601, false)._pf.unusedTokens[0], 'DDD'); +});