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