@@ -451,6 +451,114 @@ final class DiffResultTests: DiffResultBaseTests {
451451 #expect( line. number == lineNumbers [ index] )
452452 }
453453 }
454+
455+ @Test func insertLinesLeftDestination( ) throws {
456+ let leftText = " line1 \n \n line2 \n line3 "
457+ let rightText = " line1 \n line2 \n line4 "
458+
459+ let diffResult = DiffResult ( )
460+ diffResult. diff ( leftText: leftText, rightText: rightText)
461+
462+ let newLines = " line2.1 \n line2.2 \n "
463+ diffResult. insert ( text: newLines, at: 3 , side: . left)
464+
465+ let leftChangeType : [ DiffChangeType ] = [ . matching, . deleted, . matching, . deleted, . deleted, . changed]
466+ assert ( lines: diffResult. leftSide. lines, expectedValue: leftChangeType)
467+ let rightChangeType : [ DiffChangeType ] = [ . matching, . missing, . matching, . missing, . missing, . changed]
468+ assert ( lines: diffResult. rightSide. lines, expectedValue: rightChangeType)
469+
470+ assert ( sectionSeparators: diffResult. leftSide. lines, isSeparator: false )
471+ assert ( sectionSeparators: diffResult. rightSide. lines, isSeparator: false )
472+
473+ #expect( diffResult. summary == DiffSummary ( matching: 2 , added: 0 , deleted: 1 , changed: 1 ) )
474+
475+ assertArrayCount ( diffResult. sections, 2 )
476+ #expect( diffResult. sections [ 0 ] == DiffSection ( start: 1 , end: 1 ) )
477+ #expect( diffResult. sections [ 1 ] == DiffSection ( start: 3 , end: 3 ) )
478+
479+ let expectedLeftLines = [
480+ ( 1 , " line1 " ) ,
481+ ( 2 , " " ) ,
482+ ( 3 , " line2 " ) ,
483+ ( 4 , " line2.1 " ) ,
484+ ( 5 , " line2.2 " ) ,
485+ ( 6 , " line3 " ) ,
486+ ]
487+
488+ let expectedRightLines = [
489+ ( 1 , " line1 " ) ,
490+ ( - 1 , " " ) ,
491+ ( 2 , " line2 " ) ,
492+ ( - 1 , " " ) ,
493+ ( - 1 , " " ) ,
494+ ( 3 , " line4 " ) ,
495+ ]
496+
497+ for (index, ( leftNumber, leftLine) ) in expectedLeftLines. enumerated ( ) {
498+ let ( rightNumber, rightLine) = expectedRightLines [ index]
499+ let diffLeftLine = diffResult. leftSide. lines [ index]
500+ let diffRightLine = diffResult. rightSide. lines [ index]
501+
502+ #expect( leftNumber == diffLeftLine. number)
503+ #expect( leftLine == diffLeftLine. text)
504+
505+ #expect( rightNumber == diffRightLine. number)
506+ #expect( rightLine == diffRightLine. text)
507+ }
508+ }
509+
510+ @Test func insertLinesRightDestination( ) throws {
511+ let leftText = " line1 \n \n line2 \n line3 "
512+ let rightText = " line1 \n line2 \n line4 "
513+
514+ let diffResult = DiffResult ( )
515+ diffResult. diff ( leftText: leftText, rightText: rightText)
516+
517+ let newLines = " line1.1 \n line1.2 \n "
518+ diffResult. insert ( text: newLines, at: 1 , side: . right)
519+
520+ let leftChangeType : [ DiffChangeType ] = [ . matching, . changed, . missing, . matching, . changed]
521+ assert ( lines: diffResult. leftSide. lines, expectedValue: leftChangeType)
522+ let rightChangeType : [ DiffChangeType ] = [ . matching, . changed, . added, . matching, . changed]
523+ assert ( lines: diffResult. rightSide. lines, expectedValue: rightChangeType)
524+
525+ assert ( sectionSeparators: diffResult. leftSide. lines, isSeparator: false )
526+ assert ( sectionSeparators: diffResult. rightSide. lines, isSeparator: false )
527+
528+ #expect( diffResult. summary == DiffSummary ( matching: 2 , added: 0 , deleted: 1 , changed: 1 ) )
529+
530+ assertArrayCount ( diffResult. sections, 2 )
531+ #expect( diffResult. sections [ 0 ] == DiffSection ( start: 1 , end: 1 ) )
532+ #expect( diffResult. sections [ 1 ] == DiffSection ( start: 3 , end: 3 ) )
533+
534+ let expectedLeftLines = [
535+ ( 1 , " line1 " ) ,
536+ ( 2 , " " ) ,
537+ ( - 1 , " " ) ,
538+ ( 3 , " line2 " ) ,
539+ ( 4 , " line3 " ) ,
540+ ]
541+
542+ let expectedRightLines = [
543+ ( 1 , " line1 " ) ,
544+ ( 2 , " line1.1 " ) ,
545+ ( 3 , " line1.2 " ) ,
546+ ( 4 , " line2 " ) ,
547+ ( 5 , " line4 " ) ,
548+ ]
549+
550+ for (index, ( leftNumber, leftLine) ) in expectedLeftLines. enumerated ( ) {
551+ let ( rightNumber, rightLine) = expectedRightLines [ index]
552+ let diffLeftLine = diffResult. leftSide. lines [ index]
553+ let diffRightLine = diffResult. rightSide. lines [ index]
554+
555+ #expect( leftNumber == diffLeftLine. number)
556+ #expect( leftLine == diffLeftLine. text)
557+
558+ #expect( rightNumber == diffRightLine. number)
559+ #expect( rightLine == diffRightLine. text)
560+ }
561+ }
454562}
455563
456564// swiftlint:enable file_length
0 commit comments