gesture_test.go raw
1 package gesture
2
3 import (
4 "testing"
5 "time"
6
7 "github.com/p9c/p9/pkg/gel/gio/io/event"
8 "github.com/p9c/p9/pkg/gel/gio/io/pointer"
9 "github.com/p9c/p9/pkg/gel/gio/io/router"
10 "github.com/p9c/p9/pkg/gel/gio/op"
11 )
12
13 func TestMouseClicks(t *testing.T) {
14 for _, tc := range []struct {
15 label string
16 events []event.Event
17 clicks []int // number of combined clicks per click (single, double...)
18 }{
19 {
20 label: "single click",
21 events: mouseClickEvents(200 * time.Millisecond),
22 clicks: []int{1},
23 },
24 {
25 label: "double click",
26 events: mouseClickEvents(
27 100*time.Millisecond,
28 100*time.Millisecond+doubleClickDuration-1),
29 clicks: []int{1, 2},
30 },
31 {
32 label: "two single clicks",
33 events: mouseClickEvents(
34 100*time.Millisecond,
35 100*time.Millisecond+doubleClickDuration+1),
36 clicks: []int{1, 1},
37 },
38 } {
39 t.Run(tc.label, func(t *testing.T) {
40 var click Click
41 var ops op.Ops
42 click.Add(&ops)
43
44 var r router.Router
45 r.Frame(&ops)
46 r.Queue(tc.events...)
47
48 events := click.Events(&r)
49 clicks := filterMouseClicks(events)
50 if got, want := len(clicks), len(tc.clicks); got != want {
51 t.Fatalf("got %d mouse clicks, expected %d", got, want)
52 }
53
54 for i, click := range clicks {
55 if got, want := click.NumClicks, tc.clicks[i]; got != want {
56 t.Errorf("got %d combined mouse clicks, expected %d", got, want)
57 }
58 }
59 })
60 }
61 }
62
63 func mouseClickEvents(times ...time.Duration) []event.Event {
64 press := pointer.Event{
65 Type: pointer.Press,
66 Source: pointer.Mouse,
67 Buttons: pointer.ButtonPrimary,
68 }
69 events := make([]event.Event, 0, 2*len(times))
70 for _, t := range times {
71 release := press
72 release.Type = pointer.Release
73 release.Time = t
74 events = append(events, press, release)
75 }
76 return events
77 }
78
79 func filterMouseClicks(events []ClickEvent) []ClickEvent {
80 var clicks []ClickEvent
81 for _, ev := range events {
82 if ev.Type == TypeClick {
83 clicks = append(clicks, ev)
84 }
85 }
86 return clicks
87 }
88