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