date-with-offset
Version:
Work with timezone-aware dates
122 lines (103 loc) • 4.4 kB
JavaScript
var assert = require("assert"),
DateWithOffset = require('../');
function assertSameInstant(actual, expected) {
actual = new Date(actual);
expected = new Date(expected);
assert.equal(
+actual,
+expected,
"expected " + actual.toISOString() +
" to be the same time as " + expected.toISOString()
);
}
describe('DateWithOffset', function() {
var halfNoonUTC = new Date("2008-12-31T12:30Z"),
chatham = {
toString: function() { return 'Chatham (+12:45)'; },
valueOf: function() { return 765; }
},
inChatham;
beforeEach(function() {
inChatham = new DateWithOffset(halfNoonUTC, chatham);
});
describe('#toString', function() {
it('returns a Date string in the correct offset', function() {
var expected = 'Thu Jan 01 2009 01:15:00 GMT+1245';
assert.equal(inChatham.toString(), expected);
});
});
describe('#valueOf', function() {
it('returns the same moment in time', function() {
assertSameInstant(inChatham, halfNoonUTC);
});
});
describe('#offset', function() {
it('returns the original offset', function() {
assert.strictEqual(inChatham.offset(), chatham);
});
});
describe('#getTimezoneOffset', function() {
it('returns the inverse of the value of the supplied offset', function() {
assert.equal(inChatham.getTimezoneOffset(), -765);
});
});
describe('#withOffset', function() {
it('returns a new DateWithOffset representing the same time with the given offset', function() {
var inParis = inChatham.withOffset(60);
assert.ok(inParis instanceof DateWithOffset, 'expected ' + inParis + ' to be a DateWithOffset');
assertSameInstant(inParis, inChatham);
assert.equal(inParis.offset(), 60);
assert.equal(inParis.getHours(), 13);
});
});
function assertGetter(property, expectedValue) {
describe('#get' + property, function() {
it('returns the correct value', function() {
var actual = inChatham['get' + property]();
assert.equal(actual, expectedValue);
});
});
}
assertGetter('Date', 1);
assertGetter('Day', 4);
assertGetter('FullYear', 2009);
assertGetter('Hours', 1);
assertGetter('Milliseconds', 0);
assertGetter('Minutes', 15);
assertGetter('Month', 0);
assertGetter('Seconds', 0);
assertGetter('Year', 109);
assertGetter('Time', halfNoonUTC.getTime());
assertGetter('UTCDate', halfNoonUTC.getUTCDate());
assertGetter('UTCDay', halfNoonUTC.getUTCDay());
assertGetter('UTCFullYear', halfNoonUTC.getUTCFullYear());
assertGetter('UTCHours', halfNoonUTC.getUTCHours());
assertGetter('UTCMilliseconds', halfNoonUTC.getUTCMilliseconds());
assertGetter('UTCMinutes', halfNoonUTC.getUTCMinutes());
assertGetter('UTCMonth', halfNoonUTC.getUTCMonth());
assertGetter('UTCSeconds', halfNoonUTC.getUTCSeconds());
function assertSetter(property, newValue, expectedNewISOString) {
describe('#set' + property, function() {
it('updates the date', function() {
inChatham['set' + property](newValue);
assertSameInstant(inChatham, expectedNewISOString);
});
});
}
assertSetter('Date', 4, '2009-01-04T01:15:00+1245');
assertSetter('FullYear', 2010, '2010-01-01T01:15:00+1245');
assertSetter('Hours', 17, '2009-01-01T17:15:00+1245');
assertSetter('Milliseconds', 230, '2009-01-01T01:15:00.230+1245');
assertSetter('Minutes', 44, '2009-01-01T01:44:00+1245');
assertSetter('Month', 7, '2009-08-01T01:15:00+1245');
assertSetter('Seconds', 19, '2009-01-01T01:15:19+1245');
assertSetter('Year', 102, '2002-01-01T01:15:00+1245');
assertSetter('Time', (new Date('2017-03-15T11:52:18+1245')).getTime(), '2017-03-15T11:52:18+1245');
assertSetter('UTCDate', 4, '2008-12-04T12:30:00.000Z');
assertSetter('UTCFullYear', 2010, '2010-12-31T12:30:00.000Z');
assertSetter('UTCHours', 17, '2008-12-31T17:30:00.000Z');
assertSetter('UTCMilliseconds', 230, '2008-12-31T12:30:00.230Z');
assertSetter('UTCMinutes', 44, '2008-12-31T12:44:00.000Z');
assertSetter('UTCMonth', 7, '2008-08-31T12:30:00.000Z');
assertSetter('UTCSeconds', 19, '2008-12-31T12:30:19.000Z');
});