mirror of
https://github.com/AmanTahiliani/box-box.git
synced 2026-08-08 04:06:18 -04:00
105 lines
3.1 KiB
TypeScript
105 lines
3.1 KiB
TypeScript
import { describe, it, expect } from 'vitest'
|
||
import {
|
||
formatDelta,
|
||
formatPosition,
|
||
gridFinishDeltas,
|
||
shortGpLabel,
|
||
} from '../lib/driverProfile'
|
||
import type { DriverSummaryRound } from '../types'
|
||
|
||
function round(over: Partial<DriverSummaryRound>): DriverSummaryRound {
|
||
return {
|
||
meeting_key: 1201,
|
||
meeting_name: 'Bahrain Grand Prix',
|
||
country_code: 'BHR',
|
||
country_name: 'Bahrain',
|
||
race_position: 1,
|
||
grid_position: 1,
|
||
quali_position: 1,
|
||
points: 25,
|
||
dnf: false,
|
||
dns: false,
|
||
dsq: false,
|
||
...over,
|
||
}
|
||
}
|
||
|
||
describe('gridFinishDeltas', () => {
|
||
it('computes positive delta for places gained', () => {
|
||
const [d] = gridFinishDeltas([round({ grid_position: 5, race_position: 2, points: 18 })])
|
||
expect(d.grid).toBe(5)
|
||
expect(d.finish).toBe(2)
|
||
expect(d.delta).toBe(3)
|
||
expect(d.points).toBe(18)
|
||
expect(d.status).toBe('classified')
|
||
expect(d.round).toBe(1)
|
||
})
|
||
|
||
it('computes negative delta for places lost', () => {
|
||
const [d] = gridFinishDeltas([round({ grid_position: 1, race_position: 4 })])
|
||
expect(d.delta).toBe(-3)
|
||
})
|
||
|
||
it('returns null delta when the grid slot is unknown (position 0)', () => {
|
||
const [d] = gridFinishDeltas([round({ grid_position: 0, race_position: 6 })])
|
||
expect(d.grid).toBeNull()
|
||
expect(d.finish).toBe(6)
|
||
expect(d.delta).toBeNull()
|
||
})
|
||
|
||
it('flags DNS rounds and never computes a delta for them', () => {
|
||
const [d] = gridFinishDeltas([round({ dns: true, grid_position: 8, race_position: 0 })])
|
||
expect(d.status).toBe('dns')
|
||
expect(d.delta).toBeNull()
|
||
})
|
||
|
||
it('marks rounds the driver did not enter as absent', () => {
|
||
const [d] = gridFinishDeltas([round({ grid_position: 0, race_position: 0, points: 0 })])
|
||
expect(d.status).toBe('absent')
|
||
expect(d.grid).toBeNull()
|
||
expect(d.finish).toBeNull()
|
||
expect(d.delta).toBeNull()
|
||
})
|
||
|
||
it('still computes the delta for a classified DNF with known positions', () => {
|
||
const [d] = gridFinishDeltas([round({ dnf: true, grid_position: 3, race_position: 15 })])
|
||
expect(d.status).toBe('dnf')
|
||
expect(d.delta).toBe(-12)
|
||
})
|
||
|
||
it('numbers rounds sequentially and shortens labels', () => {
|
||
const ds = gridFinishDeltas([
|
||
round({}),
|
||
round({ meeting_name: 'Saudi Arabian Grand Prix', meeting_key: 1202 }),
|
||
])
|
||
expect(ds.map((d) => d.round)).toEqual([1, 2])
|
||
expect(ds[1].label).toBe('Saudi Arabian')
|
||
})
|
||
})
|
||
|
||
describe('shortGpLabel', () => {
|
||
it('strips "Grand Prix" wherever it appears', () => {
|
||
expect(shortGpLabel('Bahrain Grand Prix')).toBe('Bahrain')
|
||
expect(shortGpLabel('Grand Prix of Monaco')).toBe('of Monaco')
|
||
})
|
||
|
||
it('falls back to the original name when stripping empties it', () => {
|
||
expect(shortGpLabel('Grand Prix')).toBe('Grand Prix')
|
||
})
|
||
})
|
||
|
||
describe('formatPosition / formatDelta', () => {
|
||
it('formats positions', () => {
|
||
expect(formatPosition(4)).toBe('P4')
|
||
expect(formatPosition(null)).toBe('—')
|
||
expect(formatPosition(0)).toBe('—')
|
||
})
|
||
|
||
it('formats deltas', () => {
|
||
expect(formatDelta(3)).toBe('+3')
|
||
expect(formatDelta(-2)).toBe('−2')
|
||
expect(formatDelta(0)).toBe('=')
|
||
expect(formatDelta(null)).toBe('—')
|
||
})
|
||
})
|