100 lines
2.6 KiB
TypeScript
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()
|
|
})
|
|
})
|