UNPKG

minotor

Version:

A lightweight client-side transit routing library.

134 lines (116 loc) 3.74 kB
import assert from 'node:assert'; import { describe, it } from 'node:test'; import { Stop } from '../../stops/stops.js'; import { timeFromHMS } from '../../timetable/time.js'; import { Route, ServiceRouteInfo, Transfer, VehicleLeg } from '../route.js'; describe('Route', () => { const stopA: Stop = { id: 1, sourceStopId: 'A', name: 'Stop A', locationType: 'SIMPLE_STOP_OR_PLATFORM', children: [], }; const stopB: Stop = { id: 2, sourceStopId: 'B', name: 'Stop B', locationType: 'SIMPLE_STOP_OR_PLATFORM', children: [], }; const stopC: Stop = { id: 3, sourceStopId: 'C', name: 'Stop C', locationType: 'SIMPLE_STOP_OR_PLATFORM', children: [], }; const stopD: Stop = { id: 4, sourceStopId: 'D', name: 'Stop D', locationType: 'SIMPLE_STOP_OR_PLATFORM', children: [], }; const serviceRoute: ServiceRouteInfo = { type: 'BUS', name: 'Route 1', }; const serviceRoute2: ServiceRouteInfo = { type: 'RAIL', name: 'Route 2', }; const vehicleLeg: VehicleLeg = { from: stopA, to: stopB, route: serviceRoute, departureTime: timeFromHMS(8, 0, 0), arrivalTime: timeFromHMS(8, 30, 0), pickUpType: 'REGULAR', dropOffType: 'REGULAR', }; const transferLeg: Transfer = { from: stopB, to: stopC, type: 'RECOMMENDED', minTransferTime: 5, }; const secondVehicleLeg: VehicleLeg = { from: stopC, to: stopD, route: serviceRoute2, departureTime: timeFromHMS(8, 40, 0), arrivalTime: timeFromHMS(9, 0, 0), pickUpType: 'REGULAR', dropOffType: 'REGULAR', }; it('should calculate the correct departure time', () => { const route = new Route([vehicleLeg, transferLeg, secondVehicleLeg]); const departureTime = route.departureTime(); assert.strictEqual(departureTime, timeFromHMS(8, 0, 0)); }); it('should calculate the correct arrival time', () => { const route = new Route([vehicleLeg, transferLeg, secondVehicleLeg]); const arrivalTime = route.arrivalTime(); assert.strictEqual(arrivalTime, timeFromHMS(9, 0, 0)); }); it('should calculate the total duration of the route', () => { const route = new Route([vehicleLeg, transferLeg, secondVehicleLeg]); const totalDuration = route.totalDuration(); assert.strictEqual(totalDuration, 60); }); it('should throw an error if no vehicle leg is found for departure time', () => { const route = new Route([transferLeg]); assert.throws(() => route.departureTime(), /No vehicle leg found in route/); }); it('should throw an error if no vehicle leg is found for arrival time', () => { const route = new Route([transferLeg]); assert.throws(() => route.arrivalTime(), /No vehicle leg found in route/); }); describe('toString', () => { it('includes leg numbers, stop names, and travel details for each leg', () => { const route = new Route([vehicleLeg, transferLeg, secondVehicleLeg]); const str = route.toString(); assert(str.includes('Leg 1:')); assert(str.includes('Leg 2:')); assert(str.includes('Leg 3:')); assert(str.includes('Stop A')); assert(str.includes('Stop D')); assert(str.includes('BUS Route 1')); assert(str.includes('RAIL Route 2')); assert(str.includes('Transfer: RECOMMENDED')); }); it('includes platform info when present', () => { const stopWithPlatform: Stop = { ...stopA, platform: '3A', }; const legWithPlatform: VehicleLeg = { ...vehicleLeg, from: stopWithPlatform, }; const route = new Route([legWithPlatform]); assert(route.toString().includes('Pl. 3A')); }); }); });