Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
pointer_data_packet_converter_unittests.cc
Go to the documentation of this file.
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
7#include <cstring>
8
9#include "gtest/gtest.h"
10
11namespace flutter {
12namespace testing {
13
16 int64_t device,
17 double dx,
18 double dy,
19 int64_t buttons) {
20 data.time_stamp = 0;
21 data.change = change;
24 data.device = device;
25 data.pointer_identifier = 0;
26 data.physical_x = dx;
27 data.physical_y = dy;
28 data.physical_delta_x = 0.0;
29 data.physical_delta_y = 0.0;
30 data.buttons = buttons;
31 data.obscured = 0;
32 data.synthesized = 0;
33 data.pressure = 0.0;
34 data.pressure_min = 0.0;
35 data.pressure_max = 0.0;
36 data.distance = 0.0;
37 data.distance_max = 0.0;
38 data.size = 0.0;
39 data.radius_major = 0.0;
40 data.radius_minor = 0.0;
41 data.radius_min = 0.0;
42 data.radius_max = 0.0;
43 data.orientation = 0.0;
44 data.tilt = 0.0;
45 data.platformData = 0;
46 data.scroll_delta_x = 0.0;
47 data.scroll_delta_y = 0.0;
48 data.view_id = 0;
49}
50
53 PointerData::SignalKind signal_kind,
54 int64_t device,
55 double dx,
56 double dy,
57 double scroll_delta_x,
58 double scroll_delta_y,
59 int64_t buttons) {
60 data.time_stamp = 0;
61 data.change = change;
63 data.signal_kind = signal_kind;
64 data.device = device;
65 data.pointer_identifier = 0;
66 data.physical_x = dx;
67 data.physical_y = dy;
68 data.physical_delta_x = 0.0;
69 data.physical_delta_y = 0.0;
70 data.buttons = buttons;
71 data.obscured = 0;
72 data.synthesized = 0;
73 data.pressure = 0.0;
74 data.pressure_min = 0.0;
75 data.pressure_max = 0.0;
76 data.distance = 0.0;
77 data.distance_max = 0.0;
78 data.size = 0.0;
79 data.radius_major = 0.0;
80 data.radius_minor = 0.0;
81 data.radius_min = 0.0;
82 data.radius_max = 0.0;
83 data.orientation = 0.0;
84 data.tilt = 0.0;
85 data.platformData = 0;
86 data.scroll_delta_x = scroll_delta_x;
87 data.scroll_delta_y = scroll_delta_y;
88 data.view_id = 0;
89}
90
93 int64_t device,
94 double dx,
95 double dy,
96 double pan_x,
97 double pan_y,
98 double scale,
99 double rotation) {
100 data.time_stamp = 0;
101 data.change = change;
104 data.device = device;
105 data.pointer_identifier = 0;
106 data.physical_x = dx;
107 data.physical_y = dy;
108 data.physical_delta_x = 0.0;
109 data.physical_delta_y = 0.0;
110 data.buttons = 0;
111 data.obscured = 0;
112 data.synthesized = 0;
113 data.pressure = 0.0;
114 data.pressure_min = 0.0;
115 data.pressure_max = 0.0;
116 data.distance = 0.0;
117 data.distance_max = 0.0;
118 data.size = 0.0;
119 data.radius_major = 0.0;
120 data.radius_minor = 0.0;
121 data.radius_min = 0.0;
122 data.radius_max = 0.0;
123 data.orientation = 0.0;
124 data.tilt = 0.0;
125 data.platformData = 0;
126 data.scroll_delta_x = 0.0;
127 data.scroll_delta_y = 0.0;
128 data.pan_x = pan_x;
129 data.pan_y = pan_y;
130 data.pan_delta_x = 0.0;
131 data.pan_delta_y = 0.0;
132 data.scale = scale;
133 data.rotation = rotation;
134 data.view_id = 0;
135}
136
137void UnpackPointerPacket(std::vector<PointerData>& output, // NOLINT
138 std::unique_ptr<PointerDataPacket> packet) {
139 for (size_t i = 0; i < packet->GetLength(); i++) {
140 PointerData pointer_data = packet->GetPointerData(i);
141 output.push_back(pointer_data);
142 }
143 packet.reset();
144}
145
146TEST(PointerDataPacketConverterTest, CanConvertPointerDataPacket) {
148 auto packet = std::make_unique<PointerDataPacket>(6);
151 packet->SetPointerData(0, data);
153 packet->SetPointerData(1, data);
155 packet->SetPointerData(2, data);
157 packet->SetPointerData(3, data);
159 packet->SetPointerData(4, data);
161 0);
162 packet->SetPointerData(5, data);
163 auto converted_packet = converter.Convert(std::move(packet));
164
165 std::vector<PointerData> result;
166 UnpackPointerPacket(result, std::move(converted_packet));
167
168 ASSERT_EQ(result.size(), (size_t)6);
169 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
170 ASSERT_EQ(result[0].synthesized, 0);
171
172 ASSERT_EQ(result[1].change, PointerData::Change::kHover);
173 ASSERT_EQ(result[1].synthesized, 0);
174 ASSERT_EQ(result[1].physical_delta_x, 3.0);
175 ASSERT_EQ(result[1].physical_delta_y, 0.0);
176
177 ASSERT_EQ(result[2].change, PointerData::Change::kDown);
178 ASSERT_EQ(result[2].pointer_identifier, 1);
179 ASSERT_EQ(result[2].synthesized, 0);
180
181 ASSERT_EQ(result[3].change, PointerData::Change::kMove);
182 ASSERT_EQ(result[3].pointer_identifier, 1);
183 ASSERT_EQ(result[3].synthesized, 0);
184 ASSERT_EQ(result[3].physical_delta_x, 0.0);
185 ASSERT_EQ(result[3].physical_delta_y, 4.0);
186
187 ASSERT_EQ(result[4].change, PointerData::Change::kUp);
188 ASSERT_EQ(result[4].pointer_identifier, 1);
189 ASSERT_EQ(result[4].synthesized, 0);
190
191 ASSERT_EQ(result[5].change, PointerData::Change::kRemove);
192 ASSERT_EQ(result[5].synthesized, 0);
193}
194
195TEST(PointerDataPacketConverterTest, CanSynthesizeDownAndUp) {
197 auto packet = std::make_unique<PointerDataPacket>(4);
200 packet->SetPointerData(0, data);
202 packet->SetPointerData(1, data);
204 packet->SetPointerData(2, data);
206 0);
207 packet->SetPointerData(3, data);
208 auto converted_packet = converter.Convert(std::move(packet));
209
210 std::vector<PointerData> result;
211 UnpackPointerPacket(result, std::move(converted_packet));
212
213 ASSERT_EQ(result.size(), (size_t)6);
214 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
215 ASSERT_EQ(result[0].synthesized, 0);
216
217 // A hover should be synthesized.
218 ASSERT_EQ(result[1].change, PointerData::Change::kHover);
219 ASSERT_EQ(result[1].synthesized, 1);
220 ASSERT_EQ(result[1].physical_delta_x, 3.0);
221 ASSERT_EQ(result[1].physical_delta_y, 0.0);
222 ASSERT_EQ(result[1].buttons, 0);
223
224 ASSERT_EQ(result[2].change, PointerData::Change::kDown);
225 ASSERT_EQ(result[2].pointer_identifier, 1);
226 ASSERT_EQ(result[2].synthesized, 0);
227 ASSERT_EQ(result[2].buttons, 1);
228
229 // A move should be synthesized.
230 ASSERT_EQ(result[3].change, PointerData::Change::kMove);
231 ASSERT_EQ(result[3].pointer_identifier, 1);
232 ASSERT_EQ(result[3].synthesized, 1);
233 ASSERT_EQ(result[3].physical_delta_x, 0.0);
234 ASSERT_EQ(result[3].physical_delta_y, 4.0);
235 ASSERT_EQ(result[3].buttons, 1);
236
237 ASSERT_EQ(result[4].change, PointerData::Change::kUp);
238 ASSERT_EQ(result[4].pointer_identifier, 1);
239 ASSERT_EQ(result[4].synthesized, 0);
240 ASSERT_EQ(result[4].buttons, 0);
241
242 ASSERT_EQ(result[5].change, PointerData::Change::kRemove);
243 ASSERT_EQ(result[5].synthesized, 0);
244}
245
246TEST(PointerDataPacketConverterTest, CanUpdatePointerIdentifier) {
248 auto packet = std::make_unique<PointerDataPacket>(7);
251 packet->SetPointerData(0, data);
253 packet->SetPointerData(1, data);
255 packet->SetPointerData(2, data);
257 packet->SetPointerData(3, data);
259 packet->SetPointerData(4, data);
261 packet->SetPointerData(5, data);
263 0);
264 packet->SetPointerData(6, data);
265 auto converted_packet = converter.Convert(std::move(packet));
266
267 std::vector<PointerData> result;
268 UnpackPointerPacket(result, std::move(converted_packet));
269
270 ASSERT_EQ(result.size(), (size_t)7);
271 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
272 ASSERT_EQ(result[0].synthesized, 0);
273
274 ASSERT_EQ(result[1].change, PointerData::Change::kDown);
275 ASSERT_EQ(result[1].pointer_identifier, 1);
276 ASSERT_EQ(result[1].synthesized, 0);
277
278 ASSERT_EQ(result[2].change, PointerData::Change::kUp);
279 ASSERT_EQ(result[2].pointer_identifier, 1);
280 ASSERT_EQ(result[2].synthesized, 0);
281
282 // Pointer count increase to 2.
283 ASSERT_EQ(result[3].change, PointerData::Change::kDown);
284 ASSERT_EQ(result[3].pointer_identifier, 2);
285 ASSERT_EQ(result[3].synthesized, 0);
286
287 ASSERT_EQ(result[4].change, PointerData::Change::kMove);
288 ASSERT_EQ(result[4].pointer_identifier, 2);
289 ASSERT_EQ(result[4].synthesized, 0);
290 ASSERT_EQ(result[4].physical_delta_x, 3.0);
291 ASSERT_EQ(result[4].physical_delta_y, 0.0);
292
293 ASSERT_EQ(result[5].change, PointerData::Change::kUp);
294 ASSERT_EQ(result[5].pointer_identifier, 2);
295 ASSERT_EQ(result[5].synthesized, 0);
296
297 ASSERT_EQ(result[6].change, PointerData::Change::kRemove);
298 ASSERT_EQ(result[6].synthesized, 0);
299}
300
301TEST(PointerDataPacketConverterTest, AlwaysForwardMoveEvent) {
303 auto packet = std::make_unique<PointerDataPacket>(4);
306 packet->SetPointerData(0, data);
308 packet->SetPointerData(1, data);
309 // Creates a move event without a location change.
311 packet->SetPointerData(2, data);
313 packet->SetPointerData(3, data);
314
315 auto converted_packet = converter.Convert(std::move(packet));
316
317 std::vector<PointerData> result;
318 UnpackPointerPacket(result, std::move(converted_packet));
319
320 ASSERT_EQ(result.size(), (size_t)4);
321 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
322 ASSERT_EQ(result[0].synthesized, 0);
323
324 ASSERT_EQ(result[1].change, PointerData::Change::kDown);
325 ASSERT_EQ(result[1].pointer_identifier, 1);
326 ASSERT_EQ(result[1].synthesized, 0);
327
328 // Does not filter out the move event.
329 ASSERT_EQ(result[2].change, PointerData::Change::kMove);
330 ASSERT_EQ(result[2].pointer_identifier, 1);
331 ASSERT_EQ(result[2].synthesized, 0);
332
333 ASSERT_EQ(result[3].change, PointerData::Change::kUp);
334 ASSERT_EQ(result[3].pointer_identifier, 1);
335 ASSERT_EQ(result[3].synthesized, 0);
336}
337
338TEST(PointerDataPacketConverterTest, CanWorkWithDifferentDevices) {
340 auto packet = std::make_unique<PointerDataPacket>(12);
343 packet->SetPointerData(0, data);
345 packet->SetPointerData(1, data);
347 packet->SetPointerData(2, data);
349 packet->SetPointerData(3, data);
351 packet->SetPointerData(4, data);
353 packet->SetPointerData(5, data);
355 packet->SetPointerData(6, data);
357 packet->SetPointerData(7, data);
359 packet->SetPointerData(8, data);
361 packet->SetPointerData(9, data);
363 0);
364 packet->SetPointerData(10, data);
366 0);
367 packet->SetPointerData(11, data);
368 auto converted_packet = converter.Convert(std::move(packet));
369
370 std::vector<PointerData> result;
371 UnpackPointerPacket(result, std::move(converted_packet));
372
373 ASSERT_EQ(result.size(), (size_t)12);
374 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
375 ASSERT_EQ(result[0].device, 0);
376 ASSERT_EQ(result[0].synthesized, 0);
377
378 ASSERT_EQ(result[1].change, PointerData::Change::kDown);
379 ASSERT_EQ(result[1].device, 0);
380 ASSERT_EQ(result[1].pointer_identifier, 1);
381 ASSERT_EQ(result[1].synthesized, 0);
382
383 ASSERT_EQ(result[2].change, PointerData::Change::kAdd);
384 ASSERT_EQ(result[2].device, 1);
385 ASSERT_EQ(result[2].synthesized, 0);
386
387 ASSERT_EQ(result[3].change, PointerData::Change::kDown);
388 ASSERT_EQ(result[3].device, 1);
389 ASSERT_EQ(result[3].pointer_identifier, 2);
390 ASSERT_EQ(result[3].synthesized, 0);
391
392 ASSERT_EQ(result[4].change, PointerData::Change::kUp);
393 ASSERT_EQ(result[4].device, 0);
394 ASSERT_EQ(result[4].pointer_identifier, 1);
395 ASSERT_EQ(result[4].synthesized, 0);
396
397 ASSERT_EQ(result[5].change, PointerData::Change::kDown);
398 ASSERT_EQ(result[5].device, 0);
399 ASSERT_EQ(result[5].pointer_identifier, 3);
400 ASSERT_EQ(result[5].synthesized, 0);
401
402 ASSERT_EQ(result[6].change, PointerData::Change::kMove);
403 ASSERT_EQ(result[6].device, 1);
404 ASSERT_EQ(result[6].pointer_identifier, 2);
405 ASSERT_EQ(result[6].synthesized, 0);
406 ASSERT_EQ(result[6].physical_delta_x, 0.0);
407 ASSERT_EQ(result[6].physical_delta_y, 4.0);
408
409 ASSERT_EQ(result[7].change, PointerData::Change::kMove);
410 ASSERT_EQ(result[7].device, 0);
411 ASSERT_EQ(result[7].pointer_identifier, 3);
412 ASSERT_EQ(result[7].synthesized, 0);
413 ASSERT_EQ(result[7].physical_delta_x, 3.0);
414 ASSERT_EQ(result[7].physical_delta_y, 0.0);
415
416 ASSERT_EQ(result[8].change, PointerData::Change::kUp);
417 ASSERT_EQ(result[8].device, 1);
418 ASSERT_EQ(result[8].pointer_identifier, 2);
419 ASSERT_EQ(result[8].synthesized, 0);
420
421 ASSERT_EQ(result[9].change, PointerData::Change::kUp);
422 ASSERT_EQ(result[9].device, 0);
423 ASSERT_EQ(result[9].pointer_identifier, 3);
424 ASSERT_EQ(result[9].synthesized, 0);
425
426 ASSERT_EQ(result[10].change, PointerData::Change::kRemove);
427 ASSERT_EQ(result[10].device, 0);
428 ASSERT_EQ(result[10].synthesized, 0);
429
430 ASSERT_EQ(result[11].change, PointerData::Change::kRemove);
431 ASSERT_EQ(result[11].device, 1);
432 ASSERT_EQ(result[11].synthesized, 0);
433}
434
435TEST(PointerDataPacketConverterTest, CanSynthesizeAdd) {
437 auto packet = std::make_unique<PointerDataPacket>(2);
440 1);
441 packet->SetPointerData(0, data);
443 packet->SetPointerData(1, data);
444 auto converted_packet = converter.Convert(std::move(packet));
445
446 std::vector<PointerData> result;
447 UnpackPointerPacket(result, std::move(converted_packet));
448
449 ASSERT_EQ(result.size(), (size_t)4);
450 // A add should be synthesized.
451 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
452 ASSERT_EQ(result[0].physical_x, 330.0);
453 ASSERT_EQ(result[0].physical_y, 450.0);
454 ASSERT_EQ(result[0].synthesized, 1);
455 ASSERT_EQ(result[0].buttons, 0);
456
457 ASSERT_EQ(result[1].change, PointerData::Change::kDown);
458 ASSERT_EQ(result[1].physical_x, 330.0);
459 ASSERT_EQ(result[1].physical_y, 450.0);
460 ASSERT_EQ(result[1].synthesized, 0);
461 ASSERT_EQ(result[1].buttons, 1);
462
463 // A move should be synthesized.
464 ASSERT_EQ(result[2].change, PointerData::Change::kMove);
465 ASSERT_EQ(result[2].physical_delta_x, -330.0);
466 ASSERT_EQ(result[2].physical_delta_y, -450.0);
467 ASSERT_EQ(result[2].physical_x, 0.0);
468 ASSERT_EQ(result[2].physical_y, 0.0);
469 ASSERT_EQ(result[2].synthesized, 1);
470 ASSERT_EQ(result[2].buttons, 1);
471
472 ASSERT_EQ(result[3].change, PointerData::Change::kUp);
473 ASSERT_EQ(result[3].physical_x, 0.0);
474 ASSERT_EQ(result[3].physical_y, 0.0);
475 ASSERT_EQ(result[3].synthesized, 0);
476 ASSERT_EQ(result[3].buttons, 0);
477}
478
479TEST(PointerDataPacketConverterTest, CanHandleThreeFingerGesture) {
480 // Regression test https://github.com/flutter/flutter/issues/20517.
483 std::vector<PointerData> result;
484 // First finger down.
485 auto packet = std::make_unique<PointerDataPacket>(1);
487 packet->SetPointerData(0, data);
488 auto converted_packet = converter.Convert(std::move(packet));
489 UnpackPointerPacket(result, std::move(converted_packet));
490 // Second finger down.
491 packet = std::make_unique<PointerDataPacket>(1);
493 1);
494 packet->SetPointerData(0, data);
495 converted_packet = converter.Convert(std::move(packet));
496 UnpackPointerPacket(result, std::move(converted_packet));
497 // Triggers three cancels.
498 packet = std::make_unique<PointerDataPacket>(3);
500 0);
501 packet->SetPointerData(0, data);
503 0);
504 packet->SetPointerData(1, data);
506 0);
507 packet->SetPointerData(2, data);
508 converted_packet = converter.Convert(std::move(packet));
509 UnpackPointerPacket(result, std::move(converted_packet));
510
511 ASSERT_EQ(result.size(), (size_t)6);
512 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
513 ASSERT_EQ(result[0].device, 0);
514 ASSERT_EQ(result[0].physical_x, 0.0);
515 ASSERT_EQ(result[0].physical_y, 0.0);
516 ASSERT_EQ(result[0].synthesized, 1);
517 ASSERT_EQ(result[0].buttons, 0);
518
519 ASSERT_EQ(result[1].change, PointerData::Change::kDown);
520 ASSERT_EQ(result[1].device, 0);
521 ASSERT_EQ(result[1].physical_x, 0.0);
522 ASSERT_EQ(result[1].physical_y, 0.0);
523 ASSERT_EQ(result[1].synthesized, 0);
524 ASSERT_EQ(result[1].buttons, 1);
525
526 ASSERT_EQ(result[2].change, PointerData::Change::kAdd);
527 ASSERT_EQ(result[2].device, 1);
528 ASSERT_EQ(result[2].physical_x, 33.0);
529 ASSERT_EQ(result[2].physical_y, 44.0);
530 ASSERT_EQ(result[2].synthesized, 1);
531 ASSERT_EQ(result[2].buttons, 0);
532
533 ASSERT_EQ(result[3].change, PointerData::Change::kDown);
534 ASSERT_EQ(result[3].device, 1);
535 ASSERT_EQ(result[3].physical_x, 33.0);
536 ASSERT_EQ(result[3].physical_y, 44.0);
537 ASSERT_EQ(result[3].synthesized, 0);
538 ASSERT_EQ(result[3].buttons, 1);
539
540 ASSERT_EQ(result[4].change, PointerData::Change::kCancel);
541 ASSERT_EQ(result[4].device, 1);
542 ASSERT_EQ(result[4].physical_x, 33.0);
543 ASSERT_EQ(result[4].physical_y, 44.0);
544 ASSERT_EQ(result[4].synthesized, 0);
545
546 ASSERT_EQ(result[5].change, PointerData::Change::kCancel);
547 ASSERT_EQ(result[5].device, 0);
548 ASSERT_EQ(result[5].physical_x, 0.0);
549 ASSERT_EQ(result[5].physical_y, 0.0);
550 ASSERT_EQ(result[5].synthesized, 0);
551 // Third cancel should be dropped
552}
553
554TEST(PointerDataPacketConverterTest, CanConvertPointerSignals) {
555 PointerData::SignalKind signal_kinds[] = {
559 };
560 for (const PointerData::SignalKind& kind : signal_kinds) {
562 auto packet = std::make_unique<PointerDataPacket>(6);
566 0.0, 0.0, 0);
567 packet->SetPointerData(0, data);
570 0.0, 0.0, 0);
571 packet->SetPointerData(1, data);
574 0.0, 0.0, 1);
575 packet->SetPointerData(2, data);
577 34.0, 34.0, 30.0, 0.0, 0);
578 packet->SetPointerData(3, data);
580 49.0, 49.0, 50.0, 0.0, 0);
581 packet->SetPointerData(4, data);
583 10.0, 20.0, 30.0, 40.0, 0);
584 packet->SetPointerData(5, data);
585 auto converted_packet = converter.Convert(std::move(packet));
586
587 std::vector<PointerData> result;
588 UnpackPointerPacket(result, std::move(converted_packet));
589
590 ASSERT_EQ(result.size(), (size_t)9);
591 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
592 ASSERT_EQ(result[0].signal_kind, PointerData::SignalKind::kNone);
593 ASSERT_EQ(result[0].device, 0);
594 ASSERT_EQ(result[0].physical_x, 0.0);
595 ASSERT_EQ(result[0].physical_y, 0.0);
596 ASSERT_EQ(result[0].synthesized, 0);
597
598 ASSERT_EQ(result[1].change, PointerData::Change::kAdd);
599 ASSERT_EQ(result[1].signal_kind, PointerData::SignalKind::kNone);
600 ASSERT_EQ(result[1].device, 1);
601 ASSERT_EQ(result[1].physical_x, 0.0);
602 ASSERT_EQ(result[1].physical_y, 0.0);
603 ASSERT_EQ(result[1].synthesized, 0);
604
605 ASSERT_EQ(result[2].change, PointerData::Change::kDown);
606 ASSERT_EQ(result[2].signal_kind, PointerData::SignalKind::kNone);
607 ASSERT_EQ(result[2].device, 1);
608 ASSERT_EQ(result[2].physical_x, 0.0);
609 ASSERT_EQ(result[2].physical_y, 0.0);
610 ASSERT_EQ(result[2].synthesized, 0);
611
612 // Converter will synthesize a hover to position for device 0.
613 ASSERT_EQ(result[3].change, PointerData::Change::kHover);
614 ASSERT_EQ(result[3].signal_kind, PointerData::SignalKind::kNone);
615 ASSERT_EQ(result[3].device, 0);
616 ASSERT_EQ(result[3].physical_x, 34.0);
617 ASSERT_EQ(result[3].physical_y, 34.0);
618 ASSERT_EQ(result[3].physical_delta_x, 34.0);
619 ASSERT_EQ(result[3].physical_delta_y, 34.0);
620 ASSERT_EQ(result[3].buttons, 0);
621 ASSERT_EQ(result[3].synthesized, 1);
622
623 ASSERT_EQ(result[4].change, PointerData::Change::kHover);
624 ASSERT_EQ(result[4].signal_kind, kind);
625 ASSERT_EQ(result[4].device, 0);
626 ASSERT_EQ(result[4].physical_x, 34.0);
627 ASSERT_EQ(result[4].physical_y, 34.0);
628 ASSERT_EQ(result[4].scroll_delta_x, 30.0);
629 ASSERT_EQ(result[4].scroll_delta_y, 0.0);
630
631 // Converter will synthesize a move to position for device 1.
632 ASSERT_EQ(result[5].change, PointerData::Change::kMove);
633 ASSERT_EQ(result[5].signal_kind, PointerData::SignalKind::kNone);
634 ASSERT_EQ(result[5].device, 1);
635 ASSERT_EQ(result[5].physical_x, 49.0);
636 ASSERT_EQ(result[5].physical_y, 49.0);
637 ASSERT_EQ(result[5].physical_delta_x, 49.0);
638 ASSERT_EQ(result[5].physical_delta_y, 49.0);
639 ASSERT_EQ(result[5].buttons, 1);
640 ASSERT_EQ(result[5].synthesized, 1);
641
642 ASSERT_EQ(result[6].change, PointerData::Change::kHover);
643 ASSERT_EQ(result[6].signal_kind, kind);
644 ASSERT_EQ(result[6].device, 1);
645 ASSERT_EQ(result[6].physical_x, 49.0);
646 ASSERT_EQ(result[6].physical_y, 49.0);
647 ASSERT_EQ(result[6].scroll_delta_x, 50.0);
648 ASSERT_EQ(result[6].scroll_delta_y, 0.0);
649
650 // Converter will synthesize an add for device 2.
651 ASSERT_EQ(result[7].change, PointerData::Change::kAdd);
652 ASSERT_EQ(result[7].signal_kind, PointerData::SignalKind::kNone);
653 ASSERT_EQ(result[7].device, 2);
654 ASSERT_EQ(result[7].physical_x, 10.0);
655 ASSERT_EQ(result[7].physical_y, 20.0);
656 ASSERT_EQ(result[7].synthesized, 1);
657
658 ASSERT_EQ(result[8].change, PointerData::Change::kHover);
659 ASSERT_EQ(result[8].signal_kind, kind);
660 ASSERT_EQ(result[8].device, 2);
661 ASSERT_EQ(result[8].physical_x, 10.0);
662 ASSERT_EQ(result[8].physical_y, 20.0);
663 ASSERT_EQ(result[8].scroll_delta_x, 30.0);
664 ASSERT_EQ(result[8].scroll_delta_y, 40.0);
665 }
666}
667
668TEST(PointerDataPacketConverterTest, CanConvertTrackpadGesture) {
670 auto packet = std::make_unique<PointerDataPacket>(3);
673 0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
674 packet->SetPointerData(0, data);
676 0, 0.0, 0.0, 3.0, 4.0, 1.0, 0.0);
677 packet->SetPointerData(1, data);
679 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
680 packet->SetPointerData(2, data);
681 auto converted_packet = converter.Convert(std::move(packet));
682
683 std::vector<PointerData> result;
684 UnpackPointerPacket(result, std::move(converted_packet));
685
686 ASSERT_EQ(result.size(), (size_t)4);
687 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
688 ASSERT_EQ(result[0].device, 0);
689 ASSERT_EQ(result[0].synthesized, 1);
690
691 ASSERT_EQ(result[1].change, PointerData::Change::kPanZoomStart);
692 ASSERT_EQ(result[1].signal_kind, PointerData::SignalKind::kNone);
693 ASSERT_EQ(result[1].device, 0);
694 ASSERT_EQ(result[1].physical_x, 0.0);
695 ASSERT_EQ(result[1].physical_y, 0.0);
696 ASSERT_EQ(result[1].synthesized, 0);
697
698 ASSERT_EQ(result[2].change, PointerData::Change::kPanZoomUpdate);
699 ASSERT_EQ(result[2].signal_kind, PointerData::SignalKind::kNone);
700 ASSERT_EQ(result[2].device, 0);
701 ASSERT_EQ(result[2].physical_x, 0.0);
702 ASSERT_EQ(result[2].physical_y, 0.0);
703 ASSERT_EQ(result[2].pan_x, 3.0);
704 ASSERT_EQ(result[2].pan_y, 4.0);
705 ASSERT_EQ(result[2].pan_delta_x, 3.0);
706 ASSERT_EQ(result[2].pan_delta_y, 4.0);
707 ASSERT_EQ(result[2].scale, 1.0);
708 ASSERT_EQ(result[2].rotation, 0.0);
709 ASSERT_EQ(result[2].synthesized, 0);
710
711 ASSERT_EQ(result[3].change, PointerData::Change::kPanZoomEnd);
712 ASSERT_EQ(result[3].signal_kind, PointerData::SignalKind::kNone);
713 ASSERT_EQ(result[3].device, 0);
714 ASSERT_EQ(result[3].physical_x, 0.0);
715 ASSERT_EQ(result[3].physical_y, 0.0);
716 ASSERT_EQ(result[3].synthesized, 0);
717}
718
719TEST(PointerDataPacketConverterTest, CanConvertViewId) {
721 auto packet = std::make_unique<PointerDataPacket>(2);
724 data.view_id = 100;
725 packet->SetPointerData(0, data);
727 data.view_id = 200;
728 packet->SetPointerData(1, data);
729 auto converted_packet = converter.Convert(std::move(packet));
730
731 std::vector<PointerData> result;
732 UnpackPointerPacket(result, std::move(converted_packet));
733
734 ASSERT_EQ(result.size(), (size_t)2);
735 ASSERT_EQ(result[0].view_id, 100);
736 ASSERT_EQ(result[1].view_id, 200);
737}
738
739} // namespace testing
740} // namespace flutter
#define TEST(S, s, D, expected)
VkDevice device
Definition main.cc:53
GAsyncResult * result
void CreateSimulatedPointerData(PointerData &data, PointerData::Change change, int64_t device, double dx, double dy, int64_t buttons)
void CreateSimulatedMousePointerData(PointerData &data, PointerData::Change change, PointerData::SignalKind signal_kind, int64_t device, double dx, double dy, double scroll_delta_x, double scroll_delta_y, int64_t buttons)
void CreateSimulatedTrackpadGestureData(PointerData &data, PointerData::Change change, int64_t device, double dx, double dy, double pan_x, double pan_y, double scale, double rotation)
void UnpackPointerPacket(std::vector< PointerData > &output, std::unique_ptr< PointerDataPacket > packet)
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
Definition switches.h:41
const Scalar scale