using System; using Avalonia.Controls.Primitives.PopupPositioning; using Avalonia.Input; using Moq; using Avalonia.Platform; using Avalonia.Rendering; namespace Avalonia.UnitTests { public class MockWindowingPlatform : IWindowingPlatform { private static readonly Size s_screenSize = new Size(1280, 1024); private readonly Func _windowImpl; private readonly Func _popupImpl; public MockWindowingPlatform( Func windowImpl = null, Func popupImpl = null ) { _windowImpl = windowImpl; _popupImpl = popupImpl; } public static Mock CreateWindowMock() { var windowImpl = new Mock(); var position = new PixelPoint(); var clientSize = new Size(800, 600); windowImpl.SetupAllProperties(); windowImpl.Setup(x => x.ClientSize).Returns(() => clientSize); windowImpl.Setup(x => x.MaxAutoSizeHint).Returns(s_screenSize); windowImpl.Setup(x => x.DesktopScaling).Returns(1); windowImpl.Setup(x => x.RenderScaling).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(() => { return CreatePopupMock(windowImpl.Object).Object; }); windowImpl.Setup(x => x.Dispose()).Callback(() => { windowImpl.Object.Closed?.Invoke(); }); windowImpl.Setup(x => x.Move(It.IsAny())).Callback(x => { position = x; windowImpl.Object.PositionChanged?.Invoke(x); }); windowImpl.Setup(x => x.Resize(It.IsAny())).Callback(x => { clientSize = x.Constrain(s_screenSize); windowImpl.Object.Resized?.Invoke(clientSize); }); windowImpl.Setup(x => x.Show(true)).Callback(() => { windowImpl.Object.Activated?.Invoke(); }); return windowImpl; } public static Mock CreatePopupMock(IWindowBaseImpl parent) { var popupImpl = new Mock(); var clientSize = new Size(); var positionerHelper = new ManagedPopupPositionerPopupImplHelper(parent, (pos, size, scale) => { clientSize = size.Constrain(s_screenSize); popupImpl.Object.PositionChanged?.Invoke(pos); popupImpl.Object.Resized?.Invoke(clientSize); }); var positioner = new ManagedPopupPositioner(positionerHelper); popupImpl.SetupAllProperties(); popupImpl.Setup(x => x.ClientSize).Returns(() => clientSize); popupImpl.Setup(x => x.MaxAutoSizeHint).Returns(s_screenSize); popupImpl.Setup(x => x.RenderScaling).Returns(1); popupImpl.Setup(x => x.PopupPositioner).Returns(positioner); SetupToplevel(popupImpl); return popupImpl; } public static Mock CreateScreenMock() { var screenImpl = new Mock(); 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() { 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 IWindowImpl CreateEmbeddableWindow() { throw new NotImplementedException(); } private static void SetupToplevel(Mock mock) where T : class, ITopLevelImpl { mock.SetupGet(x => x.MouseDevice).Returns(new MouseDevice()); } } }