blob: e621a3fe5a9a5a967aa6564efd3bc9d998c6ffac [file] [log] [blame]
//
// Copyright 2014 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
#include "gmock/gmock.h"
#include "gtest/gtest.h"
// WINAPI_FAMILY is required to be defined as WINAPI_FAMILY_PC_APP
// to ensure that the proper defines are set when including additional
// headers which rely on Windows Store specific configuration.
// This would normally be defined already but this unittest exe is compiled
// as a desktop application which results in WINAPI_FAMILY being
// set to WINAPI_FAMILY_DESKTOP_APP
#undef WINAPI_FAMILY
#define WINAPI_FAMILY WINAPI_FAMILY_PC_APP
#include <angle_windowsstore.h>
#include <windows.ui.xaml.h>
#include <windows.ui.xaml.media.dxinterop.h>
#include "libANGLE/renderer/d3d/d3d11/NativeWindow.h"
using namespace rx;
using namespace ABI::Windows::ApplicationModel::Core;
using namespace ABI::Windows::Foundation;
using namespace ABI::Windows::Foundation::Collections;
using namespace ABI::Windows::UI::Core;
using namespace ABI::Windows::System;
using namespace ABI::Windows::UI::Xaml::Controls;
using namespace ABI::Windows::UI::Xaml::Data;
using namespace ABI::Windows::UI::Xaml::Media;
using namespace ABI::Windows::UI::Xaml::Input;
using namespace ABI::Windows::UI::Xaml;
namespace
{
// Mock ISwapChainPanel
class MockSwapChainPanel : public ISwapChainPanel,
IFrameworkElement,
IUIElement,
ISwapChainPanelNative
{
public:
// IUnknown
STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject)
{
*ppvObject = nullptr;
if (IsEqualIID(IID_IUnknown, riid))
{
*ppvObject = reinterpret_cast<IUnknown *>(this);
return S_OK;
}
if (IsEqualIID(IID_IInspectable, riid))
{
*ppvObject = reinterpret_cast<IInspectable *>(this);
return S_OK;
}
if (IsEqualIID(IID_ISwapChainPanel, riid))
{
*ppvObject = static_cast<ISwapChainPanel *>(this);
return S_OK;
}
if (IsEqualIID(IID_IFrameworkElement, riid))
{
*ppvObject = static_cast<IFrameworkElement *>(this);
return S_OK;
}
if (IsEqualIID(IID_IUIElement, riid))
{
*ppvObject = static_cast<IUIElement *>(this);
return S_OK;
}
if (IsEqualIID(__uuidof(ISwapChainPanelNative), riid))
{
*ppvObject = static_cast<ISwapChainPanelNative *>(this);
return S_OK;
}
return E_NOINTERFACE;
}
STDMETHOD_(ULONG, AddRef)() { return 1; }
STDMETHOD_(ULONG, Release)() { return 1; }
// IInspectable
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, GetIids, HRESULT(ULONG *, IID **));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, GetRuntimeClassName, HRESULT(HSTRING *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, GetTrustLevel, HRESULT(TrustLevel *));
// ISwapChainPanelNative
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, SetSwapChain, HRESULT(IDXGISwapChain *));
// ISwapChainPanel
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_CompositionScaleX, HRESULT(FLOAT *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_CompositionScaleY, HRESULT(FLOAT *));
MOCK_METHOD2_WITH_CALLTYPE(
STDMETHODCALLTYPE,
add_CompositionScaleChanged,
HRESULT(
__FITypedEventHandler_2_Windows__CUI__CXaml__CControls__CSwapChainPanel_IInspectable *,
EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_CompositionScaleChanged,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
CreateCoreIndependentInputSource,
HRESULT(CoreInputDeviceTypes, ICoreInputSourceBase **));
// IFrameworkElement
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
get_Triggers,
HRESULT(__FIVector_1_Windows__CUI__CXaml__CTriggerBase **));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Resources, HRESULT(IResourceDictionary **));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Resources, HRESULT(IResourceDictionary *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Tag, HRESULT(IInspectable **));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Tag, HRESULT(IInspectable *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Language, HRESULT(HSTRING *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Language, HRESULT(HSTRING));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_ActualWidth, HRESULT(DOUBLE *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_ActualHeight, HRESULT(DOUBLE *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Width, HRESULT(DOUBLE *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Width, HRESULT(DOUBLE));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Height, HRESULT(DOUBLE *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Height, HRESULT(DOUBLE));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_MinWidth, HRESULT(DOUBLE *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_MinWidth, HRESULT(DOUBLE));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_MaxWidth, HRESULT(DOUBLE *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_MaxWidth, HRESULT(DOUBLE));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_MinHeight, HRESULT(DOUBLE *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_MinHeight, HRESULT(DOUBLE));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_MaxHeight, HRESULT(DOUBLE *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_MaxHeight, HRESULT(DOUBLE));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
get_HorizontalAlignment,
HRESULT(HorizontalAlignment *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
put_HorizontalAlignment,
HRESULT(HorizontalAlignment));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
get_VerticalAlignment,
HRESULT(VerticalAlignment *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
put_VerticalAlignment,
HRESULT(VerticalAlignment));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Margin, HRESULT(Thickness *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Margin, HRESULT(Thickness));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Name, HRESULT(HSTRING *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Name, HRESULT(HSTRING));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_BaseUri, HRESULT(IUriRuntimeClass **));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_DataContext, HRESULT(IInspectable **));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_DataContext, HRESULT(IInspectable *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Style, HRESULT(IStyle **));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Style, HRESULT(IStyle *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Parent, HRESULT(IDependencyObject **));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_FlowDirection, HRESULT(FlowDirection *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_FlowDirection, HRESULT(FlowDirection));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_Loaded,
HRESULT(IRoutedEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, remove_Loaded, HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_Unloaded,
HRESULT(IRoutedEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, remove_Unloaded, HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_SizeChanged,
HRESULT(ISizeChangedEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_SizeChanged,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_LayoutUpdated,
HRESULT(__FIEventHandler_1_IInspectable *,
EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_LayoutUpdated,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, FindName, HRESULT(HSTRING, IInspectable **));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
SetBinding,
HRESULT(IDependencyProperty *, IBindingBase *));
// IUIElement
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
get_DesiredSize,
HRESULT(ABI::Windows::Foundation::Size *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_AllowDrop, HRESULT(boolean *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_AllowDrop, HRESULT(boolean));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Opacity, HRESULT(DOUBLE *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Opacity, HRESULT(DOUBLE));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Clip, HRESULT(IRectangleGeometry **));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Clip, HRESULT(IRectangleGeometry *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_RenderTransform, HRESULT(ITransform **));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_RenderTransform, HRESULT(ITransform *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Projection, HRESULT(IProjection **));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Projection, HRESULT(IProjection *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_RenderTransformOrigin, HRESULT(Point *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_RenderTransformOrigin, HRESULT(Point));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_IsHitTestVisible, HRESULT(boolean *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_IsHitTestVisible, HRESULT(boolean));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_Visibility, HRESULT(Visibility *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_Visibility, HRESULT(Visibility));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_RenderSize, HRESULT(Size *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_UseLayoutRounding, HRESULT(boolean *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_UseLayoutRounding, HRESULT(boolean));
MOCK_METHOD1_WITH_CALLTYPE(
STDMETHODCALLTYPE,
get_Transitions,
HRESULT(__FIVector_1_Windows__CUI__CXaml__CMedia__CAnimation__CTransition **));
MOCK_METHOD1_WITH_CALLTYPE(
STDMETHODCALLTYPE,
put_Transitions,
HRESULT(__FIVector_1_Windows__CUI__CXaml__CMedia__CAnimation__CTransition *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_CacheMode, HRESULT(ICacheMode **));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_CacheMode, HRESULT(ICacheMode *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_IsTapEnabled, HRESULT(boolean *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_IsTapEnabled, HRESULT(boolean));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_IsDoubleTapEnabled, HRESULT(boolean *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_IsDoubleTapEnabled, HRESULT(boolean));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_IsRightTapEnabled, HRESULT(boolean *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_IsRightTapEnabled, HRESULT(boolean));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, get_IsHoldingEnabled, HRESULT(boolean *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_IsHoldingEnabled, HRESULT(boolean));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
get_ManipulationMode,
HRESULT(ManipulationModes *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, put_ManipulationMode, HRESULT(ManipulationModes));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
get_PointerCaptures,
HRESULT(__FIVectorView_1_Windows__CUI__CXaml__CInput__CPointer **));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_KeyUp,
HRESULT(IKeyEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, remove_KeyUp, HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_KeyDown,
HRESULT(IKeyEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, remove_KeyDown, HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_GotFocus,
HRESULT(IRoutedEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, remove_GotFocus, HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_LostFocus,
HRESULT(IRoutedEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_LostFocus,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_DragEnter,
HRESULT(IDragEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_DragEnter,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_DragLeave,
HRESULT(IDragEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_DragLeave,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_DragOver,
HRESULT(IDragEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, remove_DragOver, HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_Drop,
HRESULT(IDragEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, remove_Drop, HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_PointerPressed,
HRESULT(IPointerEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_PointerPressed,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_PointerMoved,
HRESULT(IPointerEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_PointerMoved,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_PointerReleased,
HRESULT(IPointerEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_PointerReleased,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_PointerExited,
HRESULT(IPointerEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_PointerExited,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_PointerCaptureLost,
HRESULT(IPointerEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_PointerCaptureLost,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_PointerCanceled,
HRESULT(IPointerEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_PointerCanceled,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_PointerWheelChanged,
HRESULT(IPointerEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_PointerWheelChanged,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_PointerEntered,
HRESULT(IPointerEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_PointerEntered,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_Tapped,
HRESULT(ITappedEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, remove_Tapped, HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_DoubleTapped,
HRESULT(IDoubleTappedEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_DoubleTapped,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_Holding,
HRESULT(IHoldingEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, remove_Holding, HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_RightTapped,
HRESULT(IRightTappedEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_RightTapped,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_ManipulationStarting,
HRESULT(IManipulationStartingEventHandler *,
EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_ManipulationStarting,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_ManipulationInertiaStarting,
HRESULT(IManipulationInertiaStartingEventHandler *,
EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_ManipulationInertiaStarting,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_ManipulationStarted,
HRESULT(IManipulationStartedEventHandler *,
EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_ManipulationStarted,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_ManipulationDelta,
HRESULT(IManipulationDeltaEventHandler *, EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_ManipulationDelta,
HRESULT(EventRegistrationToken));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
add_ManipulationCompleted,
HRESULT(IManipulationCompletedEventHandler *,
EventRegistrationToken *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE,
remove_ManipulationCompleted,
HRESULT(EventRegistrationToken));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, Measure, HRESULT(Size));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, Arrange, HRESULT(Rect));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE, CapturePointer, HRESULT(IPointer *, boolean *));
MOCK_METHOD1_WITH_CALLTYPE(STDMETHODCALLTYPE, ReleasePointerCapture, HRESULT(IPointer *));
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, ReleasePointerCaptures, HRESULT());
MOCK_METHOD3_WITH_CALLTYPE(STDMETHODCALLTYPE,
AddHandler,
HRESULT(IRoutedEvent *, IInspectable *, boolean));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
RemoveHandler,
HRESULT(IRoutedEvent *, IInspectable *));
MOCK_METHOD2_WITH_CALLTYPE(STDMETHODCALLTYPE,
TransformToVisual,
HRESULT(IUIElement *, IGeneralTransform **));
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, InvalidateMeasure, HRESULT());
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, InvalidateArrange, HRESULT());
MOCK_METHOD0_WITH_CALLTYPE(STDMETHODCALLTYPE, UpdateLayout, HRESULT());
};
HRESULT CreatePropertyMap(IMap<HSTRING, IInspectable *> **propertyMap)
{
HRESULT result = S_OK;
ComPtr<IPropertySet> propertySet;
ComPtr<IActivationFactory> propertySetFactory;
result = GetActivationFactory(
HStringReference(RuntimeClass_Windows_Foundation_Collections_PropertySet).Get(),
&propertySetFactory);
EXPECT_HRESULT_SUCCEEDED(result);
result = propertySetFactory->ActivateInstance(&propertySet);
EXPECT_HRESULT_SUCCEEDED(result);
result = propertySet.CopyTo(propertyMap);
EXPECT_HRESULT_SUCCEEDED(result);
return result;
}
HRESULT CreatePropertyValueStatics(IPropertyValueStatics **propertyStatics)
{
ComPtr<IPropertyValueStatics> propertyValueStatics;
HRESULT result =
GetActivationFactory(HStringReference(RuntimeClass_Windows_Foundation_PropertyValue).Get(),
&propertyValueStatics);
EXPECT_HRESULT_SUCCEEDED(result);
result = propertyValueStatics.CopyTo(propertyStatics);
EXPECT_HRESULT_SUCCEEDED(result);
return result;
}
HRESULT SetInspectablePropertyValue(const ComPtr<IMap<HSTRING, IInspectable *>> &propertyMap,
const wchar_t *propertyName,
IInspectable *inspectable)
{
boolean propertyReplaced = false;
return propertyMap->Insert(HStringReference(propertyName).Get(), inspectable,
&propertyReplaced);
}
void expectNativeWindowInitCalls(MockSwapChainPanel &panel, bool expectRenderSize)
{
if (expectRenderSize)
{
EXPECT_CALL(panel, get_RenderSize(testing::_)).Times(1);
}
EXPECT_CALL(panel, add_SizeChanged(testing::_, testing::_)).Times(1);
EXPECT_CALL(panel, remove_SizeChanged(testing::_)).Times(1);
}
TEST(NativeWindowTest, SwapChainPanelByItself)
{
MockSwapChainPanel mockSwapChainPanel;
NativeWindow nativeWindow(reinterpret_cast<IInspectable *>(&mockSwapChainPanel));
expectNativeWindowInitCalls(mockSwapChainPanel, true);
EXPECT_TRUE(nativeWindow.initialize());
}
TEST(NativeWindowTest, SwapChainPanelInPropertySet)
{
// COM is required to be initialized for creation of the property set
EXPECT_HRESULT_SUCCEEDED(CoInitializeEx(nullptr, COINIT_MULTITHREADED));
{
MockSwapChainPanel mockSwapChainPanel;
ComPtr<IMap<HSTRING, IInspectable *>> propertySet;
// Create a simple property set with the swapchainpanel
EXPECT_HRESULT_SUCCEEDED(CreatePropertyMap(&propertySet));
EXPECT_HRESULT_SUCCEEDED(
SetInspectablePropertyValue(propertySet, EGLNativeWindowTypeProperty,
reinterpret_cast<IInspectable *>(&mockSwapChainPanel)));
// Check native window init calls
NativeWindow nativeWindow(propertySet.Get());
expectNativeWindowInitCalls(mockSwapChainPanel, true);
EXPECT_TRUE(nativeWindow.initialize());
}
CoUninitialize();
}
TEST(NativeWindowTest, SwapChainPanelInPropertySetWithSizeAndScale)
{
// COM is required to be initialized for creation of the property set
EXPECT_HRESULT_SUCCEEDED(CoInitializeEx(nullptr, COINIT_MULTITHREADED));
{
MockSwapChainPanel mockSwapChainPanel;
ComPtr<IMap<HSTRING, IInspectable *>> propertySet;
ComPtr<IPropertyValueStatics> propertyValueStatics;
ComPtr<IPropertyValue> singleValue;
ComPtr<IPropertyValue> sizeValue;
// Create a simple property set with the swapchainpanel
EXPECT_HRESULT_SUCCEEDED(CreatePropertyMap(&propertySet));
EXPECT_HRESULT_SUCCEEDED(
SetInspectablePropertyValue(propertySet, EGLNativeWindowTypeProperty,
reinterpret_cast<IInspectable *>(&mockSwapChainPanel)));
// Add a valid scale factor to the property set
EXPECT_HRESULT_SUCCEEDED(CreatePropertyValueStatics(propertyValueStatics.GetAddressOf()));
propertyValueStatics->CreateSingle(
0.5f, reinterpret_cast<IInspectable **>(singleValue.GetAddressOf()));
EXPECT_HRESULT_SUCCEEDED(
SetInspectablePropertyValue(propertySet, EGLRenderResolutionScaleProperty,
reinterpret_cast<IInspectable *>(singleValue.Get())));
// Add a valid size to the property set
EXPECT_HRESULT_SUCCEEDED(CreatePropertyValueStatics(propertyValueStatics.GetAddressOf()));
propertyValueStatics->CreateSize(
{480, 800}, reinterpret_cast<IInspectable **>(sizeValue.GetAddressOf()));
EXPECT_HRESULT_SUCCEEDED(
SetInspectablePropertyValue(propertySet, EGLRenderSurfaceSizeProperty,
reinterpret_cast<IInspectable *>(sizeValue.Get())));
// Check native window init fails, since we shouldn't be able to set a size and a scale
// together
NativeWindow nativeWindow(propertySet.Get());
EXPECT_FALSE(nativeWindow.initialize());
}
CoUninitialize();
}
// Tests that the scale property works as expected in a property set with a SwapChainPanel
class SwapChainPanelScaleTest : public testing::TestWithParam<std::pair<float, bool>>
{};
TEST_P(SwapChainPanelScaleTest, ValidateScale)
{
float scale = GetParam().first;
bool expectedResult = GetParam().second;
// COM is required to be initialized for creation of the property set
EXPECT_HRESULT_SUCCEEDED(CoInitializeEx(nullptr, COINIT_MULTITHREADED));
{
MockSwapChainPanel mockSwapChainPanel;
ComPtr<IMap<HSTRING, IInspectable *>> propertySet;
ComPtr<IPropertyValueStatics> propertyValueStatics;
ComPtr<IPropertyValue> singleValue;
// Create a simple property set
EXPECT_HRESULT_SUCCEEDED(CreatePropertyMap(&propertySet));
EXPECT_HRESULT_SUCCEEDED(
SetInspectablePropertyValue(propertySet, EGLNativeWindowTypeProperty,
reinterpret_cast<IInspectable *>(&mockSwapChainPanel)));
// Add a valid scale factor to the property set
EXPECT_HRESULT_SUCCEEDED(CreatePropertyValueStatics(propertyValueStatics.GetAddressOf()));
propertyValueStatics->CreateSingle(
scale, reinterpret_cast<IInspectable **>(singleValue.GetAddressOf()));
EXPECT_HRESULT_SUCCEEDED(
SetInspectablePropertyValue(propertySet, EGLRenderResolutionScaleProperty,
reinterpret_cast<IInspectable *>(singleValue.Get())));
// Check native window init status and calls to the mock swapchainpanel
NativeWindow nativeWindow(propertySet.Get());
if (expectedResult)
{
expectNativeWindowInitCalls(mockSwapChainPanel, true);
}
EXPECT_EQ(nativeWindow.initialize(), expectedResult);
}
CoUninitialize();
}
typedef std::pair<float, bool> scaleValidPair;
static const scaleValidPair scales[] = {scaleValidPair(1.0f, true), scaleValidPair(0.5f, true),
scaleValidPair(0.0f, false), scaleValidPair(0.01f, true),
scaleValidPair(2.00f, true)};
INSTANTIATE_TEST_SUITE_P(NativeWindowTest, SwapChainPanelScaleTest, testing::ValuesIn(scales));
// Tests that the size property works as expected in a property set with a SwapChainPanel
class SwapChainPanelSizeTest : public testing::TestWithParam<std::tuple<float, float, bool>>
{};
TEST_P(SwapChainPanelSizeTest, ValidateSize)
{
Size renderSize = {std::get<0>(GetParam()), std::get<1>(GetParam())};
bool expectedResult = std::get<2>(GetParam());
// COM is required to be initialized for creation of the property set
EXPECT_HRESULT_SUCCEEDED(CoInitializeEx(nullptr, COINIT_MULTITHREADED));
{
MockSwapChainPanel mockSwapChainPanel;
ComPtr<IMap<HSTRING, IInspectable *>> propertySet;
ComPtr<IPropertyValueStatics> propertyValueStatics;
ComPtr<IPropertyValue> sizeValue;
// Create a simple property set
EXPECT_HRESULT_SUCCEEDED(CreatePropertyMap(&propertySet));
EXPECT_HRESULT_SUCCEEDED(
SetInspectablePropertyValue(propertySet, EGLNativeWindowTypeProperty,
reinterpret_cast<IInspectable *>(&mockSwapChainPanel)));
// Add a valid size to the property set
EXPECT_HRESULT_SUCCEEDED(CreatePropertyValueStatics(propertyValueStatics.GetAddressOf()));
propertyValueStatics->CreateSize(
renderSize, reinterpret_cast<IInspectable **>(sizeValue.GetAddressOf()));
EXPECT_HRESULT_SUCCEEDED(
SetInspectablePropertyValue(propertySet, EGLRenderSurfaceSizeProperty,
reinterpret_cast<IInspectable *>(sizeValue.Get())));
// Check native window init status and calls to the mock swapchainpanel
NativeWindow nativeWindow(propertySet.Get());
if (expectedResult)
{
expectNativeWindowInitCalls(mockSwapChainPanel, false);
}
EXPECT_EQ(nativeWindow.initialize(), expectedResult);
}
CoUninitialize();
}
typedef std::tuple<float, float, bool> sizeValidPair;
static const sizeValidPair sizes[] = {sizeValidPair(800, 480, true), sizeValidPair(0, 480, false),
sizeValidPair(800, 0, false), sizeValidPair(0, 0, false)};
INSTANTIATE_TEST_SUITE_P(NativeWindowTest, SwapChainPanelSizeTest, testing::ValuesIn(sizes));
} // namespace