/** * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved. * For licensing, see LICENSE.md. */ /* bender-tags: conversion */ import ViewDocument from '/ckeditor5/engine/view/document.js'; import ViewSelection from '/ckeditor5/engine/view/selection.js'; import ViewRange from '/ckeditor5/engine/view/range.js'; import ModelDocument from '/ckeditor5/engine/model/document.js'; import Mapper from '/ckeditor5/engine/conversion/mapper.js'; import { convertSelectionChange } from '/ckeditor5/engine/conversion/view-selection-to-model-converters.js'; import { setData as modelSetData, getData as modelGetData } from '/tests/engine/_utils/model.js'; import { setData as viewSetData } from '/tests/engine/_utils/view.js'; describe( 'convertSelectionChange', () => { let model, view, mapper, convertSelection, modelRoot, viewRoot; beforeEach( () => { model = new ModelDocument(); modelRoot = model.createRoot(); model.schema.registerItem( 'paragraph', '$block' ); modelSetData( model, 'foobar' ); view = new ViewDocument(); viewRoot = view.createRoot( 'div' ); viewSetData( view, '

foo

bar

' ); mapper = new Mapper(); mapper.bindElements( modelRoot, viewRoot ); mapper.bindElements( modelRoot.getChild( 0 ), viewRoot.getChild( 0 ) ); mapper.bindElements( modelRoot.getChild( 1 ), viewRoot.getChild( 1 ) ); convertSelection = convertSelectionChange( model, mapper ); } ); it( 'should convert collapsed selection', () => { const viewSelection = new ViewSelection(); viewSelection.addRange( ViewRange.createFromParentsAndOffsets( viewRoot.getChild( 0 ).getChild( 0 ), 1, viewRoot.getChild( 0 ).getChild( 0 ), 1 ) ); convertSelection( null, { newSelection: viewSelection } ); expect( modelGetData( model ) ).to.equal( 'foobar' ); } ); it( 'should support unicode', () => { modelSetData( model, 'நிலைக்கு' ); viewSetData( view, '

நிலைக்கு

' ); // Re-bind elements that were just re-set. mapper.bindElements( modelRoot.getChild( 0 ), viewRoot.getChild( 0 ) ); const viewSelection = new ViewSelection(); viewSelection.addRange( ViewRange.createFromParentsAndOffsets( viewRoot.getChild( 0 ).getChild( 0 ), 2, viewRoot.getChild( 0 ).getChild( 0 ), 6 ) ); convertSelection( null, { newSelection: viewSelection } ); expect( modelGetData( model ) ).to.equal( 'நிலைக்கு' ); } ); it( 'should convert multi ranges selection', () => { const viewSelection = new ViewSelection(); viewSelection.addRange( ViewRange.createFromParentsAndOffsets( viewRoot.getChild( 0 ).getChild( 0 ), 1, viewRoot.getChild( 0 ).getChild( 0 ), 2 ) ); viewSelection.addRange( ViewRange.createFromParentsAndOffsets( viewRoot.getChild( 1 ).getChild( 0 ), 1, viewRoot.getChild( 1 ).getChild( 0 ), 2 ) ); convertSelection( null, { newSelection: viewSelection } ); // Too bad getData shows only the first range. expect( modelGetData( model ) ).to.equal( 'foobar' ); const ranges = Array.from( model.selection.getRanges() ); expect( ranges.length ).to.equal( 2 ); expect( ranges[ 0 ].start.parent ).to.equal( modelRoot.getChild( 0 ) ); expect( ranges[ 0 ].start.offset ).to.equal( 1 ); expect( ranges[ 0 ].end.parent ).to.equal( modelRoot.getChild( 0 ) ); expect( ranges[ 0 ].end.offset ).to.equal( 2 ); expect( ranges[ 1 ].start.parent ).to.equal( modelRoot.getChild( 1 ) ); expect( ranges[ 1 ].start.offset ).to.equal( 1 ); expect( ranges[ 1 ].end.parent ).to.equal( modelRoot.getChild( 1 ) ); expect( ranges[ 1 ].end.offset ).to.equal( 2 ); } ); it( 'should convert reverse selection', () => { const viewSelection = new ViewSelection(); viewSelection.addRange( ViewRange.createFromParentsAndOffsets( viewRoot.getChild( 0 ).getChild( 0 ), 1, viewRoot.getChild( 0 ).getChild( 0 ), 2 ), true ); convertSelection( null, { newSelection: viewSelection } ); // Too bad getData shows only the first range. expect( modelGetData( model ) ).to.equal( 'foobar' ); } ); } );