Files
MujicaUI/files/rename_inline_test.go

173 lines
4.6 KiB
Go

package files
import (
"strings"
"testing"
"github.com/egoist/mygo/ui"
"git.zacharyzhang.com/ZacharyZhang-NY/MujicaUI/core"
"git.zacharyzhang.com/ZacharyZhang-NY/MujicaUI/input"
)
type renameProbe struct {
name string
editing, disabled bool
folder bool
renamed, canceled int
}
func (p *renameProbe) view(c *ui.Context) {
core.Use(c, core.Settings{})
ui.Column(c).Padding(12).Gap(8).Children(func() {
r := RenameInline(c, &p.name, &p.editing, RenameInlineOptions{Folder: p.folder, Disabled: p.disabled,
Validate: func(n string) string {
if strings.ContainsRune(n, '/') {
return "No slashes"
}
return ""
}})
if r.Renamed {
p.renamed++
}
if r.Canceled {
p.canceled++
}
input.Button(c, "Elsewhere", input.ButtonOptions{})
})
}
func TestRenameStem(t *testing.T) {
for in, want := range map[string]string{"seal.txt": "seal", "a.tar.gz": "a.tar", ".env": ".env", "README": "README"} {
if got := renameStem(in, false); got != want {
t.Errorf("%s: stem %q, want %q", in, got, want)
}
}
if renameStem("v1.2", true) != "v1.2" {
t.Fatal("folder stem dropped its dot part")
}
}
func TestRenameInlineTypingReplacesStem(t *testing.T) {
p := &renameProbe{name: "seal.txt", editing: true}
tt := ui.NewTester(p.view, 400, 200)
if !tt.Focused("Name") {
t.Fatal("editor did not take the focus")
}
tt.Type("wax")
tt.Type("y")
tt.Key(0, ui.KeyEnter)
if p.name != "waxy.txt" || p.renamed != 1 || p.editing {
t.Fatalf("name %q renamed %d editing %v", p.name, p.renamed, p.editing)
}
}
func TestRenameInlineKeysAroundSelection(t *testing.T) {
p := &renameProbe{name: "seal.txt", editing: true}
tt := ui.NewTester(p.view, 400, 200)
tt.Key(0, ui.KeyLeft)
tt.Type("royal ")
tt.Key(0, ui.KeyEnter)
if p.name != "royal seal.txt" {
t.Fatalf("Left then typing gave %q", p.name)
}
p.editing = true
tt.Frame()
tt.Key(0, ui.KeyBackspace)
tt.Type("crest")
tt.Key(0, ui.KeyEnter)
if p.name != "crest.txt" {
t.Fatalf("Backspace then typing gave %q", p.name)
}
p.editing = true
tt.Frame()
tt.Key(0, ui.KeyRight)
tt.Type("s")
tt.Key(0, ui.KeyEnter)
if p.name != "crests.txt" {
t.Fatalf("Right then typing gave %q", p.name)
}
}
func TestRenameInlineValidationAndCancel(t *testing.T) {
p := &renameProbe{name: "seal.txt", editing: true}
tt := ui.NewTester(p.view, 400, 200)
tt.Type("a/b")
tt.Key(0, ui.KeyEnter)
if !p.editing || p.name != "seal.txt" || !tt.HasText("No slashes") {
t.Fatalf("invalid name accepted: %q %q", p.name, tt.Texts())
}
tt.Key(0, ui.KeyEscape)
if p.editing || p.name != "seal.txt" || p.canceled != 1 {
t.Fatalf("Escape: name %q editing %v canceled %d", p.name, p.editing, p.canceled)
}
}
func TestRenameInlineBlurCommitsAndFolder(t *testing.T) {
p := &renameProbe{name: "v1.2", editing: true, folder: true}
tt := ui.NewTester(p.view, 400, 200)
tt.Type("archive")
if err := tt.Click("Elsewhere"); err != nil {
t.Fatal(err)
}
if p.name != "archive" || p.editing {
t.Fatalf("blur gave %q editing %v", p.name, p.editing)
}
}
func TestRenameInlineDoubleClickAndDisabled(t *testing.T) {
p := &renameProbe{name: "seal.txt"}
tt := ui.NewTester(p.view, 400, 200)
r, _ := tt.Find("seal.txt")
tt.ClickAt(r.X+4, r.Y+4)
tt.ClickAt(r.X+4, r.Y+4)
if !p.editing {
t.Fatal("double click did not start editing")
}
p.disabled = true
tt.Frame()
if p.editing || p.canceled != 1 {
t.Fatal("disabling did not end the edit")
}
}
func TestRenameInlineSnapshot(t *testing.T) {
snapshot(t, "rename_inline", 360, 110, func(c *ui.Context) {
p := ui.Local(c.Root(), "snap", func() *renameProbe { return &renameProbe{name: "royal seal.txt", editing: true} })
ui.Column(c).Padding(12).Gap(8).Children(func() {
RenameInline(c, &(*p).name, &(*p).editing, RenameInlineOptions{})
name, off := "ledger.md", false
RenameInline(c, &name, &off, RenameInlineOptions{})
})
})
}
func TestRenameInlineCompositionCommit(t *testing.T) {
p := &renameProbe{name: "seal.txt", editing: true}
tt := ui.NewTester(p.view, 400, 200)
tt.Compose("印", 1)
tt.Type("印章")
tt.Key(0, ui.KeyEnter)
if p.name != "印章.txt" || p.renamed != 1 {
t.Fatalf("committed name %q", p.name)
}
}
func TestRenameInlineNativeTypingAndPaste(t *testing.T) {
p := &renameProbe{name: "seal.txt", editing: true}
tt := ui.NewTester(p.view, 400, 200)
tt.TypeKey(0, ui.KeyW, "w")
tt.Key(0, ui.KeyEnter)
if p.name != "w.txt" {
t.Fatalf("native typing renamed %q", p.name)
}
p.editing = true
tt.Frame()
tt.SetClipboard("wax")
tt.Key(ui.Cmd, ui.KeyV)
tt.Key(0, ui.KeyEnter)
if p.name != "wax.txt" {
t.Fatalf("paste renamed %q", p.name)
}
}