feat(benchmark): enhance benchmark documentation and add emulated run details

fix(benchmark): update deterministic checks and improve measurement accuracy

fix(service): refine candidate recording and enhance balance assignment logic

test(service): add test for balance recording with preference assignment
This commit is contained in:
nessar committed 2026-09-25 14:07:00 +02:00
1 parent ff86cf48b4
commit f1f08356df
5 files changed
+300 -98

No files matched your search

@@ -1,4 +1,5 @@
import { vi } from 'vitest';
import { createPlanningCalculation } from '../services/leave-planner.service';
import {
benchmarkReport,
benchmarkScenarios,
@@ -9,6 +10,20 @@ describe('leave planner benchmark protocol', () => {
it('keeps five deterministic scenarios and exercises a later earned consumer', async () => {
const scenarios = benchmarkScenarios();
expect(scenarios).toHaveLength(5);
const typedObligations = scenarios.find(
(scenario) => scenario.name === 'typed obligations',
);
const cpRule = typedObligations?.request.rules?.find((rule) => rule.id === 'cp-window');
const rttRule = typedObligations?.request.rules?.find((rule) => rule.id === 'rtt-window');
expect(cpRule).toMatchObject({ placeType: 'cp', placeDays: 2 });
expect(rttRule).toMatchObject({ placeType: 'rtt', placeDays: 2 });
expect(cpRule?.type).toBe('time_window');
expect(rttRule?.type).toBe('time_window');
if (cpRule && 'startDate' in cpRule && rttRule && 'startDate' in rttRule)
expect(
String(cpRule.startDate) <= String(rttRule.endDate) &&
String(rttRule.startDate) <= String(cpRule.endDate),
).toBe(true);
const chain = scenarios.find((scenario) => scenario.name === 'chained earned entitlements');
expect(chain?.request.rules?.map((rule) => rule.id)).toEqual([
'wednesday-holidays',
@@ -18,24 +33,44 @@ describe('leave planner benchmark protocol', () => {
const browserWindow = globalThis.window;
vi.stubGlobal('window', undefined);
try {
const measurements = await runLeavePlannerBenchmark(1);
const typedOutcome = await createPlanningCalculation(typedObligations!.request).outcome;
expect(typedOutcome.kind).toBe('Plan');
if (typedOutcome.kind === 'Plan') {
expect(
typedOutcome.placements.filter((placement) =>
placement.ruleIds.includes('cp-window'),
),
).toHaveLength(2);
expect(
typedOutcome.placements.filter((placement) =>
placement.ruleIds.includes('rtt-window'),
),
).toHaveLength(2);
}
const measurements = await runLeavePlannerBenchmark(2);
const chained = measurements.find(
(measurement) => measurement.scenario === 'chained earned entitlements',
);
const loaded = measurements.find(
const loaded = measurements.filter(
(measurement) => measurement.scenario === 'loaded year',
);
expect(chained?.outcome).toBe('Plan');
expect(chained?.placements).toBeGreaterThanOrEqual(3);
expect(loaded?.outcome).toBe('Plan');
expect(loaded?.deterministic).toBe(true);
expect(loaded?.planningMs).toBeGreaterThanOrEqual(0);
expect(loaded?.traceDeliveryMs).toBeGreaterThanOrEqual(0);
expect(loaded?.traceStatus).toBe('ready');
expect(loaded?.traceCandidates).toBeGreaterThan(0);
expect(loaded).toHaveLength(2);
expect(loaded[0].outcome).toBe('Plan');
expect(loaded[0].deterministic).toBe('baseline');
expect(loaded[1].deterministic).toBe('yes');
expect(loaded[0].planningMs).toBeGreaterThanOrEqual(0);
expect(loaded[0].traceDeliveryMs).toBeGreaterThanOrEqual(0);
expect(loaded[0].wallMs).toBeGreaterThanOrEqual(
loaded[0].preparationMs + loaded[0].planningMs + loaded[0].traceDeliveryMs,
);
expect(loaded[0].traceStatus).toBe('ready');
expect(loaded[0].traceCandidates).toBeGreaterThan(0);
const report = benchmarkReport(measurements);
expect(report.split('\n')).toHaveLength(6);
expect(report.split('\n')).toHaveLength(11);
expect(report).toContain('planning_ms\ttrace_delivery_ms');
expect(report).toContain('\tbaseline\t');
} finally {
vi.stubGlobal('window', browserWindow);
}