75 lines
2.9 KiB
TypeScript
75 lines
2.9 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { SeasonScheduleGenerator } from './SeasonScheduleGenerator';
|
|
import { SeasonSchedule } from '../value-objects/SeasonSchedule';
|
|
import { RecurrenceStrategy } from '../value-objects/RecurrenceStrategy';
|
|
import { RaceTimeOfDay } from '../value-objects/RaceTimeOfDay';
|
|
import { WeekdaySet } from '../value-objects/WeekdaySet';
|
|
import { LeagueTimezone } from '../value-objects/LeagueTimezone';
|
|
import { MonthlyRecurrencePattern } from '../value-objects/MonthlyRecurrencePattern';
|
|
|
|
describe('SeasonScheduleGenerator', () => {
|
|
it('should generate weekly slots', () => {
|
|
const startDate = new Date(2024, 0, 1); // Monday, Jan 1st 2024
|
|
const schedule = new SeasonSchedule({
|
|
startDate,
|
|
plannedRounds: 4,
|
|
timeOfDay: new RaceTimeOfDay(20, 0),
|
|
timezone: LeagueTimezone.create('UTC'),
|
|
recurrence: RecurrenceStrategy.weekly(WeekdaySet.fromArray(['Mon'])),
|
|
});
|
|
|
|
const slots = SeasonScheduleGenerator.generateSlots(schedule);
|
|
|
|
expect(slots).toHaveLength(4);
|
|
expect(slots[0].roundNumber).toBe(1);
|
|
expect(slots[0].scheduledAt.getHours()).toBe(20);
|
|
expect(slots[0].scheduledAt.getMinutes()).toBe(0);
|
|
expect(slots[0].scheduledAt.getFullYear()).toBe(2024);
|
|
expect(slots[0].scheduledAt.getMonth()).toBe(0);
|
|
expect(slots[0].scheduledAt.getDate()).toBe(1);
|
|
|
|
expect(slots[1].roundNumber).toBe(2);
|
|
expect(slots[1].scheduledAt.getDate()).toBe(8);
|
|
expect(slots[2].roundNumber).toBe(3);
|
|
expect(slots[2].scheduledAt.getDate()).toBe(15);
|
|
expect(slots[3].roundNumber).toBe(4);
|
|
expect(slots[3].scheduledAt.getDate()).toBe(22);
|
|
});
|
|
|
|
it('should generate slots every 2 weeks', () => {
|
|
const startDate = new Date(2024, 0, 1);
|
|
const schedule = new SeasonSchedule({
|
|
startDate,
|
|
plannedRounds: 2,
|
|
timeOfDay: new RaceTimeOfDay(20, 0),
|
|
timezone: LeagueTimezone.create('UTC'),
|
|
recurrence: RecurrenceStrategy.everyNWeeks(2, WeekdaySet.fromArray(['Mon'])),
|
|
});
|
|
|
|
const slots = SeasonScheduleGenerator.generateSlots(schedule);
|
|
|
|
expect(slots).toHaveLength(2);
|
|
expect(slots[0].scheduledAt.getDate()).toBe(1);
|
|
expect(slots[1].scheduledAt.getDate()).toBe(15);
|
|
});
|
|
|
|
it('should generate monthly slots (nth weekday)', () => {
|
|
const startDate = new Date(2024, 0, 1);
|
|
const schedule = new SeasonSchedule({
|
|
startDate,
|
|
plannedRounds: 2,
|
|
timeOfDay: new RaceTimeOfDay(20, 0),
|
|
timezone: LeagueTimezone.create('UTC'),
|
|
recurrence: RecurrenceStrategy.monthlyNthWeekday(MonthlyRecurrencePattern.create(1, 'Mon')),
|
|
});
|
|
|
|
const slots = SeasonScheduleGenerator.generateSlots(schedule);
|
|
|
|
expect(slots).toHaveLength(2);
|
|
expect(slots[0].scheduledAt.getMonth()).toBe(0);
|
|
expect(slots[0].scheduledAt.getDate()).toBe(1);
|
|
expect(slots[1].scheduledAt.getMonth()).toBe(1);
|
|
expect(slots[1].scheduledAt.getDate()).toBe(5);
|
|
});
|
|
});
|