public void CloneableBackingCollection() { List <Cloneable> values = new List <Cloneable>(new Cloneable[] { new Cloneable(), new Cloneable(), new Cloneable() }); CopyOnReadEnumerable <Cloneable> enumerable = new CopyOnReadEnumerable <Cloneable>(values, values); using (IEnumerator <Cloneable> enumerator = values.GetEnumerator()) { foreach (Cloneable i in enumerable) { enumerator.MoveNext(); Assert.False(Object.ReferenceEquals(i, enumerator.Current)); // "Enumerator copied references." } } }
public void NonCloneableBackingCollection() { List <int> values = new List <int>(new int[] { 1, 2, 3 }); CopyOnReadEnumerable <int> enumerable = new CopyOnReadEnumerable <int>(values, values); using (IEnumerator <int> enumerator = values.GetEnumerator()) { foreach (int i in enumerable) { enumerator.MoveNext(); Assert.Equal(i, enumerator.Current); } } }
public void EnumeratesBackingCollection() { List <int> values = new List <int>(new int[] { 1, 2, 3 }); CopyOnReadEnumerable <int, string> enumerable = new CopyOnReadEnumerable <int, string>(values, values, i => i.ToString()); using (IEnumerator <int> enumerator = values.GetEnumerator()) { foreach (string s in enumerable) { enumerator.MoveNext(); enumerator.Current.ToString().ShouldBe(s); } enumerator.MoveNext().ShouldBeFalse(); } }
public void CopiesBackingCollection() { List <string> values = new List <string>(new string[] { "a", "b", "c" }); CopyOnReadEnumerable <string, string> enumerable = new CopyOnReadEnumerable <string, string>(values, values, s => s); int expectedCount = values.Count; var enumerator = enumerable.GetEnumerator(); // The list has been copied and adding to it has no effect on the enumerable. values.Add("d"); int actualCount = 0; while (enumerator.MoveNext()) { actualCount++; } actualCount.ShouldBe(expectedCount); }