mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2025-12-13 04:03:07 +00:00
test: add some test cases
This commit is contained in:
parent
f25feba63f
commit
f3914ed815
@ -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/**',
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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>;
|
||||||
|
|||||||
@ -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];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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) => {
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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', () => {
|
||||||
|
|||||||
@ -1,32 +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 { 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';
|
|
||||||
|
|
||||||
|
|
||||||
describe('ModalNodesManager 方法测试', () => {
|
|
||||||
let editor: Editor;
|
let editor: Editor;
|
||||||
let designer: Designer;
|
let designer: Designer;
|
||||||
let project: Project;
|
let project: Project;
|
||||||
@ -48,6 +29,7 @@ describe('ModalNodesManager 方法测试', () => {
|
|||||||
project = null;
|
project = null;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('ModalNodesManager 方法测试', () => {
|
||||||
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([]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -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', () => {
|
||||||
|
|||||||
@ -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();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -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: [
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user