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