Tests/OrgDocumentTests/MergeTests.swift
47 lines · 1951 bytes
1import OrgCore
2import Testing
3@testable import OrgDocument
4
5struct MergeTests {
6 @Test func separateChangesMerge() {
7 #expect(threeWayMerge(base: "a\nb\nc\n", ours: "A\nb\nc\n", theirs: "a\nb\nC\n") == .merged("A\nb\nC\n"))
8 }
9
10 @Test func sameChangeOnBothSidesMergesOnce() {
11 #expect(threeWayMerge(base: "a\nb\n", ours: "a\nX\n", theirs: "a\nX\n") == .merged("a\nX\n"))
12 }
13
14 @Test func differentChangesConflict() {
15 let result = threeWayMerge(base: "a\nb\nc\n", ours: "a\nX\nc\n", theirs: "a\nY\nc\n")
16 #expect(result == .conflict([MergeConflict(base: "b\n", ours: "X\n", theirs: "Y\n")]))
17 }
18
19 @Test func insertionsAndDeletions() {
20 #expect(threeWayMerge(base: "a\nb\n", ours: "a\nb\nc\n", theirs: "b\n") == .merged("b\nc\n"))
21 #expect(threeWayMerge(base: "", ours: "x\n", theirs: "") == .merged("x\n"))
22 }
23
24 @Test func lineEndingsSurvive() {
25 #expect(threeWayMerge(base: "a\r\nb\r\n", ours: "A\r\nb\r\n", theirs: "a\r\nb\r\nc") == .merged("A\r\nb\r\nc"))
26 }
27
28 @Test func lineEditsRebuildTheNewText() {
29 let pairs = [("a\nb\nc\n", "a\nx\nc\nd\n"), ("", "x"), ("x", ""), ("a\r\nb", "b\r\na"), ("same\n", "same\n")]
30 for (old, new) in pairs {
31 var text = old
32 for edit in lineEdits(from: old, to: new).reversed() { text = edit.apply(to: text) }
33 #expect(text == new)
34 }
35 }
36
37 @Test func largeFilesWithSmallChanges() {
38 let base = (0..<20_000).map { "line \($0)\n" }.joined()
39 let ours = base.replacingOccurrences(of: "line 100\n", with: "ours\n")
40 let theirs = base.replacingOccurrences(of: "line 19000\n", with: "theirs\n")
41 guard case .merged(let merged) = threeWayMerge(base: base, ours: ours, theirs: theirs) else {
42 Issue.record("expected a clean merge")
43 return
44 }
45 #expect(merged.contains("ours\n") && merged.contains("theirs\n"))
46 }
47}