From a5d59b1f6e8fe234c5653e20fe89a9aba789f883 Mon Sep 17 00:00:00 2001 From: mlemanczyk Date: Sat, 21 Oct 2023 20:37:08 +0200 Subject: [PATCH] Custom list types added to force the desired interfaces. --- README.md | 8 ++- .../CustomICollection.cs | 24 ++++++++ .../CustomICollectionT.cs | 31 ++++++++++ .../CustomIList.cs | 61 ++++++++++++++----- .../CustomIListT.cs | 33 ++++++++++ .../CustomIReadOnlyList.cs | 22 +++++++ .../EnumerableWithoutCount.cs | 7 ++- .../Recyclable.Collections.TestData.csproj | 4 +- .../RecyclableLongListTestData.cs | 30 ++++----- 9 files changed, 185 insertions(+), 35 deletions(-) create mode 100644 Recyclable.Collections.TestData/CustomICollection.cs create mode 100644 Recyclable.Collections.TestData/CustomICollectionT.cs create mode 100644 Recyclable.Collections.TestData/CustomIListT.cs create mode 100644 Recyclable.Collections.TestData/CustomIReadOnlyList.cs diff --git a/README.md b/README.md index c44a4d4..c0dbd2b 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,10 @@ `Recyclable.Collections.TestData` project is a basic open source package for containing test data useful for testing collections like `RecyclableList<T>`, `RecyclableLongList<T>`, `List<T>`, `SortableList<T>`, `PriorityQueue<T>` & similar. ## Included -* `EnmerableWithoutCount` +* `CustomICollection` with `ICollection` interface +* `CustomICollectionT` with `ICollection` interface +* `CustomIList` with `IList` interface +* `CustomIListT` with `IList` interface +* `CustomIReadOnlyList` with `IReadOnlyList` interface +* `EnmerableWithoutCount` with `IEnumerable` & `IEnumerable` interfaces * `RecyclableLongListTestData` -* `CustomIList` diff --git a/Recyclable.Collections.TestData/CustomICollection.cs b/Recyclable.Collections.TestData/CustomICollection.cs new file mode 100644 index 0000000..5caf339 --- /dev/null +++ b/Recyclable.Collections.TestData/CustomICollection.cs @@ -0,0 +1,24 @@ +using System.Collections; + +namespace Recyclable.Collections.TestData +{ + public class CustomICollection : ICollection, IEnumerable + { + private readonly T[] _testData; + + public CustomICollection(in T[] testData) + { + _testData = testData; + } + + public int Count => _testData.Length; + public bool IsSynchronized => true; + public object SyncRoot => _testData; + + public void CopyTo(Array array, int index) => _testData.CopyTo((T[])array, index); + + public IEnumerator GetEnumerator() => _testData.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)_testData).GetEnumerator(); + } +} diff --git a/Recyclable.Collections.TestData/CustomICollectionT.cs b/Recyclable.Collections.TestData/CustomICollectionT.cs new file mode 100644 index 0000000..e11f079 --- /dev/null +++ b/Recyclable.Collections.TestData/CustomICollectionT.cs @@ -0,0 +1,31 @@ +using System.Collections; + +namespace Recyclable.Collections.TestData +{ + public class CustomICollectionT : ICollection, IEnumerable + { + private readonly List _testData; + + public CustomICollectionT(in List testData) + { + _testData = testData; + } + + public int Count => _testData.Count; + public bool IsReadOnly => false; + + public void Add(T item) => _testData.Add(item); + + public void Clear() => _testData.Clear(); + + public bool Contains(T item) => _testData.Contains(item); + + public void CopyTo(T[] array, int arrayIndex) => _testData.CopyTo(array, arrayIndex); + + public IEnumerator GetEnumerator() => _testData.GetEnumerator(); + + public bool Remove(T item) => _testData.Remove(item); + + IEnumerator IEnumerable.GetEnumerator() => _testData.GetEnumerator(); + } +} diff --git a/Recyclable.Collections.TestData/CustomIList.cs b/Recyclable.Collections.TestData/CustomIList.cs index 42f367f..2789da1 100644 --- a/Recyclable.Collections.TestData/CustomIList.cs +++ b/Recyclable.Collections.TestData/CustomIList.cs @@ -2,7 +2,7 @@ namespace Recyclable.Collections.TestData { - public class CustomIList : IList + public class CustomIList : IList, IEnumerable { protected List _list; @@ -16,18 +16,51 @@ namespace Recyclable.Collections.TestData _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(0, array, arrayIndex, _list.Count); - 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(); + public object? this[int index] { get => ((IList)_list)[index]; set => ((IList)_list)[index] = value; } + + public bool IsFixedSize => ((IList)_list).IsFixedSize; + + public bool IsReadOnly => ((IList)_list).IsReadOnly; + + public int Count => ((ICollection)_list).Count; + + public bool IsSynchronized => ((ICollection)_list).IsSynchronized; + + public object SyncRoot => ((ICollection)_list).SyncRoot; + + public int Add(object? value) => ((IList)_list).Add(value); + + public void Clear() + { + ((IList)_list).Clear(); + } + + public bool Contains(object? value) => ((IList)_list).Contains(value); + + public void CopyTo(Array array, int index) + { + ((ICollection)_list).CopyTo(array, index); + } + + public IEnumerator GetEnumerator() => ((IEnumerable)_list).GetEnumerator(); + + public int IndexOf(object? value) => ((IList)_list).IndexOf(value); + + public void Insert(int index, object? value) + { + ((IList)_list).Insert(index, value); + } + + public void Remove(object? value) + { + ((IList)_list).Remove(value); + } + + public void RemoveAt(int index) + { + ((IList)_list).RemoveAt(index); + } + + IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)_list).GetEnumerator(); } } \ No newline at end of file diff --git a/Recyclable.Collections.TestData/CustomIListT.cs b/Recyclable.Collections.TestData/CustomIListT.cs new file mode 100644 index 0000000..91a85b8 --- /dev/null +++ b/Recyclable.Collections.TestData/CustomIListT.cs @@ -0,0 +1,33 @@ +using System.Collections; + +namespace Recyclable.Collections.TestData +{ + public class CustomIListT : IList, IEnumerable + { + protected List _list; + + public CustomIListT() + { + _list = new List(); + } + + public CustomIListT(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(0, array, arrayIndex, _list.Count); + 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.Collections.TestData/CustomIReadOnlyList.cs b/Recyclable.Collections.TestData/CustomIReadOnlyList.cs new file mode 100644 index 0000000..2d92f64 --- /dev/null +++ b/Recyclable.Collections.TestData/CustomIReadOnlyList.cs @@ -0,0 +1,22 @@ +using System.Collections; + +namespace Recyclable.Collections.TestData +{ + public class CustomIReadOnlyList : IReadOnlyList + { + private readonly T[] _testData; + + public CustomIReadOnlyList(T[] testData) + { + _testData = testData; + } + + public T this[int index] => _testData[index]; + + public int Count => _testData.Length; + + public IEnumerator GetEnumerator() => _testData.AsEnumerable().GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => _testData.GetEnumerator(); + } +} \ No newline at end of file diff --git a/Recyclable.Collections.TestData/EnumerableWithoutCount.cs b/Recyclable.Collections.TestData/EnumerableWithoutCount.cs index fda438e..1864a24 100644 --- a/Recyclable.Collections.TestData/EnumerableWithoutCount.cs +++ b/Recyclable.Collections.TestData/EnumerableWithoutCount.cs @@ -2,7 +2,7 @@ namespace Recyclable.Collections.TestData { - public class EnumerableWithoutCount : IEnumerable + public class EnumerableWithoutCount : IEnumerable, IEnumerable { private readonly IEnumerable _testData; @@ -11,7 +11,8 @@ namespace Recyclable.Collections.TestData _testData = testData; } - public IEnumerator GetEnumerator() => _testData.GetEnumerator(); - IEnumerator IEnumerable.GetEnumerator() => _testData.GetEnumerator(); + public IEnumerator GetEnumerator() => _testData.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => _testData.GetEnumerator(); } } \ No newline at end of file diff --git a/Recyclable.Collections.TestData/Recyclable.Collections.TestData.csproj b/Recyclable.Collections.TestData/Recyclable.Collections.TestData.csproj index 4df4438..539d85f 100644 --- a/Recyclable.Collections.TestData/Recyclable.Collections.TestData.csproj +++ b/Recyclable.Collections.TestData/Recyclable.Collections.TestData.csproj @@ -7,7 +7,7 @@ Library true Recyclable.Collections.TestData - 0.0.2 + 0.0.3 Marek Lemańczyk N/A Recyclable.Collections.TestData @@ -19,7 +19,7 @@ LICENSE.md README.md git - Initial version extracted from `Recyclable.Collections` + Custom collection types added to force desired interfaces. AnyCPU;x64 logo.png diff --git a/Recyclable.Collections.TestData/RecyclableLongListTestData.cs b/Recyclable.Collections.TestData/RecyclableLongListTestData.cs index e164fcb..282504a 100644 --- a/Recyclable.Collections.TestData/RecyclableLongListTestData.cs +++ b/Recyclable.Collections.TestData/RecyclableLongListTestData.cs @@ -84,12 +84,13 @@ namespace Recyclable.Collections.TestData long[] testData = CreateTestData(itemsCount).ToArray(); yield return new object[] { $"Array[{itemsCount}]", testData, itemsCount }; - yield return new object[] { $"ICollection[{itemsCount}]", testData, itemsCount }; - yield return new object[] { $"ICollection[{itemsCount}]", testData, itemsCount }; - yield return new object[] { $"IEnumerable[{itemsCount}]", testData, itemsCount }; + yield return new object[] { $"ICollection[{itemsCount}]", new CustomICollection(testData), itemsCount }; + yield return new object[] { $"ICollection[{itemsCount}]", new CustomICollectionT(testData.ToList()), itemsCount }; + yield return new object[] { $"IEnumerable[{itemsCount}]", new EnumerableWithoutCount(testData), itemsCount }; yield return new object[] { $"IEnumerable[{itemsCount}] without non-enumerated count", new EnumerableWithoutCount(testData), itemsCount }; - yield return new object[] { $"IList[{itemsCount}]", new CustomIList(testData), itemsCount }; - yield return new object[] { $"IReadOnlyList[{itemsCount}])", testData, itemsCount }; + yield return new object[] { $"IList[{itemsCount}]", new CustomIList(testData), itemsCount }; + yield return new object[] { $"IList[{itemsCount}]", new CustomIListT(testData), itemsCount }; + yield return new object[] { $"IReadOnlyList[{itemsCount}])", new CustomIReadOnlyList(testData), itemsCount }; yield return new object[] { $"List[{itemsCount}]", testData.ToList(), itemsCount }; yield return new object[] { $"ReadOnlySpan[{itemsCount}]", testData, itemsCount }; yield return new object[] { $"RecyclableList[{itemsCount}]", testData.ToRecyclableList(), itemsCount }; @@ -114,15 +115,16 @@ namespace Recyclable.Collections.TestData break; case true: - IEnumerable testRefData = CreateRefTestData(itemsCount).ToArray(); + object[] testRefData = CreateRefTestData(itemsCount).ToArray(); yield return new object[] { $"Array[{itemsCount}]", testRefData, itemsCount }; - yield return new object[] { $"ICollection(itemsCount: {itemsCount}", testRefData, itemsCount }; - yield return new object[] { $"ICollection(itemsCount: {itemsCount}", testRefData, itemsCount }; - yield return new object[] { $"IEnumerable(itemsCount: {itemsCount})", testRefData, itemsCount }; + yield return new object[] { $"ICollection(itemsCount: {itemsCount}", new CustomICollection(testRefData), itemsCount }; + yield return new object[] { $"ICollection(itemsCount: {itemsCount}", new CustomICollectionT(testRefData.ToList()), itemsCount }; + yield return new object[] { $"IEnumerable(itemsCount: {itemsCount})", new EnumerableWithoutCount(testRefData), itemsCount }; yield return new object[] { $"IEnumerable(itemsCount: {itemsCount}) without non-enumerated count", new EnumerableWithoutCount(testRefData), itemsCount }; - yield return new object[] { $"IList(itemsCount: {itemsCount})", new CustomIList(testRefData), itemsCount }; - yield return new object[] { $"IReadOnlyList(itemsCount: {itemsCount})", testRefData, itemsCount }; + yield return new object[] { $"IList(itemsCount: {itemsCount})", new CustomIList(testRefData), itemsCount }; + yield return new object[] { $"IList(itemsCount: {itemsCount})", new CustomIListT(testRefData), itemsCount }; + yield return new object[] { $"IReadOnlyList(itemsCount: {itemsCount})", new CustomIReadOnlyList(testRefData), itemsCount }; yield return new object[] { $"List(itemsCount: {itemsCount}", testRefData.ToList(), itemsCount }; yield return new object[] { $"ReadOnlySpan[{itemsCount}]", testRefData, itemsCount }; yield return new object[] { $"RecyclableList(itemsCount: {itemsCount})", testRefData.ToRecyclableList(), itemsCount }; @@ -191,11 +193,11 @@ namespace Recyclable.Collections.TestData public static IEnumerable SourceRefDataVariants => CreateSourceDataVariants(true); public static IEnumerable SourceRefDataWithBlockSizeVariants { get; } = CombineSourceDataWithBlockSize(SourceRefDataVariants); - private static IEnumerable _initialItemIndexVariants => new long[] { 0, 1, 2, 3, 4, 5 }; + private static IEnumerable InitialItemIndexVariants => new long[] { 0, 1, 2, 3, 4, 5 }; private static IEnumerable CreateItemIndexVariants(long itemsCount, int blockSize) { - IEnumerable primes = _initialItemIndexVariants.Concat( - _initialItemIndexVariants.SelectMany(index => new long[] { blockSize - index, blockSize + index }) + IEnumerable primes = InitialItemIndexVariants.Concat( + InitialItemIndexVariants.SelectMany(index => new long[] { blockSize - index, blockSize + index }) //new long[] { blockSize - 3, blockSize - 2, blockSize - 1, blockSize, blockSize + 1, blockSize + 2, blockSize + 3 } ).ToArray();