1 //
2 // Copyright 2014 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6
7 #include "gmock/gmock.h"
8 #include "gtest/gtest.h"
9
10 // WINAPI_FAMILY is required to be defined as WINAPI_FAMILY_PC_APP
11 // to ensure that the proper defines are set when including additional
12 // headers which rely on Windows Store specific configuration.
13 // This would normally be defined already but this unittest exe is compiled
14 // as a desktop application which results in WINAPI_FAMILY being
15 // set to WINAPI_FAMILY_DESKTOP_APP
16 #undef WINAPI_FAMILY
17 #define WINAPI_FAMILY WINAPI_FAMILY_PC_APP
18 #include <angle_windowsstore.h>
19 #include <windows.ui.xaml.h>
20 #include <windows.ui.xaml.media.dxinterop.h>
21 #include "libANGLE/renderer/d3d/d3d11/NativeWindow.h"
22
23 using namespace rx;
24 using namespace ABI::Windows::ApplicationModel::Core;
25 using namespace ABI::Windows::Foundation;
26 using namespace ABI::Windows::Foundation::Collections;
27 using namespace ABI::Windows::UI::Core;
28 using namespace ABI::Windows::System;
29 using namespace ABI::Windows::UI::Xaml::Controls;
30 using namespace ABI::Windows::UI::Xaml::Data;
31 using namespace ABI::Windows::UI::Xaml::Media;
32 using namespace ABI::Windows::UI::Xaml::Input;
33 using namespace ABI::Windows::UI::Xaml;
34
35 namespace
36 {
37
38 // Mock ISwapChainPanel
39 class MockSwapChainPanel : public ISwapChainPanel,
40 IFrameworkElement,
41 IUIElement,
42 ISwapChainPanelNative
43 {
44 public:
45 // IUnknown
STDMETHOD(QueryInterface)46 STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject)
47 {
48 *ppvObject = nullptr;
49
50 if (IsEqualIID(IID_IUnknown, riid))
51 {
52 *ppvObject = reinterpret_cast<IUnknown *>(this);
53 return S_OK;
54 }
55
56 if (IsEqualIID(IID_IInspectable, riid))
57 {
58 *ppvObject = reinterpret_cast<IInspectable *>(this);
59 return S_OK;
60 }
61
62 if (IsEqualIID(IID_ISwapChainPanel, riid))
63 {
64 *ppvObject = static_cast<ISwapChainPanel *>(this);
65 return S_OK;
66 }
67
68 if (IsEqualIID(IID_IFrameworkElement, riid))
69 {
70 *ppvObject = static_cast<IFrameworkElement *>(this);
71 return S_OK;
72 }
73
74 if (IsEqualIID(IID_IUIElement, riid))
75 {
76 *ppvObject = static_cast<IUIElement *>(this);
77 return S_OK;
78 }
79
80 if (IsEqualIID(__uuidof(ISwapChainPanelNative), riid))
81 {
82 *ppvObject = static_cast<ISwapChainPanelNative *>(this);
83 return S_OK;
84 }
85
86 return E_NOINTERFACE;
87 }
88
STDMETHOD_(ULONG,AddRef)89 STDMETHOD_(ULONG, AddRef)() { return 1; }
STDMETHOD_(ULONG,Release)90 STDMETHOD_(ULONG, Release)() { return 1; }
91
92 // IInspectable
93 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, GetIids, HRESULT(ULONG *, IID **));
94 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, GetRuntimeClassName, HRESULT(HSTRING *));
95 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, GetTrustLevel, HRESULT(TrustLevel *));
96
97 // ISwapChainPanelNative
98 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetSwapChain, HRESULT(IDXGISwapChain *));
99
100 // ISwapChainPanel
101 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_CompositionScaleX, HRESULT(FLOAT *));
102 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_CompositionScaleY, HRESULT(FLOAT *));
103 MOCK_METHOD2_WITH_CALLTYPE(
104 STDMETHODCALLTYPE,
105 add_CompositionScaleChanged,
106 HRESULT(
107 __FITypedEventHandler_2_Windows__CUI__CXaml__CControls__CSwapChainPanel_IInspectable *,
108 EventRegistrationToken *));
109 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
110 remove_CompositionScaleChanged,
111 HRESULT(EventRegistrationToken));
112 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
113 CreateCoreIndependentInputSource,
114 HRESULT(CoreInputDeviceTypes, ICoreInputSourceBase **));
115
116 // IFrameworkElement
117 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
118 get_Triggers,
119 HRESULT(__FIVector_1_Windows__CUI__CXaml__CTriggerBase **));
120 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Resources, HRESULT(IResourceDictionary **));
121 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Resources, HRESULT(IResourceDictionary *));
122 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Tag, HRESULT(IInspectable **));
123 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Tag, HRESULT(IInspectable *));
124 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Language, HRESULT(HSTRING *));
125 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Language, HRESULT(HSTRING));
126 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_ActualWidth, HRESULT(DOUBLE *));
127 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_ActualHeight, HRESULT(DOUBLE *));
128 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Width, HRESULT(DOUBLE *));
129 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Width, HRESULT(DOUBLE));
130 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Height, HRESULT(DOUBLE *));
131 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Height, HRESULT(DOUBLE));
132 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_MinWidth, HRESULT(DOUBLE *));
133 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_MinWidth, HRESULT(DOUBLE));
134 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_MaxWidth, HRESULT(DOUBLE *));
135 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_MaxWidth, HRESULT(DOUBLE));
136 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_MinHeight, HRESULT(DOUBLE *));
137 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_MinHeight, HRESULT(DOUBLE));
138 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_MaxHeight, HRESULT(DOUBLE *));
139 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_MaxHeight, HRESULT(DOUBLE));
140 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
141 get_HorizontalAlignment,
142 HRESULT(HorizontalAlignment *));
143 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
144 put_HorizontalAlignment,
145 HRESULT(HorizontalAlignment));
146 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
147 get_VerticalAlignment,
148 HRESULT(VerticalAlignment *));
149 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
150 put_VerticalAlignment,
151 HRESULT(VerticalAlignment));
152 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Margin, HRESULT(Thickness *));
153 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Margin, HRESULT(Thickness));
154 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Name, HRESULT(HSTRING *));
155 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Name, HRESULT(HSTRING));
156 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_BaseUri, HRESULT(IUriRuntimeClass **));
157 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_DataContext, HRESULT(IInspectable **));
158 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_DataContext, HRESULT(IInspectable *));
159 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Style, HRESULT(IStyle **));
160 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Style, HRESULT(IStyle *));
161 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Parent, HRESULT(IDependencyObject **));
162 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_FlowDirection, HRESULT(FlowDirection *));
163 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_FlowDirection, HRESULT(FlowDirection));
164 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
165 add_Loaded,
166 HRESULT(IRoutedEventHandler *, EventRegistrationToken *));
167 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, remove_Loaded, HRESULT(EventRegistrationToken));
168 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
169 add_Unloaded,
170 HRESULT(IRoutedEventHandler *, EventRegistrationToken *));
171 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, remove_Unloaded, HRESULT(EventRegistrationToken));
172 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
173 add_SizeChanged,
174 HRESULT(ISizeChangedEventHandler *, EventRegistrationToken *));
175 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
176 remove_SizeChanged,
177 HRESULT(EventRegistrationToken));
178 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
179 add_LayoutUpdated,
180 HRESULT(__FIEventHandler_1_IInspectable *,
181 EventRegistrationToken *));
182 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
183 remove_LayoutUpdated,
184 HRESULT(EventRegistrationToken));
185 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, FindName, HRESULT(HSTRING, IInspectable **));
186 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
187 SetBinding,
188 HRESULT(IDependencyProperty *, IBindingBase *));
189
190 // IUIElement
191 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
192 get_DesiredSize,
193 HRESULT(ABI::Windows::Foundation::Size *));
194 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_AllowDrop, HRESULT(boolean *));
195 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_AllowDrop, HRESULT(boolean));
196 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Opacity, HRESULT(DOUBLE *));
197 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Opacity, HRESULT(DOUBLE));
198 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Clip, HRESULT(IRectangleGeometry **));
199 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Clip, HRESULT(IRectangleGeometry *));
200 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_RenderTransform, HRESULT(ITransform **));
201 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_RenderTransform, HRESULT(ITransform *));
202 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Projection, HRESULT(IProjection **));
203 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Projection, HRESULT(IProjection *));
204 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_RenderTransformOrigin, HRESULT(Point *));
205 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_RenderTransformOrigin, HRESULT(Point));
206 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_IsHitTestVisible, HRESULT(boolean *));
207 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_IsHitTestVisible, HRESULT(boolean));
208 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Visibility, HRESULT(Visibility *));
209 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Visibility, HRESULT(Visibility));
210 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_RenderSize, HRESULT(Size *));
211 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_UseLayoutRounding, HRESULT(boolean *));
212 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_UseLayoutRounding, HRESULT(boolean));
213 MOCK_METHOD1_WITH_CALLTYPE(
214 STDMETHODCALLTYPE,
215 get_Transitions,
216 HRESULT(__FIVector_1_Windows__CUI__CXaml__CMedia__CAnimation__CTransition **));
217 MOCK_METHOD1_WITH_CALLTYPE(
218 STDMETHODCALLTYPE,
219 put_Transitions,
220 HRESULT(__FIVector_1_Windows__CUI__CXaml__CMedia__CAnimation__CTransition *));
221 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_CacheMode, HRESULT(ICacheMode **));
222 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_CacheMode, HRESULT(ICacheMode *));
223 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_IsTapEnabled, HRESULT(boolean *));
224 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_IsTapEnabled, HRESULT(boolean));
225 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_IsDoubleTapEnabled, HRESULT(boolean *));
226 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_IsDoubleTapEnabled, HRESULT(boolean));
227 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_IsRightTapEnabled, HRESULT(boolean *));
228 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_IsRightTapEnabled, HRESULT(boolean));
229 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_IsHoldingEnabled, HRESULT(boolean *));
230 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_IsHoldingEnabled, HRESULT(boolean));
231 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
232 get_ManipulationMode,
233 HRESULT(ManipulationModes *));
234 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_ManipulationMode, HRESULT(ManipulationModes));
235 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
236 get_PointerCaptures,
237 HRESULT(__FIVectorView_1_Windows__CUI__CXaml__CInput__CPointer **));
238 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
239 add_KeyUp,
240 HRESULT(IKeyEventHandler *, EventRegistrationToken *));
241 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, remove_KeyUp, HRESULT(EventRegistrationToken));
242 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
243 add_KeyDown,
244 HRESULT(IKeyEventHandler *, EventRegistrationToken *));
245 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, remove_KeyDown, HRESULT(EventRegistrationToken));
246 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
247 add_GotFocus,
248 HRESULT(IRoutedEventHandler *, EventRegistrationToken *));
249 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, remove_GotFocus, HRESULT(EventRegistrationToken));
250 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
251 add_LostFocus,
252 HRESULT(IRoutedEventHandler *, EventRegistrationToken *));
253 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
254 remove_LostFocus,
255 HRESULT(EventRegistrationToken));
256 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
257 add_DragEnter,
258 HRESULT(IDragEventHandler *, EventRegistrationToken *));
259 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
260 remove_DragEnter,
261 HRESULT(EventRegistrationToken));
262 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
263 add_DragLeave,
264 HRESULT(IDragEventHandler *, EventRegistrationToken *));
265 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
266 remove_DragLeave,
267 HRESULT(EventRegistrationToken));
268 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
269 add_DragOver,
270 HRESULT(IDragEventHandler *, EventRegistrationToken *));
271 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, remove_DragOver, HRESULT(EventRegistrationToken));
272 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
273 add_Drop,
274 HRESULT(IDragEventHandler *, EventRegistrationToken *));
275 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, remove_Drop, HRESULT(EventRegistrationToken));
276 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
277 add_PointerPressed,
278 HRESULT(IPointerEventHandler *, EventRegistrationToken *));
279 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
280 remove_PointerPressed,
281 HRESULT(EventRegistrationToken));
282 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
283 add_PointerMoved,
284 HRESULT(IPointerEventHandler *, EventRegistrationToken *));
285 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
286 remove_PointerMoved,
287 HRESULT(EventRegistrationToken));
288 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
289 add_PointerReleased,
290 HRESULT(IPointerEventHandler *, EventRegistrationToken *));
291 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
292 remove_PointerReleased,
293 HRESULT(EventRegistrationToken));
294 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
295 add_PointerExited,
296 HRESULT(IPointerEventHandler *, EventRegistrationToken *));
297 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
298 remove_PointerExited,
299 HRESULT(EventRegistrationToken));
300 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
301 add_PointerCaptureLost,
302 HRESULT(IPointerEventHandler *, EventRegistrationToken *));
303 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
304 remove_PointerCaptureLost,
305 HRESULT(EventRegistrationToken));
306 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
307 add_PointerCanceled,
308 HRESULT(IPointerEventHandler *, EventRegistrationToken *));
309 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
310 remove_PointerCanceled,
311 HRESULT(EventRegistrationToken));
312 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
313 add_PointerWheelChanged,
314 HRESULT(IPointerEventHandler *, EventRegistrationToken *));
315 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
316 remove_PointerWheelChanged,
317 HRESULT(EventRegistrationToken));
318 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
319 add_PointerEntered,
320 HRESULT(IPointerEventHandler *, EventRegistrationToken *));
321 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
322 remove_PointerEntered,
323 HRESULT(EventRegistrationToken));
324 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
325 add_Tapped,
326 HRESULT(ITappedEventHandler *, EventRegistrationToken *));
327 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, remove_Tapped, HRESULT(EventRegistrationToken));
328 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
329 add_DoubleTapped,
330 HRESULT(IDoubleTappedEventHandler *, EventRegistrationToken *));
331 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
332 remove_DoubleTapped,
333 HRESULT(EventRegistrationToken));
334 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
335 add_Holding,
336 HRESULT(IHoldingEventHandler *, EventRegistrationToken *));
337 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, remove_Holding, HRESULT(EventRegistrationToken));
338 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
339 add_RightTapped,
340 HRESULT(IRightTappedEventHandler *, EventRegistrationToken *));
341 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
342 remove_RightTapped,
343 HRESULT(EventRegistrationToken));
344 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
345 add_ManipulationStarting,
346 HRESULT(IManipulationStartingEventHandler *,
347 EventRegistrationToken *));
348 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
349 remove_ManipulationStarting,
350 HRESULT(EventRegistrationToken));
351 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
352 add_ManipulationInertiaStarting,
353 HRESULT(IManipulationInertiaStartingEventHandler *,
354 EventRegistrationToken *));
355 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
356 remove_ManipulationInertiaStarting,
357 HRESULT(EventRegistrationToken));
358 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
359 add_ManipulationStarted,
360 HRESULT(IManipulationStartedEventHandler *,
361 EventRegistrationToken *));
362 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
363 remove_ManipulationStarted,
364 HRESULT(EventRegistrationToken));
365 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
366 add_ManipulationDelta,
367 HRESULT(IManipulationDeltaEventHandler *, EventRegistrationToken *));
368 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
369 remove_ManipulationDelta,
370 HRESULT(EventRegistrationToken));
371 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
372 add_ManipulationCompleted,
373 HRESULT(IManipulationCompletedEventHandler *,
374 EventRegistrationToken *));
375 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
376 remove_ManipulationCompleted,
377 HRESULT(EventRegistrationToken));
378 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, Measure, HRESULT(Size));
379 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, Arrange, HRESULT(Rect));
380 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, CapturePointer, HRESULT(IPointer *, boolean *));
381 MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, ReleasePointerCapture, HRESULT(IPointer *));
382 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, ReleasePointerCaptures, HRESULT());
383 MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE,
384 AddHandler,
385 HRESULT(IRoutedEvent *, IInspectable *, boolean));
386 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
387 RemoveHandler,
388 HRESULT(IRoutedEvent *, IInspectable *));
389 MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
390 TransformToVisual,
391 HRESULT(IUIElement *, IGeneralTransform **));
392 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, InvalidateMeasure, HRESULT());
393 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, InvalidateArrange, HRESULT());
394 MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, UpdateLayout, HRESULT());
395 };
396
CreatePropertyMap(IMap<HSTRING,IInspectable * > ** propertyMap)397 HRESULT CreatePropertyMap(IMap<HSTRING, IInspectable *> **propertyMap)
398 {
399 HRESULT result = S_OK;
400 ComPtr<IPropertySet> propertySet;
401 ComPtr<IActivationFactory> propertySetFactory;
402 result = GetActivationFactory(
403 HStringReference(RuntimeClass_Windows_Foundation_Collections_PropertySet).Get(),
404 &propertySetFactory);
405 EXPECT_HRESULT_SUCCEEDED(result);
406
407 result = propertySetFactory->ActivateInstance(&propertySet);
408 EXPECT_HRESULT_SUCCEEDED(result);
409
410 result = propertySet.CopyTo(propertyMap);
411 EXPECT_HRESULT_SUCCEEDED(result);
412
413 return result;
414 }
415
CreatePropertyValueStatics(IPropertyValueStatics ** propertyStatics)416 HRESULT CreatePropertyValueStatics(IPropertyValueStatics **propertyStatics)
417 {
418 ComPtr<IPropertyValueStatics> propertyValueStatics;
419 HRESULT result =
420 GetActivationFactory(HStringReference(RuntimeClass_Windows_Foundation_PropertyValue).Get(),
421 &propertyValueStatics);
422 EXPECT_HRESULT_SUCCEEDED(result);
423
424 result = propertyValueStatics.CopyTo(propertyStatics);
425 EXPECT_HRESULT_SUCCEEDED(result);
426
427 return result;
428 }
429
SetInspectablePropertyValue(const ComPtr<IMap<HSTRING,IInspectable * >> & propertyMap,const wchar_t * propertyName,IInspectable * inspectable)430 HRESULT SetInspectablePropertyValue(const ComPtr<IMap<HSTRING, IInspectable *>> &propertyMap,
431 const wchar_t *propertyName,
432 IInspectable *inspectable)
433 {
434 boolean propertyReplaced = false;
435 return propertyMap->Insert(HStringReference(propertyName).Get(), inspectable,
436 &propertyReplaced);
437 }
438
expectNativeWindowInitCalls(MockSwapChainPanel & panel,bool expectRenderSize)439 void expectNativeWindowInitCalls(MockSwapChainPanel &panel, bool expectRenderSize)
440 {
441 if (expectRenderSize)
442 {
443 EXPECT_CALL(panel, get_RenderSize(testing::_)).Times(1);
444 }
445
446 EXPECT_CALL(panel, add_SizeChanged(testing::_, testing::_)).Times(1);
447 EXPECT_CALL(panel, remove_SizeChanged(testing::_)).Times(1);
448 }
449
TEST(NativeWindowTest,SwapChainPanelByItself)450 TEST(NativeWindowTest, SwapChainPanelByItself)
451 {
452 MockSwapChainPanel mockSwapChainPanel;
453 NativeWindow nativeWindow(reinterpret_cast<IInspectable *>(&mockSwapChainPanel));
454 expectNativeWindowInitCalls(mockSwapChainPanel, true);
455 EXPECT_TRUE(nativeWindow.initialize());
456 }
457
TEST(NativeWindowTest,SwapChainPanelInPropertySet)458 TEST(NativeWindowTest, SwapChainPanelInPropertySet)
459 {
460 // COM is required to be initialized for creation of the property set
461 EXPECT_HRESULT_SUCCEEDED(CoInitializeEx(nullptr, COINIT_MULTITHREADED));
462 {
463 MockSwapChainPanel mockSwapChainPanel;
464 ComPtr<IMap<HSTRING, IInspectable *>> propertySet;
465
466 // Create a simple property set with the swapchainpanel
467 EXPECT_HRESULT_SUCCEEDED(CreatePropertyMap(&propertySet));
468 EXPECT_HRESULT_SUCCEEDED(
469 SetInspectablePropertyValue(propertySet, EGLNativeWindowTypeProperty,
470 reinterpret_cast<IInspectable *>(&mockSwapChainPanel)));
471
472 // Check native window init calls
473 NativeWindow nativeWindow(propertySet.Get());
474 expectNativeWindowInitCalls(mockSwapChainPanel, true);
475 EXPECT_TRUE(nativeWindow.initialize());
476 }
477 CoUninitialize();
478 }
479
TEST(NativeWindowTest,SwapChainPanelInPropertySetWithSizeAndScale)480 TEST(NativeWindowTest, SwapChainPanelInPropertySetWithSizeAndScale)
481 {
482 // COM is required to be initialized for creation of the property set
483 EXPECT_HRESULT_SUCCEEDED(CoInitializeEx(nullptr, COINIT_MULTITHREADED));
484 {
485 MockSwapChainPanel mockSwapChainPanel;
486 ComPtr<IMap<HSTRING, IInspectable *>> propertySet;
487 ComPtr<IPropertyValueStatics> propertyValueStatics;
488 ComPtr<IPropertyValue> singleValue;
489 ComPtr<IPropertyValue> sizeValue;
490
491 // Create a simple property set with the swapchainpanel
492 EXPECT_HRESULT_SUCCEEDED(CreatePropertyMap(&propertySet));
493 EXPECT_HRESULT_SUCCEEDED(
494 SetInspectablePropertyValue(propertySet, EGLNativeWindowTypeProperty,
495 reinterpret_cast<IInspectable *>(&mockSwapChainPanel)));
496
497 // Add a valid scale factor to the property set
498 EXPECT_HRESULT_SUCCEEDED(CreatePropertyValueStatics(propertyValueStatics.GetAddressOf()));
499 propertyValueStatics->CreateSingle(
500 0.5f, reinterpret_cast<IInspectable **>(singleValue.GetAddressOf()));
501 EXPECT_HRESULT_SUCCEEDED(
502 SetInspectablePropertyValue(propertySet, EGLRenderResolutionScaleProperty,
503 reinterpret_cast<IInspectable *>(singleValue.Get())));
504
505 // Add a valid size to the property set
506 EXPECT_HRESULT_SUCCEEDED(CreatePropertyValueStatics(propertyValueStatics.GetAddressOf()));
507 propertyValueStatics->CreateSize(
508 {480, 800}, reinterpret_cast<IInspectable **>(sizeValue.GetAddressOf()));
509 EXPECT_HRESULT_SUCCEEDED(
510 SetInspectablePropertyValue(propertySet, EGLRenderSurfaceSizeProperty,
511 reinterpret_cast<IInspectable *>(sizeValue.Get())));
512
513 // Check native window init fails, since we shouldn't be able to set a size and a scale
514 // together
515 NativeWindow nativeWindow(propertySet.Get());
516 EXPECT_FALSE(nativeWindow.initialize());
517 }
518 CoUninitialize();
519 }
520
521 // Tests that the scale property works as expected in a property set with a SwapChainPanel
522 class SwapChainPanelScaleTest : public testing::TestWithParam<std::pair<float, bool>>
523 {};
524
TEST_P(SwapChainPanelScaleTest,ValidateScale)525 TEST_P(SwapChainPanelScaleTest, ValidateScale)
526 {
527 float scale = GetParam().first;
528 bool expectedResult = GetParam().second;
529
530 // COM is required to be initialized for creation of the property set
531 EXPECT_HRESULT_SUCCEEDED(CoInitializeEx(nullptr, COINIT_MULTITHREADED));
532 {
533 MockSwapChainPanel mockSwapChainPanel;
534 ComPtr<IMap<HSTRING, IInspectable *>> propertySet;
535 ComPtr<IPropertyValueStatics> propertyValueStatics;
536 ComPtr<IPropertyValue> singleValue;
537
538 // Create a simple property set
539 EXPECT_HRESULT_SUCCEEDED(CreatePropertyMap(&propertySet));
540 EXPECT_HRESULT_SUCCEEDED(
541 SetInspectablePropertyValue(propertySet, EGLNativeWindowTypeProperty,
542 reinterpret_cast<IInspectable *>(&mockSwapChainPanel)));
543
544 // Add a valid scale factor to the property set
545 EXPECT_HRESULT_SUCCEEDED(CreatePropertyValueStatics(propertyValueStatics.GetAddressOf()));
546 propertyValueStatics->CreateSingle(
547 scale, reinterpret_cast<IInspectable **>(singleValue.GetAddressOf()));
548 EXPECT_HRESULT_SUCCEEDED(
549 SetInspectablePropertyValue(propertySet, EGLRenderResolutionScaleProperty,
550 reinterpret_cast<IInspectable *>(singleValue.Get())));
551
552 // Check native window init status and calls to the mock swapchainpanel
553 NativeWindow nativeWindow(propertySet.Get());
554 if (expectedResult)
555 {
556 expectNativeWindowInitCalls(mockSwapChainPanel, true);
557 }
558
559 EXPECT_EQ(nativeWindow.initialize(), expectedResult);
560 }
561 CoUninitialize();
562 }
563
564 typedef std::pair<float, bool> scaleValidPair;
565 static const scaleValidPair scales[] = {scaleValidPair(1.0f, true), scaleValidPair(0.5f, true),
566 scaleValidPair(0.0f, false), scaleValidPair(0.01f, true),
567 scaleValidPair(2.00f, true)};
568
569 INSTANTIATE_TEST_SUITE_P(NativeWindowTest, SwapChainPanelScaleTest, testing::ValuesIn(scales));
570
571 // Tests that the size property works as expected in a property set with a SwapChainPanel
572 class SwapChainPanelSizeTest : public testing::TestWithParam<std::tuple<float, float, bool>>
573 {};
574
TEST_P(SwapChainPanelSizeTest,ValidateSize)575 TEST_P(SwapChainPanelSizeTest, ValidateSize)
576 {
577 Size renderSize = {std::get<0>(GetParam()), std::get<1>(GetParam())};
578 bool expectedResult = std::get<2>(GetParam());
579
580 // COM is required to be initialized for creation of the property set
581 EXPECT_HRESULT_SUCCEEDED(CoInitializeEx(nullptr, COINIT_MULTITHREADED));
582 {
583 MockSwapChainPanel mockSwapChainPanel;
584 ComPtr<IMap<HSTRING, IInspectable *>> propertySet;
585 ComPtr<IPropertyValueStatics> propertyValueStatics;
586 ComPtr<IPropertyValue> sizeValue;
587
588 // Create a simple property set
589 EXPECT_HRESULT_SUCCEEDED(CreatePropertyMap(&propertySet));
590 EXPECT_HRESULT_SUCCEEDED(
591 SetInspectablePropertyValue(propertySet, EGLNativeWindowTypeProperty,
592 reinterpret_cast<IInspectable *>(&mockSwapChainPanel)));
593
594 // Add a valid size to the property set
595 EXPECT_HRESULT_SUCCEEDED(CreatePropertyValueStatics(propertyValueStatics.GetAddressOf()));
596 propertyValueStatics->CreateSize(
597 renderSize, reinterpret_cast<IInspectable **>(sizeValue.GetAddressOf()));
598 EXPECT_HRESULT_SUCCEEDED(
599 SetInspectablePropertyValue(propertySet, EGLRenderSurfaceSizeProperty,
600 reinterpret_cast<IInspectable *>(sizeValue.Get())));
601
602 // Check native window init status and calls to the mock swapchainpanel
603 NativeWindow nativeWindow(propertySet.Get());
604 if (expectedResult)
605 {
606 expectNativeWindowInitCalls(mockSwapChainPanel, false);
607 }
608
609 EXPECT_EQ(nativeWindow.initialize(), expectedResult);
610 }
611 CoUninitialize();
612 }
613
614 typedef std::tuple<float, float, bool> sizeValidPair;
615 static const sizeValidPair sizes[] = {sizeValidPair(800, 480, true), sizeValidPair(0, 480, false),
616 sizeValidPair(800, 0, false), sizeValidPair(0, 0, false)};
617
618 INSTANTIATE_TEST_SUITE_P(NativeWindowTest, SwapChainPanelSizeTest, testing::ValuesIn(sizes));
619
620 } // namespace
621