From f393109c4339a4acaf85d56c670ee65969eb62d3 Mon Sep 17 00:00:00 2001 From: Iskren Chernev Date: Tue, 27 Oct 2015 01:01:38 -0700 Subject: [PATCH] Add weekday overflow check Fixes half of #2457 --- src/lib/create/check-overflow.js | 5 ++++- src/lib/create/from-array.js | 19 +++++++++++++++---- src/lib/units/constants.js | 1 + src/test/moment/week_year.js | 7 +++++++ 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/lib/create/check-overflow.js b/src/lib/create/check-overflow.js index f76d907aa..41b539fb7 100644 --- a/src/lib/create/check-overflow.js +++ b/src/lib/create/check-overflow.js @@ -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; } diff --git a/src/lib/create/from-array.js b/src/lib/create/from-array.js index 51bddc6a6..67d0bed99 100644 --- a/src/lib/create/from-array.js +++ b/src/lib/create/from-array.js @@ -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; } } diff --git a/src/lib/units/constants.js b/src/lib/units/constants.js index 0a11938be..70bf1b26e 100644 --- a/src/lib/units/constants.js +++ b/src/lib/units/constants.js @@ -6,3 +6,4 @@ export var MINUTE = 4; export var SECOND = 5; export var MILLISECOND = 6; export var WEEK = 7; +export var WEEKDAY = 8; diff --git a/src/test/moment/week_year.js b/src/test/moment/week_year.js index 0c2ac6078..5cbad4f41 100644 --- a/src/test/moment/week_year.js +++ b/src/test/moment/week_year.js @@ -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); -- 2.47.2