import { ViewPlugin } from '@codemirror/view'; import createEditor from './createEditor'; import createEditorSettings from './testUtil/createEditorSettings'; import Setting from '@joplin/lib/models/Setting'; const createEditorControl = (initialText: string) => { const editorSettings = createEditorSettings(Setting.THEME_LIGHT); return createEditor(document.body, { initialText, settings: editorSettings, onEvent: _event => {}, onLogMessage: _message => {}, }); }; describe('CodeMirrorControl', () => { it('clearHistory should clear the undo/redo history', () => { const controls = createEditorControl(''); const insertedText = 'Testing... This is a test...'; controls.insertText(insertedText); const fullInsertedText = insertedText; expect(controls.getValue()).toBe(fullInsertedText); // Undo should work before clearing history controls.undo(); expect(controls.getValue()).toBe(''); controls.redo(); controls.clearHistory(); expect(controls.getValue()).toBe(fullInsertedText); // Should not be able to undo cleared changes controls.undo(); expect(controls.getValue()).toBe(fullInsertedText); // Should be able to undo new changes controls.insertText('!!!'); expect(controls.getValue()).toBe(`${fullInsertedText}!!!`); controls.undo(); expect(controls.getValue()).toBe(fullInsertedText); }); it('should support adding CodeMirror 6 extensions', () => { const control = createEditorControl(''); const updateFn = jest.fn(); control.addExtension([ ViewPlugin.fromClass(class { public update = updateFn; }), ]); // Verify that the extension has been loaded updateFn.mockReset(); control.insertText('Test...'); expect(updateFn).toHaveBeenCalled(); }); it('should support adding custom editor commands', () => { const control = createEditorControl(''); const command = jest.fn(() => 'test'); control.registerCommand('myTestCommand', command); expect(control.supportsCommand('myTestCommand')).toBe(true); expect(control.execCommand('myTestCommand')).toBe('test'); expect(command).toHaveBeenCalledTimes(1); }); });