Add regression test: a DNS heat must not drop a driver's other heats
The user asked specifically to confirm this: a driver who DNS'd in one qualifying heat but raced normally in others must still be fully counted across all of them, not dropped. Traced through the fix (buildQualifyingStandings backfills a DNS row per finished heat, accumulating into the same per-driver entry across every heat they're in) and confirmed it already handles this correctly - added a test that exercises exactly this scenario (DNS in heat 1, wins heat 2 and 3) to lock it in, since this specific multi-heat aggregation path had no prior coverage. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -657,6 +657,50 @@ test("qualifying standings keep a driver who never recorded a passing (DNS) so t
|
|||||||
assert.equal(standings[1].bestSingleLapMs, Number.MAX_SAFE_INTEGER, "a DNS driver's missing lap is never confused for a 0ms fastest lap");
|
assert.equal(standings[1].bestSingleLapMs, Number.MAX_SAFE_INTEGER, "a DNS driver's missing lap is never confused for a 0ms fastest lap");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("a driver who DNS'd in one heat but raced normally in the others is still fully counted across all of them, not dropped", () => {
|
||||||
|
const sessions = [
|
||||||
|
{ id: "q1h1", type: "qualification", name: "Q1 H1", status: "finished" },
|
||||||
|
{ id: "q2h1", type: "qualification", name: "Q2 H1", status: "finished" },
|
||||||
|
{ id: "q3h1", type: "qualification", name: "Q3 H1", status: "finished" },
|
||||||
|
];
|
||||||
|
// driver_2 DNS'd heat 1 (dead battery), but raced - and won - heats 2 and 3.
|
||||||
|
const rowsBySession = {
|
||||||
|
q1h1: [{ driverId: "driver_1", driverName: "One", comparisonMs: 16000, bestLapMs: 16000, resultDisplay: "16.000" }],
|
||||||
|
q2h1: [
|
||||||
|
{ driverId: "driver_2", driverName: "Two", comparisonMs: 15000, bestLapMs: 15000, resultDisplay: "15.000" },
|
||||||
|
{ driverId: "driver_1", driverName: "One", comparisonMs: 16500, bestLapMs: 16500, resultDisplay: "16.500" },
|
||||||
|
],
|
||||||
|
q3h1: [
|
||||||
|
{ driverId: "driver_2", driverName: "Two", comparisonMs: 14800, bestLapMs: 14800, resultDisplay: "14.800" },
|
||||||
|
{ driverId: "driver_1", driverName: "One", comparisonMs: 16200, bestLapMs: 16200, resultDisplay: "16.200" },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
const entrants = [{ id: "driver_1", name: "One" }, { id: "driver_2", name: "Two" }];
|
||||||
|
const standings = buildQualifyingStandings(
|
||||||
|
// Counting all 3 rounds (not just the best one) so a dropped round would be visible
|
||||||
|
// in the total score, not silently hidden by "best of N" already excluding it.
|
||||||
|
{ id: "event_1", raceConfig: { countedQualRounds: 3 } },
|
||||||
|
{
|
||||||
|
getSessionsForEvent: () => sessions,
|
||||||
|
buildLeaderboard: (session) => rowsBySession[session.id],
|
||||||
|
getSessionEntrants: () => entrants,
|
||||||
|
isHighPointsTable,
|
||||||
|
getQualifyingPointsValue,
|
||||||
|
compareNumberSet,
|
||||||
|
buildQualifyingTieBreakNote: (row, tieBreak) => buildQualifyingTieBreakNoteLogic(row, tieBreak, { t: testTranslate, formatLap: testFormatLap }),
|
||||||
|
formatLap: testFormatLap,
|
||||||
|
formatRaceClock: testFormatRaceClock,
|
||||||
|
t: testTranslate,
|
||||||
|
hasQualifyingPrimaryTie,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const driverTwo = standings.find((row) => row.driverId === "driver_2");
|
||||||
|
assert.ok(driverTwo, "driver_2 still appears at all - not dropped because of the heat 1 DNS");
|
||||||
|
assert.deepEqual(driverTwo.ranks.sort((a, b) => a - b), [1, 1, 2], "won heat 2 and heat 3 outright (rank 1), only heat 1's DNS counts against them (rank 2 of 2)");
|
||||||
|
assert.equal(driverTwo.countedPoints.length, 3, "all three heats count toward the score, including the DNS one - it isn't excluded or silently skipped");
|
||||||
|
});
|
||||||
|
|
||||||
test("session channel statistics summarize splits and pit stops per competitor", () => {
|
test("session channel statistics summarize splits and pit stops per competitor", () => {
|
||||||
const result = {
|
const result = {
|
||||||
competitors: {
|
competitors: {
|
||||||
|
|||||||
Reference in New Issue
Block a user