WindowBaseTests.cs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. using System;
  2. using System.Reactive;
  3. using System.Reactive.Subjects;
  4. using Moq;
  5. using Avalonia.Controls.Presenters;
  6. using Avalonia.Controls.Templates;
  7. using Avalonia.Input;
  8. using Avalonia.Input.Raw;
  9. using Avalonia.Layout;
  10. using Avalonia.Platform;
  11. using Avalonia.Rendering;
  12. using Avalonia.Styling;
  13. using Avalonia.UnitTests;
  14. using Xunit;
  15. namespace Avalonia.Controls.UnitTests
  16. {
  17. public class WindowBaseTests
  18. {
  19. [Fact]
  20. public void Activate_Should_Call_Impl_Activate()
  21. {
  22. using (UnitTestApplication.Start(TestServices.StyledWindow))
  23. {
  24. var impl = new Mock<IWindowBaseImpl>();
  25. var target = new TestWindowBase(impl.Object);
  26. target.Activate();
  27. impl.Verify(x => x.Activate());
  28. }
  29. }
  30. [Fact]
  31. public void Impl_Activate_Should_Call_Raise_Activated_Event()
  32. {
  33. using (UnitTestApplication.Start(TestServices.StyledWindow))
  34. {
  35. var impl = new Mock<IWindowBaseImpl>();
  36. impl.SetupAllProperties();
  37. bool raised = false;
  38. var target = new TestWindowBase(impl.Object);
  39. target.Activated += (s, e) => raised = true;
  40. impl.Object.Activated();
  41. Assert.True(raised);
  42. }
  43. }
  44. [Fact]
  45. public void Impl_Deactivate_Should_Call_Raise_Deativated_Event()
  46. {
  47. using (UnitTestApplication.Start(TestServices.StyledWindow))
  48. {
  49. var impl = new Mock<IWindowBaseImpl>();
  50. impl.SetupAllProperties();
  51. bool raised = false;
  52. var target = new TestWindowBase(impl.Object);
  53. target.Deactivated += (s, e) => raised = true;
  54. impl.Object.Deactivated();
  55. Assert.True(raised);
  56. }
  57. }
  58. [Fact]
  59. public void IsVisible_Should_Initially_Be_False()
  60. {
  61. using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
  62. {
  63. var target = new TestWindowBase();
  64. Assert.False(target.IsVisible);
  65. }
  66. }
  67. [Fact]
  68. public void IsVisible_Should_Be_True_After_Show()
  69. {
  70. using (UnitTestApplication.Start(TestServices.StyledWindow))
  71. {
  72. var target = new TestWindowBase();
  73. target.Show();
  74. Assert.True(target.IsVisible);
  75. }
  76. }
  77. [Fact]
  78. public void IsVisible_Should_Be_False_Atfer_Hide()
  79. {
  80. using (UnitTestApplication.Start(TestServices.StyledWindow))
  81. {
  82. var target = new TestWindowBase();
  83. target.Show();
  84. target.Hide();
  85. Assert.False(target.IsVisible);
  86. }
  87. }
  88. [Fact]
  89. public void IsVisible_Should_Be_False_Atfer_Impl_Signals_Close()
  90. {
  91. var windowImpl = new Mock<IPopupImpl>();
  92. windowImpl.Setup(x => x.CreateRenderer(It.IsAny<IRenderRoot>()))
  93. .Returns(() => RendererMocks.CreateRenderer().Object);
  94. windowImpl.Setup(x => x.DesktopScaling).Returns(1);
  95. windowImpl.Setup(x => x.RenderScaling).Returns(1);
  96. windowImpl.SetupProperty(x => x.Closed);
  97. using (UnitTestApplication.Start(TestServices.StyledWindow))
  98. {
  99. var target = new TestWindowBase(windowImpl.Object);
  100. target.Show();
  101. windowImpl.Object.Closed();
  102. Assert.False(target.IsVisible);
  103. }
  104. }
  105. [Fact]
  106. public void Setting_IsVisible_True_Shows_Window()
  107. {
  108. var windowImpl = new Mock<IPopupImpl>();
  109. windowImpl.Setup(x => x.CreateRenderer(It.IsAny<IRenderRoot>()))
  110. .Returns(() => RendererMocks.CreateRenderer().Object);
  111. windowImpl.Setup(x => x.DesktopScaling).Returns(1);
  112. windowImpl.Setup(x => x.RenderScaling).Returns(1);
  113. using (UnitTestApplication.Start(TestServices.StyledWindow))
  114. {
  115. var target = new TestWindowBase(windowImpl.Object);
  116. target.IsVisible = true;
  117. windowImpl.Verify(x => x.Show(true, false));
  118. }
  119. }
  120. [Fact]
  121. public void Setting_IsVisible_False_Hides_Window()
  122. {
  123. var windowImpl = new Mock<IPopupImpl>();
  124. windowImpl.Setup(x => x.CreateRenderer(It.IsAny<IRenderRoot>()))
  125. .Returns(() => RendererMocks.CreateRenderer().Object);
  126. windowImpl.Setup(x => x.DesktopScaling).Returns(1);
  127. windowImpl.Setup(x => x.RenderScaling).Returns(1);
  128. using (UnitTestApplication.Start(TestServices.StyledWindow))
  129. {
  130. var target = new TestWindowBase(windowImpl.Object);
  131. target.Show();
  132. target.IsVisible = false;
  133. windowImpl.Verify(x => x.Hide());
  134. }
  135. }
  136. [Fact]
  137. public void Showing_Should_Start_Renderer()
  138. {
  139. using (UnitTestApplication.Start(TestServices.StyledWindow))
  140. {
  141. var renderer = RendererMocks.CreateRenderer();
  142. var target = new TestWindowBase(renderer.Object);
  143. target.Show();
  144. renderer.Verify(x => x.Start(), Times.Once);
  145. }
  146. }
  147. [Fact]
  148. public void Showing_Should_Raise_Opened()
  149. {
  150. using (UnitTestApplication.Start(TestServices.StyledWindow))
  151. {
  152. var target = new TestWindowBase();
  153. var raised = false;
  154. target.Opened += (s, e) => raised = true;
  155. target.Show();
  156. Assert.True(raised);
  157. }
  158. }
  159. [Fact]
  160. public void Hiding_Should_Stop_Renderer()
  161. {
  162. using (UnitTestApplication.Start(TestServices.StyledWindow))
  163. {
  164. var renderer = RendererMocks.CreateRenderer();
  165. var target = new TestWindowBase(renderer.Object);
  166. target.Show();
  167. target.Hide();
  168. renderer.Verify(x => x.Stop(), Times.Once);
  169. }
  170. }
  171. [Fact]
  172. public void Renderer_Should_Be_Disposed_When_Impl_Signals_Close()
  173. {
  174. using (UnitTestApplication.Start(TestServices.StyledWindow))
  175. {
  176. var renderer = RendererMocks.CreateRenderer();
  177. var windowImpl = new Mock<IPopupImpl>();
  178. windowImpl.Setup(x => x.DesktopScaling).Returns(1);
  179. windowImpl.Setup(x => x.RenderScaling).Returns(1);
  180. windowImpl.SetupProperty(x => x.Closed);
  181. windowImpl.Setup(x => x.CreateRenderer(It.IsAny<IRenderRoot>())).Returns(renderer.Object);
  182. var target = new TestWindowBase(windowImpl.Object);
  183. target.Show();
  184. windowImpl.Object.Closed();
  185. renderer.Verify(x => x.Dispose(), Times.Once);
  186. }
  187. }
  188. private static FuncControlTemplate<TestWindowBase> CreateTemplate()
  189. {
  190. return new FuncControlTemplate<TestWindowBase>((x, scope) =>
  191. new ContentPresenter
  192. {
  193. Name = "PART_ContentPresenter",
  194. [!ContentPresenter.ContentProperty] = x[!ContentControl.ContentProperty],
  195. }.RegisterInNameScope(scope));
  196. }
  197. private class TestWindowBase : WindowBase
  198. {
  199. public bool IsClosed { get; private set; }
  200. public TestWindowBase(IRenderer renderer = null)
  201. : base(CreateWindowsBaseImplMock(renderer ?? RendererMocks.CreateRenderer().Object))
  202. {
  203. }
  204. private static IWindowBaseImpl CreateWindowsBaseImplMock(IRenderer renderer)
  205. => Mock.Of<IWindowBaseImpl>(x =>
  206. x.RenderScaling == 1 &&
  207. x.CreateRenderer(It.IsAny<IRenderRoot>()) == renderer);
  208. public TestWindowBase(IWindowBaseImpl impl)
  209. : base(impl)
  210. {
  211. }
  212. }
  213. }
  214. }