Skip to content

Commit 3cd052d

Browse files
committed
fixed #3 Copy from clipboard does nothing
1 parent 65b19ff commit 3cd052d

File tree

3 files changed

+146
-27
lines changed

3 files changed

+146
-27
lines changed

Sources/Features/FilesCompare/DiffResult/DiffResult.swift

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -230,49 +230,56 @@ class DiffResult {
230230
at startIndex: Int,
231231
side: DisplaySide
232232
) {
233-
var src: [DiffLine]
234-
var dest: [DiffLine]
235-
var type: DiffChangeType
236-
237233
switch side {
238234
case .left:
239-
src = leftSide.lines
240-
dest = rightSide.lines
241-
type = .deleted
235+
insertLines(
236+
text: text,
237+
destination: leftSide,
238+
otherSide: rightSide,
239+
at: startIndex,
240+
type: .deleted
241+
)
242242
case .right:
243-
src = rightSide.lines
244-
dest = leftSide.lines
245-
type = .added
243+
insertLines(
244+
text: text,
245+
destination: rightSide,
246+
otherSide: leftSide,
247+
at: startIndex,
248+
type: .added
249+
)
246250
}
251+
}
247252

253+
private func insertLines(
254+
text: String,
255+
destination: DiffSide,
256+
otherSide: DiffSide,
257+
at startIndex: Int,
258+
type: DiffChangeType
259+
) {
248260
var index = startIndex
249261

250262
text.enumerateLines { line, _ in
251-
let srcLS = src[index]
252-
if srcLS.type == .missing {
253-
srcLS.text = line
254-
let destLS = dest[index]
263+
let destLine = destination.lines[index]
264+
if destLine.type == .missing {
265+
destLine.text = line
266+
let otherLine = otherSide.lines[index]
255267
// simple comparison
256-
if destLS.text == line {
257-
destLS.type = .matching
258-
srcLS.type = .matching
268+
if otherLine.text == line {
269+
otherLine.type = .matching
270+
destLine.type = .matching
259271
} else {
260-
destLS.type = .changed
261-
srcLS.type = .changed
272+
otherLine.type = .changed
273+
destLine.type = .changed
262274
}
263275
} else {
264276
// line numbers will be set correctly below
265-
src.insert(DiffLine(with: type, number: 0, text: line), at: index)
266-
dest.insert(DiffLine.missingLine(), at: index)
277+
destination.insert(DiffLine(with: type, number: 0, text: line), at: index)
278+
otherSide.insert(DiffLine.missingLine(), at: index)
267279
}
268280
index += 1
269281
}
270-
switch side {
271-
case .left:
272-
leftSide.renumberLines()
273-
case .right:
274-
rightSide.renumberLines()
275-
}
282+
destination.renumberLines()
276283
}
277284

278285
func removeLine(at index: Int) {

Sources/Features/FilesCompare/DiffResult/DiffSide.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ class DiffSide {
3131
lines.firstIndex { $0 === line }
3232
}
3333

34+
func insert(_ line: DiffLine, at index: Int) {
35+
lines.insert(line, at: index)
36+
}
37+
3438
func write(
3539
path: URL,
3640
encoding: String.Encoding

Tests/Sources/FileCompare/DiffResult/Tests/DiffResultTests.swift

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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\nline2\nline3"
457+
let rightText = "line1\nline2\nline4"
458+
459+
let diffResult = DiffResult()
460+
diffResult.diff(leftText: leftText, rightText: rightText)
461+
462+
let newLines = "line2.1\nline2.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\nline2\nline3"
512+
let rightText = "line1\nline2\nline4"
513+
514+
let diffResult = DiffResult()
515+
diffResult.diff(leftText: leftText, rightText: rightText)
516+
517+
let newLines = "line1.1\nline1.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

Comments
 (0)