]> git.ipfire.org Git - thirdparty/moment.git/commitdiff
Add weekday overflow check
authorIskren Chernev <iskren.chernev@gmail.com>
Tue, 27 Oct 2015 08:01:38 +0000 (01:01 -0700)
committerIskren Chernev <iskren.chernev@gmail.com>
Mon, 9 Nov 2015 02:53:13 +0000 (18:53 -0800)
Fixes half of #2457

src/lib/create/check-overflow.js
src/lib/create/from-array.js
src/lib/units/constants.js
src/test/moment/week_year.js

index f76d907aae7ef05a01df2422c272b7f5eb47f489..41b539fb7338e18325d9d422a56a86baf172c2d6 100644 (file)
@@ -1,5 +1,5 @@
 import { daysInMonth } from '../units/month';
-import { YEAR, MONTH, DATE, HOUR, MINUTE, SECOND, MILLISECOND, WEEK } from '../units/constants';
+import { YEAR, MONTH, DATE, HOUR, MINUTE, SECOND, MILLISECOND, WEEK, WEEKDAY } from '../units/constants';
 import getParsingFlags from '../create/parsing-flags';
 
 export default function checkOverflow (m) {
@@ -22,6 +22,9 @@ export default function checkOverflow (m) {
         if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
             overflow = WEEK;
         }
+        if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
+            overflow = WEEKDAY;
+        }
 
         getParsingFlags(m).overflow = overflow;
     }
index 51bddc6a696c0ba429a669b317e6aa430561e0d9..67d0bed998d8a5d2b116b7f7d1a9fae9d954d9e2 100644 (file)
@@ -83,7 +83,7 @@ export function configFromArray (config) {
 }
 
 function dayOfYearFromWeekInfo(config) {
-    var w, weekYear, week, weekday, dow, doy, temp;
+    var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;
 
     w = config._w;
     if (w.GG != null || w.W != null || w.E != null) {
@@ -97,6 +97,9 @@ function dayOfYearFromWeekInfo(config) {
         weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);
         week = defaults(w.W, 1);
         weekday = defaults(w.E, 1);
+        if (weekday < 1 || weekday > 7) {
+            weekdayOverflow = true;
+        }
     } else {
         dow = config._locale._week.dow;
         doy = config._locale._week.doy;
@@ -110,19 +113,27 @@ function dayOfYearFromWeekInfo(config) {
             if (weekday < dow) {
                 ++week;
             }
+            if (weekday < 0 || weekday > 6) {
+                weekdayOverflow = true;
+            }
         } else if (w.e != null) {
             // local weekday -- counting starts from begining of week
             weekday = w.e + dow;
+            if (w.e < 0 || w.e > 6) {
+                weekdayOverflow = true;
+            }
         } else {
             // default to begining of week
             weekday = dow;
         }
     }
-    if (1 <= week && week <= weeksInYear(weekYear, dow, doy)) {
+    if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
+        getParsingFlags(config)._overflowWeeks = true;
+    } else if (weekdayOverflow != null) {
+        getParsingFlags(config)._overflowWeekday = true;
+    } else {
         temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow);
         config._a[YEAR] = temp.year;
         config._dayOfYear = temp.dayOfYear;
-    } else {
-        getParsingFlags(config)._overflowWeeks = true;
     }
 }
index 0a11938be9e099478dd79cd41e3baae35576e463..70bf1b26ede2c1fcb9e0ce1a1f6a36142d32312a 100644 (file)
@@ -6,3 +6,4 @@ export var MINUTE = 4;
 export var SECOND = 5;
 export var MILLISECOND = 6;
 export var WEEK = 7;
+export var WEEKDAY = 8;
index 0c2ac6078b1f295f26c632edb1c9db990e84e9ab..5cbad4f41a826c4be63a31158c4db586dc60faab 100644 (file)
@@ -102,6 +102,13 @@ test('weeks overflow', function (assert) {
     assert.equal(7, moment.utc('2004-W00-1', moment.ISO_8601, true).parsingFlags().overflow, 'there is no 0th week');
 });
 
+test('weekday overflow', function (assert) {
+    assert.equal(8, moment.utc('2004-W30-0', moment.ISO_8601, true).parsingFlags().overflow, 'there is no 0 iso weekday');
+    assert.equal(8, moment.utc('2004-W30-8', moment.ISO_8601, true).parsingFlags().overflow, 'there is no 8 iso weekday');
+    assert.equal(8, moment.utc('2004-w30-7', 'gggg-[w]ww-e', true).parsingFlags().overflow, 'there is no 7 \'e\' weekday');
+    assert.equal(8, moment.utc('2004-w30-7', 'gggg-[w]ww-d', true).parsingFlags().overflow, 'there is no 7 \'d\' weekday');
+});
+
 test('week year setter works', function (assert) {
     for (var year = 2000; year <= 2020; year += 1) {
         assert.equal(moment.utc('2012-12-31T00:00:00.000Z').isoWeekYear(year).isoWeekYear(), year, 'setting iso-week-year to ' + year);