Custom list types added to force the desired interfaces.

This commit is contained in:
mlemanczyk committed 2023-10-21 20:37:08 +02:00
1 parent 2416eeeab3
commit a5d59b1f6e
9 files changed
+185 -35

No files matched your search

+6 -2
View File
@@ -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<T>`
* `CustomICollection<T>` with `ICollection` interface
* `CustomICollectionT<T>` with `ICollection<T>` interface
* `CustomIList<T>` with `IList` interface
* `CustomIListT<T>` with `IList<T>` interface
* `CustomIReadOnlyList<T>` with `IReadOnlyList<T>` interface
* `EnmerableWithoutCount<T>` with `IEnumerable` & `IEnumerable<T>` interfaces
* `RecyclableLongListTestData`
* `CustomIList`
@@ -0,0 +1,24 @@
using System.Collections;
namespace Recyclable.Collections.TestData
{
public class CustomICollection<T> : ICollection, IEnumerable<T>
{
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<T> IEnumerable<T>.GetEnumerator() => ((IEnumerable<T>)_testData).GetEnumerator();
}
}
@@ -0,0 +1,31 @@
using System.Collections;
namespace Recyclable.Collections.TestData
{
public class CustomICollectionT<T> : ICollection<T>, IEnumerable<T>
{
private readonly List<T> _testData;
public CustomICollectionT(in List<T> 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<T> GetEnumerator() => _testData.GetEnumerator();
public bool Remove(T item) => _testData.Remove(item);
IEnumerator IEnumerable.GetEnumerator() => _testData.GetEnumerator();
}
}
+47 -14
View File
@@ -2,7 +2,7 @@
namespace Recyclable.Collections.TestData
{
public class CustomIList<T> : IList<T>
public class CustomIList<T> : IList, IEnumerable<T>
{
protected List<T> _list;
@@ -16,18 +16,51 @@ namespace Recyclable.Collections.TestData
_list = new List<T>(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<T> 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<T> IEnumerable<T>.GetEnumerator() => ((IEnumerable<T>)_list).GetEnumerator();
}
}
@@ -0,0 +1,33 @@
using System.Collections;
namespace Recyclable.Collections.TestData
{
public class CustomIListT<T> : IList<T>, IEnumerable<T>
{
protected List<T> _list;
public CustomIListT()
{
_list = new List<T>();
}
public CustomIListT(IEnumerable<T> items)
{
_list = new List<T>(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<T> 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();
}
}
@@ -0,0 +1,22 @@
using System.Collections;
namespace Recyclable.Collections.TestData
{
public class CustomIReadOnlyList<T> : IReadOnlyList<T>
{
private readonly T[] _testData;
public CustomIReadOnlyList(T[] testData)
{
_testData = testData;
}
public T this[int index] => _testData[index];
public int Count => _testData.Length;
public IEnumerator<T> GetEnumerator() => _testData.AsEnumerable().GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => _testData.GetEnumerator();
}
}
@@ -2,7 +2,7 @@
namespace Recyclable.Collections.TestData
{
public class EnumerableWithoutCount<T> : IEnumerable<T>
public class EnumerableWithoutCount<T> : IEnumerable, IEnumerable<T>
{
private readonly IEnumerable<T> _testData;
@@ -11,7 +11,8 @@ namespace Recyclable.Collections.TestData
_testData = testData;
}
public IEnumerator<T> GetEnumerator() => _testData.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => _testData.GetEnumerator();
public IEnumerator GetEnumerator() => _testData.GetEnumerator();
IEnumerator<T> IEnumerable<T>.GetEnumerator() => _testData.GetEnumerator();
}
}
@@ -7,7 +7,7 @@
<OutputType>Library</OutputType>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageId>Recyclable.Collections.TestData</PackageId>
<PackageVersion>0.0.2</PackageVersion>
<PackageVersion>0.0.3</PackageVersion>
<Authors>Marek Lemańczyk</Authors>
<Company>N/A</Company>
<Product>Recyclable.Collections.TestData</Product>
@@ -19,7 +19,7 @@
<PackageLicenseFile>LICENSE.md</PackageLicenseFile>
<PackageReadmeFile>README.md</PackageReadmeFile>
<RepositoryType>git</RepositoryType>
<PackageReleaseNotes>Initial version extracted from `Recyclable.Collections`</PackageReleaseNotes>
<PackageReleaseNotes>Custom collection types added to force desired interfaces.</PackageReleaseNotes>
<Platforms>AnyCPU;x64</Platforms>
<PackageIcon>logo.png</PackageIcon>
</PropertyGroup>
@@ -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<T>[{itemsCount}]", testData, itemsCount };
yield return new object[] { $"IEnumerable[{itemsCount}]", testData, itemsCount };
yield return new object[] { $"ICollection[{itemsCount}]", new CustomICollection<long>(testData), itemsCount };
yield return new object[] { $"ICollection<T>[{itemsCount}]", new CustomICollectionT<long>(testData.ToList()), itemsCount };
yield return new object[] { $"IEnumerable[{itemsCount}]", new EnumerableWithoutCount<long>(testData), itemsCount };
yield return new object[] { $"IEnumerable<T>[{itemsCount}] without non-enumerated count", new EnumerableWithoutCount<long>(testData), itemsCount };
yield return new object[] { $"IList<T>[{itemsCount}]", new CustomIList<long>(testData), itemsCount };
yield return new object[] { $"IReadOnlyList<T>[{itemsCount}])", testData, itemsCount };
yield return new object[] { $"IList[{itemsCount}]", new CustomIList<long>(testData), itemsCount };
yield return new object[] { $"IList<T>[{itemsCount}]", new CustomIListT<long>(testData), itemsCount };
yield return new object[] { $"IReadOnlyList<T>[{itemsCount}])", new CustomIReadOnlyList<long>(testData), itemsCount };
yield return new object[] { $"List<T>[{itemsCount}]", testData.ToList(), itemsCount };
yield return new object[] { $"ReadOnlySpan<T>[{itemsCount}]", testData, itemsCount };
yield return new object[] { $"RecyclableList<T>[{itemsCount}]", testData.ToRecyclableList(), itemsCount };
@@ -114,15 +115,16 @@ namespace Recyclable.Collections.TestData
break;
case true:
IEnumerable<object> 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<T>(itemsCount: {itemsCount}", testRefData, itemsCount };
yield return new object[] { $"IEnumerable(itemsCount: {itemsCount})", testRefData, itemsCount };
yield return new object[] { $"ICollection(itemsCount: {itemsCount}", new CustomICollection<object>(testRefData), itemsCount };
yield return new object[] { $"ICollection<T>(itemsCount: {itemsCount}", new CustomICollectionT<object>(testRefData.ToList()), itemsCount };
yield return new object[] { $"IEnumerable(itemsCount: {itemsCount})", new EnumerableWithoutCount<object>(testRefData), itemsCount };
yield return new object[] { $"IEnumerable<T>(itemsCount: {itemsCount}) without non-enumerated count", new EnumerableWithoutCount<object>(testRefData), itemsCount };
yield return new object[] { $"IList<T>(itemsCount: {itemsCount})", new CustomIList<object>(testRefData), itemsCount };
yield return new object[] { $"IReadOnlyList<T>(itemsCount: {itemsCount})", testRefData, itemsCount };
yield return new object[] { $"IList(itemsCount: {itemsCount})", new CustomIList<object>(testRefData), itemsCount };
yield return new object[] { $"IList<T>(itemsCount: {itemsCount})", new CustomIListT<object>(testRefData), itemsCount };
yield return new object[] { $"IReadOnlyList<T>(itemsCount: {itemsCount})", new CustomIReadOnlyList<object>(testRefData), itemsCount };
yield return new object[] { $"List<T>(itemsCount: {itemsCount}", testRefData.ToList(), itemsCount };
yield return new object[] { $"ReadOnlySpan<T>[{itemsCount}]", testRefData, itemsCount };
yield return new object[] { $"RecyclableList<T>(itemsCount: {itemsCount})", testRefData.ToRecyclableList(), itemsCount };
@@ -191,11 +193,11 @@ namespace Recyclable.Collections.TestData
public static IEnumerable<object[]> SourceRefDataVariants => CreateSourceDataVariants(true);
public static IEnumerable<object[]> SourceRefDataWithBlockSizeVariants { get; } = CombineSourceDataWithBlockSize(SourceRefDataVariants);
private static IEnumerable<long> _initialItemIndexVariants => new long[] { 0, 1, 2, 3, 4, 5 };
private static IEnumerable<long> InitialItemIndexVariants => new long[] { 0, 1, 2, 3, 4, 5 };
private static IEnumerable<long> CreateItemIndexVariants(long itemsCount, int blockSize)
{
IEnumerable<long> primes = _initialItemIndexVariants.Concat(
_initialItemIndexVariants.SelectMany(index => new long[] { blockSize - index, blockSize + index })
IEnumerable<long> 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();