import { describe, it, expect, vi, beforeEach } from 'vitest' vi.mock('leaflet', () => { const markerMock = { on: vi.fn().mockReturnThis(), addTo: vi.fn().mockReturnThis(), setLatLng: vi.fn().mockReturnThis(), } return { default: { marker: vi.fn(() => markerMock) }, marker: vi.fn(() => markerMock), } }) vi.mock('~/lib/LeafletCustomTypes', () => ({ HnHMaxZoom: 6, })) import { createCharacter, type CharacterData, type CharacterMapViewRef } from '../Character' function makeCharData(overrides: Partial = {}): CharacterData { return { name: 'Hero', position: { x: 100, y: 200 }, type: 'player', id: 1, map: 1, ...overrides, } } function makeMapViewRef(mapid = 1): CharacterMapViewRef { return { map: { unproject: vi.fn(() => ({ lat: 0, lng: 0 })), removeLayer: vi.fn(), } as unknown as import('leaflet').Map, mapid, markerLayer: { removeLayer: vi.fn(), addLayer: vi.fn(), } as unknown as import('leaflet').LayerGroup, } } describe('createCharacter', () => { beforeEach(() => { vi.clearAllMocks() }) it('creates character with correct properties', () => { const char = createCharacter(makeCharData()) expect(char.id).toBe(1) expect(char.name).toBe('Hero') expect(char.position).toEqual({ x: 100, y: 200 }) expect(char.type).toBe('player') expect(char.map).toBe(1) expect(char.text).toBe('Hero') expect(char.value).toBe(1) }) it('starts with null leaflet marker', () => { const char = createCharacter(makeCharData()) expect(char.leafletMarker).toBeNull() }) it('add creates marker when character is on correct map', () => { const char = createCharacter(makeCharData()) const mapview = makeMapViewRef(1) char.add(mapview) expect(mapview.map.unproject).toHaveBeenCalled() }) it('add does not create marker for different map', () => { const char = createCharacter(makeCharData({ map: 2 })) const mapview = makeMapViewRef(1) char.add(mapview) expect(mapview.map.unproject).not.toHaveBeenCalled() }) it('update changes position and map', () => { const char = createCharacter(makeCharData()) const mapview = makeMapViewRef(1) char.update(mapview, { ...makeCharData(), position: { x: 300, y: 400 }, map: 2, }) expect(char.position).toEqual({ x: 300, y: 400 }) expect(char.map).toBe(2) }) it('remove on a character without leaflet marker does nothing', () => { const char = createCharacter(makeCharData()) const mapview = makeMapViewRef(1) char.remove(mapview) // should not throw expect(char.leafletMarker).toBeNull() }) it('setClickCallback works', () => { const char = createCharacter(makeCharData()) const cb = vi.fn() char.setClickCallback(cb) }) })