1package core
2
3import (
4 "slices"
5 "testing"
6 "time"
7
8 "github.com/bnema/neferwl/internal/ports"
9)
10
11func TestOverviewStashInputNavigation(t *testing.T) {
12 for _, input := range []string{"swipe", "wheel", "bind"} {
13 t.Run(input, func(t *testing.T) {
14 c, _, sc, _ := stashRig(t, true)
15 m := sc.mon
16 w := m.Current()
17 before := stashIDs(w)
18 m.ToggleOverview()
19 var at time.Duration
20 send := func(ev ports.InputEvent) {
21 t.Helper()
22 if err := c.handleInput(t.Context(), ev); err != nil {
23 t.Fatal(err)
24 }
25 }
26 move := func(dx, dy int) {
27 t.Helper()
28 switch input {
29 case "swipe":
30 at += time.Second
31 send(ports.SwipeBegin{Fingers: 3, Time: at})
32 for range 3 {
33 at += 8 * time.Millisecond
34 send(ports.SwipeUpdate{DX: float64(dx) * 40, DY: float64(dy) * 40, Time: at})
35 }
36 send(ports.SwipeEnd{Time: at})
37 case "wheel":
38 m.overviewScroll(ports.PointerAxis{Source: ports.AxisWheel,
39 Horizontal: ports.ScrollAxis{Set: dx != 0, Value: float64(dx) * 70, V120: int32(dx * 120)},
40 Vertical: ports.ScrollAxis{Set: dy != 0, Value: float64(dy) * 70, V120: int32(dy * 120)}})
41 c.scrollStop(ports.PointerAxis{Vertical: ports.ScrollAxis{Stop: true}})
42 case "bind":
43 var a Action
44 switch {
45 case dx == 0 && dy < 0:
46 a = ActionFocusWorkspacePrev
47 case dx == 0 && dy > 0:
48 a = ActionFocusWorkspaceNext
49 case dx > 0 && dy == 0:
50 a = ActionFocusColumnRight
51 case dx < 0 && dy == 0:
52 a = ActionFocusColumnLeft
53 default:
54 t.Fatalf("no bind for move %d,%d", dx, dy)
55 }
56 m.overviewFocus(a)
57 }
58 }
59 move(0, -1)
60 if m.cardAt(w) != 1 {
61 t.Fatalf("up selected card %d, want 1", m.cardAt(w))
62 }
63 move(0, 1)
64 move(0, 1)
65 if m.Current() != w || m.cardAt(w) != 2 || !slices.Equal(stashIDs(w), before) {
66 t.Fatal("down escaped or reordered the stash")
67 }
68 move(1, 0)
69 if m.cardAt(w) >= 0 {
70 t.Fatal("right did not leave the stash")
71 }
72 })
73 }
74}