251 lines
6.9 KiB
TypeScript

import '../../fixtures/window';
import { Editor } from '@alilc/lowcode-editor-core';
import { Project } from '../../../src/project/project';
import { DocumentModel } from '../../../src/document/document-model';
import {
Node,
} 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 { shellModelFactory } from '../../../../engine/src/modules/shell-model-factory';
describe('NodeChildren 方法测试', () => {
let editor: Editor;
let designer: Designer;
let project: Project;
let doc: DocumentModel;
beforeEach(() => {
editor = new Editor();
designer = new Designer({ editor, shellModelFactory });
project = designer.project;
doc = new DocumentModel(project, formSchema);
});
afterEach(() => {
project.unload();
designer.purge();
editor = null;
designer = null;
project = null;
});
it('isEmpty / notEmpty', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!;
const secondBtn = doc.getNode('node_k1ow3cbp')!;
const { children } = firstBtn.parent!;
expect(children.isEmpty()).toBeFalsy();
expect(children.notEmpty()).toBeTruthy();
expect(firstBtn.children.notEmpty()).toBeFalsy();
expect(firstBtn.children.isEmpty()).toBeTruthy();
});
it('export', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!;
const { children } = firstBtn.parent!;
expect(children.export().length).toBe(2);
});
it('export - Leaf', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!;
firstBtn.parent!.insertAfter({ componentName: 'Leaf', children: 'haha' });
const { children } = firstBtn.parent!;
expect(children.export().length).toBe(3);
expect(children.export()[2]).toBe('haha');
});
it('import', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!;
const { children } = firstBtn.parent!;
children.import(children.export());
expect(children.export().length).toBe(2);
});
it('delete', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!;
const leafNode = doc.createNode({ componentName: 'Leaf', children: 'haha' });
firstBtn.parent!.insertAfter(leafNode);
const { children } = firstBtn.parent!;
children.delete(leafNode);
expect(children.export().length).toBe(2);
});
it('delete - 插入已有的节点', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!;
firstBtn.parent!.insertBefore(firstBtn, firstBtn);
const { children } = firstBtn.parent!;
expect(children.export().length).toBe(2);
});
it('purge / for of', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!;
const { children } = firstBtn.parent!;
children.purge();
for (const child of children) {
expect(child.isPurged).toBeTruthy();
}
// purge when children is purged
children.purge();
});
it('splice', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!;
const { children } = firstBtn.parent!;
children.splice(0, 1);
expect(children.size).toBe(1);
expect(children.length).toBe(1);
children.splice(0, 0, doc.createNode({ componentName: 'Button' }));
expect(children.size).toBe(2);
expect(children.length).toBe(2);
});
it('map', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!;
const { children } = firstBtn.parent!;
const newMap = children.map((item) => item);
newMap?.forEach((item) => {
expect(item.componentName).toBe('Button');
});
});
it('forEach', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!;
const { children } = firstBtn.parent!;
children.forEach((item) => {
expect(item.componentName).toBe('Button');
});
});
it('some', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!;
const { children } = firstBtn.parent!;
children.some((item) => {
return expect(item.componentName).toBe('Button');
});
});
it('every', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!;
const { children } = firstBtn.parent!;
children.every((item) => {
return expect(item.componentName).toBe('Button');
});
});
it('filter', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!;
const { children } = firstBtn.parent!;
children
.filter((item) => item.componentName === 'Button')
.forEach((item) => {
expect(item.componentName).toBe('Button');
});
});
it('find', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!;
const { children } = firstBtn.parent!;
const found = children.find((item) => item.componentName === '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', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!;
const { children } = firstBtn.parent!;
const changeMockFn = jest.fn();
const offChange = children.onChange(changeMockFn);
const rmMockFn = jest.fn((item) => {
if (item.index === 1) return true;
return false;
});
const addMockFn = jest.fn((children) => {
return [{ componentName: 'Button' }, { componentName: 'Button' }];
});
const sortMockFn = jest.fn((a, b) => {
return a > b ? 1 : -1;
});
children.mergeChildren(rmMockFn, addMockFn, sortMockFn);
expect(children.size).toBe(3);
expect(changeMockFn).toHaveBeenCalled();
offChange();
// no remover && adder && sorter
children.mergeChildren();
});
it('insert / onInsert', () => {
const firstBtn = doc.getNode('node_k1ow3cbn')!;
const { children } = firstBtn.parent!;
const mockFn = jest.fn();
const off = children.onInsert(mockFn);
children.insert(new Node(doc, { componentName: 'Button' }));
expect(mockFn).toHaveBeenCalledTimes(1);
off();
children.insert(new Node(doc, { componentName: 'Button' }));
expect(mockFn).toHaveBeenCalledTimes(1);
});
it('reportModified', () => {
const divMeta = designer.createComponentMeta(divMetadata);
const firstBtn = doc.getNode('node_k1ow3cbn')!;
const { children } = firstBtn.parent!;
const modifiedMockFn = jest.fn();
divMeta.getMetadata = () => {
return { configure: { advanced: { callbacks: { onSubtreeModified: modifiedMockFn } } } };
};
children.reportModified(null);
children.reportModified(doc.rootNode);
children.reportModified(firstBtn, firstBtn.parent);
expect(modifiedMockFn).toHaveBeenCalled();
});
});