flowgram.ai/packages/canvas-engine/document/__tests__/flow-document-transformer.test.ts
dragooncjw d7bdf8a078 feat: init flowgram.ai
Co-Authored-By: xiamidaxia <xiamidaxia@icloud.com>
2025-02-21 16:26:12 +08:00

119 lines
4.5 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { beforeEach, describe, expect, it } from 'vitest';
import { TransformData } from '@flowgram.ai/core';
import { FlowDocument, FlowNodeTransformData } from '../src';
import { baseMockAddNode } from './flow.mock';
import { createDocumentContainer } from './flow-document-container.mock';
interface TransformTestData {
version: number;
localBoundsStr: string;
localID: number;
worldID: number;
boundsStr: string;
}
function getTransformData(document: FlowDocument): Record<string, TransformTestData> {
const data: Record<string, TransformTestData> = {};
document.traverse((node) => {
const transform = node.getData<FlowNodeTransformData>(FlowNodeTransformData)!;
data[node.id] = {
version: transform.version,
boundsStr: transform.bounds.toStyleStr(),
localBoundsStr: transform.localBounds.toStyleStr(),
localID: transform.transform.localID, // 用来判断是否有更新
worldID: transform.transform.worldID,
};
});
return data;
}
describe('flow-document-transformer', () => {
let container = createDocumentContainer();
beforeEach(() => {
container = createDocumentContainer();
container.get(FlowDocument).fromJSON(baseMockAddNode);
});
it('updateTransformsTree', () => {
const document = container.get<FlowDocument>(FlowDocument);
document.transformer.updateTransformsTree();
// root 会包含三个子节点start_0, dynamicSplit_0, end_0
expect(document.root.getData<TransformData>(TransformData)!.children.length).toEqual(3);
});
it('transform version', () => {
const document = container.get<FlowDocument>(FlowDocument);
const preData = getTransformData(document);
document.transformer.refresh();
const postData = getTransformData(document);
expect(preData.root.version).toEqual(0);
expect(preData.start_0).toEqual({
version: 0,
boundsStr: 'left: 0px; top: 0px; width: 0px; height: 0px;',
localBoundsStr: 'left: 0px; top: 0px; width: 0px; height: 0px;',
localID: 0,
worldID: 0,
});
expect(postData.start_0).toEqual({
version: 2, // 更新了 size 和 position
boundsStr: 'left: -140px; top: 0px; width: 280px; height: 60px;',
localBoundsStr: 'left: -140px; top: 0px; width: 280px; height: 60px;',
localID: 2, // 更新了 size 和 position
worldID: 1,
});
expect(postData.root).toEqual({
version: 0,
boundsStr: 'left: -140px; top: 0px; width: 280px; height: 428px;',
localBoundsStr: 'left: -140px; top: 0px; width: 280px; height: 428px;',
localID: 0, // 只更新了 position
worldID: 0,
});
});
it('refresh', () => {
const document = container.get<FlowDocument>(FlowDocument);
document.transformer.refresh();
const preData = getTransformData(document);
document.transformer.refresh();
const nextData = getTransformData(document);
// 数据没有变化
expect(preData).toEqual(nextData);
});
it('transform with tree change', () => {
const document = container.get<FlowDocument>(FlowDocument);
document.transformer.refresh();
const preData = getTransformData(document);
expect(preData.dynamicSplit_0).toEqual({
version: 3,
boundsStr: 'left: -140px; top: 92px; width: 280px; height: 244px;',
localBoundsStr: 'left: -140px; top: 92px; width: 280px; height: 244px;',
localID: 3,
worldID: 1,
});
// expect(preData.$blockOrderIcon$block_1).toEqual({
// version: 2,
// boundsStr: 'left: -140px; top: 184px; width: 280px; height: 60px;',
// localBoundsStr: 'left: -140px; top: 0px; width: 280px; height: 60px;',
// localID: 2,
// worldID: 1,
// })
document.addFromNode('start_0', { id: 'test', type: 'test' });
document.transformer.refresh();
const nextData = getTransformData(document);
expect(preData.start_0).toEqual(nextData.start_0);
expect(nextData.dynamicSplit_0).toEqual({
version: 4,
boundsStr: 'left: -140px; top: 184px; width: 280px; height: 244px;',
localBoundsStr: 'left: -140px; top: 184px; width: 280px; height: 244px;',
localID: 4,
worldID: 2,
});
// 子节点页跟着更新
// expect(nextData.$blockOrderIcon$block_1).toEqual({
// version: 2, // 由于 local 未更新所以 version 没变
// boundsStr: 'left: -140px; top: 276px; width: 280px; height: 60px;',
// localBoundsStr: 'left: -140px; top: 0px; width: 280px; height: 60px;',
// localID: 2, // local 相对位置未更新
// worldID: 2, // world 绝对位置更新
// })
});
});