foo name| bar
+ * + * // Model: + *foo |name bar
+ * + * // Model: + *We would like to invite you to
foobar
+ const modelFoo = new ModelText( 'foo' ); + modelSpan = new ModelElement( 'span' ); + const modelBar = new ModelText( 'bar' ); + modelP = new ModelElement( 'p', null, [ modelFoo, modelSpan, modelBar ] ); + + // VIEW:fooxyzbar
+ const viewFoo = new ViewText( 'foo' ); + viewXyz = new ViewText( 'xyz' ); + viewSpan = new ViewElement( 'span', null, viewXyz ); + const viewBar = new ViewText( 'bar' ); + viewP = new ViewElement( 'p', null, [ viewFoo, viewSpan, viewBar ] ); + + mapper.bindElements( modelP, viewP ); + mapper.bindElements( modelSpan, viewSpan ); + } ); + + it( 'should map view position that is at the beginning of the view element to a position before the model element', () => { + mapper.on( 'viewToModelPosition', viewToModelPositionOutsideModelElement( model, viewElement => viewElement.name == 'span' ) ); + + // View: + //foo|xyzbar
. + const viewPosition = new ViewPosition( viewXyz, 0 ); + + // Model: + //foo|bar
. + const modelPosition = mapper.toModelPosition( viewPosition ); + + expect( modelPosition.path ).to.deep.equal( [ 3 ] ); + } ); + + it( 'should map view position that is in the middle of the view element to a position after the model element', () => { + mapper.on( 'viewToModelPosition', viewToModelPositionOutsideModelElement( model, viewElement => viewElement.name == 'span' ) ); + + // View: + //foox|yzbar
. + const viewPosition = new ViewPosition( viewXyz, 1 ); + + // Model: + //foo|bar
. + const modelPosition = mapper.toModelPosition( viewPosition ); + + expect( modelPosition.path ).to.deep.equal( [ 4 ] ); + } ); + + it( 'should map view position that is at the end of the view element to a position after the model element', () => { + mapper.on( 'viewToModelPosition', viewToModelPositionOutsideModelElement( model, viewElement => viewElement.name == 'span' ) ); + + // View: + //fooxyz|bar
. + const viewPosition = new ViewPosition( viewXyz, 3 ); + + // Model: + //foo|bar
. + const modelPosition = mapper.toModelPosition( viewPosition ); + + expect( modelPosition.path ).to.deep.equal( [ 4 ] ); + } ); + + it( 'should not fire if view element is not matched', () => { + mapper.on( 'viewToModelPosition', viewToModelPositionOutsideModelElement( model, () => false ) ); + + // View: + //foox|yzbar
. + const viewPosition = new ViewPosition( viewXyz, 1 ); + + // Model: + //foox|yzbar
. + modelSpan._appendChild( new ModelText( 'xyz' ) ); + const modelPosition = mapper.toModelPosition( viewPosition ); + + expect( modelPosition.path ).to.deep.equal( [ 3, 1 ] ); + } ); + } ); } );