92 lines
2.1 KiB
Go
92 lines
2.1 KiB
Go
package tray
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
type fakeMenuItem struct {
|
|
clicked chan struct{}
|
|
}
|
|
|
|
func (i *fakeMenuItem) Clicked() <-chan struct{} {
|
|
return i.clicked
|
|
}
|
|
|
|
type fakeBackend struct {
|
|
icon []byte
|
|
tooltip string
|
|
items map[string]*fakeMenuItem
|
|
quitCalls int
|
|
registering bool
|
|
}
|
|
|
|
func (b *fakeBackend) Register(onReady func(), _ func()) {
|
|
b.registering = true
|
|
onReady()
|
|
}
|
|
|
|
func (b *fakeBackend) SetIcon(icon []byte) {
|
|
b.icon = append([]byte(nil), icon...)
|
|
}
|
|
|
|
func (b *fakeBackend) SetTooltip(tooltip string) {
|
|
b.tooltip = tooltip
|
|
}
|
|
|
|
func (b *fakeBackend) AddMenuItem(title, _ string) MenuItem {
|
|
item := &fakeMenuItem{clicked: make(chan struct{}, 1)}
|
|
b.items[title] = item
|
|
return item
|
|
}
|
|
|
|
func (b *fakeBackend) Quit() {
|
|
b.quitCalls++
|
|
}
|
|
|
|
func waitFor(t *testing.T, signal <-chan struct{}) {
|
|
t.Helper()
|
|
select {
|
|
case <-signal:
|
|
case <-time.After(time.Second):
|
|
t.Fatal("timed out waiting for tray action")
|
|
}
|
|
}
|
|
|
|
func TestControllerInitializesTrayAndRoutesMenuActions(t *testing.T) {
|
|
backend := &fakeBackend{items: make(map[string]*fakeMenuItem)}
|
|
showCalls := make(chan struct{}, 1)
|
|
quitCalls := make(chan struct{}, 1)
|
|
controller := New(backend, []byte{1, 2, 3})
|
|
|
|
controller.Start(Actions{
|
|
Show: func() { showCalls <- struct{}{} },
|
|
Quit: func() { quitCalls <- struct{}{} },
|
|
})
|
|
|
|
if !backend.registering || string(backend.icon) != string([]byte{1, 2, 3}) || backend.tooltip != "Verstak" {
|
|
t.Fatalf("tray initialization = registering:%t icon:%v tooltip:%q", backend.registering, backend.icon, backend.tooltip)
|
|
}
|
|
showItem := backend.items["Show Verstak"]
|
|
quitItem := backend.items["Quit"]
|
|
if showItem == nil || quitItem == nil {
|
|
t.Fatalf("tray menu = %#v, want Show Verstak and Quit", backend.items)
|
|
}
|
|
|
|
showItem.clicked <- struct{}{}
|
|
waitFor(t, showCalls)
|
|
quitItem.clicked <- struct{}{}
|
|
waitFor(t, quitCalls)
|
|
}
|
|
|
|
func TestControllerStopsNativeTrayBackend(t *testing.T) {
|
|
backend := &fakeBackend{items: make(map[string]*fakeMenuItem)}
|
|
controller := New(backend, []byte{1})
|
|
|
|
controller.Stop()
|
|
|
|
if backend.quitCalls != 1 {
|
|
t.Fatalf("backend quit calls = %d, want 1", backend.quitCalls)
|
|
}
|
|
}
|