ItemsPresenterTests.cs 5.1 KB

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