• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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