WindowBaseTests.cs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  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.Media;
  11. using Avalonia.Platform;
  12. using Avalonia.Rendering;
  13. using Avalonia.Rendering.Composition;
  14. using Avalonia.Styling;
  15. using Avalonia.UnitTests;
  16. using Xunit;
  17. namespace Avalonia.Controls.UnitTests
  18. {
  19. public class WindowBaseTests : ScopedTestBase
  20. {
  21. [Fact]
  22. public void Activate_Should_Call_Impl_Activate()
  23. {
  24. using (UnitTestApplication.Start(TestServices.StyledWindow))
  25. {
  26. var impl = CreateMockWindowBaseImpl();
  27. var target = new TestWindowBase(impl.Object);
  28. target.Activate();
  29. impl.Verify(x => x.Activate());
  30. }
  31. }
  32. [Fact]
  33. public void Impl_Activate_Should_Call_Raise_Activated_Event()
  34. {
  35. using (UnitTestApplication.Start(TestServices.StyledWindow))
  36. {
  37. var impl = CreateMockWindowBaseImpl(true);
  38. bool raised = false;
  39. var target = new TestWindowBase(impl.Object);
  40. target.Activated += (s, e) => raised = true;
  41. impl.Object.Activated();
  42. Assert.True(raised);
  43. }
  44. }
  45. [Fact]
  46. public void Impl_Deactivate_Should_Call_Raise_Deativated_Event()
  47. {
  48. using (UnitTestApplication.Start(TestServices.StyledWindow))
  49. {
  50. var impl = CreateMockWindowBaseImpl(true);
  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.Compositor).Returns(RendererMocks.CreateDummyCompositor());
  93. windowImpl.Setup(x => x.DesktopScaling).Returns(1);
  94. windowImpl.Setup(x => x.RenderScaling).Returns(1);
  95. windowImpl.SetupProperty(x => x.Closed);
  96. using (UnitTestApplication.Start(TestServices.StyledWindow))
  97. {
  98. var target = new TestWindowBase(windowImpl.Object);
  99. target.Show();
  100. windowImpl.Object.Closed();
  101. Assert.False(target.IsVisible);
  102. }
  103. }
  104. [Fact]
  105. public void Setting_IsVisible_True_Shows_Window()
  106. {
  107. var windowImpl = new Mock<IPopupImpl>();
  108. windowImpl.Setup(x => x.Compositor).Returns(RendererMocks.CreateDummyCompositor());
  109. windowImpl.Setup(x => x.DesktopScaling).Returns(1);
  110. windowImpl.Setup(x => x.RenderScaling).Returns(1);
  111. using (UnitTestApplication.Start(TestServices.StyledWindow))
  112. {
  113. var target = new TestWindowBase(windowImpl.Object);
  114. target.IsVisible = true;
  115. windowImpl.Verify(x => x.Show(true, false));
  116. }
  117. }
  118. [Fact]
  119. public void Setting_IsVisible_False_Hides_Window()
  120. {
  121. var windowImpl = new Mock<IPopupImpl>();
  122. windowImpl.Setup(x => x.Compositor).Returns(RendererMocks.CreateDummyCompositor());
  123. windowImpl.Setup(x => x.DesktopScaling).Returns(1);
  124. windowImpl.Setup(x => x.RenderScaling).Returns(1);
  125. using (UnitTestApplication.Start(TestServices.StyledWindow))
  126. {
  127. var target = new TestWindowBase(windowImpl.Object);
  128. target.Show();
  129. target.IsVisible = false;
  130. windowImpl.Verify(x => x.Hide());
  131. }
  132. }
  133. [Fact]
  134. public void Showing_Should_Start_Renderer()
  135. {
  136. using (UnitTestApplication.Start(TestServices.StyledWindow))
  137. {
  138. var target = new TestWindowBase();
  139. target.Show();
  140. Assert.True(MediaContext.Instance.IsTopLevelActive(target));
  141. }
  142. }
  143. [Fact]
  144. public void Showing_Should_Raise_Opened()
  145. {
  146. using (UnitTestApplication.Start(TestServices.StyledWindow))
  147. {
  148. var target = new TestWindowBase();
  149. var raised = false;
  150. target.Opened += (s, e) => raised = true;
  151. target.Show();
  152. Assert.True(raised);
  153. }
  154. }
  155. [Fact]
  156. public void Hiding_Should_Stop_Renderer()
  157. {
  158. using (UnitTestApplication.Start(TestServices.StyledWindow))
  159. {
  160. var target = new TestWindowBase();
  161. target.Show();
  162. target.Hide();
  163. Assert.False(MediaContext.Instance.IsTopLevelActive(target));
  164. }
  165. }
  166. [Fact]
  167. public void Renderer_Should_Be_Disposed_When_Impl_Signals_Close()
  168. {
  169. using (UnitTestApplication.Start(TestServices.StyledWindow))
  170. {
  171. var windowImpl = new Mock<IPopupImpl>();
  172. windowImpl.Setup(x => x.DesktopScaling).Returns(1);
  173. windowImpl.Setup(x => x.RenderScaling).Returns(1);
  174. windowImpl.SetupProperty(x => x.Closed);
  175. windowImpl.Setup(x => x.Compositor).Returns(RendererMocks.CreateDummyCompositor());
  176. var target = new TestWindowBase(windowImpl.Object);
  177. target.Show();
  178. windowImpl.Object.Closed();
  179. Assert.True(((CompositingRenderer)target.Renderer).IsDisposed);
  180. }
  181. }
  182. private static FuncControlTemplate<TestWindowBase> CreateTemplate()
  183. {
  184. return new FuncControlTemplate<TestWindowBase>((x, scope) =>
  185. new ContentPresenter
  186. {
  187. Name = "PART_ContentPresenter",
  188. [!ContentPresenter.ContentProperty] = x[!ContentControl.ContentProperty],
  189. }.RegisterInNameScope(scope));
  190. }
  191. private static Mock<IWindowBaseImpl> CreateMockWindowBaseImpl(bool setupAllProperties = false)
  192. {
  193. var renderer = new Mock<IWindowBaseImpl>();
  194. if (setupAllProperties)
  195. renderer.SetupAllProperties();
  196. renderer.Setup(x => x.RenderScaling).Returns(1.0);
  197. renderer.Setup(x => x.Compositor).Returns(RendererMocks.CreateDummyCompositor());
  198. return renderer;
  199. }
  200. private class TestWindowBase : WindowBase
  201. {
  202. public bool IsClosed { get; private set; }
  203. public TestWindowBase()
  204. : base(CreateMockWindowBaseImpl().Object)
  205. {
  206. }
  207. public TestWindowBase(IWindowBaseImpl impl)
  208. : base(impl)
  209. {
  210. }
  211. }
  212. }
  213. }