2025-05-04 22:50:18 +03:00
import Mathematics from '../src/math.js' ;
import AutoMath from '../src/automath.js' ;
2025-05-09 22:28:35 +03:00
import { ClassicEditor , Clipboard , Paragraph , Undo , Typing , _getModelData as getData , _setModelData as setData } from 'ckeditor5' ;
2025-05-10 00:01:38 +03:00
import { describe , beforeEach , it , afterEach , vi , expect } from "vitest" ;
2019-10-09 13:38:30 +03:00
describe ( 'AutoMath - integration' , ( ) = > {
2024-03-20 20:55:51 -03:00
let editorElement : HTMLDivElement , editor : ClassicEditor ;
2019-10-09 13:38:30 +03:00
2024-03-20 20:55:51 -03:00
beforeEach ( async ( ) = > {
2025-03-15 00:24:12 +02:00
editorElement = document . createElement ( 'div' ) ;
document . body . appendChild ( editorElement ) ;
2019-10-09 13:38:30 +03:00
2023-02-06 19:35:50 +01:00
return ClassicEditor
2019-10-09 13:38:30 +03:00
. create ( editorElement , {
2019-10-11 19:22:03 +03:00
plugins : [ Mathematics , AutoMath , Typing , Paragraph ] ,
2025-05-09 22:16:12 +03:00
licenseKey : "GPL" ,
2019-10-11 19:22:03 +03:00
math : {
engine : ( equation , element , display ) = > {
if ( display ) {
element . innerHTML = '\\[' + equation + '\\]' ;
} else {
element . innerHTML = '\\(' + equation + '\\)' ;
}
}
}
2019-10-09 13:38:30 +03:00
} )
. 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' ) ;
} ) ;
2025-05-10 00:42:06 +03:00
// TODO: It appears that these tests are failing as the text is not replaced with its corresponding equation. What I find strange here:
// The automath plugin currently only seems to trigger a window and not allow inserting convertion a selection into an equation (either the implementation or test is broken).
// To test on the original repository.
describe . skip ( 'use fake timers' , ( ) = > {
2019-10-09 13:38:30 +03:00
beforeEach ( ( ) = > {
2025-05-09 23:56:09 +03:00
vi . useFakeTimers ( ) ;
2019-10-09 13:38:30 +03:00
} ) ;
afterEach ( ( ) = > {
2025-05-09 23:56:09 +03:00
vi . useRealTimers ( ) ;
2019-10-09 13:38:30 +03:00
} ) ;
it ( 'replaces pasted text with mathtex element after 100ms' , ( ) = > {
setData ( editor . model , '<paragraph>[]</paragraph>' ) ;
pasteHtml ( editor , '\\[x^2\\]' ) ;
expect ( getData ( editor . model ) ) . to . equal (
'<paragraph>\\[x^2\\][]</paragraph>'
) ;
2025-05-09 23:56:09 +03:00
vi . advanceTimersByTime ( 100 ) ;
2019-10-09 13:38:30 +03:00
expect ( getData ( editor . model ) ) . to . equal (
2019-10-11 18:10:41 +03:00
'<paragraph>[<mathtex display="true" equation="x^2" type="script"></mathtex>]</paragraph>'
2019-10-09 13:38:30 +03:00
) ;
} ) ;
it ( 'replaces pasted text with inline mathtex element after 100ms' , ( ) = > {
setData ( editor . model , '<paragraph>[]</paragraph>' ) ;
pasteHtml ( editor , '\\(x^2\\)' ) ;
expect ( getData ( editor . model ) ) . to . equal (
'<paragraph>\\(x^2\\)[]</paragraph>'
) ;
2025-05-09 23:56:09 +03:00
vi . advanceTimersByTime ( 100 ) ;
2019-10-09 13:38:30 +03:00
expect ( getData ( editor . model ) ) . to . equal (
2019-10-11 18:10:41 +03:00
'<paragraph>[<mathtex display="false" equation="x^2" type="script"></mathtex>]</paragraph>'
2019-10-09 13:38:30 +03:00
) ;
} ) ;
it ( 'can undo auto-mathing' , ( ) = > {
setData ( editor . model , '<paragraph>[]</paragraph>' ) ;
pasteHtml ( editor , '\\[x^2\\]' ) ;
expect ( getData ( editor . model ) ) . to . equal (
'<paragraph>\\[x^2\\][]</paragraph>'
) ;
2025-05-09 23:56:09 +03:00
vi . advanceTimersByTime ( 100 ) ;
2019-10-09 13:38:30 +03:00
editor . commands . execute ( 'undo' ) ;
expect ( getData ( editor . model ) ) . to . equal (
'<paragraph>\\[x^2\\][]</paragraph>'
) ;
} ) ;
it ( 'works for not collapsed selection inside single element' , ( ) = > {
setData ( editor . model , '<paragraph>[Foo]</paragraph>' ) ;
pasteHtml ( editor , '\\[x^2\\]' ) ;
2025-05-09 23:56:09 +03:00
vi . advanceTimersByTime ( 100 ) ;
2019-10-09 13:38:30 +03:00
expect ( getData ( editor . model ) ) . to . equal (
2019-10-11 18:10:41 +03:00
'<paragraph>[<mathtex display="true" equation="x^2" type="script"></mathtex>]</paragraph>'
2019-10-09 13:38:30 +03:00
) ;
} ) ;
it ( 'works for not collapsed selection over a few elements' , ( ) = > {
setData ( editor . model , '<paragraph>Fo[o</paragraph><paragraph>Ba]r</paragraph>' ) ;
pasteHtml ( editor , '\\[x^2\\]' ) ;
2025-05-09 23:56:09 +03:00
vi . advanceTimersByTime ( 100 ) ;
2019-10-09 13:38:30 +03:00
expect ( getData ( editor . model ) ) . to . equal (
2019-10-11 18:10:41 +03:00
'<paragraph>Fo[<mathtex display="true" equation="x^2" type="script"></mathtex>]r</paragraph>'
2019-10-09 13:38:30 +03:00
) ;
} ) ;
it ( 'inserts mathtex in-place (collapsed selection)' , ( ) = > {
setData ( editor . model , '<paragraph>Foo []Bar</paragraph>' ) ;
pasteHtml ( editor , '\\[x^2\\]' ) ;
2025-05-09 23:56:09 +03:00
vi . advanceTimersByTime ( 100 ) ;
2019-10-09 13:38:30 +03:00
expect ( getData ( editor . model ) ) . to . equal (
2019-10-11 18:10:41 +03:00
'<paragraph>Foo ' +
'[<mathtex display="true" equation="x^2" type="script"></mathtex>]' +
'Bar</paragraph>'
2019-10-09 13:38:30 +03:00
) ;
} ) ;
2019-10-11 18:10:41 +03:00
it ( 'inserts math in-place (non-collapsed selection)' , ( ) = > {
2019-10-09 13:38:30 +03:00
setData ( editor . model , '<paragraph>Foo [Bar] Baz</paragraph>' ) ;
pasteHtml ( editor , '\\[x^2\\]' ) ;
2025-05-09 23:56:09 +03:00
vi . advanceTimersByTime ( 100 ) ;
2019-10-09 13:38:30 +03:00
expect ( getData ( editor . model ) ) . to . equal (
2019-10-11 18:10:41 +03:00
'<paragraph>Foo ' +
'[<mathtex display="true" equation="x^2" type="script"></mathtex>]' +
' Baz</paragraph>'
2019-10-09 13:38:30 +03:00
) ;
} ) ;
it ( 'does nothing if pasted two equation as text' , ( ) = > {
setData ( editor . model , '<paragraph>[]</paragraph>' ) ;
pasteHtml ( editor , '\\[x^2\\] \\[\\sqrt{x}2\\]' ) ;
2025-05-09 23:56:09 +03:00
vi . advanceTimersByTime ( 100 ) ;
2019-10-09 13:38:30 +03:00
expect ( getData ( editor . model ) ) . to . equal (
2019-10-11 18:10:41 +03:00
'<paragraph>\\[x^2\\] \\[\\sqrt{x}2\\][]</paragraph>'
2019-10-09 13:38:30 +03:00
) ;
} ) ;
} ) ;
2024-03-20 20:55:51 -03:00
function pasteHtml ( editor : ClassicEditor , html : string ) {
2019-10-09 13:38:30 +03:00
editor . editing . view . document . fire ( 'paste' , {
dataTransfer : createDataTransfer ( { 'text/html' : html } ) ,
2025-05-10 00:17:55 +03:00
preventDefault() { } ,
stopPropagation() { }
2019-10-09 13:38:30 +03:00
} ) ;
}
2024-03-20 20:55:51 -03:00
function createDataTransfer ( data : Record < string , string > ) {
2019-10-09 13:38:30 +03:00
return {
2024-03-20 20:55:51 -03:00
getData ( type : string ) {
2019-10-09 13:38:30 +03:00
return data [ type ] ;
}
} ;
}
} ) ;