Files
frontend-miniapp/tests/unit/RouteStartCandidateResolver.spec.ts
lyf 9ea1bfab71
Some checks failed
CI / verify (push) Has been cancelled
同步 sgs-frontend-mobile 源码
2026-07-27 11:26:01 +08:00

100 lines
2.6 KiB
TypeScript

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()
})
})