Skip to content

Commit

Permalink
Fix for invalid Datetime when not in valid ECMA DateTime range (#576)
Browse files Browse the repository at this point in the history
#563 Added invalid check on DateTime constructor
  • Loading branch information
neversaid authored and icambron committed Sep 22, 2019
1 parent 112bc4d commit 1914644
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 7 deletions.
22 changes: 15 additions & 7 deletions src/datetime.js
Expand Up @@ -370,11 +370,12 @@ export default class DateTime {
* @access private
*/
constructor(config) {
const zone = config.zone || Settings.defaultZone,
invalid =
config.invalid ||
(Number.isNaN(config.ts) ? new Invalid("invalid input") : null) ||
(!zone.isValid ? unsupportedZone(zone) : null);
const zone = config.zone || Settings.defaultZone;

let invalid =
config.invalid ||
(Number.isNaN(config.ts) ? new Invalid("invalid input") : null) ||
(!zone.isValid ? unsupportedZone(zone) : null);
/**
* @access private
*/
Expand All @@ -384,8 +385,15 @@ export default class DateTime {
o = null;
if (!invalid) {
const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone);
c = unchanged ? config.old.c : tsToObj(this.ts, zone.offset(this.ts));
o = unchanged ? config.old.o : zone.offset(this.ts);

if (unchanged) {
[c, o] = [config.old.c, config.old.o];
} else {
c = tsToObj(this.ts, zone.offset(this.ts));
invalid = Number.isNaN(c.year) ? new Invalid("invalid input") : null;
c = invalid ? null : c;
o = invalid ? null : zone.offset(this.ts);
}
}

/**
Expand Down
20 changes: 20 additions & 0 deletions test/datetime/math.test.js
Expand Up @@ -96,6 +96,16 @@ test("DateTime#plus works across the 100 barrier", () => {
expect(d.day).toBe(2);
});

test("DateTime#plus renders invalid when out of max. datetime range using days", () => {
const d = DateTime.utc(1970, 1, 1, 0, 0, 0, 0).plus({ day: 1e8 + 1 });
expect(d.isValid).toBe(false);
});

test("DateTime#plus renders invalid when out of max. datetime range using seconds", () => {
const d = DateTime.utc(1970, 1, 1, 0, 0, 0, 0).plus({ second: 1e8 * 24 * 60 * 60 + 1 });
expect(d.isValid).toBe(false);
});

//------
// #minus()
//------
Expand Down Expand Up @@ -144,6 +154,16 @@ test("DateTime#minus works across the 100 barrier", () => {
expect(d.day).toBe(31);
});

test("DateTime#minus renders invalid when out of max. datetime range using days", () => {
const d = DateTime.utc(1970, 1, 1, 0, 0, 0, 0).minus({ day: 1e8 + 1 });
expect(d.isValid).toBe(false);
});

test("DateTime#minus renders invalid when out of max. datetime range using seconds", () => {
const d = DateTime.utc(1970, 1, 1, 0, 0, 0, 0).minus({ second: 1e8 * 24 * 60 * 60 + 1 });
expect(d.isValid).toBe(false);
});

//------
// #startOf()
//------
Expand Down

0 comments on commit 1914644

Please sign in to comment.