/**
* @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
* For licensing, see LICENSE.md.
*/
import View from '../../src/view/view';
import ViewSelection from '../../src/view/selection';
import ViewRange from '../../src/view/range';
import createViewRoot from '../view/_utils/createroot';
import Model from '../../src/model/model';
import Mapper from '../../src/conversion/mapper';
import { convertSelectionChange } from '../../src/conversion/upcast-selection-converters';
import { setData as modelSetData, getData as modelGetData } from '../../src/dev-utils/model';
import { setData as viewSetData } from '../../src/dev-utils/view';
describe( 'convertSelectionChange', () => {
let model, view, viewDocument, mapper, convertSelection, modelRoot, viewRoot;
beforeEach( () => {
model = new Model();
modelRoot = model.document.createRoot();
model.schema.register( 'paragraph', { inheritAllFrom: '$block' } );
modelSetData( model, 'foobar' );
view = new View();
viewDocument = view.document;
viewRoot = createViewRoot( viewDocument, 'div', 'main' );
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 );
} );
afterEach( () => {
view.destroy();
} );
it( 'should convert collapsed selection', () => {
const viewSelection = new ViewSelection();
viewSelection._setTo( ViewRange.createFromParentsAndOffsets(
viewRoot.getChild( 0 ).getChild( 0 ), 1, viewRoot.getChild( 0 ).getChild( 0 ), 1 ) );
convertSelection( null, { newSelection: viewSelection } );
expect( modelGetData( model ) ).to.equals( 'f[]oobar' );
expect( modelGetData( model ) ).to.equal( 'f[]oobar' );
} );
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( [
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( [
ViewRange.createFromParentsAndOffsets(
viewRoot.getChild( 0 ).getChild( 0 ), 1, viewRoot.getChild( 0 ).getChild( 0 ), 2 ),
ViewRange.createFromParentsAndOffsets(
viewRoot.getChild( 1 ).getChild( 0 ), 1, viewRoot.getChild( 1 ).getChild( 0 ), 2 )
] );
convertSelection( null, { newSelection: viewSelection } );
expect( modelGetData( model ) ).to.equal(
'f[o]ob[a]r' );
const ranges = Array.from( model.document.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( [
ViewRange.createFromParentsAndOffsets(
viewRoot.getChild( 0 ).getChild( 0 ), 1, viewRoot.getChild( 0 ).getChild( 0 ), 2 ),
ViewRange.createFromParentsAndOffsets(
viewRoot.getChild( 1 ).getChild( 0 ), 1, viewRoot.getChild( 1 ).getChild( 0 ), 2 )
], { backward: true } );
convertSelection( null, { newSelection: viewSelection } );
expect( modelGetData( model ) ).to.equal( 'f[o]ob[a]r' );
expect( model.document.selection.isBackward ).to.true;
} );
it( 'should not enqueue changes if selection has not changed', () => {
const viewSelection = new ViewSelection( [
ViewRange.createFromParentsAndOffsets(
viewRoot.getChild( 0 ).getChild( 0 ), 1, viewRoot.getChild( 0 ).getChild( 0 ), 1 )
] );
convertSelection( null, { newSelection: viewSelection } );
const spy = sinon.spy();
model.on( 'change', spy );
convertSelection( null, { newSelection: viewSelection } );
expect( spy.called ).to.be.false;
} );
} );