|
|
@@ -8,65 +8,118 @@ namespace Avalonia.UnitTests
|
|
|
{
|
|
|
public class MockWindowingPlatform : IWindowingPlatform
|
|
|
{
|
|
|
+ private static readonly Size s_screenSize = new Size(1280, 1024);
|
|
|
private readonly Func<IWindowImpl> _windowImpl;
|
|
|
- private readonly Func<IPopupImpl> _popupImpl;
|
|
|
+ private readonly Func<IWindowBaseImpl, IPopupImpl> _popupImpl;
|
|
|
|
|
|
- public MockWindowingPlatform(Func<IWindowImpl> windowImpl = null, Func<IPopupImpl> popupImpl = null )
|
|
|
+ public MockWindowingPlatform(
|
|
|
+ Func<IWindowImpl> windowImpl = null,
|
|
|
+ Func<IWindowBaseImpl, IPopupImpl> popupImpl = null )
|
|
|
{
|
|
|
_windowImpl = windowImpl;
|
|
|
_popupImpl = popupImpl;
|
|
|
}
|
|
|
|
|
|
- public static Mock<IWindowImpl> CreateWindowMock(Func<IPopupImpl> popupImpl = null)
|
|
|
+ public static Mock<IWindowImpl> CreateWindowMock()
|
|
|
{
|
|
|
- var win = Mock.Of<IWindowImpl>(x => x.Scaling == 1);
|
|
|
- var mock = Mock.Get(win);
|
|
|
- mock.Setup(x => x.Show()).Callback(() =>
|
|
|
+ var windowImpl = new Mock<IWindowImpl>();
|
|
|
+ var position = new PixelPoint();
|
|
|
+ var clientSize = new Size(800, 600);
|
|
|
+
|
|
|
+ windowImpl.SetupAllProperties();
|
|
|
+ windowImpl.Setup(x => x.ClientSize).Returns(() => clientSize);
|
|
|
+ windowImpl.Setup(x => x.Scaling).Returns(1);
|
|
|
+ windowImpl.Setup(x => x.Screen).Returns(CreateScreenMock().Object);
|
|
|
+ windowImpl.Setup(x => x.Position).Returns(() => position);
|
|
|
+ SetupToplevel(windowImpl);
|
|
|
+
|
|
|
+ windowImpl.Setup(x => x.CreatePopup()).Returns(() =>
|
|
|
{
|
|
|
- mock.Object.Activated?.Invoke();
|
|
|
+ return CreatePopupMock(windowImpl.Object).Object;
|
|
|
});
|
|
|
- mock.Setup(x => x.CreatePopup()).Returns(() =>
|
|
|
+
|
|
|
+ windowImpl.Setup(x => x.Dispose()).Callback(() =>
|
|
|
{
|
|
|
- if (popupImpl != null)
|
|
|
- return popupImpl();
|
|
|
- return CreatePopupMock().Object;
|
|
|
+ windowImpl.Object.Closed?.Invoke();
|
|
|
+ });
|
|
|
+
|
|
|
+ windowImpl.Setup(x => x.Move(It.IsAny<PixelPoint>())).Callback<PixelPoint>(x =>
|
|
|
+ {
|
|
|
+ position = x;
|
|
|
+ windowImpl.Object.PositionChanged?.Invoke(x);
|
|
|
+ });
|
|
|
|
|
|
+ windowImpl.Setup(x => x.Resize(It.IsAny<Size>())).Callback<Size>(x =>
|
|
|
+ {
|
|
|
+ clientSize = x.Constrain(s_screenSize);
|
|
|
+ windowImpl.Object.Resized?.Invoke(clientSize);
|
|
|
});
|
|
|
- mock.Setup(x => x.Dispose()).Callback(() =>
|
|
|
+
|
|
|
+ windowImpl.Setup(x => x.Show()).Callback(() =>
|
|
|
{
|
|
|
- mock.Object.Closed?.Invoke();
|
|
|
+ windowImpl.Object.Activated?.Invoke();
|
|
|
});
|
|
|
- PixelPoint pos = default;
|
|
|
- mock.SetupGet(x => x.Position).Returns(() => pos);
|
|
|
- mock.Setup(x => x.Move(It.IsAny<PixelPoint>())).Callback(new Action<PixelPoint>(np => pos = np));
|
|
|
- SetupToplevel(mock);
|
|
|
- return mock;
|
|
|
+
|
|
|
+ return windowImpl;
|
|
|
}
|
|
|
|
|
|
- static void SetupToplevel<T>(Mock<T> mock) where T : class, ITopLevelImpl
|
|
|
+ public static Mock<IPopupImpl> CreatePopupMock(IWindowBaseImpl parent)
|
|
|
{
|
|
|
- mock.SetupGet(x => x.MouseDevice).Returns(new MouseDevice());
|
|
|
+ var popupImpl = new Mock<IPopupImpl>();
|
|
|
+
|
|
|
+ var positionerHelper = new ManagedPopupPositionerPopupImplHelper(parent, (pos, size, scale) =>
|
|
|
+ {
|
|
|
+ popupImpl.Object.PositionChanged?.Invoke(pos);
|
|
|
+ popupImpl.Object.Resized?.Invoke(size);
|
|
|
+ });
|
|
|
+
|
|
|
+ var positioner = new ManagedPopupPositioner(positionerHelper);
|
|
|
+
|
|
|
+ popupImpl.Setup(x => x.Scaling).Returns(1);
|
|
|
+ popupImpl.Setup(x => x.PopupPositioner).Returns(positioner);
|
|
|
+
|
|
|
+ SetupToplevel(popupImpl);
|
|
|
+
|
|
|
+ return popupImpl;
|
|
|
}
|
|
|
|
|
|
- public static Mock<IPopupImpl> CreatePopupMock()
|
|
|
+ public static Mock<IScreenImpl> CreateScreenMock()
|
|
|
{
|
|
|
- var positioner = Mock.Of<IPopupPositioner>();
|
|
|
- var popup = Mock.Of<IPopupImpl>(x => x.Scaling == 1);
|
|
|
- var mock = Mock.Get(popup);
|
|
|
- mock.SetupGet(x => x.PopupPositioner).Returns(positioner);
|
|
|
- SetupToplevel(mock);
|
|
|
-
|
|
|
- return mock;
|
|
|
+ var screenImpl = new Mock<IScreenImpl>();
|
|
|
+ var bounds = new PixelRect(0, 0, (int)s_screenSize.Width, (int)s_screenSize.Height);
|
|
|
+ var screen = new Screen(96, bounds, bounds, true);
|
|
|
+ screenImpl.Setup(x => x.AllScreens).Returns(new[] { screen });
|
|
|
+ screenImpl.Setup(x => x.ScreenCount).Returns(1);
|
|
|
+ return screenImpl;
|
|
|
}
|
|
|
|
|
|
public IWindowImpl CreateWindow()
|
|
|
{
|
|
|
- return _windowImpl?.Invoke() ?? CreateWindowMock(_popupImpl).Object;
|
|
|
+ if (_windowImpl is object)
|
|
|
+ {
|
|
|
+ return _windowImpl();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ var mock = CreateWindowMock();
|
|
|
+
|
|
|
+ if (_popupImpl is object)
|
|
|
+ {
|
|
|
+ mock.Setup(x => x.CreatePopup()).Returns(() => _popupImpl(mock.Object));
|
|
|
+ }
|
|
|
+
|
|
|
+ return mock.Object;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public IEmbeddableWindowImpl CreateEmbeddableWindow()
|
|
|
{
|
|
|
throw new NotImplementedException();
|
|
|
}
|
|
|
+
|
|
|
+ private static void SetupToplevel<T>(Mock<T> mock) where T : class, ITopLevelImpl
|
|
|
+ {
|
|
|
+ mock.SetupGet(x => x.MouseDevice).Returns(new MouseDevice());
|
|
|
+ }
|
|
|
}
|
|
|
}
|