import { describe, it, expect } from 'vitest'; import { calculateRaceDates, getNextWeekday, ScheduleConfig } from './ScheduleCalculator'; describe('ScheduleCalculator', () => { describe('calculateRaceDates', () => { it('should return empty array if no weekdays or rounds', () => { const config: ScheduleConfig = { weekdays: [], frequency: 'weekly', rounds: 10, startDate: new Date('2024-01-01'), }; expect(calculateRaceDates(config).raceDates).toHaveLength(0); }); it('should schedule weekly races', () => { const config: ScheduleConfig = { weekdays: ['Mon'], frequency: 'weekly', rounds: 3, startDate: new Date('2024-01-01'), // Monday }; const result = calculateRaceDates(config); expect(result.raceDates).toHaveLength(3); expect(result.raceDates[0].getDay()).toBe(1); expect(result.raceDates[1].getDay()).toBe(1); expect(result.raceDates[2].getDay()).toBe(1); // Check dates are 7 days apart const diff = result.raceDates[1].getTime() - result.raceDates[0].getTime(); expect(diff).toBe(7 * 24 * 60 * 60 * 1000); }); it('should schedule bi-weekly races', () => { const config: ScheduleConfig = { weekdays: ['Mon'], frequency: 'everyNWeeks', intervalWeeks: 2, rounds: 2, startDate: new Date('2024-01-01'), }; const result = calculateRaceDates(config); expect(result.raceDates).toHaveLength(2); const diff = result.raceDates[1].getTime() - result.raceDates[0].getTime(); expect(diff).toBe(14 * 24 * 60 * 60 * 1000); }); it('should distribute races between start and end date', () => { const config: ScheduleConfig = { weekdays: ['Mon', 'Wed', 'Fri'], frequency: 'weekly', rounds: 2, startDate: new Date('2024-01-01'), // Mon endDate: new Date('2024-01-15'), // Mon }; const result = calculateRaceDates(config); expect(result.raceDates).toHaveLength(2); // Use getTime() to avoid timezone issues in comparison const expectedDate = new Date('2024-01-01'); expectedDate.setHours(12, 0, 0, 0); expect(result.raceDates[0].getTime()).toBe(expectedDate.getTime()); }); }); describe('getNextWeekday', () => { it('should return the next Monday', () => { const from = new Date('2024-01-01'); // Monday const next = getNextWeekday(from, 'Mon'); expect(next.getDay()).toBe(1); expect(next.getDate()).toBe(8); }); }); });