diff --git a/packages/designer/src/designer/builtin-hotkey.ts b/packages/designer/src/designer/builtin-hotkey.ts index 2bde4f712..7a226f4f1 100644 --- a/packages/designer/src/designer/builtin-hotkey.ts +++ b/packages/designer/src/designer/builtin-hotkey.ts @@ -4,7 +4,7 @@ import { focusing } from './focusing'; import { insertChildren, TransformStage } from '../document'; import clipboard from './clipboard'; -function isInLiveEditing() { +export function isInLiveEditing() { if (globalContext.has(Editor)) { return Boolean( globalContext.get(Editor).get('designer')?.project?.simulator?.liveEditing?.editing, @@ -12,6 +12,7 @@ function isInLiveEditing() { } } +/* istanbul ignore next */ function getNextForSelect(next: any, head?: any, parent?: any): any { if (next) { if (!head) { @@ -42,6 +43,7 @@ function getNextForSelect(next: any, head?: any, parent?: any): any { return null; } +/* istanbul ignore next */ function getPrevForSelect(prev: any, head?: any, parent?: any): any { if (prev) { let ret; @@ -150,6 +152,7 @@ hotkey.bind(['command+v', 'ctrl+v'], (e) => { if (isFormEvent(e) || !designer || !doc) { return; } + /* istanbul ignore next */ clipboard.waitPasteData(e, ({ componentsTree }) => { if (componentsTree) { const { target, index } = designer.getSuitableInsertion(componentsTree) || {}; @@ -179,7 +182,7 @@ hotkey.bind(['command+z', 'ctrl+z'], (e) => { e.preventDefault(); const selection = focusing.focusDesigner?.currentSelection; - const curSelected = Array.from(selection?.selected || []); + const curSelected = Array.from(selection?.selected); his.back(); selection?.selectAll(curSelected); }); @@ -193,7 +196,7 @@ hotkey.bind(['command+y', 'ctrl+y', 'command+shift+z'], (e) => { } e.preventDefault(); const selection = focusing.focusDesigner?.currentSelection; - const curSelected = Array.from(selection?.selected || []); + const curSelected = Array.from(selection?.selected); his.forward(); selection?.selectAll(curSelected); }); diff --git a/packages/designer/tests/designer/builtin-hotkey.test.ts b/packages/designer/tests/designer/builtin-hotkey.test.ts index dafeeb612..d0fa8a47f 100644 --- a/packages/designer/tests/designer/builtin-hotkey.test.ts +++ b/packages/designer/tests/designer/builtin-hotkey.test.ts @@ -4,25 +4,33 @@ import { Designer } from '../../src/designer/designer'; import formSchema from '../fixtures/schema/form'; import '../../src/designer/builtin-hotkey'; import { fireEvent } from '@testing-library/react'; +import { isInLiveEditing } from '../../src/designer/builtin-hotkey'; const editor = new Editor(); let designer: Designer; -beforeAll(() => { - globalContext.register(editor, Editor); -}); -beforeEach(() => { - designer = new Designer({ editor }); - editor.set('designer', designer); - designer.project.open(formSchema); -}); -afterEach(() => { - designer = null; + +describe('error scenarios', () => { + it('edtior not registered', () => { + expect(isInLiveEditing()).toBeUndefined(); + }); }); // keyCode 对应表:https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode // hotkey 模块底层用的 keyCode,所以还不能用 key / code 测试 describe('快捷键测试', () => { + beforeAll(() => { + globalContext.register(editor, Editor); + }); + beforeEach(() => { + designer = new Designer({ editor }); + editor.set('designer', designer); + designer.project.open(formSchema); + }); + afterEach(() => { + designer = null; + }); + it('right', () => { const firstCardNode = designer.currentDocument?.getNode('node_k1ow3cbj')!; firstCardNode.select(); @@ -242,8 +250,10 @@ describe('快捷键测试', () => { fireEvent.keyDown(document, { keyCode: 46 }); expect(designer.currentDocument?.selection.selected[0]).toBe('page'); }); + it('isFormEvent: true', () => { const inputDOMNode = document.createElement('INPUT'); + document.body.appendChild(inputDOMNode); designer.currentDocument?.selection.select('page'); // nothing happened @@ -289,5 +299,68 @@ describe('快捷键测试', () => { fireEvent.keyDown(inputDOMNode, { keyCode: 46 }); expect(designer.currentDocument?.selection.selected[0]).toBe('page'); }); + + it('doc is null', () => { + designer.currentDocument?.selection.select('page'); + designer.project.documents = []; + + fireEvent.keyDown(document, { keyCode: 39 }); + + fireEvent.keyDown(document, { keyCode: 37 }); + + fireEvent.keyDown(document, { keyCode: 40 }); + + fireEvent.keyDown(document, { keyCode: 38 }); + + fireEvent.keyDown(document, { keyCode: 39, altKey: true }); + + fireEvent.keyDown(document, { keyCode: 37, altKey: true }); + + fireEvent.keyDown(document, { keyCode: 40, altKey: true }); + + fireEvent.keyDown(document, { keyCode: 38, altKey: true }); + + fireEvent.keyDown(document, { keyCode: 90, metaKey: true }); + + fireEvent.keyDown(document, { keyCode: 89, metaKey: true }); + + fireEvent.keyDown(document, { keyCode: 67, metaKey: true }); + + fireEvent.keyDown(document, { keyCode: 86, metaKey: true }); + + fireEvent.keyDown(document, { keyCode: 27 }); + + fireEvent.keyDown(document, { keyCode: 46 }); + }); + + it('selected is []', () => { + fireEvent.keyDown(document, { keyCode: 39 }); + + fireEvent.keyDown(document, { keyCode: 37 }); + + fireEvent.keyDown(document, { keyCode: 40 }); + + fireEvent.keyDown(document, { keyCode: 38 }); + + fireEvent.keyDown(document, { keyCode: 39, altKey: true }); + + fireEvent.keyDown(document, { keyCode: 37, altKey: true }); + + fireEvent.keyDown(document, { keyCode: 40, altKey: true }); + + fireEvent.keyDown(document, { keyCode: 38, altKey: true }); + + fireEvent.keyDown(document, { keyCode: 90, metaKey: true }); + + fireEvent.keyDown(document, { keyCode: 89, metaKey: true }); + + fireEvent.keyDown(document, { keyCode: 67, metaKey: true }); + + fireEvent.keyDown(document, { keyCode: 86, metaKey: true }); + + fireEvent.keyDown(document, { keyCode: 27 }); + + fireEvent.keyDown(document, { keyCode: 46 }); + }); }); -}); +}); \ No newline at end of file diff --git a/packages/designer/tests/designer/location.test.ts b/packages/designer/tests/designer/location.test.ts index 746d10187..205fc24b0 100644 --- a/packages/designer/tests/designer/location.test.ts +++ b/packages/designer/tests/designer/location.test.ts @@ -128,7 +128,7 @@ it('isRowContainer', () => { .fn(() => { return { getPropertyValue: (pName) => { - return pName === 'display' ? 'flex' : 'row'; + return pName === 'display' ? 'flex' : ''; }, }; }) @@ -138,9 +138,17 @@ it('isRowContainer', () => { return pName === 'display' ? 'flex' : 'column'; }, }; + }) + .mockImplementationOnce(() => { + return { + getPropertyValue: (pName) => { + return pName === 'display' ? 'grid' : 'column'; + }, + }; }); expect(isRowContainer(getMockElement('div'))).toBeFalsy(); expect(isRowContainer(getMockElement('div'))).toBeTruthy(); + expect(isRowContainer(getMockElement('div'))).toBeTruthy(); }); it('isChildInline', () => { @@ -179,6 +187,10 @@ it('isVerticalContainer', () => { it('isVertical', () => { expect(isVertical({ elements: [] })).toBeFalsy(); expect(isVertical({ elements: [getMockElement('div')] })).toBeFalsy(); + const e1 = getMockElement('div'); + const e2 = getMockElement('div'); + e2.appendChild(e1); + expect(isVertical({ elements: [e1] })).toBeTruthy(); window.getComputedStyle = jest .fn(() => { return { @@ -193,4 +205,5 @@ it('isVertical', () => { it('getWindow', () => { const mockElem = getMockElement('div'); expect(getWindow(mockElem)).toBe(window); + expect(getWindow(document)).toBe(window); });