From 25a85ec76311a97675fa0fd3f83402bd1039a531 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Sat, 11 Mar 2023 23:16:15 +0100 Subject: [PATCH] New tests added. AddRangeShouldAddItemsInCorrectOrder & AddRangeShouldNotOverrideItems converted to theories with [MemberData] --- Recyclable.CollectionsTests/CustomIList.cs | 33 +++ .../RecyclableListTests.cs | 253 +++++++----------- 2 files changed, 128 insertions(+), 158 deletions(-) create mode 100644 Recyclable.CollectionsTests/CustomIList.cs diff --git a/Recyclable.CollectionsTests/CustomIList.cs b/Recyclable.CollectionsTests/CustomIList.cs new file mode 100644 index 0000000..6d191b8 --- /dev/null +++ b/Recyclable.CollectionsTests/CustomIList.cs @@ -0,0 +1,33 @@ +using System.Collections; + +namespace Recyclable.CollectionsTests +{ + public class CustomIList : IList + { + protected List _list; + + public CustomIList() + { + _list = new List(); + } + + public CustomIList(IEnumerable items) + { + _list = new List(items); + } + + public T this[int index] { get => _list[index]; set => _list[index] = value; } + public int Count => _list.Count; + public bool IsReadOnly => false; + public void Add(T item) => _list.Add(item); + public void Clear() => _list.Clear(); + public bool Contains(T item) => _list.Contains(item); + public void CopyTo(T[] array, int arrayIndex) => _list.CopyTo(array, arrayIndex); + public IEnumerator GetEnumerator() => _list.GetEnumerator(); + public int IndexOf(T item) => _list.IndexOf(item); + public void Insert(int index, T item) => _list.Insert(index, item); + public bool Remove(T item) => _list.Remove(item); + public void RemoveAt(int index) => _list.RemoveAt(index); + IEnumerator IEnumerable.GetEnumerator() => _list.GetEnumerator(); + } +} \ No newline at end of file diff --git a/Recyclable.CollectionsTests/RecyclableListTests.cs b/Recyclable.CollectionsTests/RecyclableListTests.cs index 2a21ca8..e6c927a 100644 --- a/Recyclable.CollectionsTests/RecyclableListTests.cs +++ b/Recyclable.CollectionsTests/RecyclableListTests.cs @@ -314,99 +314,112 @@ namespace Recyclable.CollectionsTests _ = list.LongCount.Should().Be(0); } - [Fact] - public void AddRangeShouldAddItemsInCorrectOrderWhenSourceIsArray() + public static IEnumerable AddRangeCollectionTypes => new[] { - // Prepare - var testData = _testData.ToArray(); - using var list = new RecyclableList(); + new object[] { "int[]", _testData.ToArray() }, + new object[] { "List", _testData.ToList() }, + new object[] { "RecyclableArrayList", _testData.ToRecyclableArrayList() }, + new object[] { "RecyclableList", _testData.ToRecyclableList() }, + new object[] { "IList", new CustomIList(_testData) }, + new object[] { "IEnumerable", _testData }, + }; + [Theory] + [MemberData(nameof(AddRangeCollectionTypes))] + public void AddRangeShouldAddItemsInCorrectOrder(string testCase, IEnumerable testData) + { + try + { + // Prepare + using var list = new RecyclableList(); - // Act - list.AddRange(testData); + // Act + if (testData is int[] testDataArray) + { + list.AddRange(testDataArray); + } + else if (testData is List testDataList) + { + list.AddRange(testDataList); + } + else if (testData is RecyclableArrayList testDataRecyclableArrayList) + { + list.AddRange(testDataRecyclableArrayList); + } + else if (testData is RecyclableList testDataRecyclableList) + { + list.AddRange(testDataRecyclableList); + } + else if (testData is IList testDataIList) + { + list.AddRange(testDataIList); + } + else if (testData is IEnumerable testDataIEnumerable) + { + list.AddRange(testDataIEnumerable); + } + else + { + throw new InvalidCastException("Unknown type of test data"); + } - // Validate - _ = list.Capacity.Should().Be(114_688, "when capacity == 0, then we allocate as much memory as needed, only"); - _ = list.Should().HaveCount(testData.Length) - .And.ContainInConsecutiveOrder(testData); + // Validate + int expectedItemsCount = testData.Count(); + _ = list.Capacity.Should().BeGreaterThanOrEqualTo(expectedItemsCount, "when capacity == 0, then we should allocate as much memory as needed, only"); + _ = list.Should().HaveCount(expectedItemsCount) + .And.ContainInConsecutiveOrder(testData); + } + finally + { + if (testData is IDisposable disposable) + { + disposable.Dispose(); + } + } } - [Fact] - public void AddRangeShouldAddItemsInCorrectOrderWhenSourceIsList() + [Theory] + [MemberData(nameof(AddRangeCollectionTypes))] + public void AddRangeShouldNotOverrideItems(string testCase, IEnumerable testData) { // Prepare - var testData = _testData.ToList(); - using var list = new RecyclableList(); - - // Act - list.AddRange(testData); - - // Validate - _ = list.Capacity.Should().Be(114_688, "when capacity == 0, then we allocate as much memory as needed, only"); - _ = list.Should().HaveCount(testData.Count) - .And.ContainInConsecutiveOrder(testData); - } - - [Fact] - public void AddRangeShouldAddItemsInCorrectOrderWhenSourceIsIList() - { - // Prepare - var testData = (IList)_testData.ToList(); - using var list = new RecyclableList(); - - // Act - list.AddRange(testData); - - // Validate - _ = list.Capacity.Should().BeGreaterThanOrEqualTo(testData.Count); - _ = list.Should().HaveCount(testData.Count) - .And.ContainInConsecutiveOrder(testData); - } - - [Fact] - public void AddRangeShouldAddItemsInCorrectOrderWhenSourceIsRecyclableArrayList() - { - // Prepare - var testData = _testData.ToRecyclableArrayList(); - using var list = new RecyclableList(); - - // Act - list.AddRange(testData); - - // Validate - _ = list.Capacity.Should().Be(114_688, "when capacity == 0, then we allocate as much memory as needed, only"); - _ = list.Should().HaveCount(testData.Count) - .And.ContainInConsecutiveOrder(testData) - .And.BeEquivalentTo(testData); - } - - [Fact] - public void AddRangeShouldAddItemsInCorrectOrderWhenSourceIsRecyclableList() - { - // Prepare - var testData = _testData.ToRecyclableList(); - using var list = new RecyclableList(); - - // Act - list.AddRange(testData); - - // Validate - _ = list.Capacity.Should().Be(114_688, "when capacity == 0, then we allocate as much memory as needed, only"); - _ = list.Should().HaveCount(testData.Count) - .And.ContainInConsecutiveOrder(testData) - .And.BeEquivalentTo(testData); - } - - [Fact] - public void AddRangeShouldNotOverrideItemsWhenSourceIsArray() - { - // Prepare - var testData = _testData.ToArray(); var list = new RecyclableList(); // Act - list.AddRange(testData); - list.AddRange(testData); + if (testData is int[] testDataArray) + { + list.AddRange(testDataArray); + list.AddRange(testDataArray); + } + else if (testData is List testDataList) + { + list.AddRange(testDataList); + list.AddRange(testDataList); + } + else if (testData is RecyclableArrayList testDataRecyclableArrayList) + { + list.AddRange(testDataRecyclableArrayList); + list.AddRange(testDataRecyclableArrayList); + } + else if (testData is RecyclableList testDataRecyclableList) + { + list.AddRange(testDataRecyclableList); + list.AddRange(testDataRecyclableList); + } + else if (testData is IList testDataIList) + { + list.AddRange(testDataIList); + list.AddRange(testDataIList); + } + else if (testData is IEnumerable testDataIEnumerable) + { + list.AddRange(testDataIEnumerable); + list.AddRange(testDataIEnumerable); + } + else + { + throw new InvalidCastException("Unknown type of test data"); + } // Validate var expectedData = testData.Concat(testData).ToArray(); @@ -416,82 +429,6 @@ namespace Recyclable.CollectionsTests .And.BeEquivalentTo(expectedData); } - [Fact] - public void AddRangeShouldNotOverrideItemsWhenSourceIsIList() - { - // Prepare - var testData = (IList)_testData.ToList(); - var list = new RecyclableList(); - - // Act - list.AddRange(testData); - list.AddRange(testData); - - // Validate - var expectedData = testData.Concat(testData).ToArray(); - _ = list.Capacity.Should().Be(229376L, "when capacity == 0, then we allocate as much memory as needed, only"); - _ = list.Should().HaveCount(expectedData.Length) - .And.ContainInConsecutiveOrder(expectedData) - .And.BeEquivalentTo(expectedData); - } - - [Fact] - public void AddRangeShouldNotOverrideItemsWhenSourceIsList() - { - // Prepare - var testData = _testData.ToList(); - var list = new RecyclableList(); - - // Act - list.AddRange(testData); - list.AddRange(testData); - - // Validate - var expectedData = testData.Concat(testData).ToArray(); - _ = list.Capacity.Should().Be(229376L, "when capacity == 0, then we allocate as much memory as needed, only"); - _ = list.Should().HaveCount(expectedData.Length) - .And.ContainInConsecutiveOrder(expectedData) - .And.BeEquivalentTo(expectedData); - } - - [Fact] - public void AddRangeShouldNotOverrideItemsWhenSourceIsRecyclableArrayList() - { - // Prepare - using var testData = _testData.ToRecyclableArrayList(); - using var list = new RecyclableList(); - - // Act - list.AddRange(testData); - list.AddRange(testData); - - // Validate - var expectedData = _testData.Concat(_testData).ToArray(); - _ = list.Capacity.Should().Be(229376L, "when capacity == 0, then we allocate as much memory as needed, only"); - _ = list.Should().HaveCount(expectedData.Length) - .And.ContainInConsecutiveOrder(expectedData) - .And.BeEquivalentTo(expectedData); - } - - [Fact] - public void AddRangeShouldNotOverrideItemsWhenSourceIsRecyclableList() - { - // Prepare - using var testData = _testData.ToRecyclableList(); - using var list = new RecyclableList(); - - // Act - list.AddRange(testData); - list.AddRange(testData); - - // Validate - var expectedData = _testData.Concat(_testData).ToArray(); - _ = list.Capacity.Should().Be(229376L, "when capacity == 0, then we allocate as much memory as needed, only"); - _ = list.Should().HaveCount(expectedData.Length) - .And.ContainInConsecutiveOrder(expectedData) - .And.BeEquivalentTo(expectedData); - } - [Fact] public void InsertAtTheBeginningShouldMoveItems() {