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
6
7#include <cstring>
8#include <unordered_set>
9
10#include "gtest/gtest.h"
11
12namespace flutter {
13namespace testing {
14
15namespace {
16
17constexpr int64_t kImplicitViewId = 0;
18
19}
20
22 public:
23 // |PointerDataPacketConverter::Delegate|
24 bool ViewExists(int64_t view_id) const override {
25 return views_.count(view_id) != 0;
26 }
27
28 void AddView(int64_t view_id) { views_.insert(view_id); }
29
30 void RemoveView(int64_t view_id) { views_.erase(view_id); }
31
32 private:
33 std::unordered_set<int64_t> views_;
34};
35
38 int64_t device,
39 double dx,
40 double dy,
41 int64_t buttons) {
42 data.time_stamp = 0;
43 data.change = change;
46 data.device = device;
47 data.pointer_identifier = 0;
48 data.physical_x = dx;
49 data.physical_y = dy;
50 data.physical_delta_x = 0.0;
51 data.physical_delta_y = 0.0;
52 data.buttons = buttons;
53 data.obscured = 0;
54 data.synthesized = 0;
55 data.pressure = 0.0;
56 data.pressure_min = 0.0;
57 data.pressure_max = 0.0;
58 data.distance = 0.0;
59 data.distance_max = 0.0;
60 data.size = 0.0;
61 data.radius_major = 0.0;
62 data.radius_minor = 0.0;
63 data.radius_min = 0.0;
64 data.radius_max = 0.0;
65 data.orientation = 0.0;
66 data.tilt = 0.0;
67 data.platformData = 0;
68 data.scroll_delta_x = 0.0;
69 data.scroll_delta_y = 0.0;
70 data.view_id = kImplicitViewId;
71}
72
75 PointerData::SignalKind signal_kind,
76 int64_t device,
77 double dx,
78 double dy,
79 double scroll_delta_x,
80 double scroll_delta_y,
81 int64_t buttons) {
82 data.time_stamp = 0;
83 data.change = change;
85 data.signal_kind = signal_kind;
86 data.device = device;
87 data.pointer_identifier = 0;
88 data.physical_x = dx;
89 data.physical_y = dy;
90 data.physical_delta_x = 0.0;
91 data.physical_delta_y = 0.0;
92 data.buttons = buttons;
93 data.obscured = 0;
94 data.synthesized = 0;
95 data.pressure = 0.0;
96 data.pressure_min = 0.0;
97 data.pressure_max = 0.0;
98 data.distance = 0.0;
99 data.distance_max = 0.0;
100 data.size = 0.0;
101 data.radius_major = 0.0;
102 data.radius_minor = 0.0;
103 data.radius_min = 0.0;
104 data.radius_max = 0.0;
105 data.orientation = 0.0;
106 data.tilt = 0.0;
107 data.platformData = 0;
108 data.scroll_delta_x = scroll_delta_x;
109 data.scroll_delta_y = scroll_delta_y;
110 data.view_id = kImplicitViewId;
111}
112
114 PointerData::Change change,
115 int64_t device,
116 double dx,
117 double dy,
118 double pan_x,
119 double pan_y,
120 double scale,
121 double rotation) {
122 data.time_stamp = 0;
123 data.change = change;
126 data.device = device;
127 data.pointer_identifier = 0;
128 data.physical_x = dx;
129 data.physical_y = dy;
130 data.physical_delta_x = 0.0;
131 data.physical_delta_y = 0.0;
132 data.buttons = 0;
133 data.obscured = 0;
134 data.synthesized = 0;
135 data.pressure = 0.0;
136 data.pressure_min = 0.0;
137 data.pressure_max = 0.0;
138 data.distance = 0.0;
139 data.distance_max = 0.0;
140 data.size = 0.0;
141 data.radius_major = 0.0;
142 data.radius_minor = 0.0;
143 data.radius_min = 0.0;
144 data.radius_max = 0.0;
145 data.orientation = 0.0;
146 data.tilt = 0.0;
147 data.platformData = 0;
148 data.scroll_delta_x = 0.0;
149 data.scroll_delta_y = 0.0;
150 data.pan_x = pan_x;
151 data.pan_y = pan_y;
152 data.pan_delta_x = 0.0;
153 data.pan_delta_y = 0.0;
154 data.scale = scale;
155 data.rotation = rotation;
156 data.view_id = 0;
157}
158
159void UnpackPointerPacket(std::vector<PointerData>& output, // NOLINT
160 std::unique_ptr<PointerDataPacket> packet) {
161 for (size_t i = 0; i < packet->GetLength(); i++) {
162 PointerData pointer_data = packet->GetPointerData(i);
163 output.push_back(pointer_data);
164 }
165 packet.reset();
166}
167
168TEST(PointerDataPacketConverterTest, CanConvertPointerDataPacket) {
169 TestDelegate delegate;
170 delegate.AddView(kImplicitViewId);
171 PointerDataPacketConverter converter(delegate);
172 auto packet = std::make_unique<PointerDataPacket>(6);
175 packet->SetPointerData(0, data);
177 packet->SetPointerData(1, data);
179 packet->SetPointerData(2, data);
181 packet->SetPointerData(3, data);
183 packet->SetPointerData(4, data);
185 0);
186 packet->SetPointerData(5, data);
187 auto converted_packet = converter.Convert(*packet);
188
189 std::vector<PointerData> result;
190 UnpackPointerPacket(result, std::move(converted_packet));
191
192 ASSERT_EQ(result.size(), (size_t)6);
193 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
194 ASSERT_EQ(result[0].synthesized, 0);
195
196 ASSERT_EQ(result[1].change, PointerData::Change::kHover);
197 ASSERT_EQ(result[1].synthesized, 0);
198 ASSERT_EQ(result[1].physical_delta_x, 3.0);
199 ASSERT_EQ(result[1].physical_delta_y, 0.0);
200
201 ASSERT_EQ(result[2].change, PointerData::Change::kDown);
202 ASSERT_EQ(result[2].pointer_identifier, 1);
203 ASSERT_EQ(result[2].synthesized, 0);
204
205 ASSERT_EQ(result[3].change, PointerData::Change::kMove);
206 ASSERT_EQ(result[3].pointer_identifier, 1);
207 ASSERT_EQ(result[3].synthesized, 0);
208 ASSERT_EQ(result[3].physical_delta_x, 0.0);
209 ASSERT_EQ(result[3].physical_delta_y, 4.0);
210
211 ASSERT_EQ(result[4].change, PointerData::Change::kUp);
212 ASSERT_EQ(result[4].pointer_identifier, 1);
213 ASSERT_EQ(result[4].synthesized, 0);
214
215 ASSERT_EQ(result[5].change, PointerData::Change::kRemove);
216 ASSERT_EQ(result[5].synthesized, 0);
217}
218
219TEST(PointerDataPacketConverterTest, CanSynthesizeDownAndUp) {
220 TestDelegate delegate;
221 delegate.AddView(kImplicitViewId);
222 PointerDataPacketConverter converter(delegate);
223 auto packet = std::make_unique<PointerDataPacket>(4);
226 packet->SetPointerData(0, data);
228 packet->SetPointerData(1, data);
230 packet->SetPointerData(2, data);
232 0);
233 packet->SetPointerData(3, data);
234 auto converted_packet = converter.Convert(*packet);
235
236 std::vector<PointerData> result;
237 UnpackPointerPacket(result, std::move(converted_packet));
238
239 ASSERT_EQ(result.size(), (size_t)6);
240 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
241 ASSERT_EQ(result[0].synthesized, 0);
242
243 // A hover should be synthesized.
244 ASSERT_EQ(result[1].change, PointerData::Change::kHover);
245 ASSERT_EQ(result[1].synthesized, 1);
246 ASSERT_EQ(result[1].physical_delta_x, 3.0);
247 ASSERT_EQ(result[1].physical_delta_y, 0.0);
248 ASSERT_EQ(result[1].buttons, 0);
249
250 ASSERT_EQ(result[2].change, PointerData::Change::kDown);
251 ASSERT_EQ(result[2].pointer_identifier, 1);
252 ASSERT_EQ(result[2].synthesized, 0);
253 ASSERT_EQ(result[2].buttons, 1);
254
255 // A move should be synthesized.
256 ASSERT_EQ(result[3].change, PointerData::Change::kMove);
257 ASSERT_EQ(result[3].pointer_identifier, 1);
258 ASSERT_EQ(result[3].synthesized, 1);
259 ASSERT_EQ(result[3].physical_delta_x, 0.0);
260 ASSERT_EQ(result[3].physical_delta_y, 4.0);
261 ASSERT_EQ(result[3].buttons, 1);
262
263 ASSERT_EQ(result[4].change, PointerData::Change::kUp);
264 ASSERT_EQ(result[4].pointer_identifier, 1);
265 ASSERT_EQ(result[4].synthesized, 0);
266 ASSERT_EQ(result[4].buttons, 0);
267
268 ASSERT_EQ(result[5].change, PointerData::Change::kRemove);
269 ASSERT_EQ(result[5].synthesized, 0);
270}
271
272TEST(PointerDataPacketConverterTest, CanUpdatePointerIdentifier) {
273 TestDelegate delegate;
274 delegate.AddView(kImplicitViewId);
275 PointerDataPacketConverter converter(delegate);
276 auto packet = std::make_unique<PointerDataPacket>(7);
279 packet->SetPointerData(0, data);
281 packet->SetPointerData(1, data);
283 packet->SetPointerData(2, data);
285 packet->SetPointerData(3, data);
287 packet->SetPointerData(4, data);
289 packet->SetPointerData(5, data);
291 0);
292 packet->SetPointerData(6, data);
293 auto converted_packet = converter.Convert(*packet);
294
295 std::vector<PointerData> result;
296 UnpackPointerPacket(result, std::move(converted_packet));
297
298 ASSERT_EQ(result.size(), (size_t)7);
299 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
300 ASSERT_EQ(result[0].synthesized, 0);
301
302 ASSERT_EQ(result[1].change, PointerData::Change::kDown);
303 ASSERT_EQ(result[1].pointer_identifier, 1);
304 ASSERT_EQ(result[1].synthesized, 0);
305
306 ASSERT_EQ(result[2].change, PointerData::Change::kUp);
307 ASSERT_EQ(result[2].pointer_identifier, 1);
308 ASSERT_EQ(result[2].synthesized, 0);
309
310 // Pointer count increase to 2.
311 ASSERT_EQ(result[3].change, PointerData::Change::kDown);
312 ASSERT_EQ(result[3].pointer_identifier, 2);
313 ASSERT_EQ(result[3].synthesized, 0);
314
315 ASSERT_EQ(result[4].change, PointerData::Change::kMove);
316 ASSERT_EQ(result[4].pointer_identifier, 2);
317 ASSERT_EQ(result[4].synthesized, 0);
318 ASSERT_EQ(result[4].physical_delta_x, 3.0);
319 ASSERT_EQ(result[4].physical_delta_y, 0.0);
320
321 ASSERT_EQ(result[5].change, PointerData::Change::kUp);
322 ASSERT_EQ(result[5].pointer_identifier, 2);
323 ASSERT_EQ(result[5].synthesized, 0);
324
325 ASSERT_EQ(result[6].change, PointerData::Change::kRemove);
326 ASSERT_EQ(result[6].synthesized, 0);
327}
328
329TEST(PointerDataPacketConverterTest, AlwaysForwardMoveEvent) {
330 TestDelegate delegate;
331 delegate.AddView(kImplicitViewId);
332 PointerDataPacketConverter converter(delegate);
333 auto packet = std::make_unique<PointerDataPacket>(4);
336 packet->SetPointerData(0, data);
338 packet->SetPointerData(1, data);
339 // Creates a move event without a location change.
341 packet->SetPointerData(2, data);
343 packet->SetPointerData(3, data);
344
345 auto converted_packet = converter.Convert(*packet);
346
347 std::vector<PointerData> result;
348 UnpackPointerPacket(result, std::move(converted_packet));
349
350 ASSERT_EQ(result.size(), (size_t)4);
351 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
352 ASSERT_EQ(result[0].synthesized, 0);
353
354 ASSERT_EQ(result[1].change, PointerData::Change::kDown);
355 ASSERT_EQ(result[1].pointer_identifier, 1);
356 ASSERT_EQ(result[1].synthesized, 0);
357
358 // Does not filter out the move event.
359 ASSERT_EQ(result[2].change, PointerData::Change::kMove);
360 ASSERT_EQ(result[2].pointer_identifier, 1);
361 ASSERT_EQ(result[2].synthesized, 0);
362
363 ASSERT_EQ(result[3].change, PointerData::Change::kUp);
364 ASSERT_EQ(result[3].pointer_identifier, 1);
365 ASSERT_EQ(result[3].synthesized, 0);
366}
367
368TEST(PointerDataPacketConverterTest, CanWorkWithDifferentDevices) {
369 TestDelegate delegate;
370 delegate.AddView(kImplicitViewId);
371 PointerDataPacketConverter converter(delegate);
372 auto packet = std::make_unique<PointerDataPacket>(12);
375 packet->SetPointerData(0, data);
377 packet->SetPointerData(1, data);
379 packet->SetPointerData(2, data);
381 packet->SetPointerData(3, data);
383 packet->SetPointerData(4, data);
385 packet->SetPointerData(5, data);
387 packet->SetPointerData(6, data);
389 packet->SetPointerData(7, data);
391 packet->SetPointerData(8, data);
393 packet->SetPointerData(9, data);
395 0);
396 packet->SetPointerData(10, data);
398 0);
399 packet->SetPointerData(11, data);
400 auto converted_packet = converter.Convert(*packet);
401
402 std::vector<PointerData> result;
403 UnpackPointerPacket(result, std::move(converted_packet));
404
405 ASSERT_EQ(result.size(), (size_t)12);
406 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
407 ASSERT_EQ(result[0].device, 0);
408 ASSERT_EQ(result[0].synthesized, 0);
409
410 ASSERT_EQ(result[1].change, PointerData::Change::kDown);
411 ASSERT_EQ(result[1].device, 0);
412 ASSERT_EQ(result[1].pointer_identifier, 1);
413 ASSERT_EQ(result[1].synthesized, 0);
414
415 ASSERT_EQ(result[2].change, PointerData::Change::kAdd);
416 ASSERT_EQ(result[2].device, 1);
417 ASSERT_EQ(result[2].synthesized, 0);
418
419 ASSERT_EQ(result[3].change, PointerData::Change::kDown);
420 ASSERT_EQ(result[3].device, 1);
421 ASSERT_EQ(result[3].pointer_identifier, 2);
422 ASSERT_EQ(result[3].synthesized, 0);
423
424 ASSERT_EQ(result[4].change, PointerData::Change::kUp);
425 ASSERT_EQ(result[4].device, 0);
426 ASSERT_EQ(result[4].pointer_identifier, 1);
427 ASSERT_EQ(result[4].synthesized, 0);
428
429 ASSERT_EQ(result[5].change, PointerData::Change::kDown);
430 ASSERT_EQ(result[5].device, 0);
431 ASSERT_EQ(result[5].pointer_identifier, 3);
432 ASSERT_EQ(result[5].synthesized, 0);
433
434 ASSERT_EQ(result[6].change, PointerData::Change::kMove);
435 ASSERT_EQ(result[6].device, 1);
436 ASSERT_EQ(result[6].pointer_identifier, 2);
437 ASSERT_EQ(result[6].synthesized, 0);
438 ASSERT_EQ(result[6].physical_delta_x, 0.0);
439 ASSERT_EQ(result[6].physical_delta_y, 4.0);
440
441 ASSERT_EQ(result[7].change, PointerData::Change::kMove);
442 ASSERT_EQ(result[7].device, 0);
443 ASSERT_EQ(result[7].pointer_identifier, 3);
444 ASSERT_EQ(result[7].synthesized, 0);
445 ASSERT_EQ(result[7].physical_delta_x, 3.0);
446 ASSERT_EQ(result[7].physical_delta_y, 0.0);
447
448 ASSERT_EQ(result[8].change, PointerData::Change::kUp);
449 ASSERT_EQ(result[8].device, 1);
450 ASSERT_EQ(result[8].pointer_identifier, 2);
451 ASSERT_EQ(result[8].synthesized, 0);
452
453 ASSERT_EQ(result[9].change, PointerData::Change::kUp);
454 ASSERT_EQ(result[9].device, 0);
455 ASSERT_EQ(result[9].pointer_identifier, 3);
456 ASSERT_EQ(result[9].synthesized, 0);
457
458 ASSERT_EQ(result[10].change, PointerData::Change::kRemove);
459 ASSERT_EQ(result[10].device, 0);
460 ASSERT_EQ(result[10].synthesized, 0);
461
462 ASSERT_EQ(result[11].change, PointerData::Change::kRemove);
463 ASSERT_EQ(result[11].device, 1);
464 ASSERT_EQ(result[11].synthesized, 0);
465}
466
467TEST(PointerDataPacketConverterTest, CanSynthesizeAdd) {
468 TestDelegate delegate;
469 delegate.AddView(kImplicitViewId);
470 PointerDataPacketConverter converter(delegate);
471 auto packet = std::make_unique<PointerDataPacket>(2);
474 1);
475 packet->SetPointerData(0, data);
477 packet->SetPointerData(1, data);
478 auto converted_packet = converter.Convert(*packet);
479
480 std::vector<PointerData> result;
481 UnpackPointerPacket(result, std::move(converted_packet));
482
483 ASSERT_EQ(result.size(), (size_t)4);
484 // A add should be synthesized.
485 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
486 ASSERT_EQ(result[0].physical_x, 330.0);
487 ASSERT_EQ(result[0].physical_y, 450.0);
488 ASSERT_EQ(result[0].synthesized, 1);
489 ASSERT_EQ(result[0].buttons, 0);
490
491 ASSERT_EQ(result[1].change, PointerData::Change::kDown);
492 ASSERT_EQ(result[1].physical_x, 330.0);
493 ASSERT_EQ(result[1].physical_y, 450.0);
494 ASSERT_EQ(result[1].synthesized, 0);
495 ASSERT_EQ(result[1].buttons, 1);
496
497 // A move should be synthesized.
498 ASSERT_EQ(result[2].change, PointerData::Change::kMove);
499 ASSERT_EQ(result[2].physical_delta_x, -330.0);
500 ASSERT_EQ(result[2].physical_delta_y, -450.0);
501 ASSERT_EQ(result[2].physical_x, 0.0);
502 ASSERT_EQ(result[2].physical_y, 0.0);
503 ASSERT_EQ(result[2].synthesized, 1);
504 ASSERT_EQ(result[2].buttons, 1);
505
506 ASSERT_EQ(result[3].change, PointerData::Change::kUp);
507 ASSERT_EQ(result[3].physical_x, 0.0);
508 ASSERT_EQ(result[3].physical_y, 0.0);
509 ASSERT_EQ(result[3].synthesized, 0);
510 ASSERT_EQ(result[3].buttons, 0);
511}
512
513TEST(PointerDataPacketConverterTest, CanSynthesizeRemove) {
514 TestDelegate delegate;
515 delegate.AddView(100);
516 delegate.AddView(200);
517 PointerDataPacketConverter converter(delegate);
518 auto packet = std::make_unique<PointerDataPacket>(3);
519
522 data.view_id = 100;
523 packet->SetPointerData(0, data);
525 data.view_id = 100;
526 packet->SetPointerData(1, data);
528 data.view_id = 200;
529 packet->SetPointerData(2, data);
530 auto converted_packet = converter.Convert(*packet);
531
532 std::vector<PointerData> result;
533 UnpackPointerPacket(result, std::move(converted_packet));
534
535 ASSERT_EQ(result.size(), (size_t)6);
536 ASSERT_EQ(result[0].synthesized, 0);
537 ASSERT_EQ(result[0].view_id, 100);
538
539 // A hover should be synthesized.
540 ASSERT_EQ(result[1].change, PointerData::Change::kHover);
541 ASSERT_EQ(result[1].synthesized, 1);
542 ASSERT_EQ(result[1].physical_delta_x, 3.0);
543 ASSERT_EQ(result[1].physical_delta_y, 4.0);
544 ASSERT_EQ(result[1].buttons, 0);
545
546 ASSERT_EQ(result[2].change, PointerData::Change::kDown);
547 ASSERT_EQ(result[2].pointer_identifier, 1);
548 ASSERT_EQ(result[2].synthesized, 0);
549 ASSERT_EQ(result[2].buttons, 1);
550
551 // A cancel should be synthesized.
552 ASSERT_EQ(result[3].change, PointerData::Change::kCancel);
553 ASSERT_EQ(result[3].pointer_identifier, 1);
554 ASSERT_EQ(result[3].synthesized, 1);
555 ASSERT_EQ(result[3].physical_x, 3.0);
556 ASSERT_EQ(result[3].physical_y, 4.0);
557 ASSERT_EQ(result[3].buttons, 1);
558
559 // A remove should be synthesized.
560 ASSERT_EQ(result[4].physical_x, 3.0);
561 ASSERT_EQ(result[4].physical_y, 4.0);
562 ASSERT_EQ(result[4].synthesized, 1);
563 ASSERT_EQ(result[4].view_id, 100);
564
565 ASSERT_EQ(result[5].synthesized, 0);
566 ASSERT_EQ(result[5].view_id, 200);
567}
568
569TEST(PointerDataPacketConverterTest,
570 CanAvoidDoubleRemoveAfterSynthesizedRemove) {
571 TestDelegate delegate;
572 delegate.AddView(100);
573 delegate.AddView(200);
574 PointerDataPacketConverter converter(delegate);
575 auto packet = std::make_unique<PointerDataPacket>(2);
576
579 data.view_id = 100;
580 packet->SetPointerData(0, data);
582 data.view_id = 200;
583 packet->SetPointerData(1, data);
584 auto converted_packet = converter.Convert(*packet);
585
586 std::vector<PointerData> result;
587 UnpackPointerPacket(result, std::move(converted_packet));
588
589 ASSERT_EQ(result.size(), (size_t)3);
590 ASSERT_EQ(result[0].synthesized, 0);
591 ASSERT_EQ(result[0].view_id, 100);
592
593 // A remove should be synthesized.
594 ASSERT_EQ(result[1].synthesized, 1);
595 ASSERT_EQ(result[1].view_id, 100);
596
597 ASSERT_EQ(result[2].synthesized, 0);
598 ASSERT_EQ(result[2].view_id, 200);
599
600 // Simulate a double remove.
601 packet = std::make_unique<PointerDataPacket>(1);
603 0);
604 data.view_id = 100;
605 packet->SetPointerData(0, data);
606 converted_packet = converter.Convert(*packet);
607
608 result.clear();
609 UnpackPointerPacket(result, std::move(converted_packet));
610
611 // The double remove should be ignored.
612 ASSERT_EQ(result.size(), (size_t)0);
613}
614
615TEST(PointerDataPacketConverterTest, CanHandleThreeFingerGesture) {
616 // Regression test https://github.com/flutter/flutter/issues/20517.
617 TestDelegate delegate;
618 delegate.AddView(kImplicitViewId);
619 PointerDataPacketConverter converter(delegate);
621 std::vector<PointerData> result;
622 // First finger down.
623 auto packet = std::make_unique<PointerDataPacket>(1);
625 packet->SetPointerData(0, data);
626 auto converted_packet = converter.Convert(*packet);
627 UnpackPointerPacket(result, std::move(converted_packet));
628 // Second finger down.
629 packet = std::make_unique<PointerDataPacket>(1);
631 1);
632 packet->SetPointerData(0, data);
633 converted_packet = converter.Convert(*packet);
634 UnpackPointerPacket(result, std::move(converted_packet));
635 // Triggers three cancels.
636 packet = std::make_unique<PointerDataPacket>(3);
638 0);
639 packet->SetPointerData(0, data);
641 0);
642 packet->SetPointerData(1, data);
644 0);
645 packet->SetPointerData(2, data);
646 converted_packet = converter.Convert(*packet);
647 UnpackPointerPacket(result, std::move(converted_packet));
648
649 ASSERT_EQ(result.size(), (size_t)6);
650 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
651 ASSERT_EQ(result[0].device, 0);
652 ASSERT_EQ(result[0].physical_x, 0.0);
653 ASSERT_EQ(result[0].physical_y, 0.0);
654 ASSERT_EQ(result[0].synthesized, 1);
655 ASSERT_EQ(result[0].buttons, 0);
656
657 ASSERT_EQ(result[1].change, PointerData::Change::kDown);
658 ASSERT_EQ(result[1].device, 0);
659 ASSERT_EQ(result[1].physical_x, 0.0);
660 ASSERT_EQ(result[1].physical_y, 0.0);
661 ASSERT_EQ(result[1].synthesized, 0);
662 ASSERT_EQ(result[1].buttons, 1);
663
664 ASSERT_EQ(result[2].change, PointerData::Change::kAdd);
665 ASSERT_EQ(result[2].device, 1);
666 ASSERT_EQ(result[2].physical_x, 33.0);
667 ASSERT_EQ(result[2].physical_y, 44.0);
668 ASSERT_EQ(result[2].synthesized, 1);
669 ASSERT_EQ(result[2].buttons, 0);
670
671 ASSERT_EQ(result[3].change, PointerData::Change::kDown);
672 ASSERT_EQ(result[3].device, 1);
673 ASSERT_EQ(result[3].physical_x, 33.0);
674 ASSERT_EQ(result[3].physical_y, 44.0);
675 ASSERT_EQ(result[3].synthesized, 0);
676 ASSERT_EQ(result[3].buttons, 1);
677
678 ASSERT_EQ(result[4].change, PointerData::Change::kCancel);
679 ASSERT_EQ(result[4].device, 1);
680 ASSERT_EQ(result[4].physical_x, 33.0);
681 ASSERT_EQ(result[4].physical_y, 44.0);
682 ASSERT_EQ(result[4].synthesized, 0);
683
684 ASSERT_EQ(result[5].change, PointerData::Change::kCancel);
685 ASSERT_EQ(result[5].device, 0);
686 ASSERT_EQ(result[5].physical_x, 0.0);
687 ASSERT_EQ(result[5].physical_y, 0.0);
688 ASSERT_EQ(result[5].synthesized, 0);
689 // Third cancel should be dropped
690}
691
692TEST(PointerDataPacketConverterTest, CanConvertPointerSignals) {
693 PointerData::SignalKind signal_kinds[] = {
697 };
698 for (const PointerData::SignalKind& kind : signal_kinds) {
699 TestDelegate delegate;
700 delegate.AddView(kImplicitViewId);
701 PointerDataPacketConverter converter(delegate);
702 auto packet = std::make_unique<PointerDataPacket>(6);
706 0.0, 0.0, 0);
707 packet->SetPointerData(0, data);
710 0.0, 0.0, 0);
711 packet->SetPointerData(1, data);
714 0.0, 0.0, 1);
715 packet->SetPointerData(2, data);
717 34.0, 34.0, 30.0, 0.0, 0);
718 packet->SetPointerData(3, data);
720 49.0, 49.0, 50.0, 0.0, 0);
721 packet->SetPointerData(4, data);
723 10.0, 20.0, 30.0, 40.0, 0);
724 packet->SetPointerData(5, data);
725 auto converted_packet = converter.Convert(*packet);
726
727 std::vector<PointerData> result;
728 UnpackPointerPacket(result, std::move(converted_packet));
729
730 ASSERT_EQ(result.size(), (size_t)9);
731 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
732 ASSERT_EQ(result[0].signal_kind, PointerData::SignalKind::kNone);
733 ASSERT_EQ(result[0].device, 0);
734 ASSERT_EQ(result[0].physical_x, 0.0);
735 ASSERT_EQ(result[0].physical_y, 0.0);
736 ASSERT_EQ(result[0].synthesized, 0);
737
738 ASSERT_EQ(result[1].change, PointerData::Change::kAdd);
739 ASSERT_EQ(result[1].signal_kind, PointerData::SignalKind::kNone);
740 ASSERT_EQ(result[1].device, 1);
741 ASSERT_EQ(result[1].physical_x, 0.0);
742 ASSERT_EQ(result[1].physical_y, 0.0);
743 ASSERT_EQ(result[1].synthesized, 0);
744
745 ASSERT_EQ(result[2].change, PointerData::Change::kDown);
746 ASSERT_EQ(result[2].signal_kind, PointerData::SignalKind::kNone);
747 ASSERT_EQ(result[2].device, 1);
748 ASSERT_EQ(result[2].physical_x, 0.0);
749 ASSERT_EQ(result[2].physical_y, 0.0);
750 ASSERT_EQ(result[2].synthesized, 0);
751
752 // Converter will synthesize a hover to position for device 0.
753 ASSERT_EQ(result[3].change, PointerData::Change::kHover);
754 ASSERT_EQ(result[3].signal_kind, PointerData::SignalKind::kNone);
755 ASSERT_EQ(result[3].device, 0);
756 ASSERT_EQ(result[3].physical_x, 34.0);
757 ASSERT_EQ(result[3].physical_y, 34.0);
758 ASSERT_EQ(result[3].physical_delta_x, 34.0);
759 ASSERT_EQ(result[3].physical_delta_y, 34.0);
760 ASSERT_EQ(result[3].buttons, 0);
761 ASSERT_EQ(result[3].synthesized, 1);
762
763 ASSERT_EQ(result[4].change, PointerData::Change::kHover);
764 ASSERT_EQ(result[4].signal_kind, kind);
765 ASSERT_EQ(result[4].device, 0);
766 ASSERT_EQ(result[4].physical_x, 34.0);
767 ASSERT_EQ(result[4].physical_y, 34.0);
768 ASSERT_EQ(result[4].scroll_delta_x, 30.0);
769 ASSERT_EQ(result[4].scroll_delta_y, 0.0);
770
771 // Converter will synthesize a move to position for device 1.
772 ASSERT_EQ(result[5].change, PointerData::Change::kMove);
773 ASSERT_EQ(result[5].signal_kind, PointerData::SignalKind::kNone);
774 ASSERT_EQ(result[5].device, 1);
775 ASSERT_EQ(result[5].physical_x, 49.0);
776 ASSERT_EQ(result[5].physical_y, 49.0);
777 ASSERT_EQ(result[5].physical_delta_x, 49.0);
778 ASSERT_EQ(result[5].physical_delta_y, 49.0);
779 ASSERT_EQ(result[5].buttons, 1);
780 ASSERT_EQ(result[5].synthesized, 1);
781
782 ASSERT_EQ(result[6].change, PointerData::Change::kHover);
783 ASSERT_EQ(result[6].signal_kind, kind);
784 ASSERT_EQ(result[6].device, 1);
785 ASSERT_EQ(result[6].physical_x, 49.0);
786 ASSERT_EQ(result[6].physical_y, 49.0);
787 ASSERT_EQ(result[6].scroll_delta_x, 50.0);
788 ASSERT_EQ(result[6].scroll_delta_y, 0.0);
789
790 // Converter will synthesize an add for device 2.
791 ASSERT_EQ(result[7].change, PointerData::Change::kAdd);
792 ASSERT_EQ(result[7].signal_kind, PointerData::SignalKind::kNone);
793 ASSERT_EQ(result[7].device, 2);
794 ASSERT_EQ(result[7].physical_x, 10.0);
795 ASSERT_EQ(result[7].physical_y, 20.0);
796 ASSERT_EQ(result[7].synthesized, 1);
797
798 ASSERT_EQ(result[8].change, PointerData::Change::kHover);
799 ASSERT_EQ(result[8].signal_kind, kind);
800 ASSERT_EQ(result[8].device, 2);
801 ASSERT_EQ(result[8].physical_x, 10.0);
802 ASSERT_EQ(result[8].physical_y, 20.0);
803 ASSERT_EQ(result[8].scroll_delta_x, 30.0);
804 ASSERT_EQ(result[8].scroll_delta_y, 40.0);
805 }
806}
807
808TEST(PointerDataPacketConverterTest, CanConvertTrackpadGesture) {
809 TestDelegate delegate;
810 delegate.AddView(kImplicitViewId);
811 PointerDataPacketConverter converter(delegate);
812 auto packet = std::make_unique<PointerDataPacket>(3);
815 0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
816 packet->SetPointerData(0, data);
818 0, 0.0, 0.0, 3.0, 4.0, 1.0, 0.0);
819 packet->SetPointerData(1, data);
821 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
822 packet->SetPointerData(2, data);
823 auto converted_packet = converter.Convert(*packet);
824
825 std::vector<PointerData> result;
826 UnpackPointerPacket(result, std::move(converted_packet));
827
828 ASSERT_EQ(result.size(), (size_t)4);
829 ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
830 ASSERT_EQ(result[0].device, 0);
831 ASSERT_EQ(result[0].synthesized, 1);
832
833 ASSERT_EQ(result[1].change, PointerData::Change::kPanZoomStart);
834 ASSERT_EQ(result[1].signal_kind, PointerData::SignalKind::kNone);
835 ASSERT_EQ(result[1].device, 0);
836 ASSERT_EQ(result[1].physical_x, 0.0);
837 ASSERT_EQ(result[1].physical_y, 0.0);
838 ASSERT_EQ(result[1].synthesized, 0);
839
840 ASSERT_EQ(result[2].change, PointerData::Change::kPanZoomUpdate);
841 ASSERT_EQ(result[2].signal_kind, PointerData::SignalKind::kNone);
842 ASSERT_EQ(result[2].device, 0);
843 ASSERT_EQ(result[2].physical_x, 0.0);
844 ASSERT_EQ(result[2].physical_y, 0.0);
845 ASSERT_EQ(result[2].pan_x, 3.0);
846 ASSERT_EQ(result[2].pan_y, 4.0);
847 ASSERT_EQ(result[2].pan_delta_x, 3.0);
848 ASSERT_EQ(result[2].pan_delta_y, 4.0);
849 ASSERT_EQ(result[2].scale, 1.0);
850 ASSERT_EQ(result[2].rotation, 0.0);
851 ASSERT_EQ(result[2].synthesized, 0);
852
853 ASSERT_EQ(result[3].change, PointerData::Change::kPanZoomEnd);
854 ASSERT_EQ(result[3].signal_kind, PointerData::SignalKind::kNone);
855 ASSERT_EQ(result[3].device, 0);
856 ASSERT_EQ(result[3].physical_x, 0.0);
857 ASSERT_EQ(result[3].physical_y, 0.0);
858 ASSERT_EQ(result[3].synthesized, 0);
859}
860
861TEST(PointerDataPacketConverterTest, CanConvertViewId) {
862 TestDelegate delegate;
863 delegate.AddView(100);
864 delegate.AddView(200);
865 PointerDataPacketConverter converter(delegate);
866 auto packet = std::make_unique<PointerDataPacket>(2);
869 data.view_id = 100;
870 packet->SetPointerData(0, data);
872 data.view_id = 200;
873 packet->SetPointerData(1, data);
874 auto converted_packet = converter.Convert(*packet);
875
876 std::vector<PointerData> result;
877 UnpackPointerPacket(result, std::move(converted_packet));
878
879 ASSERT_EQ(result.size(), (size_t)2);
880 ASSERT_EQ(result[0].view_id, 100);
881 ASSERT_EQ(result[1].view_id, 200);
882}
883
884} // namespace testing
885} // namespace flutter
std::unique_ptr< PointerDataPacket > Convert(const PointerDataPacket &packet)
Converts pointer data packet into a form that framework understands. The raw pointer data packet from...
bool ViewExists(int64_t view_id) const override
VkDevice device
Definition main.cc:69
G_BEGIN_DECLS FlutterViewId view_id
void CreateSimulatedPointerData(PointerData &data, PointerData::Change change, int64_t device, double dx, double dy, int64_t buttons)
TEST(NativeAssetsManagerTest, NoAvailableAssets)
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)
constexpr int64_t kImplicitViewId
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 switch_defs.h:36