LayoutBuilderTests.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. using Avalonia.Controls;
  2. using Avalonia.Controls.Presenters;
  3. using Avalonia.Interactivity;
  4. using PixiEditor.Extensions.CommonApi.FlyUI.Events;
  5. using PixiEditor.Extensions.UI.Panels;
  6. using Button = PixiEditor.Extensions.FlyUI.Elements.Button;
  7. namespace PixiEditor.Extensions.Test;
  8. [Collection("LayoutBuilderTests")]
  9. public class LayoutBuilderTests
  10. {
  11. [Fact]
  12. public void TestThatButtonClickEventFiresCallback()
  13. {
  14. Button button = new Button();
  15. bool callbackFired = false;
  16. button.Click += (e) => callbackFired = true;
  17. button.RaiseEvent(nameof(Button.Click), new ElementEventArgs());
  18. Assert.True(callbackFired);
  19. }
  20. [Fact]
  21. public void TestThatAvaloniaClickEventFiresElementCallback()
  22. {
  23. Button button = new Button();
  24. bool callbackFired = false;
  25. button.Click += (e) => callbackFired = true;
  26. button.BuildNative().RaiseEvent(new RoutedEventArgs(Avalonia.Controls.Button.ClickEvent));
  27. Assert.True(callbackFired);
  28. }
  29. [Fact]
  30. public void TestStateChangesDataAndOnlyAppliesDiffProperties()
  31. {
  32. TestStatefulElement testStatefulElement = new TestStatefulElement();
  33. testStatefulElement.CreateState();
  34. var native = testStatefulElement.BuildNative();
  35. Assert.IsType<ContentPresenter>(native);
  36. Assert.IsType<Avalonia.Controls.Button>((native as ContentPresenter).Content);
  37. Avalonia.Controls.Button button = (native as ContentPresenter).Content as Avalonia.Controls.Button;
  38. Assert.IsType<TextBlock>(button.Content);
  39. TextBlock textBlock = button.Content as TextBlock;
  40. Assert.Equal(0, testStatefulElement.State.ClickedTimes);
  41. Assert.Equal(string.Format(TestState.Format, 0), textBlock.Text);
  42. ContentPresenter contentPresenter = native as ContentPresenter;
  43. button.RaiseEvent(new RoutedEventArgs(Avalonia.Controls.Button.ClickEvent));
  44. Assert.Equal(1, testStatefulElement.State.ClickedTimes);
  45. Assert.IsType<ContentPresenter>(native);
  46. Assert.Equal(contentPresenter, native);
  47. Assert.IsType<Avalonia.Controls.Button>(contentPresenter.Content);
  48. Assert.Equal(button, contentPresenter.Content);
  49. Assert.IsType<TextBlock>(button.Content);
  50. Assert.Equal(textBlock, button.Content);
  51. Assert.Equal(string.Format(TestState.Format, 1), textBlock.Text);
  52. }
  53. [Fact]
  54. public void TestStateRemovesChildFromTree()
  55. {
  56. TestStatefulElement testStatefulElement = new TestStatefulElement();
  57. testStatefulElement.CreateState();
  58. var native = testStatefulElement.BuildNative();
  59. Assert.IsType<ContentPresenter>(native);
  60. Assert.IsType<Avalonia.Controls.Button>((native as ContentPresenter).Content);
  61. Avalonia.Controls.Button button = (native as ContentPresenter).Content as Avalonia.Controls.Button;
  62. Assert.NotNull(button.Content);
  63. Assert.IsType<TextBlock>(button.Content);
  64. testStatefulElement.State.SetState(() =>
  65. {
  66. testStatefulElement.State.ReplaceText = true;
  67. testStatefulElement.State.ReplaceTextWith = null;
  68. });
  69. Assert.Null(button.Content); // Old layout is updated and text is removed
  70. }
  71. [Fact]
  72. public void TestStateAddsChildToTree()
  73. {
  74. TestStatefulElement testStatefulElement = new TestStatefulElement();
  75. testStatefulElement.CreateState();
  76. var native = testStatefulElement.BuildNative();
  77. Assert.IsType<ContentPresenter>(native);
  78. Assert.IsType<Avalonia.Controls.Button>((native as ContentPresenter).Content);
  79. Avalonia.Controls.Button button = (native as ContentPresenter).Content as Avalonia.Controls.Button;
  80. Assert.NotNull(button.Content);
  81. Assert.IsType<TextBlock>(button.Content);
  82. testStatefulElement.State.SetState(() =>
  83. {
  84. testStatefulElement.State.ReplaceText = true;
  85. testStatefulElement.State.ReplaceTextWith = null;
  86. });
  87. Assert.Null(button.Content); // Old layout is updated and text is removed
  88. testStatefulElement.State.SetState(() => testStatefulElement.State.ReplaceText = false);
  89. Assert.NotNull(button.Content); // Old layout is updated and text is added
  90. Assert.IsType<TextBlock>(button.Content);
  91. }
  92. [Fact]
  93. public void TestStateReplacesChildInTree()
  94. {
  95. TestStatefulElement testStatefulElement = new TestStatefulElement();
  96. testStatefulElement.CreateState();
  97. var native = testStatefulElement.BuildNative();
  98. Assert.IsType<ContentPresenter>(native);
  99. Assert.IsType<Avalonia.Controls.Button>((native as ContentPresenter).Content);
  100. Avalonia.Controls.Button button = (native as ContentPresenter).Content as Avalonia.Controls.Button;
  101. Assert.NotNull(button.Content);
  102. Assert.IsType<TextBlock>(button.Content);
  103. testStatefulElement.State.SetState(() =>
  104. {
  105. testStatefulElement.State.ReplaceText = true;
  106. testStatefulElement.State.ReplaceTextWith = new Button();
  107. });
  108. Assert.IsType<Avalonia.Controls.Button>(button.Content); // Old layout is updated and text is removed
  109. testStatefulElement.State.SetState(() => testStatefulElement.State.ReplaceText = false);
  110. Assert.NotNull(button.Content); // Old layout is updated and text is added
  111. Assert.IsType<TextBlock>(button.Content);
  112. }
  113. [Fact]
  114. public void TestThatMultiChildLayoutStateUpdatesTreeCorrectly()
  115. {
  116. TestMultiChildStatefulElement testStatefulElement = new TestMultiChildStatefulElement();
  117. testStatefulElement.CreateState();
  118. var native = testStatefulElement.BuildNative();
  119. Assert.IsType<ContentPresenter>(native);
  120. Assert.IsType<ColumnPanel>((native as ContentPresenter).Content);
  121. ColumnPanel panel = (native as ContentPresenter).Content as ColumnPanel;
  122. Assert.Equal(2, panel.Children.Count);
  123. Assert.IsType<Avalonia.Controls.Button>(panel.Children[0]);
  124. Assert.IsType<RowPanel>(panel.Children[1]);
  125. Assert.Empty((panel.Children[1] as RowPanel).Children);
  126. Assert.Empty(testStatefulElement.State.Rows);
  127. Avalonia.Controls.Button button = (Avalonia.Controls.Button)panel.Children[0];
  128. RowPanel innerPanel = (RowPanel)panel.Children[1];
  129. button.RaiseEvent(new RoutedEventArgs(Avalonia.Controls.Button.ClickEvent));
  130. Assert.Single(innerPanel.Children);
  131. Assert.Single(testStatefulElement.State.Rows);
  132. Assert.IsType<TextBlock>(innerPanel.Children[0]);
  133. button.RaiseEvent(new RoutedEventArgs(Avalonia.Controls.Button.ClickEvent));
  134. Assert.Equal(2, innerPanel.Children.Count);
  135. }
  136. [Fact]
  137. public void TestThatNestedStatefulElementsAreUpdatedCorrectly()
  138. {
  139. //TODO: Make this test
  140. /*TestNestedStatefulElement testStatefulElement = new TestNestedStatefulElement();
  141. testStatefulElement.CreateState();
  142. var native = testStatefulElement.BuildNative();
  143. Assert.IsType<ContentPresenter>(native);
  144. Assert.IsType<ContentPresenter>((native as ContentPresenter).Content);
  145. ContentPresenter innerPresenter = (native as ContentPresenter).Content as ContentPresenter;
  146. Assert.IsType<Avalonia.Controls.Button>(innerPresenter.Content);
  147. Avalonia.Controls.Button button = (innerPresenter.Content as Avalonia.Controls.Button);
  148. Assert.IsType<TextBlock>(button.Content);
  149. TextBlock textBlock = button.Content as TextBlock;*/
  150. }
  151. }