import {describe, it, expect} from 'vitest'; import {ISO8601Result, Zulu} from '@/parse.js'; describe('Parse', () => { describe('date segment', () => { it('adds day', () => { let result = ISO8601Result.parseDateTime('2024-05-04'); expect(result!.date).toEqual({year: 2024, month: 5, day: 4}); let withoutSeparator = ISO8601Result.parseDateTime('20240504'); expect(withoutSeparator!.date).toEqual({year: 2024, month: 5, day: 4}); }); it('rejects mixing date separators', () => { expect(ISO8601Result.parseDateTime('2024-0504')).toEqual(null); expect(ISO8601Result.parseDateTime('202405-04')).toEqual(null); }); }); describe('time segment', () => { it('just segment', () => { let simple = ISO8601Result.parseDateTime('T12:13:14'); expect(simple!.time).toEqual({hour: 12, minute: 13, second: 14, millisecond: 0}); let withoutSeparator = ISO8601Result.parseDateTime('T121314'); expect(withoutSeparator!.time).toEqual({hour: 12, minute: 13, second: 14, millisecond: 0}); expect(ISO8601Result.parseDateTime('12:13:14')).toEqual(null); }); it('time segment', () => { let simple = ISO8601Result.parseDateTime('2024-05-04T12:12'); expect(simple!.time).toEqual({hour: 12, minute: 12, second: 0, millisecond: 0}); let hourOnly = ISO8601Result.parseDateTime('2024-05-04T12'); expect(hourOnly!.time).toEqual({hour: 12, minute: 0, second: 0, millisecond: 0}); let result = ISO8601Result.parseDateTime('2024-05-04T12:13:14'); expect(result!.time).toEqual({hour: 12, minute: 13, second: 14, millisecond: 0}); let msResult = ISO8601Result.parseDateTime('2024-05-04T12:13:14.123'); expect(msResult!.time).toEqual({hour: 12, minute: 13, second: 14, millisecond: 123}); }); it('rejects mixing time separators', () => { expect(ISO8601Result.parseDateTime('T12:1314')).toEqual(null); expect(ISO8601Result.parseDateTime('T1213:14')).toEqual(null); expect(ISO8601Result.parseDateTime('T12:1314.123')).toEqual(null); }); it('requires leading T', () => { expect(ISO8601Result.parseDateTime('12:13:14')).toEqual(null); }); }); describe('offset', () => { it('offset', () => { let simple = ISO8601Result.parseDateTime('2024-05-04T12:13+09'); expect(simple!.offset).toEqual(32400000); let withMinutes = ISO8601Result.parseDateTime('2024-05-04T12:13+08:15'); expect(withMinutes!.offset).toEqual(29700000); let minusMinutes = ISO8601Result.parseDateTime('2024-05-04T12:13-08:15'); expect(minusMinutes!.offset).toEqual(-29700000); let simpleTime = ISO8601Result.parseDateTime('2024-05-04T12+09'); expect(simpleTime!.offset).toEqual(32400000); }); it('rejects offset without time', () => { expect(ISO8601Result.parseDateTime('2024-05-04Z')).toEqual(null); expect(ISO8601Result.parseDateTime('2024-05-04+04:00')).toEqual(null); expect(ISO8601Result.parseDateTime('2024-05-04T+04:00')).toEqual(null); }); it('time zone designator', () => { let simple = ISO8601Result.parseDateTime('2024-05-04T12:13Z'); expect(simple!.offset).toEqual(Zulu); let simpleTime = ISO8601Result.parseDateTime('2024-05-04T12Z'); expect(simpleTime!.offset).toEqual(Zulu); }); it('time zone', () => { let simple = ISO8601Result.parseDateTime('2024-05-04T12:13[Europe/Oslo]'); expect(simple!.timeZone).toEqual('Europe/Oslo'); }); it('complex', () => { let simple = ISO8601Result.parseDateTime('2024-05-04T12:13[Europe/Oslo]'); expect(simple!.timeZone).toEqual('Europe/Oslo'); }); }); });