mirror of
https://github.com/AmanTahiliani/box-box.git
synced 2026-08-07 19:56:18 -04:00
Add reusable TeammateH2H component and teammatePairs helper that ranks intra-team battles by closeness, using existing hub teammate_wins data. Co-authored-by: Cursor <cursoragent@cursor.com>
133 lines
3.5 KiB
TypeScript
133 lines
3.5 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { teammatePairs } from '../lib/h2h'
|
|
import type { ChampHubDriver } from '../types'
|
|
|
|
function driver(over: Partial<ChampHubDriver>): ChampHubDriver {
|
|
return {
|
|
driver_number: 1,
|
|
name_acronym: 'VER',
|
|
full_name: 'Max Verstappen',
|
|
team_name: 'Red Bull',
|
|
team_colour: '3671c6',
|
|
points: 200,
|
|
position: 1,
|
|
wins: 5,
|
|
podiums: 8,
|
|
poles: 4,
|
|
form: [],
|
|
cumulative: [],
|
|
teammate_wins: 9,
|
|
teammate_losses: 1,
|
|
...over,
|
|
}
|
|
}
|
|
|
|
describe('teammatePairs', () => {
|
|
it('returns empty for no drivers', () => {
|
|
expect(teammatePairs([])).toEqual([])
|
|
})
|
|
|
|
it('skips teams with a single driver', () => {
|
|
const drivers = [
|
|
driver({ driver_number: 1, team_name: 'Red Bull' }),
|
|
driver({ driver_number: 44, name_acronym: 'HAM', team_name: 'Mercedes', points: 50 }),
|
|
]
|
|
expect(teammatePairs(drivers)).toHaveLength(0)
|
|
})
|
|
|
|
it('pairs two-driver teams', () => {
|
|
const drivers = [
|
|
driver({ driver_number: 1, name_acronym: 'VER', points: 200, teammate_wins: 9, teammate_losses: 1 }),
|
|
driver({
|
|
driver_number: 11,
|
|
name_acronym: 'PER',
|
|
full_name: 'Sergio Perez',
|
|
points: 60,
|
|
teammate_wins: 1,
|
|
teammate_losses: 9,
|
|
}),
|
|
]
|
|
const pairs = teammatePairs(drivers)
|
|
expect(pairs).toHaveLength(1)
|
|
expect(pairs[0].teamName).toBe('Red Bull')
|
|
expect(pairs[0].driverA.name_acronym).toBe('VER')
|
|
expect(pairs[0].driverB.name_acronym).toBe('PER')
|
|
expect(pairs[0].extraCount).toBe(0)
|
|
expect(pairs[0].closeness).toBe(8)
|
|
})
|
|
|
|
it('uses top two by points for teams with 3+ drivers', () => {
|
|
const drivers = [
|
|
driver({ driver_number: 1, name_acronym: 'VER', team_name: 'Red Bull', points: 200 }),
|
|
driver({
|
|
driver_number: 11,
|
|
name_acronym: 'PER',
|
|
team_name: 'Red Bull',
|
|
points: 60,
|
|
teammate_wins: 1,
|
|
teammate_losses: 9,
|
|
}),
|
|
driver({
|
|
driver_number: 99,
|
|
name_acronym: 'LAW',
|
|
full_name: 'Liam Lawson',
|
|
team_name: 'Red Bull',
|
|
points: 10,
|
|
teammate_wins: 0,
|
|
teammate_losses: 0,
|
|
}),
|
|
]
|
|
const pairs = teammatePairs(drivers)
|
|
expect(pairs).toHaveLength(1)
|
|
expect(pairs[0].driverA.name_acronym).toBe('VER')
|
|
expect(pairs[0].driverB.name_acronym).toBe('PER')
|
|
expect(pairs[0].extraCount).toBe(1)
|
|
})
|
|
|
|
it('sorts by closest battle first', () => {
|
|
const drivers = [
|
|
driver({
|
|
driver_number: 1,
|
|
name_acronym: 'VER',
|
|
team_name: 'Red Bull',
|
|
points: 200,
|
|
teammate_wins: 10,
|
|
teammate_losses: 0,
|
|
}),
|
|
driver({
|
|
driver_number: 11,
|
|
name_acronym: 'PER',
|
|
team_name: 'Red Bull',
|
|
points: 60,
|
|
teammate_wins: 0,
|
|
teammate_losses: 10,
|
|
}),
|
|
driver({
|
|
driver_number: 4,
|
|
name_acronym: 'NOR',
|
|
team_name: 'McLaren',
|
|
team_colour: 'ff8000',
|
|
points: 160,
|
|
teammate_wins: 6,
|
|
teammate_losses: 5,
|
|
}),
|
|
driver({
|
|
driver_number: 81,
|
|
name_acronym: 'PIA',
|
|
full_name: 'Oscar Piastri',
|
|
team_name: 'McLaren',
|
|
team_colour: 'ff8000',
|
|
points: 140,
|
|
teammate_wins: 5,
|
|
teammate_losses: 6,
|
|
}),
|
|
]
|
|
const pairs = teammatePairs(drivers)
|
|
expect(pairs).toHaveLength(2)
|
|
expect(pairs[0].teamName).toBe('McLaren')
|
|
expect(pairs[0].closeness).toBe(1)
|
|
expect(pairs[1].teamName).toBe('Red Bull')
|
|
expect(pairs[1].closeness).toBe(10)
|
|
})
|
|
})
|