WindowBaseTests.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. // Copyright (c) The Avalonia Project. All rights reserved.
  2. // Licensed under the MIT license. See licence.md file in the project root for full license information.
  3. using System;
  4. using System.Reactive;
  5. using System.Reactive.Subjects;
  6. using Moq;
  7. using Avalonia.Controls.Presenters;
  8. using Avalonia.Controls.Templates;
  9. using Avalonia.Input;
  10. using Avalonia.Input.Raw;
  11. using Avalonia.Layout;
  12. using Avalonia.Platform;
  13. using Avalonia.Rendering;
  14. using Avalonia.Styling;
  15. using Avalonia.UnitTests;
  16. using Xunit;
  17. namespace Avalonia.Controls.UnitTests
  18. {
  19. public class WindowBaseTests
  20. {
  21. [Fact]
  22. public void Activate_Should_Call_Impl_Activate()
  23. {
  24. using (UnitTestApplication.Start(TestServices.StyledWindow))
  25. {
  26. var impl = new Mock<IWindowBaseImpl>();
  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 = new Mock<IWindowBaseImpl>();
  38. impl.SetupAllProperties();
  39. bool raised = false;
  40. var target = new TestWindowBase(impl.Object);
  41. target.Activated += (s, e) => raised = true;
  42. impl.Object.Activated();
  43. Assert.True(raised);
  44. }
  45. }
  46. [Fact]
  47. public void Impl_Deactivate_Should_Call_Raise_Deativated_Event()
  48. {
  49. using (UnitTestApplication.Start(TestServices.StyledWindow))
  50. {
  51. var impl = new Mock<IWindowBaseImpl>();
  52. impl.SetupAllProperties();
  53. bool raised = false;
  54. var target = new TestWindowBase(impl.Object);
  55. target.Deactivated += (s, e) => raised = true;
  56. impl.Object.Deactivated();
  57. Assert.True(raised);
  58. }
  59. }
  60. [Fact]
  61. public void IsVisible_Should_Initially_Be_False()
  62. {
  63. using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
  64. {
  65. var target = new TestWindowBase();
  66. Assert.False(target.IsVisible);
  67. }
  68. }
  69. [Fact]
  70. public void IsVisible_Should_Be_True_After_Show()
  71. {
  72. using (UnitTestApplication.Start(TestServices.StyledWindow))
  73. {
  74. var target = new TestWindowBase();
  75. target.Show();
  76. Assert.True(target.IsVisible);
  77. }
  78. }
  79. [Fact]
  80. public void IsVisible_Should_Be_False_Atfer_Hide()
  81. {
  82. using (UnitTestApplication.Start(TestServices.StyledWindow))
  83. {
  84. var target = new TestWindowBase();
  85. target.Show();
  86. target.Hide();
  87. Assert.False(target.IsVisible);
  88. }
  89. }
  90. [Fact]
  91. public void IsVisible_Should_Be_False_Atfer_Impl_Signals_Close()
  92. {
  93. var windowImpl = new Mock<IPopupImpl>();
  94. windowImpl.Setup(x => x.Scaling).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.Scaling).Returns(1);
  109. using (UnitTestApplication.Start(TestServices.StyledWindow))
  110. {
  111. var target = new TestWindowBase(windowImpl.Object);
  112. target.IsVisible = true;
  113. windowImpl.Verify(x => x.Show());
  114. }
  115. }
  116. [Fact]
  117. public void Setting_IsVisible_False_Hides_Window()
  118. {
  119. var windowImpl = new Mock<IPopupImpl>();
  120. windowImpl.Setup(x => x.Scaling).Returns(1);
  121. using (UnitTestApplication.Start(TestServices.StyledWindow))
  122. {
  123. var target = new TestWindowBase(windowImpl.Object);
  124. target.Show();
  125. target.IsVisible = false;
  126. windowImpl.Verify(x => x.Hide());
  127. }
  128. }
  129. [Fact]
  130. public void Showing_Should_Start_Renderer()
  131. {
  132. using (UnitTestApplication.Start(TestServices.StyledWindow))
  133. {
  134. var renderer = new Mock<IRenderer>();
  135. var target = new TestWindowBase(renderer.Object);
  136. target.Show();
  137. renderer.Verify(x => x.Start(), Times.Once);
  138. }
  139. }
  140. [Fact]
  141. public void Showing_Should_Raise_Opened()
  142. {
  143. using (UnitTestApplication.Start(TestServices.StyledWindow))
  144. {
  145. var target = new TestWindowBase();
  146. var raised = false;
  147. target.Opened += (s, e) => raised = true;
  148. target.Show();
  149. Assert.True(raised);
  150. }
  151. }
  152. [Fact]
  153. public void Hiding_Should_Stop_Renderer()
  154. {
  155. using (UnitTestApplication.Start(TestServices.StyledWindow))
  156. {
  157. var renderer = new Mock<IRenderer>();
  158. var target = new TestWindowBase(renderer.Object);
  159. target.Show();
  160. target.Hide();
  161. renderer.Verify(x => x.Stop(), Times.Once);
  162. }
  163. }
  164. [Fact]
  165. public void Renderer_Should_Be_Disposed_When_Impl_Signals_Close()
  166. {
  167. using (UnitTestApplication.Start(TestServices.StyledWindow))
  168. {
  169. var renderer = new Mock<IRenderer>();
  170. var windowImpl = new Mock<IPopupImpl>();
  171. windowImpl.Setup(x => x.Scaling).Returns(1);
  172. windowImpl.SetupProperty(x => x.Closed);
  173. windowImpl.Setup(x => x.CreateRenderer(It.IsAny<IRenderRoot>())).Returns(renderer.Object);
  174. var target = new TestWindowBase(windowImpl.Object);
  175. target.Show();
  176. windowImpl.Object.Closed();
  177. renderer.Verify(x => x.Dispose(), Times.Once);
  178. }
  179. }
  180. private FuncControlTemplate<TestWindowBase> CreateTemplate()
  181. {
  182. return new FuncControlTemplate<TestWindowBase>((x, scope) =>
  183. new ContentPresenter
  184. {
  185. Name = "PART_ContentPresenter",
  186. [!ContentPresenter.ContentProperty] = x[!ContentControl.ContentProperty],
  187. }.RegisterInNameScope(scope));
  188. }
  189. private class TestWindowBase : WindowBase
  190. {
  191. public bool IsClosed { get; private set; }
  192. public TestWindowBase(IRenderer renderer = null)
  193. : base(Mock.Of<IWindowBaseImpl>(x =>
  194. x.Scaling == 1 &&
  195. x.CreateRenderer(It.IsAny<IRenderRoot>()) == renderer))
  196. {
  197. }
  198. public TestWindowBase(IWindowBaseImpl impl)
  199. : base(impl)
  200. {
  201. }
  202. }
  203. }
  204. }