import { describe, expect, it } from 'vitest' import { resolveRouteStartCandidate, toRouteStartCandidatePayload, type RouteStartSelectablePoint } from '@/components/map/routeStartCandidateResolver' const floorId = 'floor-l1' const points: RouteStartSelectablePoint[] = [ { routeTargetId: 'anchor-space-42:node-a', poiId: 'node-a', sourceId: '42', name: '球幕影院 出入口 1', floorId, positionGltf: [12, 0, 8], routeNodeId: 'node-a' }, { routeTargetId: 'anchor-space-42:node-b', poiId: 'node-b', sourceId: '42', name: '球幕影院 出入口 2', floorId, positionGltf: [4, 0, 3], routeNodeId: 'node-b' }, { routeTargetId: 'anchor-poi-99', poiId: 'node-c', sourceId: '99', name: '服务台', floorId, positionGltf: [50, 0, 50], routeNodeId: 'node-c' } ] describe('resolveRouteStartCandidate', () => { it('matches prefixed map space ids to SDK source ids and chooses the nearest entrance', () => { const result = resolveRouteStartCandidate({ floorId, position: [5, 0, 4], sourceName: '球幕影院', sourcePoiIds: ['hall-42'], points, maxDistanceMeters: 8, requireObjectMatch: true }) expect(result?.mode).toBe('linked') expect(result?.point.routeNodeId).toBe('node-b') }) it('matches an owner label to a door name when ids are unavailable', () => { const result = resolveRouteStartCandidate({ floorId, position: [11, 0, 7], sourceName: '球幕影院', points: [points[0]], maxDistanceMeters: 8, requireObjectMatch: true }) expect(result?.mode).toBe('linked') expect(result?.point.routeNodeId).toBe('node-a') }) it('returns an object-scoped coordinate candidate when a space has no published anchor', () => { const result = resolveRouteStartCandidate({ floorId, position: [1.7, 3.3, -5.6], sourceName: '没有接入点的展厅', sourcePoiIds: ['hall-777'], points, maxDistanceMeters: 8, requireObjectMatch: true }) expect(result?.mode).toBe('coordinate') expect(toRouteStartCandidatePayload(result!, '没有接入点的展厅')).toEqual(expect.objectContaining({ poiId: 'hall-777', coordinateFallback: true, positionGltf: [1.7, 3.3, -5.6] })) }) it('does not turn a blank map tap into an arbitrary route start', () => { const result = resolveRouteStartCandidate({ floorId, position: [-100, 0, -100], points, maxDistanceMeters: 8 }) expect(result).toBeNull() }) })