111 lines
2.9 KiB
Go
111 lines
2.9 KiB
Go
package mujica
|
||
|
||
import (
|
||
"testing"
|
||
"time"
|
||
|
||
"github.com/egoist/mygo/ui"
|
||
)
|
||
|
||
func calRichEvent() CalendarEvent {
|
||
ev := calEvent("r", 14, 19, 0, 120)
|
||
ev.Title, ev.Location, ev.Color = "Masquerade rehearsal", "Rehearsal hall", EventInfo
|
||
ev.Attendees = calAttendees[:2]
|
||
ev.Reminders = []time.Duration{15 * time.Minute, time.Hour}
|
||
ev.Repeat = Recurrence{Unit: RepeatWeekly, Interval: 1, Weekdays: []time.Weekday{time.Wednesday}}
|
||
return ev
|
||
}
|
||
|
||
type popoverProbe struct {
|
||
open bool
|
||
opts EventPopoverOptions
|
||
edits, deletes int
|
||
}
|
||
|
||
func (p *popoverProbe) tester() *ui.Tester {
|
||
p.opts.Location = calTokyo
|
||
return ui.NewTester(func(c *ui.Context) {
|
||
Use(c, Settings{})
|
||
ui.Column(c).Padding(16).Children(func() {
|
||
b := Button(c, "Details", ButtonOptions{Variant: Secondary})
|
||
if b.Clicked() {
|
||
p.open = true
|
||
}
|
||
r := EventPopover(c, b, &p.open, calRichEvent(), p.opts)
|
||
if r.Edit() {
|
||
p.edits++
|
||
}
|
||
if r.Delete() {
|
||
p.deletes++
|
||
}
|
||
})
|
||
}, 600, 500)
|
||
}
|
||
|
||
func TestEventPopoverSummaryAndActions(t *testing.T) {
|
||
p := &popoverProbe{}
|
||
tt := p.tester()
|
||
_ = tt.Click("Details")
|
||
for _, s := range []string{"Masquerade rehearsal", "Wednesday, October 14, 2026 · 19:00 – 21:00", "Rehearsal hall",
|
||
"Weekly on Wednesday", "2 guests: Sakiko Togawa, Mutsumi Wakaba", "15 minutes before, 1 hour before"} {
|
||
if !tt.HasText(s) {
|
||
t.Fatalf("missing %q in %v", s, tt.Texts())
|
||
}
|
||
}
|
||
_ = tt.Click("Edit")
|
||
if p.edits != 1 || p.open {
|
||
t.Fatal("Edit should report and close")
|
||
}
|
||
_ = tt.Click("Details")
|
||
tt.Key(0, ui.KeyTab)
|
||
_ = tt.Click("Delete")
|
||
if p.deletes != 1 || p.open {
|
||
t.Fatal("Delete should report and close")
|
||
}
|
||
_ = tt.Click("Details")
|
||
tt.Key(0, ui.KeyEscape)
|
||
if p.open {
|
||
t.Fatal("Escape should close")
|
||
}
|
||
}
|
||
|
||
func TestEventPopoverReadOnlyAndDisabled(t *testing.T) {
|
||
p := &popoverProbe{opts: EventPopoverOptions{ReadOnly: true}}
|
||
tt := p.tester()
|
||
_ = tt.Click("Details")
|
||
if tt.HasText("Edit") || tt.HasText("Delete") || !tt.HasText("Rehearsal hall") {
|
||
t.Fatal("read-only popover shows actions")
|
||
}
|
||
p.opts.ReadOnly, p.opts.Disabled = false, true
|
||
tt.Frame()
|
||
if p.open || tt.HasText("Rehearsal hall") {
|
||
t.Fatal("disabling should close the popover")
|
||
}
|
||
defer func() {
|
||
if recover() == nil {
|
||
t.Fatal("expected panic without Location")
|
||
}
|
||
}()
|
||
ui.NewTester(func(c *ui.Context) {
|
||
Use(c, Settings{})
|
||
open := true
|
||
EventPopover(c, ui.Box(c), &open, calRichEvent(), EventPopoverOptions{})
|
||
}, 10, 10)
|
||
}
|
||
|
||
func TestEventPopoverSnapshot(t *testing.T) {
|
||
snapshot(t, "event_popover", 460, 400, func(c *ui.Context) {
|
||
ui.Row(c).Padding(16).Children(func() {
|
||
b := Button(c, "Details", ButtonOptions{Variant: Secondary})
|
||
// Open once the anchor is laid out.
|
||
frames := ui.Local(c.Root(), "frames", func() int { return 0 })
|
||
*frames++
|
||
if *frames == 1 {
|
||
c.Invalidate()
|
||
}
|
||
open := *frames > 1
|
||
EventPopover(c, b, &open, calRichEvent(), EventPopoverOptions{Location: calTokyo})
|
||
})
|
||
})
|
||
}
|