]> git.ipfire.org Git - thirdparty/moment.git/commitdiff
Force day-of-year to nonzero parsing
authorKunal Marwaha <marwahaha@berkeley.edu>
Sun, 26 Feb 2017 03:18:49 +0000 (22:18 -0500)
committerIskren Chernev <iskren.chernev@gmail.com>
Thu, 2 Mar 2017 10:00:08 +0000 (12:00 +0200)
src/lib/parse/regex.js
src/lib/units/day-of-year.js
src/test/moment/regex.js [new file with mode: 0644]

index b1dc7529e5c7e2e182191f382217c62da6b16aa8..2d62cf9cb1e5d82196fda574fa2cee7d7699d0f2 100644 (file)
@@ -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
 
index 6fe931c1e46fbe36794d9b30d0f55c3ebac521bd..3f0aa0ab6361ca8608a93544a088bbb3495e0aef 100644 (file)
@@ -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 (file)
index 0000000..04c8320
--- /dev/null
@@ -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');
+});