mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2025-12-12 11:20:11 +00:00
286 lines
9.4 KiB
TypeScript
286 lines
9.4 KiB
TypeScript
import set from 'lodash/set';
|
||
import cloneDeep from 'lodash/cloneDeep';
|
||
import '../fixtures/window';
|
||
import { Project } from '../../src/project/project';
|
||
import { Node } from '../../src/document/node/node';
|
||
import { Designer } from '../../src/designer/designer';
|
||
import formSchema from '../fixtures/schema/form';
|
||
import { getIdsFromSchema, getNodeFromSchemaById } from '../utils';
|
||
|
||
const mockCreateSettingEntry = jest.fn();
|
||
jest.mock('../../src/designer/designer', () => {
|
||
return {
|
||
Designer: jest.fn().mockImplementation(() => {
|
||
return {
|
||
getComponentMeta() {
|
||
return {
|
||
getMetadata() {
|
||
return { configure: { advanced: null } };
|
||
},
|
||
get advanced() {
|
||
return {};
|
||
},
|
||
};
|
||
},
|
||
transformProps(props) { return props; },
|
||
createSettingEntry: mockCreateSettingEntry,
|
||
postEvent() {},
|
||
};
|
||
}),
|
||
};
|
||
});
|
||
|
||
let designer = null;
|
||
beforeAll(() => {
|
||
designer = new Designer({});
|
||
});
|
||
|
||
describe('选择区测试', () => {
|
||
it('常规方法', () => {
|
||
const project = new Project(designer, {
|
||
componentsTree: [
|
||
formSchema,
|
||
],
|
||
});
|
||
project.open();
|
||
expect(project).toBeTruthy();
|
||
const { currentDocument } = project;
|
||
const { nodesMap, selection } = currentDocument!;
|
||
const selectionChangeHandler = jest.fn();
|
||
selection.onSelectionChange(selectionChangeHandler);
|
||
|
||
selection.select('form');
|
||
expect(selectionChangeHandler).toHaveBeenCalledTimes(1);
|
||
expect(selection.selected).toEqual(['form']);
|
||
selectionChangeHandler.mockClear();
|
||
|
||
selection.select('form');
|
||
expect(selectionChangeHandler).toHaveBeenCalledTimes(0);
|
||
expect(selection.selected).toEqual(['form']);
|
||
|
||
selection.select('node_k1ow3cbj');
|
||
expect(selectionChangeHandler).toHaveBeenCalledTimes(1);
|
||
expect(selectionChangeHandler.mock.calls[0][0]).toEqual(['node_k1ow3cbj']);
|
||
expect(selection.selected).toEqual(['node_k1ow3cbj']);
|
||
selectionChangeHandler.mockClear();
|
||
|
||
selection.selectAll(['node_k1ow3cbj', 'form']);
|
||
expect(selectionChangeHandler).toHaveBeenCalledTimes(1);
|
||
expect(selectionChangeHandler.mock.calls[0][0]).toEqual(['node_k1ow3cbj', 'form']);
|
||
expect(selection.selected).toEqual(['node_k1ow3cbj', 'form']);
|
||
selectionChangeHandler.mockClear();
|
||
|
||
selection.remove('node_k1ow3cbj_fake');
|
||
selection.remove('node_k1ow3cbj');
|
||
expect(selectionChangeHandler).toHaveBeenCalledTimes(1);
|
||
expect(selectionChangeHandler.mock.calls[0][0]).toEqual(['form']);
|
||
expect(selection.selected).toEqual(['form']);
|
||
selectionChangeHandler.mockClear();
|
||
|
||
selection.clear();
|
||
expect(selectionChangeHandler).toHaveBeenCalledTimes(1);
|
||
expect(selectionChangeHandler.mock.calls[0][0]).toEqual([]);
|
||
expect(selection.selected).toEqual([]);
|
||
selectionChangeHandler.mockClear();
|
||
|
||
// 无选中时调用 clear,不再触发事件
|
||
selection.clear();
|
||
expect(selectionChangeHandler).toHaveBeenCalledTimes(0);
|
||
expect(selection.selected).toEqual([]);
|
||
selectionChangeHandler.mockClear();
|
||
});
|
||
|
||
it('add 方法', () => {
|
||
const project = new Project(designer, {
|
||
componentsTree: [
|
||
formSchema,
|
||
],
|
||
});
|
||
project.open();
|
||
expect(project).toBeTruthy();
|
||
const { currentDocument } = project;
|
||
const { nodesMap, selection } = currentDocument!;
|
||
const selectionChangeHandler = jest.fn();
|
||
selection.onSelectionChange(selectionChangeHandler);
|
||
|
||
selection.add('form');
|
||
expect(selectionChangeHandler).toHaveBeenCalledTimes(1);
|
||
expect(selectionChangeHandler.mock.calls[0][0]).toEqual(['form']);
|
||
expect(selection.selected).toEqual(['form']);
|
||
selectionChangeHandler.mockClear();
|
||
|
||
// 再加一次相同的节点,不触发事件
|
||
selection.add('form');
|
||
expect(selectionChangeHandler).toHaveBeenCalledTimes(0);
|
||
expect(selection.selected).toEqual(['form']);
|
||
selectionChangeHandler.mockClear();
|
||
|
||
selection.add('form2');
|
||
expect(selectionChangeHandler).toHaveBeenCalledTimes(1);
|
||
expect(selectionChangeHandler.mock.calls[0][0]).toEqual(['form', 'form2']);
|
||
expect(selection.selected).toEqual(['form', 'form2']);
|
||
selectionChangeHandler.mockClear();
|
||
});
|
||
|
||
it('selectAll 包含不存在的 id', () => {
|
||
const project = new Project(designer, {
|
||
componentsTree: [
|
||
formSchema,
|
||
],
|
||
});
|
||
project.open();
|
||
expect(project).toBeTruthy();
|
||
const { currentDocument } = project;
|
||
const { nodesMap, selection } = currentDocument!;
|
||
|
||
selection.selectAll(['form', 'node_k1ow3cbj', 'form2']);
|
||
|
||
expect(selection.selected).toEqual(['form', 'node_k1ow3cbj']);
|
||
});
|
||
|
||
it('dispose 方法 - 选中的节点没有被删除的', () => {
|
||
const project = new Project(designer, {
|
||
componentsTree: [
|
||
formSchema,
|
||
],
|
||
});
|
||
project.open();
|
||
expect(project).toBeTruthy();
|
||
const { currentDocument } = project;
|
||
const { nodesMap, selection } = currentDocument!;
|
||
|
||
selection.selectAll(['form', 'node_k1ow3cbj']);
|
||
|
||
const selectionChangeHandler = jest.fn();
|
||
selection.onSelectionChange(selectionChangeHandler);
|
||
selection.dispose();
|
||
|
||
expect(selectionChangeHandler).not.toHaveBeenCalled();
|
||
});
|
||
|
||
it('containsNode 方法', () => {
|
||
const project = new Project(designer, {
|
||
componentsTree: [
|
||
formSchema,
|
||
],
|
||
});
|
||
project.open();
|
||
expect(project).toBeTruthy();
|
||
const { currentDocument } = project;
|
||
const { nodesMap, selection } = currentDocument!;
|
||
const selectionChangeHandler = jest.fn();
|
||
selection.onSelectionChange(selectionChangeHandler);
|
||
|
||
selection.select('form');
|
||
expect(selectionChangeHandler).toHaveBeenCalledTimes(1);
|
||
expect(selectionChangeHandler.mock.calls[0][0]).toEqual(['form']);
|
||
expect(selection.selected).toEqual(['form']);
|
||
expect(selection.has('form')).toBe(true);
|
||
expect(selection.containsNode(currentDocument?.getNode('form'))).toBe(true);
|
||
expect(selection.containsNode(currentDocument?.getNode('node_k1ow3cbj'))).toBe(true);
|
||
expect(selection.containsNode(currentDocument?.getNode('page'))).toBe(false);
|
||
expect(selection.getNodes()).toEqual([currentDocument?.getNode('form')]);
|
||
selectionChangeHandler.mockClear();
|
||
|
||
selection.add('node_k1ow3cbj');
|
||
expect(selection.selected).toEqual(['form', 'node_k1ow3cbj']);
|
||
expect(selection.getTopNodes()).toEqual([currentDocument?.getNode('form')]);
|
||
expect(selection.getTopNodes(true)).toEqual([currentDocument?.getNode('form')]);
|
||
});
|
||
|
||
it('containsNode 方法 - excludeRoot: true', () => {
|
||
const project = new Project(designer, {
|
||
componentsTree: [
|
||
formSchema,
|
||
],
|
||
});
|
||
project.open();
|
||
expect(project).toBeTruthy();
|
||
const { currentDocument } = project;
|
||
const { nodesMap, selection } = currentDocument!;
|
||
const selectionChangeHandler = jest.fn();
|
||
selection.onSelectionChange(selectionChangeHandler);
|
||
|
||
selection.select('page');
|
||
expect(selectionChangeHandler).toHaveBeenCalledTimes(1);
|
||
expect(selectionChangeHandler.mock.calls[0][0]).toEqual(['page']);
|
||
expect(selection.selected).toEqual(['page']);
|
||
expect(selection.has('page')).toBe(true);
|
||
expect(selection.containsNode(currentDocument?.getNode('form'))).toBe(true);
|
||
expect(selection.containsNode(currentDocument?.getNode('form'), true)).toBe(false);
|
||
selectionChangeHandler.mockClear();
|
||
});
|
||
|
||
it('containsNode 方法 - excludeRoot: true', () => {
|
||
const project = new Project(designer, {
|
||
componentsTree: [
|
||
formSchema,
|
||
],
|
||
});
|
||
project.open();
|
||
expect(project).toBeTruthy();
|
||
const { currentDocument } = project;
|
||
const { nodesMap, selection } = currentDocument!;
|
||
const selectionChangeHandler = jest.fn();
|
||
const dispose = selection.onSelectionChange(selectionChangeHandler);
|
||
|
||
selection.select('form');
|
||
expect(selectionChangeHandler).toHaveBeenCalledTimes(1);
|
||
expect(selectionChangeHandler.mock.calls[0][0]).toEqual(['form']);
|
||
selectionChangeHandler.mockClear();
|
||
|
||
// dispose 后,selected 会被赋值,但是变更事件不会被触发
|
||
dispose();
|
||
selection.select('page');
|
||
expect(selectionChangeHandler).toHaveBeenCalledTimes(0);
|
||
expect(selection.selected).toEqual(['page']);
|
||
selectionChangeHandler.mockClear();
|
||
});
|
||
|
||
it('getNodes', () => {
|
||
const project = new Project(designer, {
|
||
componentsTree: [
|
||
formSchema,
|
||
],
|
||
});
|
||
project.open();
|
||
const { currentDocument } = project;
|
||
const { selection } = currentDocument!;
|
||
|
||
selection.selectAll(['form', 'node_k1ow3cbj', 'form2']);
|
||
|
||
// form2 is not a valid node
|
||
expect(selection.getNodes()).toHaveLength(2);
|
||
});
|
||
|
||
it('getTopNodes - BeforeOrAfter', () => {
|
||
const project = new Project(designer, {
|
||
componentsTree: [
|
||
formSchema,
|
||
],
|
||
});
|
||
project.open();
|
||
const { currentDocument } = project;
|
||
const { selection } = currentDocument!;
|
||
|
||
selection.selectAll(['node_k1ow3cbj', 'node_k1ow3cbo']);
|
||
|
||
expect(selection.getTopNodes()).toHaveLength(2);
|
||
});
|
||
it('getTopNodes', () => {
|
||
const project = new Project(designer, {
|
||
componentsTree: [
|
||
formSchema,
|
||
],
|
||
});
|
||
project.open();
|
||
const { currentDocument } = project;
|
||
const { selection } = currentDocument!;
|
||
|
||
selection.selectAll(['node_k1ow3cbj', 'node_k1ow3cbo', 'form', 'node_k1ow3cbl', 'form2']);
|
||
|
||
// form2 is not a valid node, and node_k1ow3cbj is a child node of form
|
||
expect(selection.getTopNodes()).toHaveLength(1);
|
||
});
|
||
});
|