补齐 UI 编辑器 activeImageId 与联合适配两条验收断言

- tests/uiEditorPage.test.ts 新增「预览里选择节点不改变左侧选中的界面图」:断言 canvas.selectNode 只改节点选中、不改 hook 暴露的 activeImageId,Inspector 部件切换同理
- tests/previewWorkspaceZoom.test.tsx 新增「进入时按全部树的联合边界适配,选中节点不重新适配」:两棵树横跨 1600 单位时联合适配缩放必须小于单棵,选中态重渲染后缩放不变;夹具补齐第二棵树的界面图(否则不进联合边界)
- 变异验证:selectNode 里加 setActiveImageId 只红那条新用例(1 failed / 36 passed);allBounds 接 slice(0,1) 只红联合适配用例的第一处断言(1 failed / 8 passed)
- 里程碑勾选第 5、6 条验收,剩余未覆盖条目收敛到 1 条(拖动进 undo/redo 与保存恢复)
This commit is contained in:
kdletters
2026-09-28 17:36:50 +08:00
parent e2964b5f31
commit 46cb3f1908
3 changed files with 62 additions and 5 deletions
@@ -248,4 +248,43 @@ describe('PreviewWorkspace quick zoom', () => {
}),
).toBe(true);
});
it('进入时按全部树的联合边界适配,选中节点不重新适配', () => {
const secondRoot: UiNode = {
...structuredClone(root),
id: 'root-2',
offset: { min: [1600, 0], max: [2800, 800] },
};
const twoTrees = [
{ src_ui_design: 'page-1', root },
{ src_ui_design: 'page-2', root: secondRoot },
];
// 第二棵树的界面图必须也在投影里,否则它不会进入联合边界(`allBounds` 只收集尺寸有效的树)。
const twoTreeCanvas = {
uiTrees: twoTrees,
images: { 'page-1': activeImage, 'page-2': activeImage },
previewUrls: {
'page-1': 'data:image/png;base64,',
'page-2': 'data:image/png;base64,',
},
};
const single = render(<PreviewWorkspace canvas={createCanvas()} />);
const singleScale = logicalViewportScale(single.container);
single.unmount();
const joint = render(
<PreviewWorkspace canvas={createCanvas(twoTreeCanvas)} />,
);
const jointScale = logicalViewportScale(joint.container);
// 联合边界(两棵树横跨 1600 单位)明显比单棵树宽:首次进入必须适配全部树。
expect(jointScale).toBeLessThan(singleScale);
// 选中另一棵树的节点只改选中态:不允许顺带重新适配(那会把用户当前视口顶掉)。
joint.rerender(
<PreviewWorkspace
canvas={createCanvas({ ...twoTreeCanvas, selectedNodeId: 'root-2' })}
/>,
);
expect(logicalViewportScale(joint.container)).toBe(jointScale);
});
});
@@ -1179,4 +1179,22 @@ describe('UiEditorPage', () => {
expect(component.checked).toBe(true);
expect(origin.checked).toBe(true);
});
it('预览里选择节点不改变左侧选中的界面图', async () => {
const hook = await renderLoadedSession(
stateWithPages(['page-1', 'page-2']),
);
// 左侧图片选择维护 activeImageId。
act(() => hook.result.current.input.selectDesignImage('page-2'));
expect(hook.result.current.canvas.activeImageId).toBe('page-2');
// 预览里选中另一棵树的节点:只改节点选中,不能反过来改掉左侧选中的界面图。
act(() => hook.result.current.canvas.selectNode('page-1-root'));
expect(hook.result.current.canvas.selectedNodeId).toBe('page-1-root');
expect(hook.result.current.canvas.activeImageId).toBe('page-2');
// Inspector 的部件切换同样不改左侧选中的界面图。
act(() => hook.result.current.input.selectSprite('panel'));
expect(hook.result.current.canvas.activeImageId).toBe('page-2');
});
});