1
0

SafeEnumerableHashSetTests.cs 3.6 KB

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