@@ -750,8 +750,8 @@ describe( 'Range', () => {
750750 describe ( 'by MoveDelta' , ( ) => {
751751 it ( 'move before range' , ( ) => {
752752 const start = new Position ( root , [ 0 ] ) ;
753- const end = new Position ( otherRoot , [ 0 ] ) ;
754- const delta = getMoveDelta ( start , 2 , end , 1 ) ;
753+ const target = new Position ( otherRoot , [ 0 ] ) ;
754+ const delta = getMoveDelta ( start , 2 , target , 1 ) ;
755755
756756 const transformed = range . getTransformedByDelta ( delta ) ;
757757
@@ -760,8 +760,8 @@ describe( 'Range', () => {
760760
761761 it ( 'move intersecting with range (and targeting before range)' , ( ) => {
762762 const start = new Position ( root , [ 4 ] ) ;
763- const end = new Position ( root , [ 0 ] ) ;
764- const delta = getMoveDelta ( start , 2 , end , 1 ) ;
763+ const target = new Position ( root , [ 0 ] ) ;
764+ const delta = getMoveDelta ( start , 2 , target , 1 ) ;
765765
766766 const transformed = range . getTransformedByDelta ( delta ) ;
767767
@@ -772,15 +772,80 @@ describe( 'Range', () => {
772772 it ( 'move inside the range' , ( ) => {
773773 range . end . offset = 6 ;
774774 const start = new Position ( root , [ 3 ] ) ;
775- const end = new Position ( root , [ 5 ] ) ;
776- const delta = getMoveDelta ( start , 1 , end , 1 ) ;
775+ const target = new Position ( root , [ 5 ] ) ;
776+ const delta = getMoveDelta ( start , 1 , target , 1 ) ;
777777
778778 const transformed = range . getTransformedByDelta ( delta ) ;
779779
780780 expectRange ( transformed [ 0 ] , 2 , 4 ) ;
781781 expectRange ( transformed [ 1 ] , 5 , 6 ) ;
782782 expectRange ( transformed [ 2 ] , 4 , 5 ) ;
783783 } ) ;
784+
785+ // #877.
786+ it ( 'moved element contains range start and is moved towards inside of range' , ( ) => {
787+ // Initial state:
788+ // <w><p>abc</p><p>x[x</p></w><p>d]ef</p>
789+ // Expected state after moving `<p>` out of `<w>`:
790+ // <w><p>abc</p></w><p>x[x</p><p>d]ef</p>
791+
792+ const range = new Range ( new Position ( root , [ 0 , 1 , 1 ] ) , new Position ( root , [ 1 , 1 ] ) ) ;
793+ const delta = getMoveDelta ( new Position ( root , [ 0 , 1 ] ) , 1 , new Position ( root , [ 1 ] ) , 1 ) ;
794+
795+ const transformed = range . getTransformedByDelta ( delta ) ;
796+
797+ expect ( transformed . length ) . to . equal ( 1 ) ;
798+ expect ( transformed [ 0 ] . start . path ) . to . deep . equal ( [ 1 , 1 ] ) ;
799+ expect ( transformed [ 0 ] . end . path ) . to . deep . equal ( [ 2 , 1 ] ) ;
800+ } ) ;
801+
802+ it ( 'moved element contains range start and is moved out of range' , ( ) => {
803+ // Initial state:
804+ // <p>abc</p><p>x[x</p><p>d]ef</p>
805+ // Expected state after moving:
806+ // <p>x[x</p><p>abc</p><p>d]ef</p>
807+
808+ const range = new Range ( new Position ( root , [ 1 , 1 ] ) , new Position ( root , [ 2 , 1 ] ) ) ;
809+ const delta = getMoveDelta ( new Position ( root , [ 1 ] ) , 1 , new Position ( root , [ 0 ] ) , 1 ) ;
810+
811+ const transformed = range . getTransformedByDelta ( delta ) ;
812+
813+ expect ( transformed . length ) . to . equal ( 1 ) ;
814+ expect ( transformed [ 0 ] . start . path ) . to . deep . equal ( [ 0 , 1 ] ) ;
815+ expect ( transformed [ 0 ] . end . path ) . to . deep . equal ( [ 2 , 1 ] ) ;
816+ } ) ;
817+
818+ it ( 'moved element contains range end and is moved towards range' , ( ) => {
819+ // Initial state:
820+ // <p>a[bc</p><p>def</p><p>x]x</p>
821+ // Expected state after moving:
822+ // <p>a[bc</p><p>x]x</p><p>def</p>
823+
824+ const range = new Range ( new Position ( root , [ 0 , 1 ] ) , new Position ( root , [ 2 , 1 ] ) ) ;
825+ const delta = getMoveDelta ( new Position ( root , [ 2 ] ) , 1 , new Position ( root , [ 1 ] ) , 1 ) ;
826+
827+ const transformed = range . getTransformedByDelta ( delta ) ;
828+
829+ expect ( transformed . length ) . to . equal ( 1 ) ;
830+ expect ( transformed [ 0 ] . start . path ) . to . deep . equal ( [ 0 , 1 ] ) ;
831+ expect ( transformed [ 0 ] . end . path ) . to . deep . equal ( [ 1 , 1 ] ) ;
832+ } ) ;
833+
834+ it ( 'moved element contains range end and is moved out of range' , ( ) => {
835+ // Initial state:
836+ // <p>a[bc</p><p>x]x</p><p>def</p>
837+ // Expected state after moving:
838+ // <p>a[bc</p><p>def</p><p>x]x</p>
839+
840+ const range = new Range ( new Position ( root , [ 0 , 1 ] ) , new Position ( root , [ 1 , 1 ] ) ) ;
841+ const delta = getMoveDelta ( new Position ( root , [ 1 ] ) , 1 , new Position ( root , [ 3 ] ) , 1 ) ;
842+
843+ const transformed = range . getTransformedByDelta ( delta ) ;
844+
845+ expect ( transformed . length ) . to . equal ( 1 ) ;
846+ expect ( transformed [ 0 ] . start . path ) . to . deep . equal ( [ 0 , 1 ] ) ;
847+ expect ( transformed [ 0 ] . end . path ) . to . deep . equal ( [ 2 , 1 ] ) ;
848+ } ) ;
784849 } ) ;
785850
786851 describe ( 'by RemoveDelta' , ( ) => {
@@ -858,6 +923,23 @@ describe( 'Range', () => {
858923 expect ( transformed [ 0 ] . start . path ) . to . deep . equal ( [ 0 , 3 ] ) ;
859924 expect ( transformed [ 0 ] . end . path ) . to . deep . equal ( [ 0 , 3 ] ) ;
860925 } ) ;
926+
927+ // #877.
928+ it ( 'merge elements that contain elements with range boundaries' , ( ) => {
929+ // Initial state:
930+ // <w><p>x[x</p></w><w><p>y]y</p></w>
931+ // Expected state after merge:
932+ // <w><p>x[x</p><p>y]y</p></w>
933+
934+ const range = new Range ( new Position ( root , [ 0 , 0 , 1 ] ) , new Position ( root , [ 1 , 0 , 1 ] ) ) ;
935+ const delta = getMergeDelta ( new Position ( root , [ 1 ] ) , 1 , 1 , 1 ) ;
936+
937+ const transformed = range . getTransformedByDelta ( delta ) ;
938+
939+ expect ( transformed . length ) . to . equal ( 1 ) ;
940+ expect ( transformed [ 0 ] . start . path ) . to . deep . equal ( [ 0 , 0 , 1 ] ) ;
941+ expect ( transformed [ 0 ] . end . path ) . to . deep . equal ( [ 0 , 1 , 1 ] ) ;
942+ } ) ;
861943 } ) ;
862944
863945 describe ( 'by WrapDelta' , ( ) => {
0 commit comments