]> git.proxmox.com Git - mirror_novnc.git/blob - tests/test.mouse.js
Remove very legacy mouse event handling
[mirror_novnc.git] / tests / test.mouse.js
1 const expect = chai.expect;
2
3 import Mouse from '../core/input/mouse.js';
4
5 describe('Mouse Event Handling', function () {
6 "use strict";
7
8 let target;
9
10 beforeEach(function () {
11 // For these tests we can assume that the canvas is 100x100
12 // located at coordinates 10x10
13 target = document.createElement('canvas');
14 target.style.position = "absolute";
15 target.style.top = "10px";
16 target.style.left = "10px";
17 target.style.width = "100px";
18 target.style.height = "100px";
19 document.body.appendChild(target);
20 });
21 afterEach(function () {
22 document.body.removeChild(target);
23 target = null;
24 });
25
26 // The real constructors might not work everywhere we
27 // want to run these tests
28 const mouseevent = (typeArg, MouseEventInit) => {
29 const e = { type: typeArg };
30 for (let key in MouseEventInit) {
31 e[key] = MouseEventInit[key];
32 }
33 e.stopPropagation = sinon.spy();
34 e.preventDefault = sinon.spy();
35 return e;
36 };
37
38 describe('Decode Mouse Events', function () {
39 it('should decode mousedown events', function (done) {
40 const mouse = new Mouse(target);
41 mouse.onmousebutton = (x, y, down, bmask) => {
42 expect(bmask).to.be.equal(0x01);
43 expect(down).to.be.equal(1);
44 done();
45 };
46 mouse._handleMouseDown(mouseevent('mousedown', { button: 0 }));
47 });
48 it('should decode mouseup events', function (done) {
49 let calls = 0;
50 const mouse = new Mouse(target);
51 mouse.onmousebutton = (x, y, down, bmask) => {
52 expect(bmask).to.be.equal(0x01);
53 if (calls++ === 1) {
54 expect(down).to.not.be.equal(1);
55 done();
56 }
57 };
58 mouse._handleMouseDown(mouseevent('mousedown', { button: 0 }));
59 mouse._handleMouseUp(mouseevent('mouseup', { button: 0 }));
60 });
61 it('should decode mousemove events', function (done) {
62 const mouse = new Mouse(target);
63 mouse.onmousemove = (x, y) => {
64 // Note that target relative coordinates are sent
65 expect(x).to.be.equal(40);
66 expect(y).to.be.equal(10);
67 done();
68 };
69 mouse._handleMouseMove(mouseevent('mousemove',
70 { clientX: 50, clientY: 20 }));
71 });
72 it('should decode mousewheel events', function (done) {
73 let calls = 0;
74 const mouse = new Mouse(target);
75 mouse.onmousebutton = (x, y, down, bmask) => {
76 calls++;
77 expect(bmask).to.be.equal(1<<6);
78 if (calls === 1) {
79 expect(down).to.be.equal(1);
80 } else if (calls === 2) {
81 expect(down).to.not.be.equal(1);
82 done();
83 }
84 };
85 mouse._handleMouseWheel(mouseevent('mousewheel',
86 { deltaX: 50, deltaY: 0,
87 deltaMode: 0}));
88 });
89 });
90
91 describe('Accumulate mouse wheel events with small delta', function () {
92
93 it('should accumulate wheel events if small enough', function () {
94 const mouse = new Mouse(target);
95 mouse.onmousebutton = sinon.spy();
96
97 mouse._handleMouseWheel(mouseevent(
98 'mousewheel', { clientX: 18, clientY: 40,
99 deltaX: 4, deltaY: 0, deltaMode: 0 }));
100 mouse._handleMouseWheel(mouseevent(
101 'mousewheel', { clientX: 18, clientY: 40,
102 deltaX: 4, deltaY: 0, deltaMode: 0 }));
103
104 // threshold is 10
105 expect(mouse._accumulatedWheelDeltaX).to.be.equal(8);
106
107 mouse._handleMouseWheel(mouseevent(
108 'mousewheel', { clientX: 18, clientY: 40,
109 deltaX: 4, deltaY: 0, deltaMode: 0 }));
110
111 expect(mouse.onmousebutton).to.have.callCount(2); // mouse down and up
112
113 mouse._handleMouseWheel(mouseevent(
114 'mousewheel', { clientX: 18, clientY: 40,
115 deltaX: 4, deltaY: 9, deltaMode: 0 }));
116
117 expect(mouse._accumulatedWheelDeltaX).to.be.equal(4);
118 expect(mouse._accumulatedWheelDeltaY).to.be.equal(9);
119
120 expect(mouse.onmousebutton).to.have.callCount(2); // still
121 });
122
123 it('should not accumulate large wheel events', function () {
124 const mouse = new Mouse(target);
125 mouse.onmousebutton = sinon.spy();
126
127 mouse._handleMouseWheel(mouseevent(
128 'mousewheel', { clientX: 18, clientY: 40,
129 deltaX: 11, deltaY: 0, deltaMode: 0 }));
130 mouse._handleMouseWheel(mouseevent(
131 'mousewheel', { clientX: 18, clientY: 40,
132 deltaX: 0, deltaY: 70, deltaMode: 0 }));
133 mouse._handleMouseWheel(mouseevent(
134 'mousewheel', { clientX: 18, clientY: 40,
135 deltaX: 400, deltaY: 400, deltaMode: 0 }));
136
137 expect(mouse.onmousebutton).to.have.callCount(8); // mouse down and up
138 });
139
140 it('should account for non-zero deltaMode', function () {
141 const mouse = new Mouse(target);
142 mouse.onmousebutton = sinon.spy();
143
144 mouse._handleMouseWheel(mouseevent(
145 'mousewheel', { clientX: 18, clientY: 40,
146 deltaX: 0, deltaY: 2, deltaMode: 1 }));
147
148 mouse._handleMouseWheel(mouseevent(
149 'mousewheel', { clientX: 18, clientY: 40,
150 deltaX: 1, deltaY: 0, deltaMode: 2 }));
151
152 expect(mouse.onmousebutton).to.have.callCount(4); // mouse down and up
153 });
154 });
155 });