Files
MujicaUI/conflict_resolver_test.go
T

87 lines
2.9 KiB
Go

package mujica
import (
"testing"
"github.com/egoist/mygo/ui"
)
const conflictText = "intro\n<<<<<<< HEAD\nours one\n=======\ntheirs one\n>>>>>>> feature\nmiddle\n<<<<<<< HEAD\nours two\n||||||| base\nold two\n=======\ntheirs two\n>>>>>>> feature\nend"
func TestConflictParse(t *testing.T) {
parts, bad := conflictParse([]string{"a", "<<<<<<< HEAD", "x", "=======", "y", ">>>>>>> br", "b"})
if bad != 0 || len(parts) != 3 || !parts[1].conflict || parts[1].oursRef != "HEAD" || parts[1].theirsRef != "br" || parts[1].line != 2 {
t.Fatalf("parts %+v bad %d", parts, bad)
}
parts, bad = conflictParse([]string{"a", "<<<<<<< HEAD", "x", "======="})
if bad != 2 || len(parts) != 1 || parts[0].conflict {
t.Fatalf("unclosed: %+v bad %d", parts, bad)
}
}
func TestConflictResolverAcceptAndCount(t *testing.T) {
var s ConflictResolverState
changes := 0
tt := ui.NewTester(func(c *ui.Context) {
Use(c, Settings{})
ui.Scroll(c).Fill().Children(func() {
if ConflictResolver(c, &s, conflictText, ConflictResolverOptions{}).Changed() {
changes++
}
})
}, 800, 900)
if !tt.HasText("0 of 2 conflicts resolved") || !tt.HasText("Conflict 2 · line 8") {
t.Fatalf("start: %q", tt.Texts())
}
if err := tt.Click("Accept incoming"); err != nil {
t.Fatal(err)
}
if !tt.HasText("1 of 2 conflicts resolved") || changes != 1 {
t.Fatalf("after one: %q", tt.Texts())
}
if err := tt.Click("Accept both"); err != nil {
t.Fatal(err)
}
if got := s.Result(); got != "intro\nours one\ntheirs one\nmiddle\n<<<<<<< HEAD\nours two\n||||||| base\nold two\n=======\ntheirs two\n>>>>>>> feature\nend" {
t.Fatalf("result %q", got)
}
if err := tt.Click("Undo"); err != nil {
t.Fatal(err)
}
if d, n := s.Resolved(); d != 0 || n != 2 || changes != 3 {
t.Fatalf("undo: %d/%d changes %d", d, n, changes)
}
}
func TestConflictResolverBrokenAndDisabled(t *testing.T) {
var s ConflictResolverState
tt := ui.NewTester(func(c *ui.Context) {
Use(c, Settings{})
ConflictResolver(c, &s, "a\n<<<<<<< HEAD\nx", ConflictResolverOptions{})
}, 600, 300)
if !tt.HasText("Conflict markers are not closed after line 2") {
t.Fatalf("broken: %q", tt.Texts())
}
if s.Result() != "a\n<<<<<<< HEAD\nx" {
t.Fatalf("broken result %q", s.Result())
}
var d ConflictResolverState
tt = ui.NewTester(func(c *ui.Context) {
Use(c, Settings{})
ConflictResolver(c, &d, conflictText, ConflictResolverOptions{Disabled: true})
}, 800, 900)
_ = tt.Click("Accept current")
if done, _ := d.Resolved(); done != 0 {
t.Fatal("disabled resolver accepted")
}
}
func TestConflictResolverSnapshot(t *testing.T) {
snapshotAfter(t, "conflict_resolver", 640, 560, func(c *ui.Context) {
s := ui.Local(c.Root(), "s", func() *ConflictResolverState { return &ConflictResolverState{} })
ui.Column(c).Padding(16).Children(func() {
ConflictResolver(c, *s, conflictText, ConflictResolverOptions{})
})
}, func(tt *ui.Tester) { _ = tt.Click("Accept incoming") })
}