import {DAY, HOUR} from '@/units.js'; import {describe, it, expect} from 'vitest'; import {ZonedDateTime} from '@/'; import {TimeZone} from '@clarify/zone-data'; import importer from '@clarify/zone-data/importer'; describe('ZonedDateTime#add', () => { describe('addDay', () => { it('adds day', async () => { let zone = new TimeZone('Test/AddHours', [1679954400000, null], [-120, -60]); let date = new ZonedDateTime(1679954400000 - DAY, zone); expect(date.toJSON()).toEqual('2023-03-27T00:00:00.000+02:00[Test/AddHours]'); expect(date.hour).toEqual(0); expect(date.day).toEqual(27); date = date.add({days: 1}); expect(date.hour).toEqual(0); expect(date.day).toEqual(28); expect(date.toJSON()).toEqual('2023-03-28T00:00:00.000+01:00[Test/AddHours]'); }); it('adds day - 1', async () => { let zone = new TimeZone('Test/AddHours', [1679958000000, null], [-60, -120]); let date = new ZonedDateTime(1679958000000 - DAY, zone); expect(date.hour).toEqual(0); expect(date.day).toEqual(27); date = date.add({days: 1}); expect(date.hour).toEqual(1); expect(date.day).toEqual(28); }); it('adds month - 1', async () => { let zone = new TimeZone('Test/AddHours', [1679958000000, null], [-60, -120]); let date = new ZonedDateTime(Date.parse('2023-02-27T23:00:00.000Z'), zone); expect(date.hour).toEqual(0); expect(date.month).toEqual(2); expect(date.day).toEqual(28); date = date.add({months: 1}); expect(date.month).toEqual(3); expect(date.hour).toEqual(1); expect(date.day).toEqual(28); }); it('adds day - 1', async () => { let zone = new TimeZone('Test/AddHours', [1679972400000, null], [-60, -120]); let date = new ZonedDateTime(1679972400000 - HOUR * 4, zone); expect(date.toJSON()).toEqual('2023-03-28T00:00:00.000+01:00[Test/AddHours]'); date = date.add({days: 1}); expect(date.toJSON()).toEqual('2023-03-29T00:00:00.000+02:00[Test/AddHours]'); }); }); describe('Europe/Oslo', () => { it('adds days', async () => { let zone = await importer['Europe/Oslo'](); let date = new ZonedDateTime(Date.parse('1975-07-28T18:51:40.000Z'), zone); date = date.add({days: 180}); expect(date.toJSON()).toEqual('1976-01-24T19:51:40.000+01:00[Europe/Paris]'); }); it('adds hours', async () => { let zone = new TimeZone('Test/AddHours', [1679983200000, null], [-180, -120]); let date = new ZonedDateTime(1679983200000 - 1, zone); date = date.with({ minute: 0, second: 0, millisecond: 0, }); expect(date.toJSON()).toEqual('2023-03-28T08:00:00.000+03:00[Test/AddHours]'); date = date.add({hours: 1}); expect(date.toJSON()).toEqual('2023-03-28T08:00:00.000+02:00[Test/AddHours]'); date = date.add({hours: 1}); expect(date.toJSON()).toEqual('2023-03-28T09:00:00.000+02:00[Test/AddHours]'); }); it('adds hours', async () => { let zone = new TimeZone('Test/AddHours', [1679983200000, null], [-60, -120]); let date = new ZonedDateTime(1679983200000 - 1, zone); date = date.with({ minute: 0, second: 0, millisecond: 0, }); expect(date.toJSON()).toEqual('2023-03-28T06:00:00.000+01:00[Test/AddHours]'); date = date.add({hours: 1}); expect(date.toJSON()).toEqual('2023-03-28T08:00:00.000+02:00[Test/AddHours]'); date = date.add({hours: 1}); expect(date.toJSON()).toEqual('2023-03-28T09:00:00.000+02:00[Test/AddHours]'); }); it('adds hours (+60 offset)', async () => { let zone = new TimeZone('Test/AddHours', [1679983200000, null], [180, 180 + 60]); let date = new ZonedDateTime(1679983200000 - 1, zone); date = date.with({ minute: 0, second: 0, millisecond: 0, }); expect(date.toJSON()).toEqual('2023-03-28T02:00:00.000-03:00[Test/AddHours]'); date = date.add({hours: 1}); expect(date.toJSON()).toEqual('2023-03-28T02:00:00.000-04:00[Test/AddHours]'); date = date.add({hours: 1}); expect(date.toJSON()).toEqual('2023-03-28T03:00:00.000-04:00[Test/AddHours]'); }); it('adds hours (15 min offset)', async () => { let zone = new TimeZone('Test/AddHours', [1679983200000, null], [120, 120 + 15]); let date = new ZonedDateTime(1679983200000 - 1, zone); date = date.with({ minute: 0, second: 0, millisecond: 0, }); expect(date.toJSON()).toEqual('2023-03-28T03:00:00.000-02:00[Test/AddHours]'); date = date.add({hours: 1}); expect(date.toJSON()).toEqual('2023-03-28T03:45:00.000-02:15[Test/AddHours]'); date = date.add({hours: 1}); expect(date.toJSON()).toEqual('2023-03-28T04:45:00.000-02:15[Test/AddHours]'); }); it('adds hours (shifted)', async () => { let zone = new TimeZone('Test/AddHours', [1679983200000, null], [120, 180]); let date = new ZonedDateTime(1679983200000 - 1, zone); date = date.with({ minute: 0, second: 0, millisecond: 0, }); expect(date.toJSON()).toEqual('2023-03-28T03:00:00.000-02:00[Test/AddHours]'); date = date.add({hours: 1}); expect(date.toJSON()).toEqual('2023-03-28T03:00:00.000-03:00[Test/AddHours]'); date = date.add({hours: 1}); expect(date.toJSON()).toEqual('2023-03-28T04:00:00.000-03:00[Test/AddHours]'); }); it('adds hours (shifted, 30 min)', async () => { let zone = new TimeZone('Test/AddHours', [1679983200000, null], [120, 150]); let date = new ZonedDateTime(1679983200000 - 1, zone); date = date.with({ minute: 0, second: 0, millisecond: 0, }); expect(date.toJSON()).toEqual('2023-03-28T03:00:00.000-02:00[Test/AddHours]'); date = date.add({hours: 1}); expect(date.toJSON()).toEqual('2023-03-28T03:30:00.000-02:30[Test/AddHours]'); date = date.add({hours: 1}); expect(date.toJSON()).toEqual('2023-03-28T04:30:00.000-02:30[Test/AddHours]'); }); }); });