|
|
|
@ -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()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|