test: add some test cases

This commit is contained in:
LeoYuan 袁力皓 2022-08-09 17:40:58 +08:00 committed by LeoYuan 袁力皓
parent f25feba63f
commit f3914ed815
13 changed files with 315 additions and 95 deletions

View File

@ -9,7 +9,7 @@ const jestConfig = {
// // '^.+\\.(ts|tsx)$': 'ts-jest', // // '^.+\\.(ts|tsx)$': 'ts-jest',
// // '^.+\\.(js|jsx)$': 'babel-jest', // // '^.+\\.(js|jsx)$': 'babel-jest',
// }, // },
// testMatch: ['**/document/node/node.test.ts'], // testMatch: ['**/node-children.test.ts'],
// testMatch: ['**/history/history.test.ts'], // testMatch: ['**/history/history.test.ts'],
// testMatch: ['**/plugin/plugin-manager.test.ts'], // testMatch: ['**/plugin/plugin-manager.test.ts'],
// testMatch: ['(/tests?/.*(test))\\.[jt]s$'], // testMatch: ['(/tests?/.*(test))\\.[jt]s$'],
@ -31,6 +31,7 @@ const jestConfig = {
'!src/builtin-simulator/live-editing/live-editing.ts', '!src/builtin-simulator/live-editing/live-editing.ts',
'!src/designer/offset-observer.ts', '!src/designer/offset-observer.ts',
'!src/designer/clipboard.ts', '!src/designer/clipboard.ts',
'!src/designer/scroller.ts',
'!src/builtin-simulator/host.ts', '!src/builtin-simulator/host.ts',
'!**/node_modules/**', '!**/node_modules/**',
'!**/vendor/**', '!**/vendor/**',

View File

@ -54,17 +54,17 @@ export function createSimulator(
const id = asset.id ? ` data-id="${asset.id}"` : ''; const id = asset.id ? ` data-id="${asset.id}"` : '';
const lv = asset.level || level || AssetLevel.Environment; const lv = asset.level || level || AssetLevel.Environment;
if (asset.type === AssetType.JSUrl) { if (asset.type === AssetType.JSUrl) {
(scripts[lv] || scripts[AssetLevel.App]).push( scripts[lv].push(
`<script src="${asset.content}"${id}></script>`, `<script src="${asset.content}"${id}></script>`,
); );
} else if (asset.type === AssetType.JSText) { } else if (asset.type === AssetType.JSText) {
(scripts[lv] || scripts[AssetLevel.App]).push(`<script${id}>${asset.content}</script>`); scripts[lv].push(`<script${id}>${asset.content}</script>`);
} else if (asset.type === AssetType.CSSUrl) { } else if (asset.type === AssetType.CSSUrl) {
(styles[lv] || styles[AssetLevel.App]).push( styles[lv].push(
`<link rel="stylesheet" href="${asset.content}"${id} />`, `<link rel="stylesheet" href="${asset.content}"${id} />`,
); );
} else if (asset.type === AssetType.CSSText) { } else if (asset.type === AssetType.CSSText) {
(styles[lv] || styles[AssetLevel.App]).push( styles[lv].push(
`<style type="text/css"${id}>${asset.content}</style>`, `<style type="text/css"${id}>${asset.content}</style>`,
); );
} }
@ -98,8 +98,9 @@ export function createSimulator(
doc.close(); doc.close();
return new Promise((resolve) => { return new Promise((resolve) => {
if (win.SimulatorRenderer || host.renderer) { const renderer = win.SimulatorRenderer || host.renderer;
return resolve(win.SimulatorRenderer || host.renderer); if (renderer) {
return resolve(renderer);
} }
const loaded = () => { const loaded = () => {
resolve(win.SimulatorRenderer || host.renderer); resolve(win.SimulatorRenderer || host.renderer);

View File

@ -420,7 +420,7 @@ export class Designer {
} }
get(key: string): any { get(key: string): any {
return this.props ? this.props[key] : null; return this.props?.[key];
} }
@obx.ref private _simulatorComponent?: ComponentType<any>; @obx.ref private _simulatorComponent?: ComponentType<any>;

View File

@ -220,8 +220,10 @@ export class DocumentModel {
if (this.hasNode(schema?.id)) { if (this.hasNode(schema?.id)) {
schema.id = null; schema.id = null;
} }
/* istanbul ignore next */
if (schema.id) { if (schema.id) {
node = this.getNode(schema.id); node = this.getNode(schema.id);
// TODO: 底下这几段代码似乎永远都进不去
if (node && node.componentName === schema.componentName) { if (node && node.componentName === schema.componentName) {
if (node.parent) { if (node.parent) {
node.internalSetParent(null, false); node.internalSetParent(null, false);
@ -239,12 +241,6 @@ export class DocumentModel {
// todo: this.activeNodes?.push(node); // 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._nodesMap.set(node.id, node);
this.nodes.add(node); this.nodes.add(node);
@ -578,6 +574,7 @@ export class DocumentModel {
/** /**
* @deprecated * @deprecated
*/ */
/* istanbul ignore next */
getAddonData(name: string) { getAddonData(name: string) {
const addon = this._addons.find((item) => item.name === name); const addon = this._addons.find((item) => item.name === name);
if (addon) { if (addon) {
@ -588,6 +585,7 @@ export class DocumentModel {
/** /**
* @deprecated * @deprecated
*/ */
/* istanbul ignore next */
exportAddonData() { exportAddonData() {
const addons = {}; const addons = {};
this._addons.forEach((addon) => { this._addons.forEach((addon) => {
@ -604,6 +602,7 @@ export class DocumentModel {
/** /**
* @deprecated * @deprecated
*/ */
/* istanbul ignore next */
registerAddon(name: string, exportData: any) { registerAddon(name: string, exportData: any) {
if (['id', 'params', 'layout'].indexOf(name) > -1) { if (['id', 'params', 'layout'].indexOf(name) > -1) {
throw new Error('addon name cannot be id, params, layout'); throw new Error('addon name cannot be id, params, layout');
@ -618,6 +617,7 @@ export class DocumentModel {
}); });
} }
/* istanbul ignore next */
acceptRootNodeVisitor( acceptRootNodeVisitor(
visitorName = 'default', visitorName = 'default',
visitorFn: (node: RootNode) => any, visitorFn: (node: RootNode) => any,
@ -637,6 +637,7 @@ export class DocumentModel {
return visitorResult; return visitorResult;
} }
/* istanbul ignore next */
getRootNodeVisitor(name: string) { getRootNodeVisitor(name: string) {
return this.rootNodeVisitorMap[name]; return this.rootNodeVisitorMap[name];
} }

View File

@ -2,7 +2,7 @@ import { EventEmitter } from 'events';
import { Node } from './node'; import { Node } from './node';
import { DocumentModel } from '../document-model'; import { DocumentModel } from '../document-model';
function getModalNodes(node: Node) { export function getModalNodes(node: Node) {
if (!node) return []; if (!node) return [];
let nodes: any = []; let nodes: any = [];
if (node.componentMeta.isModal) { if (node.componentMeta.isModal) {
@ -40,44 +40,37 @@ export class ModalNodesManager {
]; ];
} }
public getModalNodes() { getModalNodes() {
return this.modalNodes; return this.modalNodes;
} }
public getVisibleModalNode() { getVisibleModalNode() {
const visibleNode = this.modalNodes return this.getModalNodes().find((node: Node) => node.getVisible());
? this.modalNodes.find((node: Node) => {
return node.getVisible();
})
: null;
return visibleNode;
} }
public hideModalNodes() { hideModalNodes() {
if (this.modalNodes) { this.modalNodes.forEach((node: Node) => {
this.modalNodes.forEach((node: Node) => { node.setVisible(false);
node.setVisible(false); });
});
}
} }
public setVisible(node: Node) { setVisible(node: Node) {
this.hideModalNodes(); this.hideModalNodes();
node.setVisible(true); node.setVisible(true);
} }
public setInvisible(node: Node) { setInvisible(node: Node) {
node.setVisible(false); node.setVisible(false);
} }
public onVisibleChange(func: () => any) { onVisibleChange(func: () => any) {
this.emitter.on('visibleChange', func); this.emitter.on('visibleChange', func);
return () => { return () => {
this.emitter.removeListener('visibleChange', func); this.emitter.removeListener('visibleChange', func);
}; };
} }
public onModalNodesChange(func: () => any) { onModalNodesChange(func: () => any) {
this.emitter.on('modalNodesChange', func); this.emitter.on('modalNodesChange', func);
return () => { return () => {
this.emitter.removeListener('modalNodesChange', func); this.emitter.removeListener('modalNodesChange', func);
@ -122,7 +115,7 @@ export class ModalNodesManager {
} }
} }
public setNodes() { setNodes() {
const nodes = getModalNodes(this.page.getRoot()!); const nodes = getModalNodes(this.page.getRoot()!);
this.modalNodes = nodes; this.modalNodes = nodes;
this.modalNodes.forEach((node: Node) => { this.modalNodes.forEach((node: Node) => {

View File

@ -259,7 +259,7 @@ export class Prop implements IPropParent {
} else { } else {
this._type = 'map'; this._type = 'map';
} }
} /* istanbul ignore next */ else { } else /* istanbul ignore next */ {
this._type = 'expression'; this._type = 'expression';
this._value = { this._value = {
type: 'JSExpression', type: 'JSExpression',
@ -502,6 +502,7 @@ export class Prop implements IPropParent {
*/ */
@action @action
delete(prop: Prop): void { delete(prop: Prop): void {
/* istanbul ignore else */
if (this._items) { if (this._items) {
const i = this._items.indexOf(prop); const i = this._items.indexOf(prop);
if (i > -1) { if (i > -1) {
@ -519,6 +520,7 @@ export class Prop implements IPropParent {
*/ */
@action @action
deleteKey(key: string): void { deleteKey(key: string): void {
/* istanbul ignore else */
if (this.maps) { if (this.maps) {
const prop = this.maps.get(key); const prop = this.maps.get(key);
if (prop) { if (prop) {

View File

@ -150,8 +150,6 @@ export class Selection {
} else if (n === PositionNO.ContainedBy) { } else if (n === PositionNO.ContainedBy) {
// node contains nodes[i], delete nodes[i] // node contains nodes[i], delete nodes[i]
nodes.splice(i, 1); nodes.splice(i, 1);
} else {
isTop = false;
} }
} }
// node is top item, push to nodes // node is top item, push to nodes

View File

@ -273,6 +273,18 @@ describe('Designer 测试', () => {
expect(designer._componentMetasMap.has('Div')).toBeTruthy(); expect(designer._componentMetasMap.has('Div')).toBeTruthy();
const { editor: editorFromDesigner2, ...others2 } = designer.props; const { editor: editorFromDesigner2, ...others2 } = designer.props;
expect(others2).toEqual(updatedProps); 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', () => { 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', () => { it('createLocation / clearLocation', () => {
const mockTarget = { const mockTarget = {
document: doc, document: doc,

View File

@ -23,7 +23,7 @@ describe('document-model 测试', () => {
project = designer.project; project = designer.project;
}); });
test('empty schema', () => { it('empty schema', () => {
const doc = new DocumentModel(project); const doc = new DocumentModel(project);
expect(doc.rootNode.id).toBe('root'); expect(doc.rootNode.id).toBe('root');
expect(doc.currentRoot).toBe(doc.rootNode); expect(doc.currentRoot).toBe(doc.rootNode);
@ -44,7 +44,7 @@ describe('document-model 测试', () => {
}); });
}); });
test('各种方法测试', () => { it('各种方法测试', () => {
const doc = new DocumentModel(project, formSchema); const doc = new DocumentModel(project, formSchema);
const mockNode = { id: 1 }; const mockNode = { id: 1 };
doc.addWillPurge(mockNode); doc.addWillPurge(mockNode);
@ -115,8 +115,89 @@ describe('document-model 测试', () => {
expect(doc.history).toBe(doc.getHistory()); 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', () => { it('registerAddon / getAddonData / exportAddonData', () => {
const doc = new DocumentModel(project); const doc = new DocumentModel(project);
expect(doc.getAddonData('a')).toBeUndefined();
doc.registerAddon('a', () => 'addon a'); doc.registerAddon('a', () => 'addon a');
doc.registerAddon('a', () => 'modified addon a'); doc.registerAddon('a', () => 'modified addon a');
doc.registerAddon('b', () => 'addon b'); doc.registerAddon('b', () => 'addon b');
@ -177,6 +258,8 @@ describe('document-model 测试', () => {
expect(comps.find(comp => comp.componentName === 'Page')).toEqual( expect(comps.find(comp => comp.componentName === 'Page')).toEqual(
{ componentName: 'Page', devMode: 'lowCode' } { componentName: 'Page', devMode: 'lowCode' }
); );
const comps2 = doc.getComponentsMap(['Div']);
}); });
it('acceptRootNodeVisitor / getRootNodeVisitor', () => { it('acceptRootNodeVisitor / getRootNodeVisitor', () => {

View File

@ -1,53 +1,35 @@
import '../../fixtures/window'; import '../../fixtures/window';
import { set, delayObxTick, delay } from '../../utils';
import { Editor } from '@alilc/lowcode-editor-core'; import { Editor } from '@alilc/lowcode-editor-core';
import { Project } from '../../../src/project/project'; import { Project } from '../../../src/project/project';
import { DocumentModel } from '../../../src/document/document-model'; import { DocumentModel } from '../../../src/document/document-model';
import { import { Node } from '../../../src/document/node/node';
isRootNode,
Node,
isNode,
comparePosition,
contains,
insertChild,
insertChildren,
PositionNO,
} from '../../../src/document/node/node';
import { Designer } from '../../../src/designer/designer'; import { Designer } from '../../../src/designer/designer';
import formSchema from '../../fixtures/schema/form-with-modal'; import formSchema from '../../fixtures/schema/form-with-modal';
import divMetadata from '../../fixtures/component-metadata/div';
import dlgMetadata from '../../fixtures/component-metadata/dialog'; import dlgMetadata from '../../fixtures/component-metadata/dialog';
import buttonMetadata from '../../fixtures/component-metadata/button'; import { getModalNodes } from '../../../src/document/node/modal-nodes-manager';
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';
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 方法测试', () => { 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', () => { it('getModalNodes / getVisibleModalNode', () => {
const mgr = doc.modalNodesManager; const mgr = doc.modalNodesManager;
const nodes = mgr.getModalNodes(); const nodes = mgr.getModalNodes();
@ -100,5 +82,30 @@ describe('ModalNodesManager 方法测试', () => {
mgr.addNode(newNode); mgr.addNode(newNode);
expect(visibleMockFn).not.toHaveBeenCalled(); expect(visibleMockFn).not.toHaveBeenCalled();
expect(nodesMockFn).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([]);
}); });
}); });

View File

@ -1,29 +1,13 @@
import '../../fixtures/window'; import '../../fixtures/window';
import { set, delayObxTick, delay } from '../../utils';
import { Editor } from '@alilc/lowcode-editor-core'; import { Editor } from '@alilc/lowcode-editor-core';
import { Project } from '../../../src/project/project'; import { Project } from '../../../src/project/project';
import { DocumentModel } from '../../../src/document/document-model'; import { DocumentModel } from '../../../src/document/document-model';
import { import {
isRootNode,
Node, Node,
isNode,
comparePosition,
contains,
insertChild,
insertChildren,
PositionNO,
} from '../../../src/document/node/node'; } from '../../../src/document/node/node';
import { Designer } from '../../../src/designer/designer'; import { Designer } from '../../../src/designer/designer';
import formSchema from '../../fixtures/schema/form'; import formSchema from '../../fixtures/schema/form';
import divMetadata from '../../fixtures/component-metadata/div'; 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 方法测试', () => { describe('NodeChildren 方法测试', () => {
let editor: Editor; let editor: Editor;
@ -57,6 +41,13 @@ describe('NodeChildren 方法测试', () => {
expect(firstBtn.children.isEmpty()).toBeTruthy(); 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', () => { it('purge / for of', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!; const firstBtn = doc.getNode('node_k1ow3cbn')!;
const { children } = firstBtn.parent!; const { children } = firstBtn.parent!;
@ -65,6 +56,9 @@ describe('NodeChildren 方法测试', () => {
for (const child of children) { for (const child of children) {
expect(child.isPurged).toBeTruthy(); expect(child.isPurged).toBeTruthy();
} }
// purge when children is purged
children.purge();
}); });
it('splice', () => { it('splice', () => {
@ -138,6 +132,28 @@ describe('NodeChildren 方法测试', () => {
expect(found?.componentName).toBe('Button'); 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', () => { it('mergeChildren', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!; const firstBtn = doc.getNode('node_k1ow3cbn')!;
const { children } = firstBtn.parent!; const { children } = firstBtn.parent!;
@ -159,6 +175,9 @@ describe('NodeChildren 方法测试', () => {
expect(children.size).toBe(3); expect(children.size).toBe(3);
expect(changeMockFn).toHaveBeenCalled(); expect(changeMockFn).toHaveBeenCalled();
offChange(); offChange();
// no remover && adder && sorter
children.mergeChildren();
}); });
it('insert / onInsert', () => { it('insert / onInsert', () => {

View File

@ -95,6 +95,7 @@ describe('Prop 类测试', () => {
it('getValue / getAsString / setValue', () => { it('getValue / getAsString / setValue', () => {
expect(strProp.getValue()).toBe('haha'); expect(strProp.getValue()).toBe('haha');
strProp.setValue('heihei'); strProp.setValue('heihei');
strProp.setValue('heihei');
expect(strProp.getValue()).toBe('heihei'); expect(strProp.getValue()).toBe('heihei');
expect(strProp.getAsString()).toBe('heihei'); expect(strProp.getAsString()).toBe('heihei');
@ -177,6 +178,7 @@ describe('Prop 类测试', () => {
it('compare', () => { it('compare', () => {
const newProp = new Prop(mockedPropsInst, 'haha'); const newProp = new Prop(mockedPropsInst, 'haha');
const newProp2 = new Prop(mockedPropsInst, { a: 1 });
expect(strProp.compare(newProp)).toBe(0); expect(strProp.compare(newProp)).toBe(0);
expect(strProp.compare(expProp)).toBe(2); expect(strProp.compare(expProp)).toBe(2);
@ -184,6 +186,7 @@ describe('Prop 类测试', () => {
expect(strProp.compare(newProp)).toBe(2); expect(strProp.compare(newProp)).toBe(2);
strProp.unset(); strProp.unset();
expect(strProp.compare(newProp)).toBe(0); expect(strProp.compare(newProp)).toBe(0);
expect(strProp.compare(newProp2)).toBe(2);
}); });
it('isVirtual', () => { it('isVirtual', () => {
@ -435,6 +438,28 @@ describe('Prop 类测试', () => {
prop = new Prop(mockedPropsInst, [undefined, undefined], '___loopArgs___'); prop = new Prop(mockedPropsInst, [undefined, undefined], '___loopArgs___');
expect(prop.getValue()).toBeUndefined(); 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();
});
}); });
}); });

View File

@ -257,6 +257,20 @@ describe('选择区测试', () => {
expect(selection.getNodes()).toHaveLength(2); 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', () => { it('getTopNodes', () => {
const project = new Project(designer, { const project = new Project(designer, {
componentsTree: [ componentsTree: [