diff --git a/packages/designer/jest.config.js b/packages/designer/jest.config.js
index 2ffc057fa..f8a7e9f98 100644
--- a/packages/designer/jest.config.js
+++ b/packages/designer/jest.config.js
@@ -9,7 +9,7 @@ const jestConfig = {
// // '^.+\\.(ts|tsx)$': 'ts-jest',
// // '^.+\\.(js|jsx)$': 'babel-jest',
// },
- // testMatch: ['**/document/node/node.test.ts'],
+ // testMatch: ['**/node-children.test.ts'],
// testMatch: ['**/history/history.test.ts'],
// testMatch: ['**/plugin/plugin-manager.test.ts'],
// testMatch: ['(/tests?/.*(test))\\.[jt]s$'],
@@ -31,6 +31,7 @@ const jestConfig = {
'!src/builtin-simulator/live-editing/live-editing.ts',
'!src/designer/offset-observer.ts',
'!src/designer/clipboard.ts',
+ '!src/designer/scroller.ts',
'!src/builtin-simulator/host.ts',
'!**/node_modules/**',
'!**/vendor/**',
diff --git a/packages/designer/src/builtin-simulator/create-simulator.ts b/packages/designer/src/builtin-simulator/create-simulator.ts
index 1d98fcd2a..2ee0320d8 100644
--- a/packages/designer/src/builtin-simulator/create-simulator.ts
+++ b/packages/designer/src/builtin-simulator/create-simulator.ts
@@ -54,17 +54,17 @@ export function createSimulator(
const id = asset.id ? ` data-id="${asset.id}"` : '';
const lv = asset.level || level || AssetLevel.Environment;
if (asset.type === AssetType.JSUrl) {
- (scripts[lv] || scripts[AssetLevel.App]).push(
+ scripts[lv].push(
``,
);
} else if (asset.type === AssetType.JSText) {
- (scripts[lv] || scripts[AssetLevel.App]).push(``);
+ scripts[lv].push(``);
} else if (asset.type === AssetType.CSSUrl) {
- (styles[lv] || styles[AssetLevel.App]).push(
+ styles[lv].push(
``,
);
} else if (asset.type === AssetType.CSSText) {
- (styles[lv] || styles[AssetLevel.App]).push(
+ styles[lv].push(
``,
);
}
@@ -98,8 +98,9 @@ export function createSimulator(
doc.close();
return new Promise((resolve) => {
- if (win.SimulatorRenderer || host.renderer) {
- return resolve(win.SimulatorRenderer || host.renderer);
+ const renderer = win.SimulatorRenderer || host.renderer;
+ if (renderer) {
+ return resolve(renderer);
}
const loaded = () => {
resolve(win.SimulatorRenderer || host.renderer);
diff --git a/packages/designer/src/designer/designer.ts b/packages/designer/src/designer/designer.ts
index 12d9bc112..9663574db 100644
--- a/packages/designer/src/designer/designer.ts
+++ b/packages/designer/src/designer/designer.ts
@@ -420,7 +420,7 @@ export class Designer {
}
get(key: string): any {
- return this.props ? this.props[key] : null;
+ return this.props?.[key];
}
@obx.ref private _simulatorComponent?: ComponentType;
diff --git a/packages/designer/src/document/document-model.ts b/packages/designer/src/document/document-model.ts
index 410d19718..c7e25b7a1 100644
--- a/packages/designer/src/document/document-model.ts
+++ b/packages/designer/src/document/document-model.ts
@@ -220,8 +220,10 @@ export class DocumentModel {
if (this.hasNode(schema?.id)) {
schema.id = null;
}
+ /* istanbul ignore next */
if (schema.id) {
node = this.getNode(schema.id);
+ // TODO: 底下这几段代码似乎永远都进不去
if (node && node.componentName === schema.componentName) {
if (node.parent) {
node.internalSetParent(null, false);
@@ -239,12 +241,6 @@ export class DocumentModel {
// todo: this.activeNodes?.push(node);
}
- const origin = this._nodesMap.get(node.id);
- if (origin && origin !== node) {
- // almost will not go here, ensure the id is unique
- origin.internalSetWillPurge();
- }
-
this._nodesMap.set(node.id, node);
this.nodes.add(node);
@@ -578,6 +574,7 @@ export class DocumentModel {
/**
* @deprecated
*/
+ /* istanbul ignore next */
getAddonData(name: string) {
const addon = this._addons.find((item) => item.name === name);
if (addon) {
@@ -588,6 +585,7 @@ export class DocumentModel {
/**
* @deprecated
*/
+ /* istanbul ignore next */
exportAddonData() {
const addons = {};
this._addons.forEach((addon) => {
@@ -604,6 +602,7 @@ export class DocumentModel {
/**
* @deprecated
*/
+ /* istanbul ignore next */
registerAddon(name: string, exportData: any) {
if (['id', 'params', 'layout'].indexOf(name) > -1) {
throw new Error('addon name cannot be id, params, layout');
@@ -618,6 +617,7 @@ export class DocumentModel {
});
}
+ /* istanbul ignore next */
acceptRootNodeVisitor(
visitorName = 'default',
visitorFn: (node: RootNode) => any,
@@ -637,6 +637,7 @@ export class DocumentModel {
return visitorResult;
}
+ /* istanbul ignore next */
getRootNodeVisitor(name: string) {
return this.rootNodeVisitorMap[name];
}
diff --git a/packages/designer/src/document/node/modal-nodes-manager.ts b/packages/designer/src/document/node/modal-nodes-manager.ts
index 6288b3547..7f1a7baf2 100644
--- a/packages/designer/src/document/node/modal-nodes-manager.ts
+++ b/packages/designer/src/document/node/modal-nodes-manager.ts
@@ -2,7 +2,7 @@ import { EventEmitter } from 'events';
import { Node } from './node';
import { DocumentModel } from '../document-model';
-function getModalNodes(node: Node) {
+export function getModalNodes(node: Node) {
if (!node) return [];
let nodes: any = [];
if (node.componentMeta.isModal) {
@@ -40,44 +40,37 @@ export class ModalNodesManager {
];
}
- public getModalNodes() {
+ getModalNodes() {
return this.modalNodes;
}
- public getVisibleModalNode() {
- const visibleNode = this.modalNodes
- ? this.modalNodes.find((node: Node) => {
- return node.getVisible();
- })
- : null;
- return visibleNode;
+ getVisibleModalNode() {
+ return this.getModalNodes().find((node: Node) => node.getVisible());
}
- public hideModalNodes() {
- if (this.modalNodes) {
- this.modalNodes.forEach((node: Node) => {
- node.setVisible(false);
- });
- }
+ hideModalNodes() {
+ this.modalNodes.forEach((node: Node) => {
+ node.setVisible(false);
+ });
}
- public setVisible(node: Node) {
+ setVisible(node: Node) {
this.hideModalNodes();
node.setVisible(true);
}
- public setInvisible(node: Node) {
+ setInvisible(node: Node) {
node.setVisible(false);
}
- public onVisibleChange(func: () => any) {
+ onVisibleChange(func: () => any) {
this.emitter.on('visibleChange', func);
return () => {
this.emitter.removeListener('visibleChange', func);
};
}
- public onModalNodesChange(func: () => any) {
+ onModalNodesChange(func: () => any) {
this.emitter.on('modalNodesChange', func);
return () => {
this.emitter.removeListener('modalNodesChange', func);
@@ -122,7 +115,7 @@ export class ModalNodesManager {
}
}
- public setNodes() {
+ setNodes() {
const nodes = getModalNodes(this.page.getRoot()!);
this.modalNodes = nodes;
this.modalNodes.forEach((node: Node) => {
diff --git a/packages/designer/src/document/node/props/prop.ts b/packages/designer/src/document/node/props/prop.ts
index 6533b4607..87fcc5310 100644
--- a/packages/designer/src/document/node/props/prop.ts
+++ b/packages/designer/src/document/node/props/prop.ts
@@ -259,7 +259,7 @@ export class Prop implements IPropParent {
} else {
this._type = 'map';
}
- } /* istanbul ignore next */ else {
+ } else /* istanbul ignore next */ {
this._type = 'expression';
this._value = {
type: 'JSExpression',
@@ -502,6 +502,7 @@ export class Prop implements IPropParent {
*/
@action
delete(prop: Prop): void {
+ /* istanbul ignore else */
if (this._items) {
const i = this._items.indexOf(prop);
if (i > -1) {
@@ -519,6 +520,7 @@ export class Prop implements IPropParent {
*/
@action
deleteKey(key: string): void {
+ /* istanbul ignore else */
if (this.maps) {
const prop = this.maps.get(key);
if (prop) {
diff --git a/packages/designer/src/document/selection.ts b/packages/designer/src/document/selection.ts
index bc012a899..bd30f5314 100644
--- a/packages/designer/src/document/selection.ts
+++ b/packages/designer/src/document/selection.ts
@@ -150,8 +150,6 @@ export class Selection {
} else if (n === PositionNO.ContainedBy) {
// node contains nodes[i], delete nodes[i]
nodes.splice(i, 1);
- } else {
- isTop = false;
}
}
// node is top item, push to nodes
diff --git a/packages/designer/tests/designer/designer.test.ts b/packages/designer/tests/designer/designer.test.ts
index fc6997bd8..51fbabea7 100644
--- a/packages/designer/tests/designer/designer.test.ts
+++ b/packages/designer/tests/designer/designer.test.ts
@@ -273,6 +273,18 @@ describe('Designer 测试', () => {
expect(designer._componentMetasMap.has('Div')).toBeTruthy();
const { editor: editorFromDesigner2, ...others2 } = designer.props;
expect(others2).toEqual(updatedProps);
+
+ // 第三次设置 props,跟第二次值一样,for 覆盖率测试
+ const updatedProps2 = updatedProps;
+ designer.setProps(updatedProps2);
+
+ expect(designer.simulatorComponent).toEqual({ isSimulatorComp2: true });
+ expect(designer.simulatorProps).toEqual({ designMode: 'live' });
+ expect(designer.suspensed).toBeFalsy();
+ expect(designer._componentMetasMap.has('Button')).toBeTruthy();
+ expect(designer._componentMetasMap.has('Div')).toBeTruthy();
+ const { editor: editorFromDesigner3, ...others3 } = designer.props;
+ expect(others3).toEqual(updatedProps);
});
describe('getSuitableInsertion', () => {
@@ -313,6 +325,70 @@ describe('Designer 测试', () => {
});
});
+ it('getComponentMetasMap', () => {
+ designer.createComponentMeta({
+ componentName: 'Div',
+ title: '容器',
+ docUrl: 'http://gitlab.alibaba-inc.com/vision-components/vc-block/blob/master/README.md',
+ devMode: 'procode',
+ tags: ['布局'],
+ });
+
+ expect(designer.getComponentMetasMap().get('Div')).not.toBeUndefined();
+ });
+
+ it('refreshComponentMetasMap', () => {
+ designer.createComponentMeta({
+ componentName: 'Div',
+ title: '容器',
+ docUrl: 'http://gitlab.alibaba-inc.com/vision-components/vc-block/blob/master/README.md',
+ devMode: 'procode',
+ tags: ['布局'],
+ });
+
+ const originalMetasMap = designer.getComponentMetasMap();
+ designer.refreshComponentMetasMap();
+
+ expect(originalMetasMap).not.toBe(designer.getComponentMetasMap());
+ });
+
+ describe('loadIncrementalAssets', () => {
+ it('components && packages', async () => {
+ editor.set('assets', { components: [], packages: [] });
+ const fn = jest.fn();
+
+ project.mountSimulator({
+ setupComponents: fn,
+ });
+ await designer.loadIncrementalAssets({
+ components: [{
+ componentName: 'Div2',
+ title: '容器',
+ docUrl: 'http://gitlab.alibaba-inc.com/vision-components/vc-block/blob/master/README.md',
+ devMode: 'proCode',
+ tags: ['布局'],
+ }],
+ packages: [],
+ });
+
+ const comps = editor.get('assets').components;
+ expect(comps).toHaveLength(1);
+ expect(fn).toHaveBeenCalled();
+ });
+
+ it('no components && packages', async () => {
+ editor.set('assets', { components: [], packages: [] });
+ const fn = jest.fn();
+
+ project.mountSimulator({
+ setupComponents: fn,
+ });
+ await designer.loadIncrementalAssets({});
+
+ expect(fn).not.toHaveBeenCalled();
+ });
+ });
+
it('createLocation / clearLocation', () => {
const mockTarget = {
document: doc,
diff --git a/packages/designer/tests/document/document-model/document-model.test.ts b/packages/designer/tests/document/document-model/document-model.test.ts
index 9ef834eb7..c110116a6 100644
--- a/packages/designer/tests/document/document-model/document-model.test.ts
+++ b/packages/designer/tests/document/document-model/document-model.test.ts
@@ -23,7 +23,7 @@ describe('document-model 测试', () => {
project = designer.project;
});
- test('empty schema', () => {
+ it('empty schema', () => {
const doc = new DocumentModel(project);
expect(doc.rootNode.id).toBe('root');
expect(doc.currentRoot).toBe(doc.rootNode);
@@ -44,7 +44,7 @@ describe('document-model 测试', () => {
});
});
- test('各种方法测试', () => {
+ it('各种方法测试', () => {
const doc = new DocumentModel(project, formSchema);
const mockNode = { id: 1 };
doc.addWillPurge(mockNode);
@@ -115,8 +115,89 @@ describe('document-model 测试', () => {
expect(doc.history).toBe(doc.getHistory());
});
+ it('focusNode - using drillDown', () => {
+ const doc = new DocumentModel(project, formSchema);
+ expect(doc.focusNode.id).toBe('page');
+
+ doc.drillDown(doc.getNode('node_k1ow3cbb'));
+ expect(doc.focusNode.id).toBe('node_k1ow3cbb');
+ });
+
+ it('focusNode - using drillDown & import', () => {
+ const doc = new DocumentModel(project, formSchema);
+ expect(doc.focusNode.id).toBe('page');
+
+ doc.drillDown(doc.getNode('node_k1ow3cbb'));
+ doc.import(formSchema);
+ expect(doc.focusNode.id).toBe('node_k1ow3cbb');
+ });
+
+ it('focusNode - using focusNodeSelector', () => {
+ const doc = new DocumentModel(project, formSchema);
+ editor.set('focusNodeSelector', (rootNode) => {
+ return rootNode.children.get(1);
+ });
+ expect(doc.focusNode.id).toBe('node_k1ow3cbb');
+ });
+
+ it('getNodeCount', () => {
+ const doc = new DocumentModel(project);
+ // using default schema, only one node
+ expect(doc.getNodeCount()).toBe(1);
+ });
+
+ it('getNodeSchema', () => {
+ const doc = new DocumentModel(project, formSchema);
+ expect(doc.getNodeSchema('page').id).toBe('page');
+ });
+
+ it('export - with __isTopFixed__', () => {
+ formSchema.children[1].props.__isTopFixed__ = true;
+ const doc = new DocumentModel(project, formSchema);
+
+ const schema = doc.export();
+ expect(schema.children).toHaveLength(3);
+ expect(schema.children[0].componentName).toBe('RootContent');
+ expect(schema.children[1].componentName).toBe('RootHeader');
+ expect(schema.children[2].componentName).toBe('RootFooter');
+ });
+
+ describe('createNode', () => {
+ it('same id && componentName', () => {
+ const doc = new DocumentModel(project, formSchema);
+ const node = doc.createNode({
+ componentName: 'RootFooter',
+ id: 'node_k1ow3cbc',
+ props: {},
+ condition: true,
+ });
+ expect(node.parent).toBeNull();
+ });
+
+ it('same id && different componentName', () => {
+ const doc = new DocumentModel(project, formSchema);
+ const originalNode = doc.getNode('node_k1ow3cbc');
+ const node = doc.createNode({
+ componentName: 'RootFooter2',
+ id: 'node_k1ow3cbc',
+ props: {},
+ condition: true,
+ });
+ // expect(originalNode.parent).toBeNull();
+ expect(node.id).not.toBe('node_k1ow3cbc');
+ });
+ });
+
+ it('setSuspense', () => {
+ const doc = new DocumentModel(project, formSchema);
+ expect(doc.opened).toBeFalsy();
+ doc.setSuspense(false);
+ });
+
it('registerAddon / getAddonData / exportAddonData', () => {
const doc = new DocumentModel(project);
+ expect(doc.getAddonData('a')).toBeUndefined();
+
doc.registerAddon('a', () => 'addon a');
doc.registerAddon('a', () => 'modified addon a');
doc.registerAddon('b', () => 'addon b');
@@ -177,6 +258,8 @@ describe('document-model 测试', () => {
expect(comps.find(comp => comp.componentName === 'Page')).toEqual(
{ componentName: 'Page', devMode: 'lowCode' }
);
+
+ const comps2 = doc.getComponentsMap(['Div']);
});
it('acceptRootNodeVisitor / getRootNodeVisitor', () => {
diff --git a/packages/designer/tests/document/node/modal-nodes-manager.test.ts b/packages/designer/tests/document/node/modal-nodes-manager.test.ts
index d7b3ef8b9..80ca53b3e 100644
--- a/packages/designer/tests/document/node/modal-nodes-manager.test.ts
+++ b/packages/designer/tests/document/node/modal-nodes-manager.test.ts
@@ -1,53 +1,35 @@
import '../../fixtures/window';
-import { set, delayObxTick, delay } from '../../utils';
import { Editor } from '@alilc/lowcode-editor-core';
import { Project } from '../../../src/project/project';
import { DocumentModel } from '../../../src/document/document-model';
-import {
- isRootNode,
- Node,
- isNode,
- comparePosition,
- contains,
- insertChild,
- insertChildren,
- PositionNO,
-} from '../../../src/document/node/node';
+import { Node } from '../../../src/document/node/node';
import { Designer } from '../../../src/designer/designer';
import formSchema from '../../fixtures/schema/form-with-modal';
-import divMetadata from '../../fixtures/component-metadata/div';
import dlgMetadata from '../../fixtures/component-metadata/dialog';
-import buttonMetadata from '../../fixtures/component-metadata/button';
-import formMetadata from '../../fixtures/component-metadata/form';
-import otherMeta from '../../fixtures/component-metadata/other';
-import pageMetadata from '../../fixtures/component-metadata/page';
-import rootHeaderMetadata from '../../fixtures/component-metadata/root-header';
-import rootContentMetadata from '../../fixtures/component-metadata/root-content';
-import rootFooterMetadata from '../../fixtures/component-metadata/root-footer';
+import { getModalNodes } from '../../../src/document/node/modal-nodes-manager';
+let editor: Editor;
+let designer: Designer;
+let project: Project;
+let doc: DocumentModel;
+
+beforeEach(() => {
+ editor = new Editor();
+ designer = new Designer({ editor });
+ designer.createComponentMeta(dlgMetadata);
+ project = designer.project;
+ doc = new DocumentModel(project, formSchema);
+});
+
+afterEach(() => {
+ project.unload();
+ designer.purge();
+ editor = null;
+ designer = null;
+ project = null;
+});
describe('ModalNodesManager 方法测试', () => {
- let editor: Editor;
- let designer: Designer;
- let project: Project;
- let doc: DocumentModel;
-
- beforeEach(() => {
- editor = new Editor();
- designer = new Designer({ editor });
- designer.createComponentMeta(dlgMetadata);
- project = designer.project;
- doc = new DocumentModel(project, formSchema);
- });
-
- afterEach(() => {
- project.unload();
- designer.purge();
- editor = null;
- designer = null;
- project = null;
- });
-
it('getModalNodes / getVisibleModalNode', () => {
const mgr = doc.modalNodesManager;
const nodes = mgr.getModalNodes();
@@ -100,5 +82,30 @@ describe('ModalNodesManager 方法测试', () => {
mgr.addNode(newNode);
expect(visibleMockFn).not.toHaveBeenCalled();
expect(nodesMockFn).not.toHaveBeenCalled();
+
+ const newNode2 = new Node(doc, { componentName: 'Dialog' });
+ mgr.addNode(newNode2);
+ mgr.setInvisible(newNode2);
+ mgr.removeNode(newNode2);
+
+ const newNode3 = new Node(doc, { componentName: 'Dialog' });
+ mgr.removeNode(newNode3);
+
+ const newNode4 = new Node(doc, { componentName: 'Non-Modal' });
+ mgr.removeNode(newNode4);
+
+ const newNode5 = doc.createNode({ componentName: 'Non-Modal' });
+ newNode5.remove(); // trigger node destroy
});
});
+
+describe('其他方法', () => {
+ it('getModalNodes - null', () => {
+ expect(getModalNodes()).toEqual([]);
+ });
+
+ it('getModalNodes - no children', () => {
+ const node = doc.createNode({ componentName: 'Leaf', children: 'haha' });
+ expect(getModalNodes(node)).toEqual([]);
+ });
+});
\ No newline at end of file
diff --git a/packages/designer/tests/document/node/node-children.test.ts b/packages/designer/tests/document/node/node-children.test.ts
index 2265596e5..8776f3bdd 100644
--- a/packages/designer/tests/document/node/node-children.test.ts
+++ b/packages/designer/tests/document/node/node-children.test.ts
@@ -1,29 +1,13 @@
import '../../fixtures/window';
-import { set, delayObxTick, delay } from '../../utils';
import { Editor } from '@alilc/lowcode-editor-core';
import { Project } from '../../../src/project/project';
import { DocumentModel } from '../../../src/document/document-model';
import {
- isRootNode,
Node,
- isNode,
- comparePosition,
- contains,
- insertChild,
- insertChildren,
- PositionNO,
} from '../../../src/document/node/node';
import { Designer } from '../../../src/designer/designer';
import formSchema from '../../fixtures/schema/form';
import divMetadata from '../../fixtures/component-metadata/div';
-import buttonMetadata from '../../fixtures/component-metadata/button';
-import formMetadata from '../../fixtures/component-metadata/form';
-import otherMeta from '../../fixtures/component-metadata/other';
-import pageMetadata from '../../fixtures/component-metadata/page';
-import rootHeaderMetadata from '../../fixtures/component-metadata/root-header';
-import rootContentMetadata from '../../fixtures/component-metadata/root-content';
-import rootFooterMetadata from '../../fixtures/component-metadata/root-footer';
-
describe('NodeChildren 方法测试', () => {
let editor: Editor;
@@ -57,6 +41,13 @@ describe('NodeChildren 方法测试', () => {
expect(firstBtn.children.isEmpty()).toBeTruthy();
});
+ it('export', () => {
+ const firstBtn = doc.getNode('node_k1ow3cbn')!;
+ const { children } = firstBtn.parent!;
+
+ expect(children.export().length).toBe(2);
+ });
+
it('purge / for of', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!;
const { children } = firstBtn.parent!;
@@ -65,6 +56,9 @@ describe('NodeChildren 方法测试', () => {
for (const child of children) {
expect(child.isPurged).toBeTruthy();
}
+
+ // purge when children is purged
+ children.purge();
});
it('splice', () => {
@@ -138,6 +132,28 @@ describe('NodeChildren 方法测试', () => {
expect(found?.componentName).toBe('Button');
});
+ it('concat', () => {
+ const firstBtn = doc.getNode('node_k1ow3cbn')!;
+ const { children } = firstBtn.parent!;
+
+ const ret = children.concat([doc.createNode({ componentName: 'Button' })]);
+
+ expect(ret.length).toBe(3);
+ });
+
+ it('reduce', () => {
+ const firstBtn = doc.getNode('node_k1ow3cbn')!;
+ const { children } = firstBtn.parent!;
+
+ let ret = 0;
+ ret = children.reduce((count, node) => {
+ count = count + 1;
+ return count;
+ }, 0);
+
+ expect(ret).toBe(2);
+ });
+
it('mergeChildren', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!;
const { children } = firstBtn.parent!;
@@ -159,6 +175,9 @@ describe('NodeChildren 方法测试', () => {
expect(children.size).toBe(3);
expect(changeMockFn).toHaveBeenCalled();
offChange();
+
+ // no remover && adder && sorter
+ children.mergeChildren();
});
it('insert / onInsert', () => {
diff --git a/packages/designer/tests/document/node/props/prop.test.ts b/packages/designer/tests/document/node/props/prop.test.ts
index ec447a902..d1d2a3fdd 100644
--- a/packages/designer/tests/document/node/props/prop.test.ts
+++ b/packages/designer/tests/document/node/props/prop.test.ts
@@ -95,6 +95,7 @@ describe('Prop 类测试', () => {
it('getValue / getAsString / setValue', () => {
expect(strProp.getValue()).toBe('haha');
strProp.setValue('heihei');
+ strProp.setValue('heihei');
expect(strProp.getValue()).toBe('heihei');
expect(strProp.getAsString()).toBe('heihei');
@@ -177,6 +178,7 @@ describe('Prop 类测试', () => {
it('compare', () => {
const newProp = new Prop(mockedPropsInst, 'haha');
+ const newProp2 = new Prop(mockedPropsInst, { a: 1 });
expect(strProp.compare(newProp)).toBe(0);
expect(strProp.compare(expProp)).toBe(2);
@@ -184,6 +186,7 @@ describe('Prop 类测试', () => {
expect(strProp.compare(newProp)).toBe(2);
strProp.unset();
expect(strProp.compare(newProp)).toBe(0);
+ expect(strProp.compare(newProp2)).toBe(2);
});
it('isVirtual', () => {
@@ -435,6 +438,28 @@ describe('Prop 类测试', () => {
prop = new Prop(mockedPropsInst, [undefined, undefined], '___loopArgs___');
expect(prop.getValue()).toBeUndefined();
});
+
+ it('迭代器 / map / forEach', () => {
+ const listProp = new Prop(mockedPropsInst, [1, 2]);
+ const mockedFn = jest.fn();
+ for (const item of listProp) {
+ mockedFn();
+ }
+ expect(mockedFn).toHaveBeenCalledTimes(2);
+ mockedFn.mockClear();
+
+ listProp.forEach((item) => {
+ mockedFn();
+ });
+ expect(mockedFn).toHaveBeenCalledTimes(2);
+ mockedFn.mockClear();
+
+ listProp.map((item) => {
+ return mockedFn();
+ });
+ expect(mockedFn).toHaveBeenCalledTimes(2);
+ mockedFn.mockClear();
+ });
});
});
diff --git a/packages/designer/tests/document/selection.test.ts b/packages/designer/tests/document/selection.test.ts
index 630faa95e..30032ac7a 100644
--- a/packages/designer/tests/document/selection.test.ts
+++ b/packages/designer/tests/document/selection.test.ts
@@ -257,6 +257,20 @@ describe('选择区测试', () => {
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: [