SafeEnumerableListTests.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. using System.Collections.Generic;
  2. using Avalonia.Utilities;
  3. using Xunit;
  4. namespace Avalonia.Controls.UnitTests.Utils
  5. {
  6. public class SafeEnumerableListTests
  7. {
  8. [Fact]
  9. public void List_Is_Not_Copied_Outside_Enumeration()
  10. {
  11. var target = new SafeEnumerableList<string>();
  12. var inner = target.Inner;
  13. target.Add("foo");
  14. target.Add("bar");
  15. target.Remove("foo");
  16. Assert.Same(inner, target.Inner);
  17. }
  18. [Fact]
  19. public void List_Is_Copied_Outside_Enumeration()
  20. {
  21. var target = new SafeEnumerableList<string>();
  22. var inner = target.Inner;
  23. target.Add("foo");
  24. foreach (var i in target)
  25. {
  26. Assert.Same(inner, target.Inner);
  27. target.Add("bar");
  28. Assert.NotSame(inner, target.Inner);
  29. Assert.Equal("foo", i);
  30. }
  31. inner = target.Inner;
  32. foreach (var i in target)
  33. {
  34. target.Add("baz");
  35. Assert.NotSame(inner, target.Inner);
  36. }
  37. Assert.Equal(new[] { "foo", "bar", "baz", "baz" }, target);
  38. }
  39. [Fact]
  40. public void List_Is_Not_Copied_After_Enumeration()
  41. {
  42. var target = new SafeEnumerableList<string>();
  43. var inner = target.Inner;
  44. target.Add("foo");
  45. foreach (var i in target)
  46. {
  47. target.Add("bar");
  48. Assert.NotSame(inner, target.Inner);
  49. inner = target.Inner;
  50. Assert.Equal("foo", i);
  51. }
  52. target.Add("baz");
  53. Assert.Same(inner, target.Inner);
  54. }
  55. [Fact]
  56. public void List_Is_Copied_Only_Once_During_Enumeration()
  57. {
  58. var target = new SafeEnumerableList<string>();
  59. var inner = target.Inner;
  60. target.Add("foo");
  61. foreach (var i in target)
  62. {
  63. target.Add("bar");
  64. Assert.NotSame(inner, target.Inner);
  65. inner = target.Inner;
  66. target.Add("baz");
  67. Assert.Same(inner, target.Inner);
  68. }
  69. target.Add("baz");
  70. }
  71. [Fact]
  72. public void List_Is_Copied_During_Nested_Enumerations()
  73. {
  74. var target = new SafeEnumerableList<string>();
  75. var initialInner = target.Inner;
  76. var firstItems = new List<string>();
  77. var secondItems = new List<string>();
  78. List<string> firstInner;
  79. List<string> secondInner;
  80. target.Add("foo");
  81. foreach (var i in target)
  82. {
  83. target.Add("bar");
  84. firstInner = target.Inner;
  85. Assert.NotSame(initialInner, firstInner);
  86. foreach (var j in target)
  87. {
  88. target.Add("baz");
  89. secondInner = target.Inner;
  90. Assert.NotSame(firstInner, secondInner);
  91. secondItems.Add(j);
  92. }
  93. firstItems.Add(i);
  94. }
  95. Assert.Equal(new[] { "foo" }, firstItems);
  96. Assert.Equal(new[] { "foo", "bar" }, secondItems);
  97. Assert.Equal(new[] { "foo", "bar", "baz", "baz" }, target);
  98. var finalInner = target.Inner;
  99. target.Add("final");
  100. Assert.Same(finalInner, target.Inner);
  101. }
  102. }
  103. }