ItemsPresenterTests.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using Avalonia.Collections;
  6. using Avalonia.Controls.Presenters;
  7. using Avalonia.Controls.Templates;
  8. using Avalonia.UnitTests;
  9. using Avalonia.VisualTree;
  10. using Xunit;
  11. #nullable enable
  12. namespace Avalonia.Controls.UnitTests.Presenters
  13. {
  14. public class ItemsPresenterTests : ScopedTestBase
  15. {
  16. [Fact]
  17. public void Should_Register_With_Host_When_TemplatedParent_Set()
  18. {
  19. var host = new ItemsControl();
  20. var target = new ItemsPresenter();
  21. Assert.Null(host.Presenter);
  22. target.TemplatedParent = host;
  23. Assert.Same(target, host.Presenter);
  24. }
  25. [Fact]
  26. public void Panel_Should_Be_Visual_Child()
  27. {
  28. var (target, _, _) = CreateTarget();
  29. var child = target.GetVisualChildren().Single();
  30. Assert.Equal(target.Panel, child);
  31. }
  32. public class NonVirtualizingPanel : ScopedTestBase
  33. {
  34. [Fact]
  35. public void Creates_Containers_For_Initial_Items()
  36. {
  37. using var app = Start();
  38. var items = new[] { "foo", "bar", "baz" };
  39. var (target, _, _) = CreateTarget(items);
  40. var panel = Assert.IsType<StackPanel>(target.Panel);
  41. AssertContainers(panel, items);
  42. }
  43. [Fact]
  44. public void Creates_Containers_For_Inserted_Items()
  45. {
  46. using var app = Start();
  47. var items = new ObservableCollection<string>(new[] { "foo", "bar", "baz" });
  48. var (target, _, root) = CreateTarget(items);
  49. var panel = Assert.IsType<StackPanel>(target.Panel);
  50. items.Insert(1, "foo2");
  51. root.LayoutManager.ExecuteLayoutPass();
  52. AssertContainers(panel, items);
  53. }
  54. [Fact]
  55. public void Removes_Containers_For_Removed_Items()
  56. {
  57. using var app = Start();
  58. var items = new ObservableCollection<string>(new[] { "foo", "bar", "baz" });
  59. var (target, _, root) = CreateTarget(items);
  60. var panel = Assert.IsType<StackPanel>(target.Panel);
  61. items.RemoveAt(1);
  62. root.LayoutManager.ExecuteLayoutPass();
  63. AssertContainers(panel, items);
  64. }
  65. [Fact]
  66. public void Updates_Containers_For_Moved_Items()
  67. {
  68. using var app = Start();
  69. var items = new ObservableCollection<string>(new[] { "foo", "bar", "baz" });
  70. var (target, _, root) = CreateTarget(items);
  71. var panel = Assert.IsType<StackPanel>(target.Panel);
  72. items.Move(0, 2);
  73. root.LayoutManager.ExecuteLayoutPass();
  74. AssertContainers(panel, items);
  75. }
  76. [Fact]
  77. public void Updates_Container_For_Moved_Range_Of_Items()
  78. {
  79. using var app = Start();
  80. AvaloniaList<string> items = ["foo", "bar", "baz"];
  81. var (target, _, root) = CreateTarget(items);
  82. var panel = Assert.IsType<StackPanel>(target.Panel);
  83. items.MoveRange(0, 2, 2);
  84. root.LayoutManager.ExecuteLayoutPass();
  85. AssertContainers(panel, items);
  86. }
  87. [Fact]
  88. public void Updates_Containers_For_Replaced_Items()
  89. {
  90. using var app = Start();
  91. var items = new ObservableCollection<string>(new[] { "foo", "bar", "baz" });
  92. var (target, _, root) = CreateTarget(items);
  93. var panel = Assert.IsType<StackPanel>(target.Panel);
  94. items[1] = "bar2";
  95. root.LayoutManager.ExecuteLayoutPass();
  96. AssertContainers(panel, items);
  97. }
  98. [Fact]
  99. public void Updates_Containers_On_Items_Changed()
  100. {
  101. using var app = Start();
  102. var items = new ObservableCollection<string>(new[] { "foo", "bar", "baz" });
  103. var (target, itemsControl, root) = CreateTarget(items);
  104. var panel = Assert.IsType<StackPanel>(target.Panel);
  105. var newItems = new[] { "qux", "quux", "corge" };
  106. itemsControl.ItemsSource = newItems;
  107. root.LayoutManager.ExecuteLayoutPass();
  108. AssertContainers(panel, newItems);
  109. }
  110. private static void AssertContainers(StackPanel panel, IReadOnlyList<string> items)
  111. {
  112. Assert.Equal(items.Count, panel.Children.Count);
  113. for (var i = 0; i < items.Count; i++)
  114. {
  115. var container = Assert.IsType<ContentPresenter>(panel.Children[i]);
  116. Assert.Equal(items[i], container.DataContext);
  117. Assert.Equal(items[i], container.Content);
  118. }
  119. }
  120. }
  121. private static (ItemsPresenter, ItemsControl, TestRoot) CreateTarget(IReadOnlyList<string>? items = null)
  122. {
  123. var result = new ItemsPresenter();
  124. var itemsControl = new ItemsControl
  125. {
  126. ItemsSource = items,
  127. Template = new FuncControlTemplate<ItemsControl>((_, _) => result)
  128. };
  129. var root = new TestRoot(itemsControl);
  130. root.LayoutManager.ExecuteInitialLayoutPass();
  131. return (result, itemsControl, root);
  132. }
  133. private static IDisposable Start() => UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
  134. }
  135. }