mirror of
https://github.com/duckietm/Nitro-V3.git
synced 2026-06-19 23:16:21 +00:00
59 lines
2.5 KiB
TypeScript
59 lines
2.5 KiB
TypeScript
import { describe, it, expect, vi } from 'vitest';
|
|
import { fireEvent, render } from '@testing-library/react';
|
|
import { FloorplanCanvasSVG } from './FloorplanCanvasSVG';
|
|
import { initialState } from '../state/reducer';
|
|
|
|
describe('FloorplanCanvasSVG', () =>
|
|
{
|
|
it('renders one polygon per non-blocked tile', () =>
|
|
{
|
|
const state = {
|
|
...initialState,
|
|
tiles: [
|
|
[{ h: 0, blocked: false }, { h: 1, blocked: true }],
|
|
[{ h: 2, blocked: false }, { h: 3, blocked: false }]
|
|
]
|
|
};
|
|
const { container } = render(<FloorplanCanvasSVG state={ state } dispatch={ () => {} } />);
|
|
const polys = container.querySelectorAll('polygon');
|
|
expect(polys.length).toBeGreaterThanOrEqual(3);
|
|
});
|
|
|
|
it('renders door marker on the door tile', () =>
|
|
{
|
|
const state = {
|
|
...initialState,
|
|
tiles: [[{ h: 0, blocked: false }, { h: 0, blocked: false }]],
|
|
door: { x: 1, y: 0, dir: 2 as const }
|
|
};
|
|
const { container } = render(<FloorplanCanvasSVG state={ state } dispatch={ () => {} } />);
|
|
expect(container.querySelector('[data-testid="door-marker"]')).toBeTruthy();
|
|
});
|
|
|
|
it('forwards pointer events to a tool dispatch (PAINT_TILE with brush)', () =>
|
|
{
|
|
const state = {
|
|
...initialState,
|
|
tiles: [[{ h: 0, blocked: false }]],
|
|
brush: { h: 0, action: 'SET' as const }
|
|
};
|
|
const dispatch = vi.fn();
|
|
const { container } = render(<FloorplanCanvasSVG state={ state } dispatch={ dispatch } />);
|
|
const svg = container.querySelector('svg') as SVGSVGElement;
|
|
svg.getBoundingClientRect = () => ({ left: 0, top: 0, right: 2048, bottom: 1024, width: 2048, height: 1024, x: 0, y: 0, toJSON: () => ({}) });
|
|
fireEvent.pointerDown(svg, { clientX: 1024, clientY: 0, pointerId: 1 });
|
|
expect(dispatch).toHaveBeenCalled();
|
|
const call = dispatch.mock.calls[0][0];
|
|
expect(call.type).toBe('PAINT_TILE');
|
|
});
|
|
|
|
it('zoom in/out buttons adjust the viewBox', () =>
|
|
{
|
|
const { container } = render(<FloorplanCanvasSVG state={ initialState } dispatch={ () => {} } />);
|
|
const svg = container.querySelector('svg') as SVGSVGElement;
|
|
const initialVB = svg.getAttribute('viewBox');
|
|
fireEvent.click(container.querySelector('[data-testid="zoom-in"]') as Element);
|
|
expect(svg.getAttribute('viewBox')).not.toBe(initialVB);
|
|
});
|
|
});
|