7 #include "flutter/fml/macros.h"
8 #include "flutter/shell/platform/windows/testing/mock_window_binding_handler_delegate.h"
9 #include "gtest/gtest.h"
24 HRESULT(REFIID,
void**));
27 ActivateConfiguration,
28 HRESULT(DIRECTMANIPULATION_CONFIGURATION));
31 HRESULT(DIRECTMANIPULATION_CONFIGURATION));
34 HRESULT(IDirectManipulationContent*));
38 IDirectManipulationViewportEventHandler*,
44 HRESULT(REFIID,
void**));
47 HRESULT(DIRECTMANIPULATION_STATUS*));
50 HRESULT(REFIID,
void**, UINT32*));
60 HRESULT(DIRECTMANIPULATION_CONFIGURATION));
63 HRESULT(IDirectManipulationContent*));
69 HRESULT(DIRECTMANIPULATION_MOTION_TYPES));
73 HRESULT(DIRECTMANIPULATION_INPUT_MODE));
76 HRESULT(DIRECTMANIPULATION_GESTURE_CONFIGURATION));
79 HRESULT(IUnknown*, UINT32));
82 HRESULT(DIRECTMANIPULATION_INPUT_MODE));
85 HRESULT(DIRECTMANIPULATION_VIEWPORT_OPTIONS));
88 HRESULT(
const RECT*));
91 HRESULT(
const float*, DWORD));
95 HRESULT(
const float*, DWORD));
99 HRESULT(
const float,
const float,
const float,
const float, BOOL));
113 HRESULT(REFIID,
void**));
117 HRESULT(
float*, DWORD));
120 HRESULT(
float*, DWORD));
123 HRESULT(REFIID,
void**, UINT32*));
126 HRESULT(REFIID,
void**));
129 HRESULT(
const RECT*));
132 HRESULT(IUnknown*, UINT32));
134 SyncContentTransform,
135 HRESULT(
const float*, DWORD));
141 TEST(DirectManipulationTest, TestGesture) {
143 MockWindowBindingHandlerDelegate delegate;
145 const float scale = 1.5;
146 const float pan_x = 32.0;
147 const float pan_y = 16.0;
148 const int DISPLAY_WIDTH = 800;
149 const int DISPLAY_HEIGHT = 600;
150 auto owner = std::make_unique<DirectManipulationOwner>(
nullptr);
151 owner->SetBindingHandlerDelegate(&delegate);
153 fml::MakeRefCounted<DirectManipulationEventHandler>(owner.get());
154 int32_t device_id = (int32_t)
reinterpret_cast<int64_t
>(handler.get());
155 EXPECT_CALL(viewport, GetPrimaryContent(_, _))
156 .WillOnce([&
content](REFIID in,
void** out) {
160 .RetiresOnSaturation();
161 EXPECT_CALL(
content, GetContentTransform(_, 6))
162 .WillOnce([scale](
float* transform, DWORD size) {
168 .RetiresOnSaturation();
169 EXPECT_CALL(delegate, OnPointerPanZoomStart(device_id));
170 handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
171 DIRECTMANIPULATION_RUNNING,
172 DIRECTMANIPULATION_READY);
173 EXPECT_CALL(
content, GetContentTransform(_, 6))
174 .WillOnce([scale, pan_x, pan_y](
float* transform, DWORD size) {
175 transform[0] = scale;
176 transform[4] = pan_x;
177 transform[5] = pan_y;
180 EXPECT_CALL(delegate,
181 OnPointerPanZoomUpdate(device_id, pan_x, pan_y, scale, 0));
182 handler->OnContentUpdated((IDirectManipulationViewport*)&viewport,
183 (IDirectManipulationContent*)&
content);
184 EXPECT_CALL(delegate, OnPointerPanZoomEnd(device_id));
185 EXPECT_CALL(viewport, GetViewportRect(_))
186 .WillOnce([DISPLAY_WIDTH, DISPLAY_HEIGHT](RECT* rect) {
189 rect->right = DISPLAY_WIDTH;
190 rect->bottom = DISPLAY_HEIGHT;
193 EXPECT_CALL(viewport, ZoomToRect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT,
false))
194 .WillOnce(::testing::Return(S_OK));
195 handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
196 DIRECTMANIPULATION_INERTIA,
197 DIRECTMANIPULATION_RUNNING);
198 handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
199 DIRECTMANIPULATION_READY,
200 DIRECTMANIPULATION_INERTIA);
204 TEST(DirectManipulationTest, TestRounding) {
206 MockWindowBindingHandlerDelegate delegate;
208 const float scale = 1.5;
209 const int DISPLAY_WIDTH = 800;
210 const int DISPLAY_HEIGHT = 600;
211 auto owner = std::make_unique<DirectManipulationOwner>(
nullptr);
212 owner->SetBindingHandlerDelegate(&delegate);
214 fml::MakeRefCounted<DirectManipulationEventHandler>(owner.get());
215 int32_t device_id = (int32_t)
reinterpret_cast<int64_t
>(handler.get());
216 EXPECT_CALL(viewport, GetPrimaryContent(_, _))
217 .WillOnce([&
content](REFIID in,
void** out) {
221 .RetiresOnSaturation();
222 EXPECT_CALL(
content, GetContentTransform(_, 6))
223 .WillOnce([scale](
float* transform, DWORD size) {
229 .RetiresOnSaturation();
230 EXPECT_CALL(delegate, OnPointerPanZoomStart(device_id));
231 handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
232 DIRECTMANIPULATION_RUNNING,
233 DIRECTMANIPULATION_READY);
234 EXPECT_CALL(
content, GetContentTransform(_, 6))
235 .WillOnce([scale](
float* transform, DWORD size) {
236 transform[0] = 1.5000001f;
241 .RetiresOnSaturation();
242 EXPECT_CALL(delegate,
243 OnPointerPanZoomUpdate(device_id, 4.0, 0, 1.5000001f, 0))
245 EXPECT_CALL(delegate, OnPointerPanZoomUpdate(device_id, 4.0, 0, 1.5f, 0))
247 .RetiresOnSaturation();
248 EXPECT_CALL(
content, GetContentTransform(_, 6))
249 .WillOnce([scale](
float* transform, DWORD size) {
250 transform[0] = 1.50000065f;
255 .RetiresOnSaturation();
256 EXPECT_CALL(delegate,
257 OnPointerPanZoomUpdate(device_id, 2.0, 0, 1.50000065f, 0))
259 EXPECT_CALL(delegate,
260 OnPointerPanZoomUpdate(device_id, 2.0, 0, 1.50000047f, 0))
262 .RetiresOnSaturation();
263 EXPECT_CALL(delegate, OnPointerPanZoomEnd(device_id));
264 EXPECT_CALL(viewport, GetViewportRect(_))
265 .WillOnce([DISPLAY_WIDTH, DISPLAY_HEIGHT](RECT* rect) {
268 rect->right = DISPLAY_WIDTH;
269 rect->bottom = DISPLAY_HEIGHT;
272 EXPECT_CALL(viewport, ZoomToRect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT,
false))
273 .WillOnce(::testing::Return(S_OK));
274 handler->OnContentUpdated((IDirectManipulationViewport*)&viewport,
275 (IDirectManipulationContent*)&
content);
276 handler->OnContentUpdated((IDirectManipulationViewport*)&viewport,
277 (IDirectManipulationContent*)&
content);
278 handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
279 DIRECTMANIPULATION_INERTIA,
280 DIRECTMANIPULATION_RUNNING);
281 handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
282 DIRECTMANIPULATION_READY,
283 DIRECTMANIPULATION_INERTIA);
286 TEST(DirectManipulationTest, TestInertiaCancelSentForUserCancel) {
288 MockWindowBindingHandlerDelegate delegate;
290 const int DISPLAY_WIDTH = 800;
291 const int DISPLAY_HEIGHT = 600;
292 auto owner = std::make_unique<DirectManipulationOwner>(
nullptr);
293 owner->SetBindingHandlerDelegate(&delegate);
295 fml::MakeRefCounted<DirectManipulationEventHandler>(owner.get());
296 int32_t device_id = (int32_t)
reinterpret_cast<int64_t
>(handler.get());
298 EXPECT_CALL(viewport, GetViewportRect(_))
299 .WillOnce([DISPLAY_WIDTH, DISPLAY_HEIGHT](RECT* rect) {
302 rect->right = DISPLAY_WIDTH;
303 rect->bottom = DISPLAY_HEIGHT;
306 EXPECT_CALL(viewport, ZoomToRect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT,
false))
307 .WillOnce(::testing::Return(S_OK));
308 EXPECT_CALL(delegate, OnPointerPanZoomEnd(device_id));
309 handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
310 DIRECTMANIPULATION_INERTIA,
311 DIRECTMANIPULATION_RUNNING);
313 EXPECT_CALL(
content, GetContentTransform(_, 6))
314 .WillOnce([](
float* transform, DWORD size) {
320 handler->OnContentUpdated((IDirectManipulationViewport*)&viewport,
321 (IDirectManipulationContent*)&
content);
322 EXPECT_CALL(
content, GetContentTransform(_, 6))
323 .WillOnce([](
float* transform, DWORD size) {
329 handler->OnContentUpdated((IDirectManipulationViewport*)&viewport,
330 (IDirectManipulationContent*)&
content);
333 EXPECT_CALL(delegate, OnScrollInertiaCancel(device_id));
334 handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
335 DIRECTMANIPULATION_READY,
336 DIRECTMANIPULATION_INERTIA);
339 TEST(DirectManipulationTest, TestInertiaCamcelNotSentAtInertiaEnd) {
341 MockWindowBindingHandlerDelegate delegate;
343 const int DISPLAY_WIDTH = 800;
344 const int DISPLAY_HEIGHT = 600;
345 auto owner = std::make_unique<DirectManipulationOwner>(
nullptr);
346 owner->SetBindingHandlerDelegate(&delegate);
348 fml::MakeRefCounted<DirectManipulationEventHandler>(owner.get());
349 int32_t device_id = (int32_t)
reinterpret_cast<int64_t
>(handler.get());
351 EXPECT_CALL(viewport, GetViewportRect(_))
352 .WillOnce([DISPLAY_WIDTH, DISPLAY_HEIGHT](RECT* rect) {
355 rect->right = DISPLAY_WIDTH;
356 rect->bottom = DISPLAY_HEIGHT;
359 EXPECT_CALL(viewport, ZoomToRect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT,
false))
360 .WillOnce(::testing::Return(S_OK));
361 EXPECT_CALL(delegate, OnPointerPanZoomEnd(device_id));
362 handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
363 DIRECTMANIPULATION_INERTIA,
364 DIRECTMANIPULATION_RUNNING);
366 EXPECT_CALL(
content, GetContentTransform(_, 6))
367 .WillOnce([](
float* transform, DWORD size) {
373 handler->OnContentUpdated((IDirectManipulationViewport*)&viewport,
374 (IDirectManipulationContent*)&
content);
375 EXPECT_CALL(
content, GetContentTransform(_, 6))
376 .WillOnce([](
float* transform, DWORD size) {
382 handler->OnContentUpdated((IDirectManipulationViewport*)&viewport,
383 (IDirectManipulationContent*)&
content);
385 EXPECT_CALL(delegate, OnScrollInertiaCancel(device_id)).Times(0);
386 handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
387 DIRECTMANIPULATION_READY,
388 DIRECTMANIPULATION_INERTIA);
393 TEST(DirectManipulationTest, TestGestureWithInitialData) {
395 MockWindowBindingHandlerDelegate delegate;
397 const float scale = 1.5;
398 const float pan_x = 32.0;
399 const float pan_y = 16.0;
400 const int DISPLAY_WIDTH = 800;
401 const int DISPLAY_HEIGHT = 600;
402 auto owner = std::make_unique<DirectManipulationOwner>(
nullptr);
403 owner->SetBindingHandlerDelegate(&delegate);
405 fml::MakeRefCounted<DirectManipulationEventHandler>(owner.get());
406 int32_t device_id = (int32_t)
reinterpret_cast<int64_t
>(handler.get());
407 EXPECT_CALL(viewport, GetPrimaryContent(_, _))
408 .WillOnce([&
content](REFIID in,
void** out) {
412 .RetiresOnSaturation();
413 EXPECT_CALL(
content, GetContentTransform(_, 6))
414 .WillOnce([scale](
float* transform, DWORD size) {
416 transform[4] = 234.0;
417 transform[5] = 345.0;
420 .RetiresOnSaturation();
421 EXPECT_CALL(delegate, OnPointerPanZoomStart(device_id));
422 handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
423 DIRECTMANIPULATION_RUNNING,
424 DIRECTMANIPULATION_READY);
425 EXPECT_CALL(
content, GetContentTransform(_, 6))
426 .WillOnce([scale, pan_x, pan_y](
float* transform, DWORD size) {
427 transform[0] = 2.0f * scale;
428 transform[4] = 234.0 + pan_x;
429 transform[5] = 345.0 + pan_y;
432 EXPECT_CALL(delegate,
433 OnPointerPanZoomUpdate(device_id, pan_x, pan_y, scale, 0));
434 handler->OnContentUpdated((IDirectManipulationViewport*)&viewport,
435 (IDirectManipulationContent*)&
content);
436 EXPECT_CALL(delegate, OnPointerPanZoomEnd(device_id));
437 EXPECT_CALL(viewport, GetViewportRect(_))
438 .WillOnce([DISPLAY_WIDTH, DISPLAY_HEIGHT](RECT* rect) {
441 rect->right = DISPLAY_WIDTH;
442 rect->bottom = DISPLAY_HEIGHT;
445 EXPECT_CALL(viewport, ZoomToRect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT,
false))
446 .WillOnce(::testing::Return(S_OK));
447 handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
448 DIRECTMANIPULATION_INERTIA,
449 DIRECTMANIPULATION_RUNNING);
450 handler->OnViewportStatusChanged((IDirectManipulationViewport*)&viewport,
451 DIRECTMANIPULATION_READY,
452 DIRECTMANIPULATION_INERTIA);
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, QueryInterface, HRESULT(REFIID, void **))
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, GetContentTransform, HRESULT(float *, DWORD))
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, GetOutputTransform, HRESULT(float *, DWORD))
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Release, ULONG())
MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE, GetTag, HRESULT(REFIID, void **, UINT32 *))
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, SyncContentTransform, HRESULT(const float *, DWORD))
MockIDirectManipulationContent()
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, GetContentRect, HRESULT(RECT *))
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, AddRef, ULONG())
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, SetTag, HRESULT(IUnknown *, UINT32))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetContentRect, HRESULT(const RECT *))
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, GetViewport, HRESULT(REFIID, void **))
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, QueryInterface, HRESULT(REFIID, void **))
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Abandon, HRESULT())
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, AddRef, ULONG())
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetViewportRect, HRESULT(const RECT *))
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, SyncDisplayTransform, HRESULT(const float *, DWORD))
MOCK_METHOD5_WITH_CALLTYPE(STDMETHODCALLTYPE, ZoomToRect, HRESULT(const float, const float, const float, const float, BOOL))
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Enable, HRESULT())
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Disable, HRESULT())
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, RemoveEventHandler, HRESULT(DWORD))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, AddConfiguration, HRESULT(DIRECTMANIPULATION_CONFIGURATION))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetViewportOptions, HRESULT(DIRECTMANIPULATION_VIEWPORT_OPTIONS))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, RemoveContent, HRESULT(IDirectManipulationContent *))
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, SetTag, HRESULT(IUnknown *, UINT32))
MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE, GetTag, HRESULT(REFIID, void **, UINT32 *))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetInputMode, HRESULT(DIRECTMANIPULATION_INPUT_MODE))
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Stop, HRESULT())
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, SetViewportTransform, HRESULT(const float *, DWORD))
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, ReleaseAllContacts, HRESULT())
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetUpdateMode, HRESULT(DIRECTMANIPULATION_INPUT_MODE))
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, Release, ULONG())
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, ActivateConfiguration, HRESULT(DIRECTMANIPULATION_CONFIGURATION))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, RemoveConfiguration, HRESULT(DIRECTMANIPULATION_CONFIGURATION))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, AddContent, HRESULT(IDirectManipulationContent *))
MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE, AddEventHandler, HRESULT(HWND, IDirectManipulationViewportEventHandler *, DWORD *))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetChaining, HRESULT(DIRECTMANIPULATION_MOTION_TYPES))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, GetStatus, HRESULT(DIRECTMANIPULATION_STATUS *))
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, GetPrimaryContent, HRESULT(REFIID, void **))
MockIDirectManipulationViewport()
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, ReleaseContact, HRESULT(UINT32))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, GetViewportRect, HRESULT(RECT *))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetContact, HRESULT(UINT32))
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetManualGesture, HRESULT(DIRECTMANIPULATION_GESTURE_CONFIGURATION))
union flutter::testing::@100::KeyboardChange::@0 content
TEST(AccessibilityBridgeWindows, GetParent)