- Introduced .editorconfig for consistent coding styles across the project. - Added .golangci.yml for Go linting configuration. - Updated AGENTS.md to clarify project structure and components. - Enhanced CONTRIBUTING.md with Makefile usage for common tasks. - Updated Dockerfiles to use Go 1.24 and improved build instructions. - Refined README.md and deployment documentation for clarity. - Added testing documentation in testing.md for backend and frontend tests. - Introduced Makefile for streamlined development commands and tasks.
108 lines
2.9 KiB
TypeScript
108 lines
2.9 KiB
TypeScript
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> = {}): 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)
|
|
})
|
|
})
|