105 lines
4.1 KiB
TypeScript
105 lines
4.1 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { toMuseumPoi } from '@/data/adapters/navAssetsAdapter'
|
|
import { isVisitorSearchPoi, resolvePoiCategory } from '@/domain/poiCategories'
|
|
import type { StaticNavPoiPayload } from '@/data/providers/staticNavAssetsProvider'
|
|
|
|
const createStaticPoi = (name: string, iconType = 'elevator'): StaticNavPoiPayload => ({
|
|
id: `poi-${name}`,
|
|
name,
|
|
floorId: 'L1',
|
|
primaryCategory: 'basic_service_facility',
|
|
primaryCategoryZh: '基础服务设施',
|
|
iconType,
|
|
categories: [{
|
|
topCategory: 'basic_service_facility',
|
|
topCategoryZh: '基础服务设施',
|
|
subcategory: iconType,
|
|
iconType
|
|
}],
|
|
positionGltf: [1, 0, 1]
|
|
})
|
|
|
|
const createTouringPoi = (name: string, iconType = 'exhibition'): StaticNavPoiPayload => ({
|
|
...createStaticPoi(name, iconType),
|
|
primaryCategory: 'touring_poi',
|
|
primaryCategoryZh: '展厅与参观点',
|
|
categories: [{
|
|
topCategory: 'touring_poi',
|
|
topCategoryZh: '展厅与参观点',
|
|
subcategory: iconType,
|
|
iconType
|
|
}]
|
|
})
|
|
|
|
describe('static nav POI adapter', () => {
|
|
it('repairs legacy static facility icons from visitor-facing names', () => {
|
|
const stairs = toMuseumPoi(createStaticPoi('西侧楼梯'))
|
|
const escalator = toMuseumPoi(createStaticPoi('中央扶梯'))
|
|
const nursing = toMuseumPoi(createStaticPoi('母婴室', 'toilet'))
|
|
const restroom = toMuseumPoi(createStaticPoi('无障碍洗手间', 'elevator'))
|
|
|
|
expect(stairs.primaryCategory.iconType).toBe('stairs')
|
|
expect(resolvePoiCategory(stairs)).toBeNull()
|
|
expect(escalator.primaryCategory.iconType).toBe('escalator')
|
|
expect(resolvePoiCategory(escalator)?.id).toBe('escalator')
|
|
expect(nursing.primaryCategory.iconType).toBe('mother_baby_room')
|
|
expect(resolvePoiCategory(nursing)?.id).toBe('nursing-room')
|
|
expect(restroom.primaryCategory.iconType).toBe('accessible_toilet')
|
|
expect(resolvePoiCategory(restroom)?.id).toBe('restroom')
|
|
})
|
|
|
|
it('repairs static generic restroom icons for service facilities without misclassifying tea rooms', () => {
|
|
const serviceDesk = toMuseumPoi(createStaticPoi('服务台', 'restroom'))
|
|
const locker = toMuseumPoi(createStaticPoi('存包处', 'restroom'))
|
|
const teaRoom = toMuseumPoi(createStaticPoi('茶水间', 'restroom'))
|
|
const vipReception = toMuseumPoi(createStaticPoi('贵宾接待区', 'restroom'))
|
|
const vipRestroom = toMuseumPoi(createStaticPoi('贵宾卫生间', 'restroom'))
|
|
|
|
expect(resolvePoiCategory(serviceDesk)?.id).toBe('service-center')
|
|
expect(resolvePoiCategory(locker)?.id).toBe('service-center')
|
|
expect(resolvePoiCategory(teaRoom)).toBeNull()
|
|
expect(teaRoom.visitorVisible).toBe(false)
|
|
expect(vipReception.visitorVisible).toBe(false)
|
|
expect(vipRestroom.visitorVisible).toBe(false)
|
|
expect(toMuseumPoi({
|
|
...createStaticPoi('茶水间', 'restroom'),
|
|
visitorVisible: true
|
|
}).visitorVisible).toBe(true)
|
|
expect(toMuseumPoi({
|
|
...createStaticPoi('贵宾卫生间', 'restroom'),
|
|
visitorVisible: true
|
|
}).visitorVisible).toBe(true)
|
|
})
|
|
|
|
it('splits generic touring fallback records into their visitor-facing semantic kinds', () => {
|
|
const cinema = toMuseumPoi(createTouringPoi('巨幕影院'))
|
|
const ticketOffice = toMuseumPoi(createTouringPoi('展厅售票点'))
|
|
|
|
expect(cinema).toMatchObject({
|
|
kind: 'space',
|
|
primaryCategory: { id: 'space_theater', iconType: 'theater' }
|
|
})
|
|
expect(resolvePoiCategory(cinema)?.id).toBe('cinema')
|
|
expect(ticketOffice).toMatchObject({
|
|
kind: 'facility',
|
|
primaryCategory: { id: 'basic_service_facility', iconType: 'ticket_office' }
|
|
})
|
|
expect(resolvePoiCategory(ticketOffice)?.id).toBe('ticket-office')
|
|
})
|
|
|
|
it('keeps a hall visible when its secondary category describes an entrance', () => {
|
|
const hall = toMuseumPoi(createTouringPoi('地球展厅'))
|
|
hall.kind = 'hall'
|
|
hall.categories = [
|
|
hall.primaryCategory,
|
|
{
|
|
id: 'exhibition_hall_entrance',
|
|
label: '展厅出入口',
|
|
iconType: 'hall_entrance'
|
|
}
|
|
]
|
|
|
|
expect(isVisitorSearchPoi(hall)).toBe(true)
|
|
})
|
|
})
|