clipboard_test.go raw

   1  package router
   2  
   3  import (
   4  	"testing"
   5  
   6  	"github.com/p9c/p9/pkg/gel/gio/io/clipboard"
   7  	"github.com/p9c/p9/pkg/gel/gio/io/event"
   8  	"github.com/p9c/p9/pkg/gel/gio/op"
   9  )
  10  
  11  func TestClipboardDuplicateEvent(t *testing.T) {
  12  	ops, router, handler := new(op.Ops), new(Router), make([]int, 2)
  13  
  14  	// Both must receive the event once
  15  	clipboard.ReadOp{Tag: &handler[0]}.Add(ops)
  16  	clipboard.ReadOp{Tag: &handler[1]}.Add(ops)
  17  
  18  	router.Frame(ops)
  19  	event := clipboard.Event{Text: "Test"}
  20  	router.Queue(event)
  21  	assertClipboardReadOp(t, router, 0)
  22  	assertClipboardEvent(t, router.Events(&handler[0]), true)
  23  	assertClipboardEvent(t, router.Events(&handler[1]), true)
  24  	ops.Reset()
  25  
  26  	// No ReadOp
  27  
  28  	router.Frame(ops)
  29  	assertClipboardReadOp(t, router, 0)
  30  	assertClipboardEvent(t, router.Events(&handler[0]), false)
  31  	assertClipboardEvent(t, router.Events(&handler[1]), false)
  32  	ops.Reset()
  33  
  34  	clipboard.ReadOp{Tag: &handler[0]}.Add(ops)
  35  
  36  	router.Frame(ops)
  37  	// No ClipboardEvent sent
  38  	assertClipboardReadOp(t, router, 1)
  39  	assertClipboardEvent(t, router.Events(&handler[0]), false)
  40  	assertClipboardEvent(t, router.Events(&handler[1]), false)
  41  	ops.Reset()
  42  }
  43  
  44  func TestQueueProcessReadClipboard(t *testing.T) {
  45  	ops, router, handler := new(op.Ops), new(Router), make([]int, 2)
  46  	ops.Reset()
  47  
  48  	// Request read
  49  	clipboard.ReadOp{Tag: &handler[0]}.Add(ops)
  50  
  51  	router.Frame(ops)
  52  	assertClipboardReadOp(t, router, 1)
  53  	ops.Reset()
  54  
  55  	for i := 0; i < 3; i++ {
  56  		// No ReadOp
  57  		// One receiver must still wait for response
  58  
  59  		router.Frame(ops)
  60  		assertClipboardReadOpDuplicated(t, router, 1)
  61  		ops.Reset()
  62  	}
  63  
  64  	router.Frame(ops)
  65  	// Send the clipboard event
  66  	event := clipboard.Event{Text: "Text 2"}
  67  	router.Queue(event)
  68  	assertClipboardReadOp(t, router, 0)
  69  	assertClipboardEvent(t, router.Events(&handler[0]), true)
  70  	ops.Reset()
  71  
  72  	// No ReadOp
  73  	// There's no receiver waiting
  74  
  75  	router.Frame(ops)
  76  	assertClipboardReadOp(t, router, 0)
  77  	assertClipboardEvent(t, router.Events(&handler[0]), false)
  78  	ops.Reset()
  79  }
  80  
  81  func TestQueueProcessWriteClipboard(t *testing.T) {
  82  	ops, router := new(op.Ops), new(Router)
  83  	ops.Reset()
  84  
  85  	clipboard.WriteOp{Text: "Write 1"}.Add(ops)
  86  
  87  	router.Frame(ops)
  88  	assertClipboardWriteOp(t, router, "Write 1")
  89  	ops.Reset()
  90  
  91  	// No WriteOp
  92  
  93  	router.Frame(ops)
  94  	assertClipboardWriteOp(t, router, "")
  95  	ops.Reset()
  96  
  97  	clipboard.WriteOp{Text: "Write 2"}.Add(ops)
  98  
  99  	router.Frame(ops)
 100  	assertClipboardReadOp(t, router, 0)
 101  	assertClipboardWriteOp(t, router, "Write 2")
 102  	ops.Reset()
 103  }
 104  
 105  func assertClipboardEvent(t *testing.T, events []event.Event, expected bool) {
 106  	t.Helper()
 107  	var evtClipboard int
 108  	for _, e := range events {
 109  		switch e.(type) {
 110  		case clipboard.Event:
 111  			evtClipboard++
 112  		}
 113  	}
 114  	if evtClipboard <= 0 && expected {
 115  		t.Error("expected to receive some event")
 116  	}
 117  	if evtClipboard > 0 && !expected {
 118  		t.Error("unexpected event received")
 119  	}
 120  }
 121  
 122  func assertClipboardReadOp(t *testing.T, router *Router, expected int) {
 123  	t.Helper()
 124  	if len(router.cqueue.receivers) != expected {
 125  		t.Error("unexpected number of receivers")
 126  	}
 127  	if router.cqueue.ReadClipboard() != (expected > 0) {
 128  		t.Error("missing requests")
 129  	}
 130  }
 131  
 132  func assertClipboardReadOpDuplicated(t *testing.T, router *Router, expected int) {
 133  	t.Helper()
 134  	if len(router.cqueue.receivers) != expected {
 135  		t.Error("receivers removed")
 136  	}
 137  	if router.cqueue.ReadClipboard() != false {
 138  		t.Error("duplicated requests")
 139  	}
 140  }
 141  
 142  func assertClipboardWriteOp(t *testing.T, router *Router, expected string) {
 143  	t.Helper()
 144  	if (router.cqueue.text != nil) != (expected != "") {
 145  		t.Error("text not defined")
 146  	}
 147  	text, ok := router.cqueue.WriteClipboard()
 148  	if ok != (expected != "") {
 149  		t.Error("duplicated requests")
 150  	}
 151  	if text != expected {
 152  		t.Errorf("got text %s, expected %s", text, expected)
 153  	}
 154  }
 155