|
|
@@ -0,0 +1,116 @@
|
|
|
+import { beforeEach, describe, expect, it } from 'vitest';
|
|
|
+
|
|
|
+import { createDocumentContainer } from './flow-document-container.mock';
|
|
|
+import { FlowDocument, FlowNodeRegistry } from '../src';
|
|
|
+
|
|
|
+function registerNode(doc: FlowDocument, newRegistry: FlowNodeRegistry): FlowNodeRegistry {
|
|
|
+ doc.registerFlowNodes(newRegistry);
|
|
|
+ return doc.getNodeRegistry(newRegistry.type);
|
|
|
+}
|
|
|
+const mockRegistries: FlowNodeRegistry[] = [
|
|
|
+ {
|
|
|
+ type: 'dynamicSplit',
|
|
|
+ meta: {},
|
|
|
+ onCreate(node, json) {
|
|
|
+ return node.document.addInlineBlocks(node, json.blocks || []);
|
|
|
+ },
|
|
|
+ extendChildRegistries: [
|
|
|
+ {
|
|
|
+ type: 'blockIcon',
|
|
|
+ customKey: 'blockIcon_base',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: 'inlineBlocks',
|
|
|
+ customKey: 'inlineBlocks_base',
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ onAdd: () => {},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: 'a',
|
|
|
+ extend: 'dynamicSplit',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: 'b',
|
|
|
+ extend: 'a',
|
|
|
+ extendChildRegistries: [
|
|
|
+ {
|
|
|
+ type: 'blockIcon',
|
|
|
+ customKey: 'blockIcon_from_b',
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: 'c',
|
|
|
+ extend: 'b',
|
|
|
+ extendChildRegistries: [
|
|
|
+ {
|
|
|
+ type: 'blockIcon',
|
|
|
+ customKey: 'blockIcon_from_c',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: 'inlineBlocks',
|
|
|
+ customKey: 'inlineBlocks_from_c',
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+];
|
|
|
+describe('flow-node-registry', () => {
|
|
|
+ let doc: FlowDocument;
|
|
|
+ beforeEach(() => {
|
|
|
+ const container = createDocumentContainer();
|
|
|
+ doc = container.get<FlowDocument>(FlowDocument);
|
|
|
+ doc.registerFlowNodes(...mockRegistries);
|
|
|
+ });
|
|
|
+ it('extend check', () => {
|
|
|
+ expect(doc.getNodeRegistry('dynamicSplit').__extends__).toEqual(undefined);
|
|
|
+ expect(doc.getNodeRegistry('a').__extends__).toEqual(['dynamicSplit']);
|
|
|
+ expect(doc.getNodeRegistry('b').__extends__).toEqual(['a', 'dynamicSplit']);
|
|
|
+ expect(doc.getNodeRegistry('c').__extends__).toEqual(['b', 'a', 'dynamicSplit']);
|
|
|
+ expect(doc.isExtend('dynamicSplit', 'dynamicSplit')).toBeFalsy();
|
|
|
+ expect(doc.isExtend('a', 'b')).toBeFalsy();
|
|
|
+ expect(doc.isExtend('a', 'dynamicSplit')).toBeTruthy();
|
|
|
+ expect(doc.isExtend('b', 'dynamicSplit')).toBeTruthy();
|
|
|
+ expect(doc.isExtend('b', 'a')).toBeTruthy();
|
|
|
+ expect(doc.isExtend('c', 'dynamicSplit')).toBeTruthy();
|
|
|
+ expect(doc.isExtend('c', 'b')).toBeTruthy();
|
|
|
+ expect(doc.isExtend('c', 'a')).toBeTruthy();
|
|
|
+ });
|
|
|
+ it('base extend', () => {
|
|
|
+ expect(doc.getNodeRegistry('a').onAdd).toBeTypeOf('function');
|
|
|
+ doc.addNode({
|
|
|
+ id: 'a',
|
|
|
+ type: 'a',
|
|
|
+ parent: doc.root,
|
|
|
+ });
|
|
|
+ expect(doc.toString()).toEqual(`root
|
|
|
+|-- a
|
|
|
+|---- $blockIcon$a
|
|
|
+|---- $inlineBlocks$a`);
|
|
|
+ expect(doc.getNode('$blockIcon$a').getNodeRegistry().customKey).toBe('blockIcon_base');
|
|
|
+ });
|
|
|
+ it('extend nested', () => {
|
|
|
+ expect(doc.getNodeRegistry('b').onAdd).toBeTypeOf('function');
|
|
|
+ doc.addNode({
|
|
|
+ id: 'b',
|
|
|
+ type: 'b',
|
|
|
+ parent: doc.root,
|
|
|
+ });
|
|
|
+ doc.addNode({
|
|
|
+ id: 'c',
|
|
|
+ type: 'c',
|
|
|
+ parent: doc.root,
|
|
|
+ });
|
|
|
+ expect(doc.toString()).toEqual(`root
|
|
|
+|-- b
|
|
|
+|---- $blockIcon$b
|
|
|
+|---- $inlineBlocks$b
|
|
|
+|-- c
|
|
|
+|---- $blockIcon$c
|
|
|
+|---- $inlineBlocks$c`);
|
|
|
+ expect(doc.getNode('$blockIcon$b').getNodeRegistry().customKey).toBe('blockIcon_from_b');
|
|
|
+ expect(doc.getNode('$inlineBlocks$b').getNodeRegistry().customKey).toBe('inlineBlocks_base');
|
|
|
+ expect(doc.getNode('$blockIcon$c').getNodeRegistry().customKey).toBe('blockIcon_from_c');
|
|
|
+ expect(doc.getNode('$inlineBlocks$c').getNodeRegistry().customKey).toBe('inlineBlocks_from_c');
|
|
|
+ });
|
|
|
+});
|