Files
MujicaUI/recent_files_test.go
T

173 lines
4.6 KiB
Go

package mujica
import (
"fmt"
"strings"
"testing"
"time"
"github.com/egoist/mygo/ui"
)
var recentNow = time.Date(2026, 10, 5, 15, 0, 0, 0, time.UTC)
func recentSample() []RecentFile {
return []RecentFile{
{"/court/old/charter.pdf", recentNow.AddDate(0, -2, 0)},
{"/court/seal.go", recentNow.Add(-2 * time.Hour)},
{"/court/notes.md", recentNow.Add(-26 * time.Hour)},
{"/court/crest.png", recentNow.AddDate(0, 0, -4)},
{"/court/ledger.csv", recentNow.Add(-10 * time.Minute)},
}
}
type recentProbe struct {
files []RecentFile
s RecentFilesState
disabled bool
opened []string
}
func (p *recentProbe) view(c *ui.Context) {
Use(c, Settings{})
r := RecentFiles(c, p.files, &p.s, RecentFilesOptions{Now: recentNow, Disabled: p.disabled})
r.Element.Height(420)
if r.Opened != nil {
p.opened = append(p.opened, r.Opened.Path)
}
if r.Removed != "" {
for i, f := range p.files {
if f.Path == r.Removed {
p.files = append(p.files[:i:i], p.files[i+1:]...)
break
}
}
}
if r.Cleared {
p.files = nil
}
}
func TestRecentFilesGroups(t *testing.T) {
p := &recentProbe{files: recentSample()}
ui.NewTester(p.view, 480, 440)
want := []recentRow{{0, -1}, {0, 4}, {0, 1}, {1, -1}, {1, 2}, {2, -1}, {2, 3}, {3, -1}, {3, 0}}
if len(p.s.flat) != len(want) {
t.Fatalf("rows %v", p.s.flat)
}
for i := range want {
if p.s.flat[i] != want[i] {
t.Fatalf("rows %v, want %v", p.s.flat, want)
}
}
}
func TestRecentFilesOpenRemoveClear(t *testing.T) {
p := &recentProbe{files: recentSample()}
tt := ui.NewTester(p.view, 480, 440)
for _, s := range []string{"Today", "Yesterday", "This week", "Earlier", "14:50", "Oct 1"} {
if !tt.HasText(s) {
t.Fatalf("missing %q in %q", s, tt.Texts())
}
}
r, _ := tt.Find("seal.go")
tt.ClickAt(r.X, r.Y+r.H/2)
tt.ClickAt(r.X, r.Y+r.H/2)
if len(p.opened) != 1 || p.opened[0] != "/court/seal.go" {
t.Fatalf("opened %v", p.opened)
}
if err := tt.Click("Remove notes.md from recent"); err != nil {
t.Fatal(err)
}
if len(p.files) != 4 || tt.HasText("Yesterday") {
t.Fatalf("remove left %d files", len(p.files))
}
_ = tt.Click("Clear")
if len(p.files) != 0 || !tt.HasText("No recent files") {
t.Fatal("clear did not empty the list")
}
}
func TestRecentFilesKeyboardAndDisabled(t *testing.T) {
p := &recentProbe{files: recentSample()}
tt := ui.NewTester(p.view, 480, 440)
tt.Key(0, ui.KeyTab)
tt.Key(0, ui.KeyTab)
tt.Key(0, ui.KeyDown)
tt.Key(0, ui.KeyEnter)
if len(p.opened) != 1 || p.opened[0] != "/court/ledger.csv" {
t.Fatalf("keyboard opened %v", p.opened)
}
p = &recentProbe{files: recentSample(), disabled: true}
tt = ui.NewTester(p.view, 480, 440)
_ = tt.Click("Clear")
if len(p.files) != 5 {
t.Fatal("disabled list cleared")
}
}
func TestRecentFilesSnapshot(t *testing.T) {
snapshot(t, "recent_files", 460, 440, func(c *ui.Context) {
p := ui.Local(c.Root(), "snap", func() *recentProbe { return &recentProbe{files: recentSample()} })
ui.Column(c).Padding(12).Children(func() {
RecentFiles(c, (*p).files, &(*p).s, RecentFilesOptions{Now: recentNow}).Element.Height(416)
})
})
}
func TestRecentFilesLargeAndRevision(t *testing.T) {
files := make([]RecentFile, 100000)
for i := range files {
files[i] = RecentFile{Path: fmt.Sprintf("/f-%d.txt", i), Opened: recentNow}
}
s := RecentFilesState{}
revision := uint64(0)
tt := ui.NewTester(func(c *ui.Context) {
Use(c, Settings{})
RecentFiles(c, files, &s, RecentFilesOptions{Now: recentNow, Revision: revision}).Element.Height(220)
}, 500, 250)
n := 0
for _, text := range tt.Texts() {
if strings.HasPrefix(text, "f-") {
n++
}
}
if n == 0 || n > 60 {
t.Fatalf("built %d recent files", n)
}
files[0].Opened = recentNow.AddDate(0, -1, 0)
revision++
tt.Frame()
if r := s.flat[len(s.flat)-1]; r.group != 3 || r.file != 0 {
t.Fatalf("revised last row %+v", r)
}
}
func TestRecentFilesDisablingBeforeDeliveredKey(t *testing.T) {
p := &recentProbe{files: recentSample()}
tt := ui.NewTester(p.view, 480, 440)
tt.Key(0, ui.KeyTab)
tt.Key(0, ui.KeyTab)
tt.Key(0, ui.KeyDown)
before := p.s.selected
p.disabled = true
tt.Key(0, ui.KeyDown)
if p.s.selected != before {
t.Fatalf("disabled row %d, want %d", p.s.selected, before)
}
}
func TestRecentFilesRemovedSelectionDoesNotOpenAnother(t *testing.T) {
p := &recentProbe{files: []RecentFile{{Path: "a.txt", Opened: recentNow}, {Path: "b.txt", Opened: recentNow}}}
tt := ui.NewTester(p.view, 480, 440)
if err := tt.Click("b.txt"); err != nil {
t.Fatal(err)
}
p.files = p.files[:1]
tt.Frame()
tt.Key(0, ui.KeyEnter)
if len(p.opened) != 0 {
t.Fatalf("opened %v after removing selection", p.opened)
}
}