resolve todos in website and api
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
|
||||
import {
|
||||
applyScoringPresetToTimings,
|
||||
type ScoringPresetTimings,
|
||||
} from '@core/racing/domain/services/ScoringPresetTimingService';
|
||||
|
||||
describe('ScoringPresetTimingService', () => {
|
||||
it('applies sprint/double style presets with two sessions and sprint minutes', () => {
|
||||
const initial: ScoringPresetTimings = {
|
||||
practiceMinutes: 5,
|
||||
qualifyingMinutes: 10,
|
||||
mainRaceMinutes: 20,
|
||||
sessionCount: 1,
|
||||
};
|
||||
|
||||
const result = applyScoringPresetToTimings('Sprint-Main-Double', initial);
|
||||
|
||||
expect(result.practiceMinutes).toBe(15);
|
||||
expect(result.qualifyingMinutes).toBe(20);
|
||||
expect(result.sprintRaceMinutes).toBe(20);
|
||||
expect(result.mainRaceMinutes).toBe(35);
|
||||
expect(result.sessionCount).toBe(2);
|
||||
});
|
||||
|
||||
it('applies endurance/long style presets with single main session and no sprint', () => {
|
||||
const initial: ScoringPresetTimings = {
|
||||
practiceMinutes: 10,
|
||||
qualifyingMinutes: 15,
|
||||
sprintRaceMinutes: 10,
|
||||
mainRaceMinutes: 30,
|
||||
sessionCount: 2,
|
||||
};
|
||||
|
||||
const result = applyScoringPresetToTimings('Endurance-Main', initial);
|
||||
|
||||
expect(result.practiceMinutes).toBe(30);
|
||||
expect(result.qualifyingMinutes).toBe(30);
|
||||
expect(result.mainRaceMinutes).toBe(90);
|
||||
expect(result.sessionCount).toBe(1);
|
||||
expect(result.sprintRaceMinutes).toBeUndefined();
|
||||
});
|
||||
|
||||
it('applies default timing rules for non-matching presets and clears sprint minutes', () => {
|
||||
const initial: ScoringPresetTimings = {
|
||||
practiceMinutes: 10,
|
||||
qualifyingMinutes: 15,
|
||||
sprintRaceMinutes: 10,
|
||||
mainRaceMinutes: 30,
|
||||
sessionCount: 2,
|
||||
};
|
||||
|
||||
const result = applyScoringPresetToTimings('club-default', initial);
|
||||
|
||||
expect(result.practiceMinutes).toBe(20);
|
||||
expect(result.qualifyingMinutes).toBe(30);
|
||||
expect(result.mainRaceMinutes).toBe(40);
|
||||
expect(result.sessionCount).toBe(1);
|
||||
expect(result.sprintRaceMinutes).toBeUndefined();
|
||||
});
|
||||
|
||||
it('treats pattern id matching as case-insensitive', () => {
|
||||
const initial: ScoringPresetTimings = {};
|
||||
|
||||
const lower = applyScoringPresetToTimings('endurance-main', initial);
|
||||
const upper = applyScoringPresetToTimings('ENDURANCE-MAIN', initial);
|
||||
|
||||
expect(lower).toEqual(upper);
|
||||
});
|
||||
});
|
||||
56
core/racing/domain/services/ScoringPresetTimingService.ts
Normal file
56
core/racing/domain/services/ScoringPresetTimingService.ts
Normal file
@@ -0,0 +1,56 @@
|
||||
export type ScoringPresetTimings = {
|
||||
practiceMinutes?: number;
|
||||
qualifyingMinutes?: number;
|
||||
sprintRaceMinutes?: number;
|
||||
mainRaceMinutes?: number;
|
||||
sessionCount?: number;
|
||||
roundsPlanned?: number;
|
||||
raceDayOfWeek?: number;
|
||||
raceTimeUtc?: string;
|
||||
};
|
||||
|
||||
/**
|
||||
* Apply high-level scoring preset semantics to league/session timings.
|
||||
*
|
||||
* This encapsulates the mapping between logical scoring presets (sprint, endurance, etc.)
|
||||
* and their default timing configuration so that UI layers do not need to duplicate
|
||||
* or interpret preset IDs directly.
|
||||
*/
|
||||
export function applyScoringPresetToTimings(
|
||||
patternId: string,
|
||||
currentTimings: ScoringPresetTimings,
|
||||
): ScoringPresetTimings {
|
||||
const lowerPresetId = patternId.toLowerCase();
|
||||
let updatedTimings: ScoringPresetTimings = { ...currentTimings };
|
||||
|
||||
if (lowerPresetId.includes('sprint') || lowerPresetId.includes('double')) {
|
||||
updatedTimings = {
|
||||
...updatedTimings,
|
||||
practiceMinutes: 15,
|
||||
qualifyingMinutes: 20,
|
||||
sprintRaceMinutes: 20,
|
||||
mainRaceMinutes: 35,
|
||||
sessionCount: 2,
|
||||
};
|
||||
} else if (lowerPresetId.includes('endurance') || lowerPresetId.includes('long')) {
|
||||
updatedTimings = {
|
||||
...updatedTimings,
|
||||
practiceMinutes: 30,
|
||||
qualifyingMinutes: 30,
|
||||
mainRaceMinutes: 90,
|
||||
sessionCount: 1,
|
||||
};
|
||||
delete (updatedTimings as { sprintRaceMinutes?: number }).sprintRaceMinutes;
|
||||
} else {
|
||||
updatedTimings = {
|
||||
...updatedTimings,
|
||||
practiceMinutes: 20,
|
||||
qualifyingMinutes: 30,
|
||||
mainRaceMinutes: 40,
|
||||
sessionCount: 1,
|
||||
};
|
||||
delete (updatedTimings as { sprintRaceMinutes?: number }).sprintRaceMinutes;
|
||||
}
|
||||
|
||||
return updatedTimings;
|
||||
}
|
||||
Reference in New Issue
Block a user