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:
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);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user