import { describe, expect, it } from 'vitest' import { displayTemporalValue, parseTemporalValue, temporalInputValue } from '../temporal-value' const formats = { dateFormat: 'DD/MM/YYYY', timeFormat: 'HH:mm' } describe('settings-dependent temporal interpretation', () => { it('keeps ISO stable while interpreting only the current free-form pattern', () => { expect(parseTemporalValue('2026-09-30', 'date', formats)).toBe('2026-09-30') expect(parseTemporalValue('30/09/2026', 'date', formats)).toBe('2026-09-30') expect(parseTemporalValue('03/04/2026', 'date', formats)).toBe('2026-04-03') const changed = { ...formats, dateFormat: 'MM/DD/YYYY' } expect(parseTemporalValue('30/09/2026', 'date', changed)).toBeUndefined() expect(parseTemporalValue('03/04/2026', 'date', changed)).toBe('2026-03-04') expect(displayTemporalValue('2026-09-30', 'date', changed)).toBe('09/30/2026') }) it('rejects impossible, partial and mismatched dates without a native Date fallback', () => { for (const value of ['31/02/2026', '9/30/2026', '2026-02-30', 'garbage']) expect(parseTemporalValue(value, 'date', formats)).toBeUndefined() expect(parseTemporalValue('2026', 'date', { ...formats, dateFormat: 'YYYY' })).toBeUndefined() expect(parseTemporalValue('29/02/2024', 'date', formats)).toBe('2024-02-29') expect(parseTemporalValue('September 30, 2026', 'date', { ...formats, dateFormat: 'MMMM D, YYYY' })).toBe('2026-09-30') }) it('uses UTC for zone-free text and retains explicit offsets and hidden precision during edits', () => { expect(parseTemporalValue('30/09/2026 14:00', 'datetime', formats)).toBe('2026-09-30T14:00:00.000Z') expect(parseTemporalValue('2026-09-30T23:30:00-01:00', 'datetime', formats)).toBe('2026-09-30T23:30:00-01:00') expect(displayTemporalValue('2026-09-30T23:30:12.123-01:00', 'datetime', formats)).toBe('30/09/2026 23:30') expect(temporalInputValue('01/10/2026 14:00', 'datetime', formats, '2026-09-30T23:30:12.123-01:00')).toBe('2026-10-01T14:00:12.123-01:00') expect(parseTemporalValue('2026-02-30T24:00Z', 'datetime', formats)).toBeUndefined() expect(parseTemporalValue('30/09/2026 24:00', 'datetime', formats)).toBeUndefined() }) it('retains hidden minutes for an hour-only display, without mistaking literals for tokens', () => { const hourOnly = { dateFormat: 'YYYY-MM-DD', timeFormat: 'HH' } expect(temporalInputValue('2026-10-01 15', 'datetime', hourOnly, '2026-09-30T14:37:12Z')).toBe('2026-10-01T15:37:12Z') expect(temporalInputValue('2026-10-01 15h', 'datetime', { ...hourOnly, timeFormat: 'HH[h]' }, '2026-09-30T14:37:12Z')).toBe('2026-10-01T15:37:12Z') expect(temporalInputValue('2026-10-01 15m', 'datetime', { ...hourOnly, timeFormat: 'HH[m]' }, '2026-09-30T14:37:12Z')).toBe('2026-10-01T15:37:12Z') }) it('retains hidden seconds and fractions when format text contains literal token letters', () => { for (const [timeFormat, text] of [['HH:mm [seconds]', '14:37 seconds'], ['HH:mm [SSS]', '14:37 SSS']]) { expect(temporalInputValue(`01/10/2026 ${text}`, 'datetime', { ...formats, timeFormat: timeFormat! }, '2026-09-30T14:37:12.123Z')).toBe('2026-10-01T14:37:12.123Z') } }) })