ItemContainerGeneratorTests.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. // Copyright (c) The Avalonia Project. All rights reserved.
  2. // Licensed under the MIT license. See licence.md file in the project root for full license information.
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Reactive.Linq;
  6. using Avalonia.Controls.Generators;
  7. using Avalonia.Controls.Presenters;
  8. using Avalonia.Data;
  9. using Xunit;
  10. namespace Avalonia.Controls.UnitTests.Generators
  11. {
  12. public class ItemContainerGeneratorTests
  13. {
  14. [Fact]
  15. public void Materialize_Should_Create_Containers()
  16. {
  17. var items = new[] { "foo", "bar", "baz" };
  18. var owner = new Decorator();
  19. var target = new ItemContainerGenerator(owner);
  20. var containers = Materialize(target, 0, items);
  21. var result = containers
  22. .Select(x => x.ContainerControl)
  23. .OfType<ContentPresenter>()
  24. .Select(x => x.Content)
  25. .ToList();
  26. Assert.Equal(items, result);
  27. }
  28. [Fact]
  29. public void ContainerFromIndex_Should_Return_Materialized_Containers()
  30. {
  31. var items = new[] { "foo", "bar", "baz" };
  32. var owner = new Decorator();
  33. var target = new ItemContainerGenerator(owner);
  34. var containers = Materialize(target, 0, items);
  35. Assert.Equal(containers[0].ContainerControl, target.ContainerFromIndex(0));
  36. Assert.Equal(containers[1].ContainerControl, target.ContainerFromIndex(1));
  37. Assert.Equal(containers[2].ContainerControl, target.ContainerFromIndex(2));
  38. }
  39. [Fact]
  40. public void IndexFromContainer_Should_Return_Index()
  41. {
  42. var items = new[] { "foo", "bar", "baz" };
  43. var owner = new Decorator();
  44. var target = new ItemContainerGenerator(owner);
  45. var containers = Materialize(target, 0, items);
  46. Assert.Equal(0, target.IndexFromContainer(containers[0].ContainerControl));
  47. Assert.Equal(1, target.IndexFromContainer(containers[1].ContainerControl));
  48. Assert.Equal(2, target.IndexFromContainer(containers[2].ContainerControl));
  49. }
  50. [Fact]
  51. public void Dematerialize_Should_Remove_Container()
  52. {
  53. var items = new[] { "foo", "bar", "baz" };
  54. var owner = new Decorator();
  55. var target = new ItemContainerGenerator(owner);
  56. var containers = Materialize(target, 0, items);
  57. target.Dematerialize(1, 1);
  58. Assert.Equal(containers[0].ContainerControl, target.ContainerFromIndex(0));
  59. Assert.Null(target.ContainerFromIndex(1));
  60. Assert.Equal(containers[2].ContainerControl, target.ContainerFromIndex(2));
  61. }
  62. [Fact]
  63. public void Dematerialize_Should_Return_Removed_Containers()
  64. {
  65. var items = new[] { "foo", "bar", "baz" };
  66. var owner = new Decorator();
  67. var target = new ItemContainerGenerator(owner);
  68. var containers = Materialize(target, 0, items);
  69. var expected = target.Containers.Take(2).ToList();
  70. var result = target.Dematerialize(0, 2);
  71. Assert.Equal(expected, result);
  72. }
  73. [Fact]
  74. public void InsertSpace_Should_Alter_Successive_Container_Indexes()
  75. {
  76. var items = new[] { "foo", "bar", "baz" };
  77. var owner = new Decorator();
  78. var target = new ItemContainerGenerator(owner);
  79. var containers = Materialize(target, 0, items);
  80. target.InsertSpace(1, 3);
  81. Assert.Equal(3, target.Containers.Count());
  82. Assert.Equal(new[] { 0, 4, 5 }, target.Containers.Select(x => x.Index));
  83. }
  84. [Fact]
  85. public void RemoveRange_Should_Alter_Successive_Container_Indexes()
  86. {
  87. var items = new[] { "foo", "bar", "baz" };
  88. var owner = new Decorator();
  89. var target = new ItemContainerGenerator(owner);
  90. var containers = Materialize(target, 0, items);
  91. var removed = target.RemoveRange(1, 1).Single();
  92. Assert.Equal(containers[0].ContainerControl, target.ContainerFromIndex(0));
  93. Assert.Equal(containers[2].ContainerControl, target.ContainerFromIndex(1));
  94. Assert.Equal(containers[1], removed);
  95. Assert.Equal(new[] { 0, 1 }, target.Containers.Select(x => x.Index));
  96. }
  97. [Fact]
  98. public void Style_Binding_Should_Be_Able_To_Override_Content()
  99. {
  100. var owner = new Decorator();
  101. var target = new ItemContainerGenerator(owner);
  102. var container = (ContentPresenter)target.Materialize(0, "foo").ContainerControl;
  103. Assert.Equal("foo", container.Content);
  104. container.Bind(
  105. ContentPresenter.ContentProperty,
  106. Observable.Never<object>().StartWith("bar"),
  107. BindingPriority.Style);
  108. Assert.Equal("bar", container.Content);
  109. }
  110. [Fact]
  111. public void Style_Binding_Should_Be_Able_To_Override_Content_Typed()
  112. {
  113. var owner = new Decorator();
  114. var target = new ItemContainerGenerator<ListBoxItem>(owner, ListBoxItem.ContentProperty, null);
  115. var container = (ListBoxItem)target.Materialize(0, "foo").ContainerControl;
  116. Assert.Equal("foo", container.Content);
  117. container.Bind(
  118. ContentPresenter.ContentProperty,
  119. Observable.Never<object>().StartWith("bar"),
  120. BindingPriority.Style);
  121. Assert.Equal("bar", container.Content);
  122. }
  123. private IList<ItemContainerInfo> Materialize(
  124. IItemContainerGenerator generator,
  125. int index,
  126. string[] items)
  127. {
  128. var result = new List<ItemContainerInfo>();
  129. foreach (var item in items)
  130. {
  131. var container = generator.Materialize(index++, item);
  132. result.Add(container);
  133. }
  134. return result;
  135. }
  136. }
  137. }