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 | |
8 | namespace flutter { |
9 | namespace testing { |
10 | |
11 | void 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 | |
46 | void 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 | |
84 | void 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 | |
99 | TEST(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 | |
147 | TEST(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 | |
193 | TEST(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 | |
247 | TEST(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 | |
284 | TEST(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 | |
379 | TEST(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 | |
418 | TEST(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 | |
485 | TEST(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 | |