233 lines
8.2 KiB
TypeScript
233 lines
8.2 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import {
|
|
getAmbientFacilityKind,
|
|
getAmbientFacilityLimit,
|
|
getAmbientFacilityTier,
|
|
getPoiDisplayPolicy,
|
|
getPoiMapLabelText,
|
|
getPoiMarkerLimit,
|
|
getPoiScreenSpacing,
|
|
getPoiVisibilityTier,
|
|
isPoiVisibilityTierAtLeast
|
|
} from '@/domain/poiDisplay'
|
|
|
|
describe('POI 显示策略', () => {
|
|
it('室内空间地标默认显示标签,但不进入外观总览', () => {
|
|
const policy = getPoiDisplayPolicy({
|
|
primaryCategory: 'space_public_area',
|
|
kind: 'space'
|
|
})
|
|
|
|
expect(policy.labelVisible).toBe(true)
|
|
expect(policy.pinInOverview).toBe(true)
|
|
expect(policy.minMarkerTier).toBe('tight')
|
|
expect(policy.allowOverview).toBe(false)
|
|
expect(policy.allowMulti).toBe(true)
|
|
expect(policy.minLabelTier).toBe('tight')
|
|
})
|
|
|
|
it('影院和剧场等 space_theater 作为室内地标参与默认标签布局', () => {
|
|
const policy = getPoiDisplayPolicy({
|
|
primaryCategory: 'space_theater',
|
|
kind: 'space'
|
|
})
|
|
|
|
expect(policy.labelVisible).toBe(true)
|
|
expect(policy.minLabelTier).toBe('tight')
|
|
expect(policy.allowOverview).toBe(false)
|
|
})
|
|
|
|
it('展厅、业务地标和普通服务设施拥有不同标签密度策略', () => {
|
|
const hall = getPoiDisplayPolicy({ primaryCategory: 'exhibition_hall', kind: 'hall' })
|
|
const business = getPoiDisplayPolicy({ primaryCategory: 'business_poi', kind: 'facility' })
|
|
const service = getPoiDisplayPolicy({ primaryCategory: 'basic_service_facility', kind: 'facility' })
|
|
|
|
expect(hall.labelVisible).toBe(true)
|
|
expect(hall.pinInOverview).toBe(true)
|
|
expect(hall.minLabelTier).toBe('tight')
|
|
expect(business.labelVisible).toBe(true)
|
|
expect(business.minLabelTier).toBe('tight')
|
|
expect(service.minLabelTier).toBe('full')
|
|
})
|
|
|
|
it('售票设施和楼层出入口默认显示标签', () => {
|
|
const ticket = getPoiDisplayPolicy({
|
|
primaryCategory: 'basic_service_facility',
|
|
iconType: 'ticket_office',
|
|
kind: 'facility'
|
|
})
|
|
const floorExit = getPoiDisplayPolicy({
|
|
primaryCategory: 'navigation_anchor',
|
|
iconType: 'entrance_exit',
|
|
kind: 'guide'
|
|
})
|
|
|
|
expect(ticket.labelVisible).toBe(true)
|
|
expect(ticket.pinInOverview).toBe(true)
|
|
expect(ticket.minLabelTier).toBe('tight')
|
|
expect(floorExit.labelVisible).toBe(true)
|
|
expect(floorExit.minLabelTier).toBe('tight')
|
|
})
|
|
|
|
it('服务台使用统一文字标签并隐藏旧式 marker', () => {
|
|
const serviceDesk = getPoiDisplayPolicy({
|
|
primaryCategory: 'basic_service_facility',
|
|
iconType: 'service_desk',
|
|
kind: 'facility'
|
|
})
|
|
|
|
expect(serviceDesk.labelVisible).toBe(true)
|
|
expect(serviceDesk.pinInOverview).toBe(true)
|
|
expect(serviceDesk.minLabelTier).toBe('tight')
|
|
expect(serviceDesk.priority).toBe(94)
|
|
})
|
|
|
|
it.each(['locker', 'wheelchair_rental'])('%s 次级服务只在近景或选中时显示统一文字标签', (iconType) => {
|
|
const service = getPoiDisplayPolicy({
|
|
primaryCategory: 'basic_service_facility',
|
|
iconType,
|
|
kind: 'facility'
|
|
})
|
|
|
|
expect(service.markerVisible).toBe(true)
|
|
expect(service.labelVisible).toBe(true)
|
|
expect(service.pinInOverview).toBe(false)
|
|
expect(service.minMarkerTier).toBe('full')
|
|
expect(service.minLabelTier).toBe('full')
|
|
})
|
|
|
|
it('目标预览仍可在外观和多层视图中强制显示', () => {
|
|
const target = getPoiDisplayPolicy({ primaryCategory: 'target_preview' })
|
|
|
|
expect(target.markerVisible).toBe(true)
|
|
expect(target.labelVisible).toBe(true)
|
|
expect(target.allowOverview).toBe(true)
|
|
expect(target.allowMulti).toBe(true)
|
|
})
|
|
|
|
it.each([
|
|
['basic_service_facility', 'restroom'],
|
|
['accessibility_special_service', 'accessible_toilet'],
|
|
['basic_service_facility', 'mother_baby_room'],
|
|
['transport_circulation', 'elevator']
|
|
])('%s 的 %s 设施从中景开始显示', (primaryCategory, iconType) => {
|
|
const policy = getPoiDisplayPolicy({ primaryCategory, iconType, kind: 'facility' })
|
|
|
|
expect(policy.labelVisible).toBe(true)
|
|
expect(policy.pinInOverview).toBe(false)
|
|
expect(policy.minMarkerTier).toBe('balanced')
|
|
expect(policy.minLabelTier).toBe('balanced')
|
|
})
|
|
|
|
it.each(['escalator', 'stairs', 'stair'])('%s 设施只在近景显示', (iconType) => {
|
|
const policy = getPoiDisplayPolicy({
|
|
primaryCategory: 'transport_circulation',
|
|
iconType,
|
|
kind: 'facility'
|
|
})
|
|
|
|
expect(policy.labelVisible).toBe(true)
|
|
expect(policy.pinInOverview).toBe(false)
|
|
expect(policy.minMarkerTier).toBe('full')
|
|
expect(policy.minLabelTier).toBe('full')
|
|
})
|
|
|
|
it('设备终端在地图标签中隐藏楼层和技术编号', () => {
|
|
const policy = getPoiDisplayPolicy({
|
|
primaryCategory: 'poi',
|
|
iconType: 'device_terminal',
|
|
kind: 'facility'
|
|
})
|
|
|
|
expect(policy.labelVisible).toBe(true)
|
|
expect(policy.minLabelTier).toBe('tight')
|
|
expect(policy.allowOverview).toBe(false)
|
|
expect(policy.allowMulti).toBe(false)
|
|
expect(getPoiMapLabelText({
|
|
name: 'L1_导览屏_01',
|
|
iconType: 'device_terminal'
|
|
})).toBe('导览屏')
|
|
expect(getPoiMapLabelText({
|
|
name: 'L1_H_闸机_05',
|
|
iconType: 'device_terminal'
|
|
})).toBe('闸机')
|
|
expect(getPoiMapLabelText({
|
|
name: 'L1_自助售卖机',
|
|
iconType: 'device_terminal'
|
|
})).toBe('自助售卖机')
|
|
})
|
|
|
|
it('未知交通类型不创建环境标签', () => {
|
|
const policy = getPoiDisplayPolicy({
|
|
primaryCategory: 'transport_circulation',
|
|
iconType: 'moving_walkway',
|
|
kind: 'facility'
|
|
})
|
|
|
|
expect(policy.labelVisible).toBe(false)
|
|
expect(policy.pinInOverview).toBe(false)
|
|
})
|
|
|
|
it.each([
|
|
['L5_A电梯', 'elevator', '电梯'],
|
|
['L1_B_楼梯09', 'stairs', '楼梯'],
|
|
['L5_C楼梯', 'stair', '楼梯'],
|
|
['L1_A扶梯03', 'escalator', '扶梯'],
|
|
['L1_男卫生间02', 'toilet', '男卫生间'],
|
|
['L3_女卫生间09', 'restroom', '女卫生间'],
|
|
['L1_无障碍卫生间02', 'toilet', '无障碍卫生间'],
|
|
['L1_A无障碍卫生间02', 'accessible', '无障碍卫生间'],
|
|
['L1_A无障碍卫生间02', 'accessible_toilet', '无障碍卫生间'],
|
|
['L2_母婴室01', 'mother_baby_room', '母婴室']
|
|
])('地图设施标签将 %s 显示为简短类型名', (name, iconType, expected) => {
|
|
expect(getPoiMapLabelText({ name, iconType })).toBe(expected)
|
|
})
|
|
|
|
it('设施分类区分中景与近景保留额度', () => {
|
|
expect(getAmbientFacilityKind('elevator')).toBe('elevator')
|
|
expect(getAmbientFacilityTier('elevator')).toBe('balanced')
|
|
expect(getAmbientFacilityKind('stairs')).toBe('stairs')
|
|
expect(getAmbientFacilityTier('stairs')).toBe('near-only')
|
|
expect(getAmbientFacilityTier('moving_walkway')).toBeNull()
|
|
})
|
|
|
|
it('电梯优先于卫生间,扶梯优先于楼梯', () => {
|
|
const priority = (iconType: string) => getPoiDisplayPolicy({
|
|
primaryCategory: 'transport_circulation',
|
|
iconType,
|
|
kind: 'facility'
|
|
}).priority
|
|
|
|
expect(priority('elevator')).toBeGreaterThan(getPoiDisplayPolicy({
|
|
primaryCategory: 'basic_service_facility',
|
|
iconType: 'toilet',
|
|
kind: 'facility'
|
|
}).priority)
|
|
expect(priority('escalator')).toBeGreaterThan(priority('stairs'))
|
|
})
|
|
|
|
it('LOD tier 按 tight 到 full 单调放宽', () => {
|
|
expect(isPoiVisibilityTierAtLeast('tight', 'tight')).toBe(true)
|
|
expect(isPoiVisibilityTierAtLeast('balanced', 'tight')).toBe(true)
|
|
expect(isPoiVisibilityTierAtLeast('balanced', 'full')).toBe(false)
|
|
expect(isPoiVisibilityTierAtLeast('full', 'balanced')).toBe(true)
|
|
})
|
|
|
|
it('距离比例在 0.72/0.42 边界映射为共享三级 LOD', () => {
|
|
expect(getPoiVisibilityTier(0.72)).toBe('tight')
|
|
expect(getPoiVisibilityTier(0.719999)).toBe('balanced')
|
|
expect(getPoiVisibilityTier(0.42)).toBe('balanced')
|
|
expect(getPoiVisibilityTier(0.419999)).toBe('full')
|
|
})
|
|
|
|
it('三级 LOD 复用同一 marker、设施与屏幕间距额度', () => {
|
|
expect(['tight', 'balanced', 'full'].map(getPoiMarkerLimit)).toEqual([
|
|
5,
|
|
9,
|
|
Number.POSITIVE_INFINITY
|
|
])
|
|
expect(['tight', 'balanced', 'full'].map(getAmbientFacilityLimit)).toEqual([0, 4, 8])
|
|
expect(['tight', 'balanced', 'full'].map(getPoiScreenSpacing)).toEqual([116, 78, 0])
|
|
})
|
|
})
|