Recyclable.AddRange fixed to ignore empty sources
This commit is contained in:
1 parent
025cdb3073
commit
efb393e13f
3 files changed
+95
No files matched your search
@@ -275,6 +275,11 @@ namespace Recyclable.Collections
|
|||||||
|
|
||||||
public void AddRange(in T[] items)
|
public void AddRange(in T[] items)
|
||||||
{
|
{
|
||||||
|
if (items.LongLength == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
long targetCapacity = _longCount + items.LongLength;
|
long targetCapacity = _longCount + items.LongLength;
|
||||||
if (_capacity < targetCapacity)
|
if (_capacity < targetCapacity)
|
||||||
{
|
{
|
||||||
@@ -309,6 +314,11 @@ namespace Recyclable.Collections
|
|||||||
|
|
||||||
public void AddRange(RecyclableArrayList<T> items)
|
public void AddRange(RecyclableArrayList<T> items)
|
||||||
{
|
{
|
||||||
|
if (items.Count == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
long targetCapacity = _longCount + items.Count;
|
long targetCapacity = _longCount + items.Count;
|
||||||
if (_capacity < targetCapacity)
|
if (_capacity < targetCapacity)
|
||||||
{
|
{
|
||||||
@@ -343,6 +353,11 @@ namespace Recyclable.Collections
|
|||||||
|
|
||||||
public void AddRange(RecyclableList<T> items)
|
public void AddRange(RecyclableList<T> items)
|
||||||
{
|
{
|
||||||
|
if (items.LongCount == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
long itemsCount = items.LongCount,
|
long itemsCount = items.LongCount,
|
||||||
targetCapacity = _longCount + itemsCount;
|
targetCapacity = _longCount + itemsCount;
|
||||||
|
|
||||||
@@ -410,6 +425,11 @@ namespace Recyclable.Collections
|
|||||||
|
|
||||||
public void AddRange(List<T> items)
|
public void AddRange(List<T> items)
|
||||||
{
|
{
|
||||||
|
if (items.Count == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
long targetCapacity = _longCount + items.Count;
|
long targetCapacity = _longCount + items.Count;
|
||||||
if (_capacity < targetCapacity)
|
if (_capacity < targetCapacity)
|
||||||
{
|
{
|
||||||
@@ -445,6 +465,11 @@ namespace Recyclable.Collections
|
|||||||
|
|
||||||
public void AddRange(IList<T> items)
|
public void AddRange(IList<T> items)
|
||||||
{
|
{
|
||||||
|
if (items.Count == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
long targetCapacity = _longCount + items.Count;
|
long targetCapacity = _longCount + items.Count;
|
||||||
if (_capacity < targetCapacity)
|
if (_capacity < targetCapacity)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
using System.Collections;
|
||||||
|
|
||||||
|
namespace Recyclable.CollectionsTests
|
||||||
|
{
|
||||||
|
public class EnumerableWithoutCount<T> : IEnumerable<T>
|
||||||
|
{
|
||||||
|
private IEnumerable<T> _testData;
|
||||||
|
|
||||||
|
public EnumerableWithoutCount(IEnumerable<T> testData)
|
||||||
|
{
|
||||||
|
_testData = testData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerator<T> GetEnumerator() => _testData.GetEnumerator();
|
||||||
|
IEnumerator IEnumerable.GetEnumerator() => _testData.GetEnumerator();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -323,6 +323,17 @@ namespace Recyclable.CollectionsTests
|
|||||||
new object[] { "IEnumerable<int>", _testData },
|
new object[] { "IEnumerable<int>", _testData },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public static IEnumerable<object[]> AddRangeEmptyCollectionTypes => new[]
|
||||||
|
{
|
||||||
|
new object[] { "int[]", Array.Empty<int>() },
|
||||||
|
new object[] { "List<int>", Array.Empty<int>().ToList() },
|
||||||
|
new object[] { "RecyclableArrayList<int>", Array.Empty<int>().ToRecyclableArrayList() },
|
||||||
|
new object[] { "RecyclableList<int>", Array.Empty<int>().ToRecyclableList() },
|
||||||
|
new object[] { "IList<int>", new CustomIList<int>(Array.Empty<int>()) },
|
||||||
|
new object[] { "IEnumerable<int> with non-enumerated count", Array.Empty<int>().AsEnumerable() },
|
||||||
|
new object[] { "IEnumerable<int> without non-enumerated count", new EnumerableWithoutCount<int>(Array.Empty<int>()) }
|
||||||
|
};
|
||||||
|
|
||||||
[Theory]
|
[Theory]
|
||||||
[MemberData(nameof(AddRangeCollectionTypes))]
|
[MemberData(nameof(AddRangeCollectionTypes))]
|
||||||
public void AddRangeShouldAddItemsInCorrectOrder(string testCase, IEnumerable<int> testData)
|
public void AddRangeShouldAddItemsInCorrectOrder(string testCase, IEnumerable<int> testData)
|
||||||
@@ -428,6 +439,48 @@ namespace Recyclable.CollectionsTests
|
|||||||
.And.BeEquivalentTo(expectedData);
|
.And.BeEquivalentTo(expectedData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[MemberData(nameof(AddRangeEmptyCollectionTypes))]
|
||||||
|
public void AddRangeShouldDoNothingWhenSourceIsEmpty(string testCase, IEnumerable<int> testData)
|
||||||
|
{
|
||||||
|
// Prepare
|
||||||
|
var list = new RecyclableList<int>();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
if (testData is int[] testDataArray)
|
||||||
|
{
|
||||||
|
list.AddRange(testDataArray);
|
||||||
|
}
|
||||||
|
else if (testData is List<int> testDataList)
|
||||||
|
{
|
||||||
|
list.AddRange(testDataList);
|
||||||
|
}
|
||||||
|
else if (testData is RecyclableArrayList<int> testDataRecyclableArrayList)
|
||||||
|
{
|
||||||
|
list.AddRange(testDataRecyclableArrayList);
|
||||||
|
}
|
||||||
|
else if (testData is RecyclableList<int> testDataRecyclableList)
|
||||||
|
{
|
||||||
|
list.AddRange(testDataRecyclableList);
|
||||||
|
}
|
||||||
|
else if (testData is IList<int> testDataIList)
|
||||||
|
{
|
||||||
|
list.AddRange(testDataIList);
|
||||||
|
}
|
||||||
|
else if (testData is IEnumerable<int> testDataIEnumerable)
|
||||||
|
{
|
||||||
|
list.AddRange(testDataIEnumerable);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new InvalidCastException("Unknown type of test data");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate
|
||||||
|
_ = list.Capacity.Should().Be(0);
|
||||||
|
_ = list.Should().BeEmpty().And.HaveCount(0);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void InsertAtTheBeginningShouldMoveItems()
|
public void InsertAtTheBeginningShouldMoveItems()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in new issue
Block a user