'use strict'; require('should'); var dateFormat = require('../lib'); describe('dateFormat.parse', function() { it('should require a pattern', function() { (function() { dateFormat.parse() }).should.throw(/pattern must be supplied/); (function() { dateFormat.parse(null) }).should.throw(/pattern must be supplied/); (function() { dateFormat.parse('') }).should.throw(/pattern must be supplied/); }); describe('with a pattern that has no replacements', function() { it('should return a new date when the string matches', function() { dateFormat.parse('cheese', 'cheese').should.be.a.Date() }); it('should throw if the string does not match', function() { (function() { dateFormat.parse('cheese', 'biscuits'); }).should.throw(/String 'biscuits' could not be parsed as 'cheese'/); }); }); describe('with a full pattern', function() { var pattern = 'yyyy-MM-dd hh:mm:ss.SSSO'; it('should return the correct date if the string matches', function() { var testDate = new Date(); testDate.setFullYear(2018); testDate.setMonth(8); testDate.setDate(13); testDate.setHours(18); testDate.setMinutes(10); testDate.setSeconds(12); testDate.setMilliseconds(392); testDate.getTimezoneOffset = function() { return 600; }; dateFormat.parse(pattern, '2018-09-13 08:10:12.392+1000').getTime().should.eql(testDate.getTime()); }); it('should throw if the string does not match', function() { (function() { dateFormat.parse(pattern, 'biscuits') }).should.throw(/String 'biscuits' could not be parsed as 'yyyy-MM-dd hh:mm:ss.SSSO'/); }); }); describe('with a partial pattern', function() { var testDate = new Date(); dateFormat.now = function() { return testDate; }; function verifyDate(actual, expected) { actual.getFullYear().should.eql(expected.year || testDate.getFullYear()); actual.getMonth().should.eql(expected.month || testDate.getMonth()); actual.getDate().should.eql(expected.day || testDate.getDate()); actual.getHours().should.eql(expected.hours || testDate.getHours()); actual.getMinutes().should.eql(expected.minutes || testDate.getMinutes()); actual.getSeconds().should.eql(expected.seconds || testDate.getSeconds()); actual.getMilliseconds().should.eql(expected.milliseconds || testDate.getMilliseconds()); } it('should return a date with missing values defaulting to current time', function() { var date = dateFormat.parse('yyyy-MM', '2015-09'); verifyDate(date, { year: 2015, month: 8 }); }); it('should handle variations on the same pattern', function() { var date = dateFormat.parse('MM-yyyy', '09-2015'); verifyDate(date, { year: 2015, month: 8 }); date = dateFormat.parse('yyyy MM', '2015 09'); verifyDate(date, { year: 2015, month: 8 }); date = dateFormat.parse('MM, yyyy.', '09, 2015.'); verifyDate(date, { year: 2015, month: 8 }); }); it('should match all the date parts', function() { var date = dateFormat.parse('dd', '21'); verifyDate(date, { day: 21 }); date = dateFormat.parse('hh', '12'); verifyDate(date, { hours: 12 }); date = dateFormat.parse('mm', '34'); verifyDate(date, { minutes: 34 }); date = dateFormat.parse('ss', '59'); verifyDate(date, { seconds: 59 }); date = dateFormat.parse('ss.SSS', '23.452'); verifyDate(date, { seconds: 23, milliseconds: 452 }); date = dateFormat.parse('hh:mm O', '05:23 +1000'); verifyDate(date, { hours: 15, minutes: 23 }); date = dateFormat.parse('hh:mm O', '05:23 -200'); verifyDate(date, { hours: 3, minutes: 23 }); date = dateFormat.parse('hh:mm O', '05:23 +0930'); verifyDate(date, { hours: 14, minutes: 53 }); }); }); describe('with a date formatted by this library', function() { var testDate = new Date(); testDate.setUTCFullYear(2018); testDate.setUTCMonth(8); testDate.setUTCDate(13); testDate.setUTCHours(18); testDate.setUTCMinutes(10); testDate.setUTCSeconds(12); testDate.setUTCMilliseconds(392); it('should format and then parse back to the same date', function() { dateFormat.parse( dateFormat.ISO8601_WITH_TZ_OFFSET_FORMAT, dateFormat(dateFormat.ISO8601_WITH_TZ_OFFSET_FORMAT, testDate) ).should.eql(testDate); dateFormat.parse( dateFormat.ISO8601_FORMAT, dateFormat(dateFormat.ISO8601_FORMAT, testDate) ).should.eql(testDate); dateFormat.parse( dateFormat.DATETIME_FORMAT, dateFormat(dateFormat.DATETIME_FORMAT, testDate) ).should.eql(testDate); dateFormat.parse( dateFormat.ABSOLUTETIME_FORMAT, dateFormat(dateFormat.ABSOLUTETIME_FORMAT, testDate) ).should.eql(testDate); }); }); });