import { fireEvent, render, screen } from '@testing-library/react';
import { MapDraftStatusOverlay, MapViewportToolbar } from './MapViewportTools';
const noop = () => {};
describe('MapViewportToolbar', () => {
it('统一联动变换、吸附与贴地检测命令', () => {
const onModeChange = vi.fn();
const onSnappingChange = vi.fn();
const onPlacementModeChange = vi.fn();
const onAlignToSurface = vi.fn();
render(
,
);
fireEvent.click(screen.getByRole('button', { name: '旋转工具 E' }));
fireEvent.click(screen.getByRole('button', { name: '网格吸附' }));
fireEvent.change(screen.getByLabelText('贴地检测模式'), {
target: { value: 'gravity' },
});
fireEvent.click(screen.getByRole('button', { name: '立即贴合承载面' }));
expect(onModeChange).toHaveBeenCalledWith('rotate');
expect(onSnappingChange).toHaveBeenCalledWith(false);
expect(onPlacementModeChange).toHaveBeenCalledWith('gravity');
expect(onAlignToSurface).toHaveBeenCalledOnce();
});
it('参数地形或未选中对象时不提供缩放与贴合动作', () => {
render(
,
);
expect(screen.queryByRole('button', { name: '缩放工具 R' })).not.toBeInTheDocument();
expect(screen.getByRole('button', { name: '立即贴合承载面' })).toBeDisabled();
});
});
describe('MapDraftStatusOverlay', () => {
it('提交中与失败摘要不能隐藏,失败保留重试和放弃入口', () => {
const props = { visible: true, changeCount: 2, onCommit: noop, onDiscard: noop };
const { rerender } = render();
expect(screen.getByRole('status')).toHaveTextContent('正在应用草稿');
expect(screen.getByRole('button', { name: '提交地图草稿' })).toBeDisabled();
rerender();
expect(screen.getByRole('status')).toHaveTextContent('应用失败');
expect(screen.getByRole('status')).toHaveTextContent('编译失败,草稿已保留');
expect(screen.getByRole('button', { name: '提交地图草稿' })).toBeEnabled();
expect(screen.getByRole('button', { name: '丢弃地图草稿' })).toBeEnabled();
});
it('显示未保存数量并提供提交与丢弃入口', () => {
const onCommit = vi.fn();
const onDiscard = vi.fn();
render(
,
);
expect(screen.getByText('3 项未保存改动')).toBeVisible();
fireEvent.click(screen.getByRole('button', { name: '提交地图草稿' }));
fireEvent.click(screen.getByRole('button', { name: '丢弃地图草稿' }));
expect(onCommit).toHaveBeenCalledOnce();
expect(onDiscard).toHaveBeenCalledOnce();
});
it('无草稿时不占位', () => {
render(
,
);
expect(screen.queryByLabelText('地图草稿状态')).not.toBeInTheDocument();
});
});