/** * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved. * For licensing, see LICENSE.md. */ import normalizeHtml from '@ckeditor/ckeditor5-utils/tests/_utils/normalizehtml'; import { getData as getModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model'; import { stringify, getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view'; /** * Checks whether for a given editor instance pasting specific content (input) gives expected result (output). * * @param {module:core/editor/editor~Editor} editor * @param {String} input Data to paste. * @param {String} expectedModel Expected model. * @param {String} [expectedView=null] Expected view. */ export function expectPaste( editor, input, expectedModel, expectedView = null ) { pasteHtml( editor, input ); expect( getModelData( editor.model ) ).to.equal( expectedModel ); if ( expectedView ) { expect( getViewData( editor.editing.view ) ).to.equal( expectedView ); } } /** * Fires paste event on a given editor instance with a specific HTML data. * * @param {module:core/editor/editor~Editor} editor Editor instance on which paste event will be fired. * @param {String} html The HTML data with which paste event will be fired. */ export function pasteHtml( editor, html ) { editor.editing.view.document.fire( 'paste', { dataTransfer: createDataTransfer( { 'text/html': html } ), preventDefault() {} } ); } /** * Mocks dataTransfer object which can be used for simulating paste. * * @param {Object} data Object containing "mime type - data" pairs. * @returns {Object} DataTransfer mock object. */ export function createDataTransfer( data ) { return { getData( type ) { return data[ type ]; } }; } /** * Compares two HTML strings. * * This function is designed for comparing normalized data so expected input is preprocessed before comparing: * * * Tabs on the lines beginning are removed. * * Line breaks and empty lines are removed. * * The expected input should be prepared in the above in mind which means every element containing text nodes must start * and end in the same line. So expected input may be formatted like: * * 03 * * but not like: * * * 03 * * * * because tabulator preceding `03` text will be treated as formatting character and will be removed. * * @param {String} actual * @param {String} expected */ export function expectNormalized( actual, expected ) { const expectedInlined = expected // Replace tabs on the lines beginning as normalized input files are formatted. .replace( /^\t*