LayoutBuilderTests.cs 7.4 KB

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