Twenty pieces of a retro desktop: Desktop, DesktopIcon, Taskbar, StartMenu, AppWindow, Calculator, Notepad, Minesweeper, ControlPanel, TrayIcons, ShutdownScreen, BootScreen, Screensaver, Snake, Dock, RunDialog, DiskDefrag, WallpaperPicker, ClipboardPanel and LockScreen. The calculator really adds up and calls division by zero GAME OVER; Minesweeper and Snake are playable, first click always safe; START cascades its submenus without moving the rows already open; windows drag by whole dots; the screensaver's logo changes color at each wall and sparkles in a corner; the defragmenter is oddly soothing. Clocks that step back hold at zero, and typed or copied text never reaches the log. icon.Bomb is the new 12x12 mine.
110 lines
2.7 KiB
Go
110 lines
2.7 KiB
Go
package desk_test
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/egoist/mygo/ui"
|
|
|
|
"git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/desk"
|
|
"git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/input"
|
|
"git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/pixel"
|
|
)
|
|
|
|
func TestShutdownScreenSaysItIsSafe(t *testing.T) {
|
|
tt := view(700, 300, newWorld(), func(c *ui.Context) { desk.ShutdownScreen(c, desk.ShutdownScreenOptions{}) })
|
|
find(t, tt, "IT'S NOW SAFE TO TURN OFF YOUR COMPUTER.")
|
|
}
|
|
|
|
func TestBootScreenCountsThenPrints(t *testing.T) {
|
|
for _, reduce := range []bool{false, true} {
|
|
wd := newWorld()
|
|
wd.reduce = reduce
|
|
done := 0
|
|
tt := view(700, 400, wd, func(c *ui.Context) {
|
|
if desk.BootScreen(c, "BIOS", []string{"A", "B", "C"}, desk.BootScreenOptions{}).Done {
|
|
done++
|
|
}
|
|
})
|
|
x, y, w, _ := dots(find(t, tt, "BIOS"))
|
|
// POST lines print in Faint, one each, under the count.
|
|
lines := func() int {
|
|
n := 0
|
|
for i := range 3 {
|
|
if count(tt.Image(), x, y+6+(3+i)*16, w, 16, pixel.Faint) > 0 {
|
|
n++
|
|
}
|
|
}
|
|
return n
|
|
}
|
|
first := lines()
|
|
later(tt, wd, 2*time.Second)
|
|
if done != 1 || lines() != 3 || reduce != (first == 3) {
|
|
t.Errorf("reduce %v: done %d, %d lines at first, %d after", reduce, done, first, lines())
|
|
}
|
|
later(tt, wd, time.Second)
|
|
if done != 1 {
|
|
t.Errorf("reduce %v: done reported %d times", reduce, done)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestScreensaverWakesOnAnyInput(t *testing.T) {
|
|
for _, wake := range []string{"key", "click", "move"} {
|
|
wd := newWorld()
|
|
on, woke := false, 0
|
|
tt := view(600, 400, wd, func(c *ui.Context) {
|
|
if input.Button(c, "SAVER", input.ButtonOptions{}).Clicked {
|
|
on = true
|
|
}
|
|
if desk.Screensaver(c, "LOGO", &on, desk.ScreensaverOptions{}).Woke {
|
|
woke++
|
|
}
|
|
})
|
|
click(t, tt, "SAVER")
|
|
if !on || !tt.Focused("LOGO") {
|
|
t.Fatalf("%s: the saver did not take over", wake)
|
|
}
|
|
// A small nudge of the pointer is not a wake.
|
|
tt.Move(300, 200)
|
|
tt.Move(304, 200)
|
|
before := moves(tt, wd)
|
|
switch wake {
|
|
case "key":
|
|
tt.Key(0, ui.KeyA)
|
|
case "click":
|
|
tt.ClickAt(10, 10)
|
|
case "move":
|
|
tt.Move(380, 300)
|
|
}
|
|
tt.Frame()
|
|
if on || woke != 1 || !before {
|
|
t.Errorf("%s: on %v, woke %d, logo moved %v", wake, on, woke, before)
|
|
}
|
|
if !tt.Focused("SAVER") {
|
|
t.Errorf("%s: the focus did not come back", wake)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestLockScreenOpensOnAKeyNotAMove(t *testing.T) {
|
|
wd := newWorld()
|
|
locked, open := true, 0
|
|
tt := view(600, 400, wd, func(c *ui.Context) {
|
|
if desk.LockScreen(c, "Lock", &locked, desk.LockScreenOptions{}).Unlocked {
|
|
open++
|
|
}
|
|
})
|
|
tt.Move(10, 10)
|
|
tt.Move(300, 300)
|
|
tt.Frame()
|
|
if !locked {
|
|
t.Fatal("a move unlocked it")
|
|
}
|
|
tt.Key(0, ui.KeySpace)
|
|
tt.Frame()
|
|
if locked || open != 1 {
|
|
t.Fatalf("Space left it locked %v, %d unlocks", locked, open)
|
|
}
|
|
}
|