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

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