1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "flutter/lib/ui/window/pointer_data_packet_converter.h"
6#include "gtest/gtest.h"
7
8namespace flutter {
9namespace testing {
10
11void CreateSimulatedPointerData(PointerData& data, // NOLINT
12 PointerData::Change change,
13 int64_t device,
14 double dx,
15 double dy) {
16 data.time_stamp = 0;
17 data.change = change;
18 data.kind = PointerData::DeviceKind::kTouch;
19 data.signal_kind = PointerData::SignalKind::kNone;
20 data.device = device;
21 data.pointer_identifier = 0;
22 data.physical_x = dx;
23 data.physical_y = dy;
24 data.physical_delta_x = 0.0;
25 data.physical_delta_y = 0.0;
26 data.buttons = 0;
27 data.obscured = 0;
28 data.synthesized = 0;
29 data.pressure = 0.0;
30 data.pressure_min = 0.0;
31 data.pressure_max = 0.0;
32 data.distance = 0.0;
33 data.distance_max = 0.0;
34 data.size = 0.0;
35 data.radius_major = 0.0;
36 data.radius_minor = 0.0;
37 data.radius_min = 0.0;
38 data.radius_max = 0.0;
39 data.orientation = 0.0;
40 data.tilt = 0.0;
41 data.platformData = 0;
42 data.scroll_delta_x = 0.0;
43 data.scroll_delta_y = 0.0;
44}
45
46void CreateSimulatedMousePointerData(PointerData& data, // NOLINT
47 PointerData::Change change,
48 PointerData::SignalKind signal_kind,
49 int64_t device,
50 double dx,
51 double dy,
52 double scroll_delta_x,
53 double scroll_delta_y) {
54 data.time_stamp = 0;
55 data.change = change;
56 data.kind = PointerData::DeviceKind::kMouse;
57 data.signal_kind = signal_kind;
58 data.device = device;
59 data.pointer_identifier = 0;
60 data.physical_x = dx;
61 data.physical_y = dy;
62 data.physical_delta_x = 0.0;
63 data.physical_delta_y = 0.0;
64 data.buttons = 0;
65 data.obscured = 0;
66 data.synthesized = 0;
67 data.pressure = 0.0;
68 data.pressure_min = 0.0;
69 data.pressure_max = 0.0;
70 data.distance = 0.0;
71 data.distance_max = 0.0;
72 data.size = 0.0;
73 data.radius_major = 0.0;
74 data.radius_minor = 0.0;
75 data.radius_min = 0.0;
76 data.radius_max = 0.0;
77 data.orientation = 0.0;
78 data.tilt = 0.0;
79 data.platformData = 0;
80 data.scroll_delta_x = scroll_delta_x;
81 data.scroll_delta_y = scroll_delta_y;
82}
83
84void UnpackPointerPacket(std::vector<PointerData>& output, // NOLINT
85 std::unique_ptr<PointerDataPacket> packet) {
86 size_t kBytesPerPointerData = kPointerDataFieldCount * kBytesPerField;
87 auto buffer = packet->data();
88 size_t buffer_length = buffer.size();
89
90 for (size_t i = 0; i < buffer_length / kBytesPerPointerData; i++) {
91 PointerData pointer_data;
92 memcpy(&pointer_data, &buffer[i * kBytesPerPointerData],
93 sizeof(PointerData));
94 output.push_back(pointer_data);
95 }
96 packet.reset();
97}
98
99TEST(PointerDataPacketConverterTest, CanConvetPointerDataPacket) {
100 PointerDataPacketConverter converter;
101 auto packet = std::make_unique<PointerDataPacket>(6);
102 PointerData data;
103 CreateSimulatedPointerData(data, PointerData::Change::kAdd, 0, 0.0, 0.0);
104 packet->SetPointerData(0, data);
105 CreateSimulatedPointerData(data, PointerData::Change::kHover, 0, 3.0, 0.0);
106 packet->SetPointerData(1, data);
107 CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 3.0, 0.0);
108 packet->SetPointerData(2, data);
109 CreateSimulatedPointerData(data, PointerData::Change::kMove, 0, 3.0, 4.0);
110 packet->SetPointerData(3, data);
111 CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 3.0, 4.0);
112 packet->SetPointerData(4, data);
113 CreateSimulatedPointerData(data, PointerData::Change::kRemove, 0, 3.0, 4.0);
114 packet->SetPointerData(5, data);
115 auto converted_packet = converter.Convert(std::move(packet));
116
117 std::vector<PointerData> result;
118 UnpackPointerPacket(result, std::move(converted_packet));
119
120 ASSERT_EQ(result.size(), (size_t)6);
121 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
122 ASSERT_EQ(result[0].synthesized, 0);
123
124 ASSERT_EQ(result[1].change, PointerData::Change::kHover);
125 ASSERT_EQ(result[1].synthesized, 0);
126 ASSERT_EQ(result[1].physical_delta_x, 3.0);
127 ASSERT_EQ(result[1].physical_delta_y, 0.0);
128
129 ASSERT_EQ(result[2].change, PointerData::Change::kDown);
130 ASSERT_EQ(result[2].pointer_identifier, 1);
131 ASSERT_EQ(result[2].synthesized, 0);
132
133 ASSERT_EQ(result[3].change, PointerData::Change::kMove);
134 ASSERT_EQ(result[3].pointer_identifier, 1);
135 ASSERT_EQ(result[3].synthesized, 0);
136 ASSERT_EQ(result[3].physical_delta_x, 0.0);
137 ASSERT_EQ(result[3].physical_delta_y, 4.0);
138
139 ASSERT_EQ(result[4].change, PointerData::Change::kUp);
140 ASSERT_EQ(result[4].pointer_identifier, 1);
141 ASSERT_EQ(result[4].synthesized, 0);
142
143 ASSERT_EQ(result[5].change, PointerData::Change::kRemove);
144 ASSERT_EQ(result[5].synthesized, 0);
145}
146
147TEST(PointerDataPacketConverterTest, CanSynthesizeDownAndUp) {
148 PointerDataPacketConverter converter;
149 auto packet = std::make_unique<PointerDataPacket>(4);
150 PointerData data;
151 CreateSimulatedPointerData(data, PointerData::Change::kAdd, 0, 0.0, 0.0);
152 packet->SetPointerData(0, data);
153 CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 3.0, 0.0);
154 packet->SetPointerData(1, data);
155 CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 3.0, 4.0);
156 packet->SetPointerData(2, data);
157 CreateSimulatedPointerData(data, PointerData::Change::kRemove, 0, 3.0, 4.0);
158 packet->SetPointerData(3, data);
159 auto converted_packet = converter.Convert(std::move(packet));
160
161 std::vector<PointerData> result;
162 UnpackPointerPacket(result, std::move(converted_packet));
163
164 ASSERT_EQ(result.size(), (size_t)6);
165 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
166 ASSERT_EQ(result[0].synthesized, 0);
167
168 // A hover should be synthesized.
169 ASSERT_EQ(result[1].change, PointerData::Change::kHover);
170 ASSERT_EQ(result[1].synthesized, 1);
171 ASSERT_EQ(result[1].physical_delta_x, 3.0);
172 ASSERT_EQ(result[1].physical_delta_y, 0.0);
173
174 ASSERT_EQ(result[2].change, PointerData::Change::kDown);
175 ASSERT_EQ(result[2].pointer_identifier, 1);
176 ASSERT_EQ(result[2].synthesized, 0);
177
178 // A move should be synthesized.
179 ASSERT_EQ(result[3].change, PointerData::Change::kMove);
180 ASSERT_EQ(result[3].pointer_identifier, 1);
181 ASSERT_EQ(result[3].synthesized, 1);
182 ASSERT_EQ(result[3].physical_delta_x, 0.0);
183 ASSERT_EQ(result[3].physical_delta_y, 4.0);
184
185 ASSERT_EQ(result[4].change, PointerData::Change::kUp);
186 ASSERT_EQ(result[4].pointer_identifier, 1);
187 ASSERT_EQ(result[4].synthesized, 0);
188
189 ASSERT_EQ(result[5].change, PointerData::Change::kRemove);
190 ASSERT_EQ(result[5].synthesized, 0);
191}
192
193TEST(PointerDataPacketConverterTest, CanUpdatePointerIdentifier) {
194 PointerDataPacketConverter converter;
195 auto packet = std::make_unique<PointerDataPacket>(7);
196 PointerData data;
197 CreateSimulatedPointerData(data, PointerData::Change::kAdd, 0, 0.0, 0.0);
198 packet->SetPointerData(0, data);
199 CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0);
200 packet->SetPointerData(1, data);
201 CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 0.0, 0.0);
202 packet->SetPointerData(2, data);
203 CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0);
204 packet->SetPointerData(3, data);
205 CreateSimulatedPointerData(data, PointerData::Change::kMove, 0, 3.0, 0.0);
206 packet->SetPointerData(4, data);
207 CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 3.0, 0.0);
208 packet->SetPointerData(5, data);
209 CreateSimulatedPointerData(data, PointerData::Change::kRemove, 0, 3.0, 0.0);
210 packet->SetPointerData(6, data);
211 auto converted_packet = converter.Convert(std::move(packet));
212
213 std::vector<PointerData> result;
214 UnpackPointerPacket(result, std::move(converted_packet));
215
216 ASSERT_EQ(result.size(), (size_t)7);
217 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
218 ASSERT_EQ(result[0].synthesized, 0);
219
220 ASSERT_EQ(result[1].change, PointerData::Change::kDown);
221 ASSERT_EQ(result[1].pointer_identifier, 1);
222 ASSERT_EQ(result[1].synthesized, 0);
223
224 ASSERT_EQ(result[2].change, PointerData::Change::kUp);
225 ASSERT_EQ(result[2].pointer_identifier, 1);
226 ASSERT_EQ(result[2].synthesized, 0);
227
228 // Pointer count increase to 2.
229 ASSERT_EQ(result[3].change, PointerData::Change::kDown);
230 ASSERT_EQ(result[3].pointer_identifier, 2);
231 ASSERT_EQ(result[3].synthesized, 0);
232
233 ASSERT_EQ(result[4].change, PointerData::Change::kMove);
234 ASSERT_EQ(result[4].pointer_identifier, 2);
235 ASSERT_EQ(result[4].synthesized, 0);
236 ASSERT_EQ(result[4].physical_delta_x, 3.0);
237 ASSERT_EQ(result[4].physical_delta_y, 0.0);
238
239 ASSERT_EQ(result[5].change, PointerData::Change::kUp);
240 ASSERT_EQ(result[5].pointer_identifier, 2);
241 ASSERT_EQ(result[5].synthesized, 0);
242
243 ASSERT_EQ(result[6].change, PointerData::Change::kRemove);
244 ASSERT_EQ(result[6].synthesized, 0);
245}
246
247TEST(PointerDataPacketConverterTest, AlwaysForwardMoveEvent) {
248 PointerDataPacketConverter converter;
249 auto packet = std::make_unique<PointerDataPacket>(4);
250 PointerData data;
251 CreateSimulatedPointerData(data, PointerData::Change::kAdd, 0, 0.0, 0.0);
252 packet->SetPointerData(0, data);
253 CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0);
254 packet->SetPointerData(1, data);
255 // Creates a move event without a location change.
256 CreateSimulatedPointerData(data, PointerData::Change::kMove, 0, 0.0, 0.0);
257 packet->SetPointerData(2, data);
258 CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 0.0, 0.0);
259 packet->SetPointerData(3, data);
260
261 auto converted_packet = converter.Convert(std::move(packet));
262
263 std::vector<PointerData> result;
264 UnpackPointerPacket(result, std::move(converted_packet));
265
266 ASSERT_EQ(result.size(), (size_t)4);
267 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
268 ASSERT_EQ(result[0].synthesized, 0);
269
270 ASSERT_EQ(result[1].change, PointerData::Change::kDown);
271 ASSERT_EQ(result[1].pointer_identifier, 1);
272 ASSERT_EQ(result[1].synthesized, 0);
273
274 // Does not filter out the move event.
275 ASSERT_EQ(result[2].change, PointerData::Change::kMove);
276 ASSERT_EQ(result[2].pointer_identifier, 1);
277 ASSERT_EQ(result[2].synthesized, 0);
278
279 ASSERT_EQ(result[3].change, PointerData::Change::kUp);
280 ASSERT_EQ(result[3].pointer_identifier, 1);
281 ASSERT_EQ(result[3].synthesized, 0);
282}
283
284TEST(PointerDataPacketConverterTest, CanWorkWithDifferentDevices) {
285 PointerDataPacketConverter converter;
286 auto packet = std::make_unique<PointerDataPacket>(12);
287 PointerData data;
288 CreateSimulatedPointerData(data, PointerData::Change::kAdd, 0, 0.0, 0.0);
289 packet->SetPointerData(0, data);
290 CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0);
291 packet->SetPointerData(1, data);
292 CreateSimulatedPointerData(data, PointerData::Change::kAdd, 1, 0.0, 0.0);
293 packet->SetPointerData(2, data);
294 CreateSimulatedPointerData(data, PointerData::Change::kDown, 1, 0.0, 0.0);
295 packet->SetPointerData(3, data);
296 CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 0.0, 0.0);
297 packet->SetPointerData(4, data);
298 CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0);
299 packet->SetPointerData(5, data);
300 CreateSimulatedPointerData(data, PointerData::Change::kMove, 1, 0.0, 4.0);
301 packet->SetPointerData(6, data);
302 CreateSimulatedPointerData(data, PointerData::Change::kMove, 0, 3.0, 0.0);
303 packet->SetPointerData(7, data);
304 CreateSimulatedPointerData(data, PointerData::Change::kUp, 1, 0.0, 4.0);
305 packet->SetPointerData(8, data);
306 CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 3.0, 0.0);
307 packet->SetPointerData(9, data);
308 CreateSimulatedPointerData(data, PointerData::Change::kRemove, 0, 3.0, 0.0);
309 packet->SetPointerData(10, data);
310 CreateSimulatedPointerData(data, PointerData::Change::kRemove, 1, 0.0, 4.0);
311 packet->SetPointerData(11, data);
312 auto converted_packet = converter.Convert(std::move(packet));
313
314 std::vector<PointerData> result;
315 UnpackPointerPacket(result, std::move(converted_packet));
316
317 ASSERT_EQ(result.size(), (size_t)12);
318 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
319 ASSERT_EQ(result[0].device, 0);
320 ASSERT_EQ(result[0].synthesized, 0);
321
322 ASSERT_EQ(result[1].change, PointerData::Change::kDown);
323 ASSERT_EQ(result[1].device, 0);
324 ASSERT_EQ(result[1].pointer_identifier, 1);
325 ASSERT_EQ(result[1].synthesized, 0);
326
327 ASSERT_EQ(result[2].change, PointerData::Change::kAdd);
328 ASSERT_EQ(result[2].device, 1);
329 ASSERT_EQ(result[2].synthesized, 0);
330
331 ASSERT_EQ(result[3].change, PointerData::Change::kDown);
332 ASSERT_EQ(result[3].device, 1);
333 ASSERT_EQ(result[3].pointer_identifier, 2);
334 ASSERT_EQ(result[3].synthesized, 0);
335
336 ASSERT_EQ(result[4].change, PointerData::Change::kUp);
337 ASSERT_EQ(result[4].device, 0);
338 ASSERT_EQ(result[4].pointer_identifier, 1);
339 ASSERT_EQ(result[4].synthesized, 0);
340
341 ASSERT_EQ(result[5].change, PointerData::Change::kDown);
342 ASSERT_EQ(result[5].device, 0);
343 ASSERT_EQ(result[5].pointer_identifier, 3);
344 ASSERT_EQ(result[5].synthesized, 0);
345
346 ASSERT_EQ(result[6].change, PointerData::Change::kMove);
347 ASSERT_EQ(result[6].device, 1);
348 ASSERT_EQ(result[6].pointer_identifier, 2);
349 ASSERT_EQ(result[6].synthesized, 0);
350 ASSERT_EQ(result[6].physical_delta_x, 0.0);
351 ASSERT_EQ(result[6].physical_delta_y, 4.0);
352
353 ASSERT_EQ(result[7].change, PointerData::Change::kMove);
354 ASSERT_EQ(result[7].device, 0);
355 ASSERT_EQ(result[7].pointer_identifier, 3);
356 ASSERT_EQ(result[7].synthesized, 0);
357 ASSERT_EQ(result[7].physical_delta_x, 3.0);
358 ASSERT_EQ(result[7].physical_delta_y, 0.0);
359
360 ASSERT_EQ(result[8].change, PointerData::Change::kUp);
361 ASSERT_EQ(result[8].device, 1);
362 ASSERT_EQ(result[8].pointer_identifier, 2);
363 ASSERT_EQ(result[8].synthesized, 0);
364
365 ASSERT_EQ(result[9].change, PointerData::Change::kUp);
366 ASSERT_EQ(result[9].device, 0);
367 ASSERT_EQ(result[9].pointer_identifier, 3);
368 ASSERT_EQ(result[9].synthesized, 0);
369
370 ASSERT_EQ(result[10].change, PointerData::Change::kRemove);
371 ASSERT_EQ(result[10].device, 0);
372 ASSERT_EQ(result[10].synthesized, 0);
373
374 ASSERT_EQ(result[11].change, PointerData::Change::kRemove);
375 ASSERT_EQ(result[11].device, 1);
376 ASSERT_EQ(result[11].synthesized, 0);
377}
378
379TEST(PointerDataPacketConverterTest, CanSynthesizeAdd) {
380 PointerDataPacketConverter converter;
381 auto packet = std::make_unique<PointerDataPacket>(2);
382 PointerData data;
383 CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 330.0, 450.0);
384 packet->SetPointerData(0, data);
385 CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 0.0, 0.0);
386 packet->SetPointerData(1, data);
387 auto converted_packet = converter.Convert(std::move(packet));
388
389 std::vector<PointerData> result;
390 UnpackPointerPacket(result, std::move(converted_packet));
391
392 ASSERT_EQ(result.size(), (size_t)4);
393 // A add should be synthesized.
394 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
395 ASSERT_EQ(result[0].physical_x, 330.0);
396 ASSERT_EQ(result[0].physical_y, 450.0);
397 ASSERT_EQ(result[0].synthesized, 1);
398
399 ASSERT_EQ(result[1].change, PointerData::Change::kDown);
400 ASSERT_EQ(result[1].physical_x, 330.0);
401 ASSERT_EQ(result[1].physical_y, 450.0);
402 ASSERT_EQ(result[1].synthesized, 0);
403
404 // A move should be synthesized.
405 ASSERT_EQ(result[2].change, PointerData::Change::kMove);
406 ASSERT_EQ(result[2].physical_delta_x, -330.0);
407 ASSERT_EQ(result[2].physical_delta_y, -450.0);
408 ASSERT_EQ(result[2].physical_x, 0.0);
409 ASSERT_EQ(result[2].physical_y, 0.0);
410 ASSERT_EQ(result[2].synthesized, 1);
411
412 ASSERT_EQ(result[3].change, PointerData::Change::kUp);
413 ASSERT_EQ(result[3].physical_x, 0.0);
414 ASSERT_EQ(result[3].physical_y, 0.0);
415 ASSERT_EQ(result[3].synthesized, 0);
416}
417
418TEST(PointerDataPacketConverterTest, CanHandleThreeFingerGesture) {
419 // Regression test https://github.com/flutter/flutter/issues/20517.
420 PointerDataPacketConverter converter;
421 PointerData data;
422 std::vector<PointerData> result;
423 // First finger down.
424 auto packet = std::make_unique<PointerDataPacket>(1);
425 CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0);
426 packet->SetPointerData(0, data);
427 auto converted_packet = converter.Convert(std::move(packet));
428 UnpackPointerPacket(result, std::move(converted_packet));
429 // Second finger down.
430 packet = std::make_unique<PointerDataPacket>(1);
431 CreateSimulatedPointerData(data, PointerData::Change::kDown, 1, 33.0, 44.0);
432 packet->SetPointerData(0, data);
433 converted_packet = converter.Convert(std::move(packet));
434 UnpackPointerPacket(result, std::move(converted_packet));
435 // Triggers three cancels.
436 packet = std::make_unique<PointerDataPacket>(3);
437 CreateSimulatedPointerData(data, PointerData::Change::kCancel, 1, 33.0, 44.0);
438 packet->SetPointerData(0, data);
439 CreateSimulatedPointerData(data, PointerData::Change::kCancel, 0, 0.0, 0.0);
440 packet->SetPointerData(1, data);
441 CreateSimulatedPointerData(data, PointerData::Change::kCancel, 2, 40.0, 50.0);
442 packet->SetPointerData(2, data);
443 converted_packet = converter.Convert(std::move(packet));
444 UnpackPointerPacket(result, std::move(converted_packet));
445
446 ASSERT_EQ(result.size(), (size_t)6);
447 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
448 ASSERT_EQ(result[0].device, 0);
449 ASSERT_EQ(result[0].physical_x, 0.0);
450 ASSERT_EQ(result[0].physical_y, 0.0);
451 ASSERT_EQ(result[0].synthesized, 1);
452
453 ASSERT_EQ(result[1].change, PointerData::Change::kDown);
454 ASSERT_EQ(result[1].device, 0);
455 ASSERT_EQ(result[1].physical_x, 0.0);
456 ASSERT_EQ(result[1].physical_y, 0.0);
457 ASSERT_EQ(result[1].synthesized, 0);
458
459 ASSERT_EQ(result[2].change, PointerData::Change::kAdd);
460 ASSERT_EQ(result[2].device, 1);
461 ASSERT_EQ(result[2].physical_x, 33.0);
462 ASSERT_EQ(result[2].physical_y, 44.0);
463 ASSERT_EQ(result[2].synthesized, 1);
464
465 ASSERT_EQ(result[3].change, PointerData::Change::kDown);
466 ASSERT_EQ(result[3].device, 1);
467 ASSERT_EQ(result[3].physical_x, 33.0);
468 ASSERT_EQ(result[3].physical_y, 44.0);
469 ASSERT_EQ(result[3].synthesized, 0);
470
471 ASSERT_EQ(result[4].change, PointerData::Change::kCancel);
472 ASSERT_EQ(result[4].device, 1);
473 ASSERT_EQ(result[4].physical_x, 33.0);
474 ASSERT_EQ(result[4].physical_y, 44.0);
475 ASSERT_EQ(result[4].synthesized, 0);
476
477 ASSERT_EQ(result[5].change, PointerData::Change::kCancel);
478 ASSERT_EQ(result[5].device, 0);
479 ASSERT_EQ(result[5].physical_x, 0.0);
480 ASSERT_EQ(result[5].physical_y, 0.0);
481 ASSERT_EQ(result[5].synthesized, 0);
482 // Third cancel should be dropped
483}
484
485TEST(PointerDataPacketConverterTest, CanConvetScroll) {
486 PointerDataPacketConverter converter;
487 auto packet = std::make_unique<PointerDataPacket>(5);
488 PointerData data;
489 CreateSimulatedMousePointerData(data, PointerData::Change::kAdd,
490 PointerData::SignalKind::kNone, 0, 0.0, 0.0,
491 0.0, 0.0);
492 packet->SetPointerData(0, data);
493 CreateSimulatedMousePointerData(data, PointerData::Change::kAdd,
494 PointerData::SignalKind::kNone, 1, 0.0, 0.0,
495 0.0, 0.0);
496 packet->SetPointerData(1, data);
497 CreateSimulatedMousePointerData(data, PointerData::Change::kDown,
498 PointerData::SignalKind::kNone, 1, 0.0, 0.0,
499 0.0, 0.0);
500 packet->SetPointerData(2, data);
501 CreateSimulatedMousePointerData(data, PointerData::Change::kHover,
502 PointerData::SignalKind::kScroll, 0, 34.0,
503 34.0, 30.0, 0.0);
504 packet->SetPointerData(3, data);
505 CreateSimulatedMousePointerData(data, PointerData::Change::kHover,
506 PointerData::SignalKind::kScroll, 1, 49.0,
507 49.0, 50.0, 0.0);
508 packet->SetPointerData(4, data);
509 auto converted_packet = converter.Convert(std::move(packet));
510
511 std::vector<PointerData> result;
512 UnpackPointerPacket(result, std::move(converted_packet));
513
514 ASSERT_EQ(result.size(), (size_t)7);
515 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
516 ASSERT_EQ(result[0].signal_kind, PointerData::SignalKind::kNone);
517 ASSERT_EQ(result[0].device, 0);
518 ASSERT_EQ(result[0].physical_x, 0.0);
519 ASSERT_EQ(result[0].physical_y, 0.0);
520 ASSERT_EQ(result[0].synthesized, 0);
521
522 ASSERT_EQ(result[1].change, PointerData::Change::kAdd);
523 ASSERT_EQ(result[1].signal_kind, PointerData::SignalKind::kNone);
524 ASSERT_EQ(result[1].device, 1);
525 ASSERT_EQ(result[1].physical_x, 0.0);
526 ASSERT_EQ(result[1].physical_y, 0.0);
527 ASSERT_EQ(result[1].synthesized, 0);
528
529 ASSERT_EQ(result[2].change, PointerData::Change::kDown);
530 ASSERT_EQ(result[2].signal_kind, PointerData::SignalKind::kNone);
531 ASSERT_EQ(result[2].device, 1);
532 ASSERT_EQ(result[2].physical_x, 0.0);
533 ASSERT_EQ(result[2].physical_y, 0.0);
534 ASSERT_EQ(result[2].synthesized, 0);
535
536 // Converter will synthesize a hover to position.
537 ASSERT_EQ(result[3].change, PointerData::Change::kHover);
538 ASSERT_EQ(result[3].signal_kind, PointerData::SignalKind::kNone);
539 ASSERT_EQ(result[3].device, 0);
540 ASSERT_EQ(result[3].physical_x, 34.0);
541 ASSERT_EQ(result[3].physical_y, 34.0);
542 ASSERT_EQ(result[3].physical_delta_x, 34.0);
543 ASSERT_EQ(result[3].physical_delta_y, 34.0);
544 ASSERT_EQ(result[3].synthesized, 1);
545
546 ASSERT_EQ(result[4].change, PointerData::Change::kHover);
547 ASSERT_EQ(result[4].signal_kind, PointerData::SignalKind::kScroll);
548 ASSERT_EQ(result[4].device, 0);
549 ASSERT_EQ(result[4].physical_x, 34.0);
550 ASSERT_EQ(result[4].physical_y, 34.0);
551 ASSERT_EQ(result[4].scroll_delta_x, 30.0);
552 ASSERT_EQ(result[4].scroll_delta_y, 0.0);
553
554 // Converter will synthesize a move to position.
555 ASSERT_EQ(result[5].change, PointerData::Change::kMove);
556 ASSERT_EQ(result[5].signal_kind, PointerData::SignalKind::kNone);
557 ASSERT_EQ(result[5].device, 1);
558 ASSERT_EQ(result[5].physical_x, 49.0);
559 ASSERT_EQ(result[5].physical_y, 49.0);
560 ASSERT_EQ(result[5].physical_delta_x, 49.0);
561 ASSERT_EQ(result[5].physical_delta_y, 49.0);
562 ASSERT_EQ(result[5].synthesized, 1);
563
564 ASSERT_EQ(result[6].change, PointerData::Change::kHover);
565 ASSERT_EQ(result[6].signal_kind, PointerData::SignalKind::kScroll);
566 ASSERT_EQ(result[6].device, 1);
567 ASSERT_EQ(result[6].physical_x, 49.0);
568 ASSERT_EQ(result[6].physical_y, 49.0);
569 ASSERT_EQ(result[6].scroll_delta_x, 50.0);
570 ASSERT_EQ(result[6].scroll_delta_y, 0.0);
571}
572
573} // namespace testing
574} // namespace flutter
575