krz/orgstar

A native macOS editor for org-mode files. editor org-mode swift

Tests/OrgDocumentTests/MergeTests.swift

322a87d47526d505d903e05d14e65a5464e1468f
orgstar/Tests/OrgDocumentTests/MergeTests.swift history · blame · raw

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}