LayoutBuilderTests.cs 7.4 KB

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