6 #include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h"
12 #include "gtest/gtest.h"
25 (
reinterpret_cast<GTypeInstance*
>(device))->g_class =
26 static_cast<GTypeClass*
>(g_malloc0(
sizeof(GTypeClass)));
27 (
reinterpret_cast<GTypeInstance*
>(device))->g_class->g_type = GDK_TYPE_DEVICE;
28 return reinterpret_cast<GdkDevice*
>(device);
31 TEST(FlScrollingManagerTest, DiscreteDirectional) {
35 g_autoptr(GError)
error =
nullptr;
37 EXPECT_EQ(
error,
nullptr);
39 std::vector<FlutterPointerEvent> pointer_events;
42 ([&pointer_events](
auto engine,
const FlutterPointerEvent* events,
43 size_t events_count) {
44 for (
size_t i = 0;
i < events_count;
i++) {
45 pointer_events.push_back(events[
i]);
54 GdkEventScroll*
event =
55 reinterpret_cast<GdkEventScroll*
>(gdk_event_new(GDK_SCROLL));
59 event->device = mouse;
60 event->direction = GDK_SCROLL_UP;
62 EXPECT_EQ(pointer_events.size(), 1u);
63 EXPECT_EQ(pointer_events[0].x, 4.0);
64 EXPECT_EQ(pointer_events[0].y, 8.0);
65 EXPECT_EQ(pointer_events[0].device_kind, kFlutterPointerDeviceKindMouse);
66 EXPECT_EQ(pointer_events[0].timestamp,
68 EXPECT_EQ(pointer_events[0].scroll_delta_x, 0);
69 EXPECT_EQ(pointer_events[0].scroll_delta_y, 53 * -1.0);
70 event->direction = GDK_SCROLL_DOWN;
72 EXPECT_EQ(pointer_events.size(), 2u);
73 EXPECT_EQ(pointer_events[1].x, 4.0);
74 EXPECT_EQ(pointer_events[1].y, 8.0);
75 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
76 EXPECT_EQ(pointer_events[1].timestamp,
78 EXPECT_EQ(pointer_events[1].scroll_delta_x, 0);
79 EXPECT_EQ(pointer_events[1].scroll_delta_y, 53 * 1.0);
80 event->direction = GDK_SCROLL_LEFT;
82 EXPECT_EQ(pointer_events.size(), 3u);
83 EXPECT_EQ(pointer_events[2].x, 4.0);
84 EXPECT_EQ(pointer_events[2].y, 8.0);
85 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindMouse);
86 EXPECT_EQ(pointer_events[2].timestamp,
88 EXPECT_EQ(pointer_events[2].scroll_delta_x, 53 * -1.0);
89 EXPECT_EQ(pointer_events[2].scroll_delta_y, 0);
90 event->direction = GDK_SCROLL_RIGHT;
92 EXPECT_EQ(pointer_events.size(), 4u);
93 EXPECT_EQ(pointer_events[3].x, 4.0);
94 EXPECT_EQ(pointer_events[3].y, 8.0);
95 EXPECT_EQ(pointer_events[3].device_kind, kFlutterPointerDeviceKindMouse);
96 EXPECT_EQ(pointer_events[3].timestamp,
98 EXPECT_EQ(pointer_events[3].scroll_delta_x, 53 * 1.0);
99 EXPECT_EQ(pointer_events[3].scroll_delta_y, 0);
102 TEST(FlScrollingManagerTest, DiscreteScrolling) {
106 g_autoptr(GError)
error =
nullptr;
108 EXPECT_EQ(
error,
nullptr);
110 std::vector<FlutterPointerEvent> pointer_events;
113 ([&pointer_events](
auto engine,
const FlutterPointerEvent* events,
114 size_t events_count) {
115 for (
size_t i = 0;
i < events_count;
i++) {
116 pointer_events.push_back(events[
i]);
125 GdkEventScroll*
event =
126 reinterpret_cast<GdkEventScroll*
>(gdk_event_new(GDK_SCROLL));
130 event->delta_x = 1.0;
131 event->delta_y = 2.0;
132 event->device = mouse;
133 event->direction = GDK_SCROLL_SMOOTH;
135 EXPECT_EQ(pointer_events.size(), 1u);
136 EXPECT_EQ(pointer_events[0].x, 4.0);
137 EXPECT_EQ(pointer_events[0].y, 8.0);
138 EXPECT_EQ(pointer_events[0].device_kind, kFlutterPointerDeviceKindMouse);
139 EXPECT_EQ(pointer_events[0].timestamp,
141 EXPECT_EQ(pointer_events[0].scroll_delta_x, 53 * 1.0);
142 EXPECT_EQ(pointer_events[0].scroll_delta_y, 53 * 2.0);
145 TEST(FlScrollingManagerTest, Panning) {
149 g_autoptr(GError)
error =
nullptr;
151 EXPECT_EQ(
error,
nullptr);
153 std::vector<FlutterPointerEvent> pointer_events;
156 ([&pointer_events](
auto engine,
const FlutterPointerEvent* events,
157 size_t events_count) {
158 for (
size_t i = 0;
i < events_count;
i++) {
159 pointer_events.push_back(events[
i]);
168 GdkEventScroll*
event =
169 reinterpret_cast<GdkEventScroll*
>(gdk_event_new(GDK_SCROLL));
173 event->delta_x = 1.0;
174 event->delta_y = 2.0;
175 event->device = touchpad;
176 event->direction = GDK_SCROLL_SMOOTH;
178 EXPECT_EQ(pointer_events.size(), 2u);
179 EXPECT_EQ(pointer_events[0].x, 4.0);
180 EXPECT_EQ(pointer_events[0].y, 8.0);
181 EXPECT_EQ(pointer_events[0].timestamp,
183 EXPECT_EQ(pointer_events[0].phase, kPanZoomStart);
184 EXPECT_EQ(pointer_events[1].x, 4.0);
185 EXPECT_EQ(pointer_events[1].y, 8.0);
186 EXPECT_EQ(pointer_events[1].timestamp,
188 EXPECT_EQ(pointer_events[1].phase, kPanZoomUpdate);
189 EXPECT_EQ(pointer_events[1].pan_x, 53 * -1.0);
190 EXPECT_EQ(pointer_events[1].pan_y, 53 * -2.0);
191 EXPECT_EQ(pointer_events[1].scale, 1.0);
192 EXPECT_EQ(pointer_events[1].rotation, 0.0);
194 EXPECT_EQ(pointer_events.size(), 3u);
195 EXPECT_EQ(pointer_events[2].x, 4.0);
196 EXPECT_EQ(pointer_events[2].y, 8.0);
197 EXPECT_EQ(pointer_events[2].timestamp,
199 EXPECT_EQ(pointer_events[2].phase, kPanZoomUpdate);
200 EXPECT_EQ(pointer_events[2].pan_x, 53 * -2.0);
201 EXPECT_EQ(pointer_events[2].pan_y, 53 * -4.0);
202 EXPECT_EQ(pointer_events[2].scale, 1.0);
203 EXPECT_EQ(pointer_events[2].rotation, 0.0);
204 event->is_stop =
true;
206 EXPECT_EQ(pointer_events.size(), 4u);
207 EXPECT_EQ(pointer_events[3].x, 4.0);
208 EXPECT_EQ(pointer_events[3].y, 8.0);
209 EXPECT_EQ(pointer_events[3].timestamp,
211 EXPECT_EQ(pointer_events[3].phase, kPanZoomEnd);
214 TEST(FlScrollingManagerTest, Zooming) {
218 g_autoptr(GError)
error =
nullptr;
220 EXPECT_EQ(
error,
nullptr);
222 std::vector<FlutterPointerEvent> pointer_events;
225 ([&pointer_events](
auto engine,
const FlutterPointerEvent* events,
226 size_t events_count) {
227 for (
size_t i = 0;
i < events_count;
i++) {
228 pointer_events.push_back(events[
i]);
236 size_t time_start = g_get_real_time();
238 EXPECT_EQ(pointer_events.size(), 1u);
239 EXPECT_EQ(pointer_events[0].x, 0);
240 EXPECT_EQ(pointer_events[0].y, 0);
241 EXPECT_EQ(pointer_events[0].phase, kPanZoomStart);
242 EXPECT_GE(pointer_events[0].timestamp, time_start);
244 EXPECT_EQ(pointer_events.size(), 2u);
245 EXPECT_EQ(pointer_events[1].x, 0);
246 EXPECT_EQ(pointer_events[1].y, 0);
247 EXPECT_EQ(pointer_events[1].phase, kPanZoomUpdate);
248 EXPECT_GE(pointer_events[1].timestamp, pointer_events[0].timestamp);
249 EXPECT_EQ(pointer_events[1].pan_x, 0);
250 EXPECT_EQ(pointer_events[1].pan_y, 0);
251 EXPECT_EQ(pointer_events[1].scale, 1.1);
252 EXPECT_EQ(pointer_events[1].rotation, 0);
254 EXPECT_EQ(pointer_events.size(), 3u);
255 EXPECT_EQ(pointer_events[2].x, 0);
256 EXPECT_EQ(pointer_events[2].y, 0);
257 EXPECT_EQ(pointer_events[2].phase, kPanZoomEnd);
258 EXPECT_GE(pointer_events[2].timestamp, pointer_events[1].timestamp);
261 TEST(FlScrollingManagerTest, Rotating) {
265 g_autoptr(GError)
error =
nullptr;
267 EXPECT_EQ(
error,
nullptr);
269 std::vector<FlutterPointerEvent> pointer_events;
272 ([&pointer_events](
auto engine,
const FlutterPointerEvent* events,
273 size_t events_count) {
274 for (
size_t i = 0;
i < events_count;
i++) {
275 pointer_events.push_back(events[
i]);
283 size_t time_start = g_get_real_time();
285 EXPECT_EQ(pointer_events.size(), 1u);
286 EXPECT_EQ(pointer_events[0].x, 0);
287 EXPECT_EQ(pointer_events[0].y, 0);
288 EXPECT_EQ(pointer_events[0].phase, kPanZoomStart);
289 EXPECT_GE(pointer_events[0].timestamp, time_start);
291 EXPECT_EQ(pointer_events.size(), 2u);
292 EXPECT_EQ(pointer_events[1].x, 0);
293 EXPECT_EQ(pointer_events[1].y, 0);
294 EXPECT_EQ(pointer_events[1].phase, kPanZoomUpdate);
295 EXPECT_GE(pointer_events[1].timestamp, pointer_events[0].timestamp);
296 EXPECT_EQ(pointer_events[1].pan_x, 0);
297 EXPECT_EQ(pointer_events[1].pan_y, 0);
298 EXPECT_EQ(pointer_events[1].scale, 1.0);
299 EXPECT_EQ(pointer_events[1].rotation, 0.5);
301 EXPECT_EQ(pointer_events.size(), 3u);
302 EXPECT_EQ(pointer_events[2].x, 0);
303 EXPECT_EQ(pointer_events[2].y, 0);
304 EXPECT_EQ(pointer_events[2].phase, kPanZoomEnd);
305 EXPECT_GE(pointer_events[2].timestamp, pointer_events[1].timestamp);
308 TEST(FlScrollingManagerTest, SynchronizedZoomingAndRotating) {
312 g_autoptr(GError)
error =
nullptr;
314 EXPECT_EQ(
error,
nullptr);
316 std::vector<FlutterPointerEvent> pointer_events;
319 ([&pointer_events](
auto engine,
const FlutterPointerEvent* events,
320 size_t events_count) {
321 for (
size_t i = 0;
i < events_count;
i++) {
322 pointer_events.push_back(events[
i]);
330 size_t time_start = g_get_real_time();
332 EXPECT_EQ(pointer_events.size(), 1u);
333 EXPECT_EQ(pointer_events[0].x, 0);
334 EXPECT_EQ(pointer_events[0].y, 0);
335 EXPECT_EQ(pointer_events[0].phase, kPanZoomStart);
336 EXPECT_GE(pointer_events[0].timestamp, time_start);
338 EXPECT_EQ(pointer_events.size(), 2u);
339 EXPECT_EQ(pointer_events[1].x, 0);
340 EXPECT_EQ(pointer_events[1].y, 0);
341 EXPECT_EQ(pointer_events[1].phase, kPanZoomUpdate);
342 EXPECT_GE(pointer_events[1].timestamp, pointer_events[0].timestamp);
343 EXPECT_EQ(pointer_events[1].pan_x, 0);
344 EXPECT_EQ(pointer_events[1].pan_y, 0);
345 EXPECT_EQ(pointer_events[1].scale, 1.1);
346 EXPECT_EQ(pointer_events[1].rotation, 0);
348 EXPECT_EQ(pointer_events.size(), 2u);
350 EXPECT_EQ(pointer_events.size(), 3u);
351 EXPECT_EQ(pointer_events[2].x, 0);
352 EXPECT_EQ(pointer_events[2].y, 0);
353 EXPECT_EQ(pointer_events[2].phase, kPanZoomUpdate);
354 EXPECT_GE(pointer_events[2].timestamp, pointer_events[1].timestamp);
355 EXPECT_EQ(pointer_events[2].pan_x, 0);
356 EXPECT_EQ(pointer_events[2].pan_y, 0);
357 EXPECT_EQ(pointer_events[2].scale, 1.1);
358 EXPECT_EQ(pointer_events[2].rotation, 0.5);
361 EXPECT_EQ(pointer_events.size(), 3u);
363 EXPECT_EQ(pointer_events.size(), 4u);
364 EXPECT_EQ(pointer_events[3].x, 0);
365 EXPECT_EQ(pointer_events[3].y, 0);
366 EXPECT_EQ(pointer_events[3].phase, kPanZoomEnd);
367 EXPECT_GE(pointer_events[3].timestamp, pointer_events[2].timestamp);
372 TEST(FlScrollingManagerTest, UnsynchronizedZoomingAndRotating) {
376 g_autoptr(GError)
error =
nullptr;
378 EXPECT_EQ(
error,
nullptr);
380 std::vector<FlutterPointerEvent> pointer_events;
383 ([&pointer_events](
auto engine,
const FlutterPointerEvent* events,
384 size_t events_count) {
385 for (
size_t i = 0;
i < events_count;
i++) {
386 pointer_events.push_back(events[
i]);
394 size_t time_start = g_get_real_time();
396 EXPECT_EQ(pointer_events.size(), 1u);
397 EXPECT_EQ(pointer_events[0].x, 0);
398 EXPECT_EQ(pointer_events[0].y, 0);
399 EXPECT_EQ(pointer_events[0].phase, kPanZoomStart);
400 EXPECT_GE(pointer_events[0].timestamp, time_start);
402 EXPECT_EQ(pointer_events.size(), 2u);
403 EXPECT_EQ(pointer_events[1].x, 0);
404 EXPECT_EQ(pointer_events[1].y, 0);
405 EXPECT_EQ(pointer_events[1].phase, kPanZoomUpdate);
406 EXPECT_GE(pointer_events[1].timestamp, pointer_events[0].timestamp);
407 EXPECT_EQ(pointer_events[1].pan_x, 0);
408 EXPECT_EQ(pointer_events[1].pan_y, 0);
409 EXPECT_EQ(pointer_events[1].scale, 1.1);
410 EXPECT_EQ(pointer_events[1].rotation, 0);
412 EXPECT_EQ(pointer_events.size(), 2u);
414 EXPECT_EQ(pointer_events.size(), 3u);
415 EXPECT_EQ(pointer_events[2].x, 0);
416 EXPECT_EQ(pointer_events[2].y, 0);
417 EXPECT_EQ(pointer_events[2].phase, kPanZoomUpdate);
418 EXPECT_GE(pointer_events[2].timestamp, pointer_events[1].timestamp);
419 EXPECT_EQ(pointer_events[2].pan_x, 0);
420 EXPECT_EQ(pointer_events[2].pan_y, 0);
421 EXPECT_EQ(pointer_events[2].scale, 1.1);
422 EXPECT_EQ(pointer_events[2].rotation, 0.5);
424 EXPECT_EQ(pointer_events.size(), 3u);
426 EXPECT_EQ(pointer_events.size(), 4u);
427 EXPECT_EQ(pointer_events[3].x, 0);
428 EXPECT_EQ(pointer_events[3].y, 0);
429 EXPECT_EQ(pointer_events[3].phase, kPanZoomUpdate);
430 EXPECT_GE(pointer_events[3].timestamp, pointer_events[2].timestamp);
431 EXPECT_EQ(pointer_events[3].pan_x, 0);
432 EXPECT_EQ(pointer_events[3].pan_y, 0);
433 EXPECT_EQ(pointer_events[3].scale, 1.1);
434 EXPECT_EQ(pointer_events[3].rotation, 1.0);
436 EXPECT_EQ(pointer_events.size(), 5u);
437 EXPECT_EQ(pointer_events[4].x, 0);
438 EXPECT_EQ(pointer_events[4].y, 0);
439 EXPECT_EQ(pointer_events[4].phase, kPanZoomEnd);
440 EXPECT_GE(pointer_events[4].timestamp, pointer_events[3].timestamp);