Files
sky_phone/frontend/src/features/map/mapViewport.test.ts
T
2026-08-16 22:08:00 +02:00

54 lines
1.2 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import {
clampMapPan,
clientPointToMapPercent,
minimumCoverZoom,
zoomPanAtPoint,
} from '@/features/map/mapViewport'
describe('map viewport geometry', () => {
const metrics = {
canvasHeight: 900,
canvasWidth: 600,
viewportHeight: 720,
viewportWidth: 360,
}
it('raises the minimum zoom until the canvas covers the viewport', () => {
expect(minimumCoverZoom(metrics)).toBe(0.8)
})
it('clamps panning so no empty edge enters the viewport', () => {
expect(clampMapPan({ x: 999, y: -999 }, 1, metrics)).toEqual({
x: 120,
y: -90,
})
})
it('converts scaled client positions into bounded map percentages', () => {
const canvas = { height: 800, left: 100, top: 50, width: 400 }
expect(clientPointToMapPercent({ x: 300, y: 250 }, canvas)).toEqual({
x: 0.5,
y: 0.25,
})
expect(clientPointToMapPercent({ x: 900, y: -100 }, canvas)).toEqual({
x: 1,
y: 0,
})
})
it('keeps the focal map point stationary while zooming', () => {
expect(
zoomPanAtPoint(
{ x: 20, y: -10 },
1,
2,
{ x: 270, y: 180 },
{ x: 360, y: 720 },
),
).toEqual({ x: -50, y: 160 })
})
})