import {describe, expect, it} from 'vitest' import {dayRangeRole, normalizeRange, resolveRangeBounds} from './dateRange' describe('dateRange', () => { describe('normalizeRange', () => { it('keeps an already ordered pair', () => { expect(normalizeRange('2026-05-19', '2026-05-25')).toEqual({start: '2026-05-19', end: '2026-05-25'}) }) it('swaps a reversed pair', () => { expect(normalizeRange('2026-05-25', '2026-05-19')).toEqual({start: '2026-05-19', end: '2026-05-25'}) }) it('handles an equal pair', () => { expect(normalizeRange('2026-05-19', '2026-05-19')).toEqual({start: '2026-05-19', end: '2026-05-19'}) }) }) describe('resolveRangeBounds', () => { it('returns null without a start', () => { expect(resolveRangeBounds(null, null, null)).toBeNull() }) it('returns a single-point range when only start is set', () => { expect(resolveRangeBounds('2026-05-19', null, null)).toEqual({lo: '2026-05-19', hi: '2026-05-19'}) }) it('orders start and committed end', () => { expect(resolveRangeBounds('2026-05-19', '2026-05-25', null)).toEqual({lo: '2026-05-19', hi: '2026-05-25'}) }) it('uses preview when end is not set', () => { expect(resolveRangeBounds('2026-05-19', null, '2026-05-22')).toEqual({lo: '2026-05-19', hi: '2026-05-22'}) }) it('inverts when preview is before start', () => { expect(resolveRangeBounds('2026-05-19', null, '2026-05-10')).toEqual({lo: '2026-05-10', hi: '2026-05-19'}) }) it('prioritises committed end over preview', () => { expect(resolveRangeBounds('2026-05-19', '2026-05-25', '2026-05-30')).toEqual({lo: '2026-05-19', hi: '2026-05-25'}) }) }) describe('dayRangeRole', () => { const bounds = {lo: '2026-05-19', hi: '2026-05-25'} it('returns none without bounds', () => { expect(dayRangeRole('2026-05-20', null)).toBe('none') }) it('returns single when lo === hi and matches', () => { expect(dayRangeRole('2026-05-19', {lo: '2026-05-19', hi: '2026-05-19'})).toBe('single') expect(dayRangeRole('2026-05-20', {lo: '2026-05-19', hi: '2026-05-19'})).toBe('none') }) it('returns start, end and in-range', () => { expect(dayRangeRole('2026-05-19', bounds)).toBe('start') expect(dayRangeRole('2026-05-25', bounds)).toBe('end') expect(dayRangeRole('2026-05-22', bounds)).toBe('in-range') }) it('returns none outside the bounds', () => { expect(dayRangeRole('2026-05-10', bounds)).toBe('none') expect(dayRangeRole('2026-05-30', bounds)).toBe('none') }) }) })