import { describe, expect, it } from 'vitest' import { haversineKm, legKm, summarize } from '../../server/utils/transitous' const PARIS = { lat: 48.8566, lon: 2.3522 } const LYON = { lat: 45.764, lon: 4.8357 } describe('haversineKm', () => { it('mesure Paris-Lyon a environ 392 km a vol d oiseau', () => { const km = haversineKm(PARIS, LYON) expect(km).toBeGreaterThan(388) expect(km).toBeLessThan(396) }) it('renvoie zero entre un point et lui-meme', () => { expect(haversineKm(PARIS, PARIS)).toBe(0) }) }) describe('legKm', () => { const base = { mode: 'RAIL', startTime: '', endTime: '', from: PARIS, to: LYON } it('utilise la distance fournie quand elle existe', () => { expect(legKm({ ...base, distance: 465000 })).toBe(465) }) it('retombe sur le calcul geometrique quand la distance manque', () => { expect(legKm(base)).toBeCloseTo(haversineKm(PARIS, LYON), 5) }) }) describe('summarize', () => { const leg = (mode: string, distance: number) => ({ mode, distance, startTime: '', endTime: '', from: PARIS, to: PARIS, }) it('applique a chaque troncon son propre facteur d emission', () => { // 10 km de metro a 4,1 g + 400 km de TGV a 2,4 g const r = summarize({ duration: 7200, transfers: 1, legs: [leg('SUBWAY', 10000), leg('HIGHSPEED_RAIL', 400000)] }, 'train') expect(r.co2Grams).toBe(1001) expect(r.distanceKm).toBe(410) expect(r.durationMin).toBe(120) }) it('ne compte pas la marche dans les emissions', () => { const r = summarize({ duration: 600, transfers: 0, legs: [leg('WALK', 2000)] }, 'bus') expect(r.co2Grams).toBe(0) }) it('prend le facteur le plus penalisant pour un mode inconnu', () => { // Mieux vaut surestimer que de laisser croire a un trajet propre. const r = summarize({ duration: 600, transfers: 0, legs: [leg('TELEPORTATION', 10000)] }, 'bus') expect(r.co2Grams).toBe(1130) }) })