import Mathematics from '../src/math';
import AutoMath from '../src/automath';
import ClassicTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/classictesteditor';
import Clipboard from '@ckeditor/ckeditor5-clipboard/src/clipboard';
import Undo from '@ckeditor/ckeditor5-undo/src/undo';
import Typing from '@ckeditor/ckeditor5-typing/src/typing';
import global from '@ckeditor/ckeditor5-utils/src/dom/global';
import { getData, setData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
describe( 'AutoMath - integration', () => {
let editorElement, editor;
beforeEach( () => {
editorElement = global.document.createElement( 'div' );
global.document.body.appendChild( editorElement );
return ClassicTestEditor
.create( editorElement, {
plugins: [ Mathematics, AutoMath, Typing ]
} )
.then( newEditor => {
editor = newEditor;
} );
} );
afterEach( () => {
editorElement.remove();
return editor.destroy();
} );
it( 'should load Clipboard plugin', () => {
expect( editor.plugins.get( Clipboard ) ).to.instanceOf( Clipboard );
} );
it( 'should load Undo plugin', () => {
expect( editor.plugins.get( Undo ) ).to.instanceOf( Undo );
} );
it( 'has proper name', () => {
expect( AutoMath.pluginName ).to.equal( 'AutoMath' );
} );
describe( 'use fake timers', () => {
let clock;
beforeEach( () => {
clock = sinon.useFakeTimers();
} );
afterEach( () => {
clock.restore();
} );
it( 'replaces pasted text with mathtex element after 100ms', () => {
setData( editor.model, '[]' );
pasteHtml( editor, '\\[x^2\\]' );
expect( getData( editor.model ) ).to.equal(
'\\[x^2\\][]'
);
clock.tick( 100 );
expect( getData( editor.model ) ).to.equal(
'[]'
);
} );
it( 'replaces pasted text with inline mathtex element after 100ms', () => {
setData( editor.model, '[]' );
pasteHtml( editor, '\\(x^2\\)' );
expect( getData( editor.model ) ).to.equal(
'\\(x^2\\)[]'
);
clock.tick( 100 );
expect( getData( editor.model ) ).to.equal(
'[]'
);
} );
it( 'can undo auto-mathing', () => {
setData( editor.model, '[]' );
pasteHtml( editor, '\\[x^2\\]' );
expect( getData( editor.model ) ).to.equal(
'\\[x^2\\][]'
);
clock.tick( 100 );
editor.commands.execute( 'undo' );
expect( getData( editor.model ) ).to.equal(
'\\[x^2\\][]'
);
} );
it( 'works for not collapsed selection inside single element', () => {
setData( editor.model, '[Foo]' );
pasteHtml( editor, '\\[x^2\\]' );
clock.tick( 100 );
expect( getData( editor.model ) ).to.equal(
'[]'
);
} );
it( 'works for not collapsed selection over a few elements', () => {
setData( editor.model, 'Fo[oBa]r' );
pasteHtml( editor, '\\[x^2\\]' );
clock.tick( 100 );
expect( getData( editor.model ) ).to.equal(
'Fo[]r'
);
} );
it( 'inserts mathtex in-place (collapsed selection)', () => {
setData( editor.model, 'Foo []Bar' );
pasteHtml( editor, '\\[x^2\\]' );
clock.tick( 100 );
expect( getData( editor.model ) ).to.equal(
'Foo ' +
'[]' +
'Bar'
);
} );
it( 'inserts media in-place (non-collapsed selection)', () => {
setData( editor.model, 'Foo [Bar] Baz' );
pasteHtml( editor, '\\[x^2\\]' );
clock.tick( 100 );
expect( getData( editor.model ) ).to.equal(
'Foo ' +
'[]' +
' Baz'
);
} );
it( 'does nothing if pasted two equation as text', () => {
setData( editor.model, '[]' );
pasteHtml( editor, '\\[x^2\\] \\[\\sqrt{x}2\\]' );
clock.tick( 100 );
expect( getData( editor.model ) ).to.equal(
'\\[x^2\\] \\[\\sqrt{x}2\\]'
);
} );
} );
function pasteHtml( editor, html ) {
editor.editing.view.document.fire( 'paste', {
dataTransfer: createDataTransfer( { 'text/html': html } ),
preventDefault() {
}
} );
}
function createDataTransfer( data ) {
return {
getData( type ) {
return data[ type ];
}
};
}
} );