This commit is contained in:
99
tests/unit/RouteStartCandidateResolver.spec.ts
Normal file
99
tests/unit/RouteStartCandidateResolver.spec.ts
Normal file
@@ -0,0 +1,99 @@
|
||||
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()
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user