123 lines
3.9 KiB
Go
123 lines
3.9 KiB
Go
package input
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/egoist/mygo"
|
|
"github.com/egoist/mygo/ui"
|
|
|
|
"git.zacharyzhang.com/ZacharyZhang-NY/MujicaUI/core"
|
|
)
|
|
|
|
// fileDropZoneFiles writes files of the given sizes into a temp dir.
|
|
func fileDropZoneFiles(t *testing.T, sizes map[string]int) string {
|
|
t.Helper()
|
|
dir := t.TempDir()
|
|
for name, n := range sizes {
|
|
if err := os.WriteFile(filepath.Join(dir, name), make([]byte, n), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
return dir
|
|
}
|
|
|
|
func fileDropZoneTester(files *[]DroppedFile, opts FileDropZoneOptions, changes *int) *ui.Tester {
|
|
return ui.NewTester(func(c *ui.Context) {
|
|
core.Use(c, core.Settings{})
|
|
if FileDropZone(c, files, opts).Changed() {
|
|
*changes++
|
|
}
|
|
}, 560, 600)
|
|
}
|
|
|
|
// fileDropZoneBrowse answers the Browse dialog with paths.
|
|
func fileDropZoneBrowse(t *testing.T, paths ...string) *mygo.OpenDialogOptions {
|
|
saved := filePickerOpen
|
|
t.Cleanup(func() { filePickerOpen = saved })
|
|
got := &mygo.OpenDialogOptions{}
|
|
filePickerOpen = func(o mygo.OpenDialogOptions) ([]string, error) {
|
|
*got = o
|
|
return paths, nil
|
|
}
|
|
return got
|
|
}
|
|
|
|
func TestFileDropZoneChecksTypeSizeAndCount(t *testing.T) {
|
|
dir := fileDropZoneFiles(t, map[string]int{"a.pdf": 10, "b.PDF": 3000, "c.pdf": 20, "d.txt": 5, "e.pdf": 30})
|
|
p := func(n string) string { return filepath.Join(dir, n) }
|
|
got := fileDropZoneBrowse(t, p("a.pdf"), p("b.PDF"), p("c.pdf"), p("d.txt"), p("e.pdf"), p("missing.pdf"), dir+"/sub.pdf")
|
|
if err := os.Mkdir(p("sub.pdf"), 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var files []DroppedFile
|
|
n := 0
|
|
tt := fileDropZoneTester(&files, FileDropZoneOptions{Extensions: []string{"pdf"}, MaxFiles: 2, MaxSize: 1024}, &n)
|
|
if err := tt.Click("Browse…"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
filePickerWait(t, tt, func() bool { return len(files) == 2 && tt.HasText("More than 2 files") })
|
|
if files[0] != (DroppedFile{p("a.pdf"), 10}) || files[1] != (DroppedFile{p("c.pdf"), 20}) || n != 1 {
|
|
t.Fatalf("files %+v changes %d", files, n)
|
|
}
|
|
for _, want := range []string{"Only pdf files", "Larger than 1.0 KB", "Folders are not accepted", "Cannot read: no such file or directory"} {
|
|
if !tt.HasText(want) {
|
|
t.Errorf("missing %q in %q", want, tt.Texts())
|
|
}
|
|
}
|
|
if !got.Multiple || got.Filters[0].Extensions[0] != "pdf" {
|
|
t.Fatalf("dialog options %+v", got)
|
|
}
|
|
}
|
|
|
|
func TestFileDropZoneRemoveAndDedupe(t *testing.T) {
|
|
dir := fileDropZoneFiles(t, map[string]int{"score.mid": 2048})
|
|
path := filepath.Join(dir, "score.mid")
|
|
fileDropZoneBrowse(t, path)
|
|
files := []DroppedFile{{path, 2048}}
|
|
n := 0
|
|
tt := fileDropZoneTester(&files, FileDropZoneOptions{}, &n)
|
|
_ = tt.Click("Browse…")
|
|
for range 20 {
|
|
tt.Frame()
|
|
}
|
|
if len(files) != 1 || n != 0 || !tt.HasText("2.0 KB") {
|
|
t.Fatalf("duplicate added: %+v", files)
|
|
}
|
|
if err := tt.Click("Remove score.mid"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(files) != 0 || n != 1 {
|
|
t.Fatalf("remove: %+v changes %d", files, n)
|
|
}
|
|
}
|
|
|
|
func TestFileDropZoneDisabled(t *testing.T) {
|
|
called := false
|
|
saved := filePickerOpen
|
|
t.Cleanup(func() { filePickerOpen = saved })
|
|
filePickerOpen = func(mygo.OpenDialogOptions) ([]string, error) { called = true; return nil, nil }
|
|
files := []DroppedFile{{"/x/kept.pdf", 1}}
|
|
n := 0
|
|
tt := fileDropZoneTester(&files, FileDropZoneOptions{Disabled: true}, &n)
|
|
_ = tt.Click("Browse…")
|
|
_ = tt.Click("Remove kept.pdf")
|
|
tt.Frame()
|
|
if called || len(files) != 1 {
|
|
t.Fatal("disabled zone acted")
|
|
}
|
|
if fileDropZoneSize(1536) != "1.5 KB" || fileDropZoneSize(3<<20) != "3.0 MB" || fileDropZoneSize(12) != "12 B" {
|
|
t.Fatal("size format")
|
|
}
|
|
}
|
|
|
|
func TestFileDropZoneSnapshot(t *testing.T) {
|
|
files := []DroppedFile{{"/scores/Imprisoned XII.pdf", 482133}, {"/scores/cover.png", 1 << 20}}
|
|
snapshot(t, "file_drop_zone", 520, 330, func(c *ui.Context) {
|
|
ui.Column(c).Padding(20).Children(func() {
|
|
FileDropZone(c, &files, FileDropZoneOptions{Extensions: []string{"pdf", "png"}, MaxFiles: 3, MaxSize: 2 << 20})
|
|
})
|
|
})
|
|
}
|