mirror of
https://github.com/AmanTahiliani/box-box.git
synced 2026-08-07 19:56:18 -04:00
fix(compare): gap delta graph when reference lap is null
Reference-null laps now emit null deltas for all drivers and exclude that lap window from aligned cumulative totals so later comparisons stay sane. Challenger-null behavior is unchanged. Compare tab meta documents the policy. Closes #46 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -47,7 +47,7 @@ describe('computeCumulativeDeltas', () => {
|
||||
expect(result[0].deltas[2]).toBeCloseTo(2)
|
||||
})
|
||||
|
||||
it('emits null for missing lap times while carrying cumulative forward', () => {
|
||||
it('emits null for challenger missing lap times while carrying cumulative forward', () => {
|
||||
const withNull: DeltaSeries = {
|
||||
label: 'NOR',
|
||||
color: '#FF8000',
|
||||
@@ -60,6 +60,24 @@ describe('computeCumulativeDeltas', () => {
|
||||
expect(result[0].deltas[2]).toBeCloseTo(-92)
|
||||
})
|
||||
|
||||
it('gaps all drivers when the reference lap is null and resumes without that window', () => {
|
||||
const refWithNull: DeltaSeries = {
|
||||
label: 'VER',
|
||||
color: '#3671C6',
|
||||
lapTimes: [90, null, 92],
|
||||
}
|
||||
const validChallenger: DeltaSeries = {
|
||||
label: 'HAM',
|
||||
color: '#E8002D',
|
||||
lapTimes: [89, 91, 90],
|
||||
}
|
||||
const result = computeCumulativeDeltas([refWithNull, validChallenger])
|
||||
expect(result[0].deltas[0]).toBeCloseTo(-1)
|
||||
expect(result[0].deltas[1]).toBeNull()
|
||||
// Lap 3 excludes the reference-null window for both: (89+90) - (90+92) = -3
|
||||
expect(result[0].deltas[2]).toBeCloseTo(-3)
|
||||
})
|
||||
|
||||
it('returns an empty array when only one series is provided', () => {
|
||||
expect(computeCumulativeDeltas([reference])).toEqual([])
|
||||
})
|
||||
@@ -97,6 +115,19 @@ describe('DeltaTimeGraph', () => {
|
||||
expect(screen.queryByTestId('delta-line-VER')).not.toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('splits polylines at reference-null laps', () => {
|
||||
const refWithNull: DeltaSeries = {
|
||||
label: 'VER',
|
||||
color: '#3671C6',
|
||||
lapTimes: [90, null, 92],
|
||||
}
|
||||
const { container } = render(
|
||||
<DeltaTimeGraph series={[refWithNull, challenger]} />,
|
||||
)
|
||||
const lines = container.querySelectorAll('.delta-graph-driver-line')
|
||||
expect(lines.length).toBeGreaterThan(1)
|
||||
})
|
||||
|
||||
it('shows a crosshair tooltip on hover', () => {
|
||||
vi.spyOn(SVGSVGElement.prototype, 'getBoundingClientRect').mockReturnValue({
|
||||
x: 0,
|
||||
@@ -118,4 +149,31 @@ describe('DeltaTimeGraph', () => {
|
||||
expect(screen.getByText(/Lap 1/)).toBeInTheDocument()
|
||||
vi.restoreAllMocks()
|
||||
})
|
||||
|
||||
it('omits tooltip rows on reference-null laps', () => {
|
||||
vi.spyOn(SVGSVGElement.prototype, 'getBoundingClientRect').mockReturnValue({
|
||||
x: 0,
|
||||
y: 0,
|
||||
left: 0,
|
||||
top: 0,
|
||||
width: 640,
|
||||
height: 220,
|
||||
right: 640,
|
||||
bottom: 220,
|
||||
toJSON: () => ({}),
|
||||
})
|
||||
const refWithNull: DeltaSeries = {
|
||||
label: 'VER',
|
||||
color: '#3671C6',
|
||||
lapTimes: [90, null, 92],
|
||||
}
|
||||
const { container } = render(
|
||||
<DeltaTimeGraph series={[refWithNull, challenger]} />,
|
||||
)
|
||||
const hoverLayer = container.querySelector('.delta-graph-hover-layer')
|
||||
fireEvent.mouseMove(hoverLayer!, { clientX: 352, clientY: 100 })
|
||||
expect(screen.getByTestId('delta-crosshair')).toBeInTheDocument()
|
||||
expect(screen.queryByTestId('delta-tooltip')).not.toBeInTheDocument()
|
||||
vi.restoreAllMocks()
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user