jesseduffield.lazygit/pkg/gui/mergeconflicts/find_conflicts_test.go
Stefan Haller d0078bf05c Recognize conflict markers that have no label
Git only writes the space after a marker when there is a label to write
after it, and the label can be empty: `git checkout -m` with the diff3
conflict style, for instance, has no name for the common ancestor, so it
writes a bare "|||||||" line.
2026-08-08 12:43:42 +02:00

185 lines
3.4 KiB
Go

package mergeconflicts
import (
"strings"
"testing"
"github.com/stretchr/testify/assert"
)
func TestDetermineLineType(t *testing.T) {
// A markerSize of 0 means the file has no conflict-marker-size gitattribute,
// so git's default size applies.
type scenario struct {
line string
markerSize int
expected LineType
}
scenarios := []scenario{
{
line: "",
expected: NOT_A_MARKER,
},
{
line: "blah",
expected: NOT_A_MARKER,
},
{
line: "<<<<<<< HEAD",
expected: START,
},
{
line: "<<<<<<< HEAD:my_branch",
expected: START,
},
{
line: "<<<<<<< MERGE_HEAD:my_branch",
expected: START,
},
{
line: "<<<<<<< Updated upstream:my_branch",
expected: START,
},
{
line: "<<<<<<< ours:my_branch",
expected: START,
},
{
line: "=======",
expected: TARGET,
},
{
line: ">>>>>>> blah",
expected: END,
},
{
line: "||||||| adf33b9",
expected: ANCESTOR,
},
{
line: "<<<<<<<<",
expected: NOT_A_MARKER,
},
// Markers without a label
{
line: "<<<<<<<",
expected: START,
},
{
line: "|||||||",
expected: ANCESTOR,
},
{
line: ">>>>>>>",
expected: END,
},
{
line: strings.Repeat("<", 32) + " HEAD",
markerSize: 32,
expected: START,
},
{
line: strings.Repeat("|", 32) + " adf33b9",
markerSize: 32,
expected: ANCESTOR,
},
{
line: strings.Repeat("=", 32),
markerSize: 32,
expected: TARGET,
},
{
line: strings.Repeat(">", 32) + " blah",
markerSize: 32,
expected: END,
},
// A file gets a bigger marker size precisely because its regular content
// tends to contain marker-looking lines, so lines with the default size
// must not be mistaken for markers
{
line: "<<<<<<< HEAD",
markerSize: 32,
expected: NOT_A_MARKER,
},
{
line: "=======",
markerSize: 32,
expected: NOT_A_MARKER,
},
{
line: strings.Repeat("=", 33),
markerSize: 32,
expected: NOT_A_MARKER,
},
}
for _, s := range scenarios {
assert.EqualValues(t, s.expected, determineLineType(s.line, s.markerSize), s.line)
}
}
func TestFindConflictsAux(t *testing.T) {
// A markerSize of 0 means the file has no conflict-marker-size gitattribute,
// so git's default size applies.
type scenario struct {
content string
markerSize int
expected bool
}
scenarios := []scenario{
{
content: "",
expected: false,
},
{
content: "blah",
expected: false,
},
{
content: ">>>>>>> ",
expected: true,
},
{
content: "<<<<<<< ",
expected: true,
},
{
content: " <<<<<<< ",
expected: false,
},
{
content: ">>>>>>>",
expected: true,
},
{
content: "a\nb\nc\n<<<<<<< ",
expected: true,
},
{
content: "a\nb\nc\n" + strings.Repeat("<", 32) + " HEAD",
markerSize: 32,
expected: true,
},
{
content: "a\nb\nc\n" + strings.Repeat(">", 32) + " blah",
markerSize: 32,
expected: true,
},
// Marker-looking lines of the default size are the file's regular content
{
content: "a\nb\nc\n<<<<<<< HEAD\n=======\n>>>>>>> blah",
markerSize: 32,
expected: false,
},
}
for _, s := range scenarios {
reader := strings.NewReader(s.content)
result, err := fileHasConflictMarkersAux(reader, s.markerSize)
assert.NoError(t, err)
assert.EqualValues(t, s.expected, result, s.content)
}
}