Skip to content

Commit 1c0ddeb

Browse files
committed
test: add tests for defaultDate option in parse() and isValid()
Cover leap-day validation, day-range validation, timezone offset precedence, 12-hour component defaults, buddhist calendar interaction, and regression for hour24:h24 with defaultDate.H missing from format.
1 parent 862161f commit 1c0ddeb

2 files changed

Lines changed: 61 additions & 0 deletions

File tree

tests/isValid.spec.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,4 +149,30 @@ describe('options', () => {
149149
const dateString = format(new Date(-3944621033000), 'YYYY-MM-DD[T]HH:mm:ss ZZ');
150150
expect(isValid(dateString, 'YYYY-MM-DD[T]HH:mm:ss ZZ')).toBe(true);
151151
});
152+
153+
test('defaultDate: year for leap day validation', () => {
154+
expect(isValid('02-29', 'MM-DD', { defaultDate: { Y: 2024 } })).toBe(true);
155+
expect(isValid('02-29', 'MM-DD', { defaultDate: { Y: 2023 } })).toBe(false);
156+
expect(isValid('02-29', 'MM-DD')).toBe(false); // defaults to 1970 (non-leap year)
157+
});
158+
159+
test('defaultDate: month for day range validation', () => {
160+
expect(isValid('29', 'D', { defaultDate: { Y: 2024, M: 2 } })).toBe(true);
161+
expect(isValid('29', 'D', { defaultDate: { Y: 2023, M: 2 } })).toBe(false);
162+
expect(isValid('31', 'D', { defaultDate: { Y: 2024, M: 4 } })).toBe(false); // April has 30 days
163+
});
164+
165+
test('defaultDate: timezone offset (Z) validation', () => {
166+
expect(isValid('12:00', 'HH:mm', { defaultDate: { Y: 2024, M: 1, D: 1, Z: 0 } })).toBe(true);
167+
expect(isValid('12:00', 'HH:mm', { defaultDate: { Y: 2024, M: 1, D: 1, Z: -999 } })).toBe(false);
168+
});
169+
170+
test('defaultDate: H out of range', () => {
171+
expect(isValid('30', 'mm', { defaultDate: { Y: 2024, M: 1, D: 1, H: 25 } })).toBe(false);
172+
expect(isValid('30', 'mm', { defaultDate: { Y: 2024, M: 1, D: 1, H: 0 } })).toBe(true);
173+
});
174+
175+
test('defaultDate: H not in format with hour24: h24 (regression)', () => {
176+
expect(isValid('30', 'mm', { defaultDate: { Y: 2024, M: 1, D: 1 }, hour24: 'h24' })).toBe(true);
177+
});
152178
});

tests/parse.spec.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,41 @@ describe('options', () => {
558558
expect(Number.isNaN(parse('2025-01-01 00:00:00', 'YYYY-MM-DD HH:mm:ss', { timeZone: dummyTimeZone }).getTime())).toBe(true);
559559
expect(Number.isNaN(parse('2025-01-01 00:00:00', 'YYYY-MM-DD HH:mm:ss', { timeZone: 'dummyTimeZone' }).getTime())).toBe(true);
560560
});
561+
562+
test('defaultDate: date components', () => {
563+
expect(parse('12:30', 'HH:mm', { defaultDate: { Y: 2024, M: 3, D: 15 } }))
564+
.toEqual(new Date(2024, 2, 15, 12, 30));
565+
expect(parse('03-15', 'MM-DD', { defaultDate: { Y: 2024 } }))
566+
.toEqual(new Date(2024, 2, 15));
567+
});
568+
569+
test('defaultDate: time components', () => {
570+
expect(parse('2024-03-15', 'YYYY-MM-DD', { defaultDate: { H: 10, m: 30, s: 45 } }))
571+
.toEqual(new Date(2024, 2, 15, 10, 30, 45));
572+
});
573+
574+
test('defaultDate: timezone offset (Z)', () => {
575+
// Z: -540 means UTC+9 (JST): minutes become 30+(-540)=-510, so Date.UTC(2024,2,15,12,-510) = 03:30 UTC
576+
expect(parse('12:30', 'HH:mm', { defaultDate: { Y: 2024, M: 3, D: 15, Z: -540 } }))
577+
.toEqual(new Date(Date.UTC(2024, 2, 15, 3, 30)));
578+
});
579+
580+
test('defaultDate: Z takes precedence over timeZone option', () => {
581+
// Z: -540 (UTC+9) overrides timeZone: 'UTC'; 12:30 local → 03:30 UTC
582+
expect(parse('12:30', 'HH:mm', { defaultDate: { Y: 2024, M: 3, D: 15, Z: -540 }, timeZone: 'UTC' }))
583+
.toEqual(new Date(Date.UTC(2024, 2, 15, 3, 30)));
584+
});
585+
586+
test('defaultDate: 12-hour components (h and A)', () => {
587+
// base.A=1 (PM), base.h=2 → hour = 1*12 + 2 = 14 (2 PM)
588+
expect(parse('30', 'mm', { defaultDate: { Y: 2024, M: 3, D: 15, h: 2, A: 1 } }))
589+
.toEqual(new Date(2024, 2, 15, 14, 30));
590+
});
591+
592+
test('defaultDate: calendar: buddhist interaction', () => {
593+
expect(parse('2567-03-15', 'YYYY-MM-DD', { calendar: 'buddhist' }))
594+
.toEqual(new Date(2024, 2, 15));
595+
});
561596
});
562597

563598
describe('timeZone Los_Angeles', () => {

0 commit comments

Comments
 (0)