diff --git a/Recyclable.CollectionsTests/Recyclable.CollectionsTests.csproj b/Recyclable.CollectionsTests/Recyclable.CollectionsTests.csproj
index 3e6de67..2be9788 100644
--- a/Recyclable.CollectionsTests/Recyclable.CollectionsTests.csproj
+++ b/Recyclable.CollectionsTests/Recyclable.CollectionsTests.csproj
@@ -16,6 +16,7 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
+
all
diff --git a/Recyclable.CollectionsTests/RecyclableListTests.cs b/Recyclable.CollectionsTests/RecyclableListTests.cs
index 35f450b..9104730 100644
--- a/Recyclable.CollectionsTests/RecyclableListTests.cs
+++ b/Recyclable.CollectionsTests/RecyclableListTests.cs
@@ -53,7 +53,7 @@ namespace Recyclable.CollectionsTests
[Theory]
[MemberData(nameof(RecyclableLongListTestData.EmptySourceDataVariants), MemberType = typeof(RecyclableLongListTestData))]
- public void AddRangeShouldDoNothingWhenSourceIsEmpty(string testCase, IEnumerable testData)
+ public void AddRangeShouldDoNothingWhenSourceIsEmpty(string testCase, IEnumerable testData, long itemsCount)
{
// Prepare
using var list = new RecyclableList();
@@ -145,7 +145,7 @@ namespace Recyclable.CollectionsTests
_ = list.Capacity.Should().BeGreaterThanOrEqualTo((int)itemsCount * 2);
}
- _ = list.Count.Should().Be(expectedData.Count);
+ _ = list.Count.Should().Be(expectedData.Length);
_ = list.Should().Equal(expectedData);
}
@@ -217,7 +217,8 @@ namespace Recyclable.CollectionsTests
list.Clear();
list.Clear();
- // Validate
+ // Validate
+ _ = list.Capacity.Should().BeGreaterThanOrEqualTo((int)itemsCount);
_ = list.Count.Should().Be(0);
_ = list.Should().BeEmpty();
}
@@ -260,23 +261,17 @@ namespace Recyclable.CollectionsTests
}
[Theory]
- [MemberData(nameof(RecyclableLongListTestData.SourceDataVariants), MemberType = typeof(RecyclableLongListTestData))]
- public void ContainsShouldFindAllItems(string testCase, IEnumerable testData, long itemsCount)
+ [MemberData(nameof(RecyclableLongListTestData.SourceDataWithItemIndexVariants), MemberType = typeof(RecyclableLongListTestData))]
+ public void ContainsShouldFindAllItems(string testCase, IEnumerable testData, long itemsCount, in long[] itemIndexes)
{
- if (itemsCount == 0)
- {
- return;
- }
-
// Prepare
using var list = new RecyclableList(testData, (int)itemsCount);
_ = testData.Any().Should().BeTrue("we need items on the list that we can look for");
- // Act
- foreach (var item in testData)
+ // Act & Validate
+ foreach (var itemIndex in itemIndexes)
{
- // Validate
- _ = list.Contains(item).Should().BeTrue();
+ _ = list.Contains(list[(int)itemIndex]).Should().BeTrue();
}
}
@@ -292,27 +287,18 @@ namespace Recyclable.CollectionsTests
}
[Theory]
- [MemberData(nameof(RecyclableLongListTestData.SourceDataVariants), MemberType = typeof(RecyclableLongListTestData))]
- public void ContainsShouldNotFindNonExistingItems(string testCase, IEnumerable testData, long itemsCount)
+ [MemberData(nameof(RecyclableLongListTestData.SourceDataWithItemIndexVariants), MemberType = typeof(RecyclableLongListTestData))]
+ public void ContainsShouldNotFindNonExistingItems(string testCase, IEnumerable testData, long itemsCount, in long[] itemIndexes)
{
- if (itemsCount == 0)
- {
- return;
- }
-
// Prepare
using var list = new RecyclableList(testData, (int)itemsCount);
_ = testData.Any().Should().BeTrue("we need items on the list that we can look for");
- // Act
- foreach (var item in testData)
+ // Act & Validate
+ foreach (var itemIndex in itemIndexes)
{
- // Validate
- _ = list.Contains(-item).Should().BeFalse();
+ _ = list.Contains(-list[(int)itemIndex]).Should().BeFalse();
}
-
- // Validate
- _ = list.Contains(0).Should().BeFalse();
}
[Theory]
@@ -362,198 +348,130 @@ namespace Recyclable.CollectionsTests
}
[Theory]
- [MemberData(nameof(RecyclableLongListTestData.SourceDataVariants), MemberType = typeof(RecyclableLongListTestData))]
- public void IndexOfShouldNotFindNonExistingItems(string testCase, IEnumerable testData, long itemsCount)
+ [MemberData(nameof(RecyclableLongListTestData.SourceDataWithItemIndexVariants), MemberType = typeof(RecyclableLongListTestData))]
+ public void IndexOfShouldNotFindNonExistingItems(string testCase, IEnumerable testData, long itemsCount, in long[] itemIndexes)
{
- // Prepare
- if (itemsCount == 0)
- {
- // There is nothing to search for when our lists are empty
- return;
- }
-
// Prepare
using var list = new RecyclableList(testData, (int)itemsCount);
_ = testData.Any().Should().BeTrue("we need items on the list that we can look for");
- // Act
- foreach (var item in testData)
+ // Act & Validate
+ foreach (var itemIndex in itemIndexes)
{
- // Validate
- _ = list.IndexOf(-item).Should().Be(-1);
+ _ = list.IndexOf(-list[(int)itemIndex]).Should().Be(-1);
}
-
- // Validate
- _ = list.IndexOf(0).Should().Be(-1);
}
[Theory]
- [MemberData(nameof(RecyclableLongListTestData.SourceDataVariants), MemberType = typeof(RecyclableLongListTestData))]
- public void IndexOfShouldReturnCorrectIndexes(string testCase, IEnumerable testData, long itemsCount)
+ [MemberData(nameof(RecyclableLongListTestData.SourceDataWithItemIndexVariants), MemberType = typeof(RecyclableLongListTestData))]
+ public void IndexOfShouldReturnCorrectIndexes(string testCase, IEnumerable testData, long itemsCount, in long[] itemIndexes)
{
// Prepare
using var list = new RecyclableList(testData, (int)itemsCount);
// Act & Validate
- foreach (var index in testData)
+ foreach (var itemIndex in itemIndexes)
{
- var actual = list.IndexOf(index);
- _ = actual.Should().Be((int)(index - 1));
+ _ = list.IndexOf(list[(int)itemIndex]).Should().Be((int)itemIndex);
}
}
[Theory]
- [MemberData(nameof(RecyclableLongListTestData.SourceDataVariants), MemberType = typeof(RecyclableLongListTestData))]
- public void InitializeSortClearAddRangeRemoveShouldSucceed(string testCase, IEnumerable testData, long itemsCount)
+ [MemberData(nameof(RecyclableLongListTestData.SourceDataWithItemIndexVariants), MemberType = typeof(RecyclableLongListTestData))]
+ public void InitializeSortClearAddRangeRemoveShouldSucceed(string testCase, IEnumerable testData, long itemsCount, in long[] itemIndexes)
{
- if (itemsCount == 0)
- {
- return;
- }
-
- // Act
- using RecyclableList list = new(testData, (int)itemsCount);
- QuickSortExtensions.QuickSort(list);
-
- // Validate
- _ = list.Count.Should().Be((int)itemsCount);
- _ = list.Should().Equal(testData);
-
- // Act
- list.Clear();
-
- // Validate
- _ = list.Count.Should().Be(0);
- _ = list.Should().BeEmpty();
-
- // Act
- list.AddRange(testData);
-
- // Validate
- _ = list.Count.Should().Be((int)itemsCount);
- _ = list.Should().Equal(testData);
-
- // Act
- foreach (var item in testData.Reverse())
- {
- _ = list.Remove(item).Should().BeTrue();
- }
- }
-
- [Theory]
- [MemberData(nameof(RecyclableLongListTestData.SourceDataVariants), MemberType = typeof(RecyclableLongListTestData))]
- public void InsertAtTheBeginningShouldMoveItems(string testCase, IEnumerable testData, long itemsCount)
- {
- // Prepare
- using var list = new RecyclableList((int)itemsCount);
-
- // Act
- foreach (var item in testData)
- {
- list.Insert(0, item);
- _ = list.Count.Should().Be((int)item);
- }
-
- // Validate
- _ = list.Capacity.Should().BeGreaterThanOrEqualTo((int)itemsCount);
- _ = list.Count.Should().Be((int)itemsCount);
- _ = list.Should().Equal(testData.Reverse());
- }
-
- [Theory]
- [MemberData(nameof(RecyclableLongListTestData.SourceTargetDataVariants), MemberType = typeof(RecyclableLongListTestData))]
- public void InsertAtTheEndShouldAppend(string testCase, IEnumerable testData, long itemsCount, int targetBlockSize)
- {
- // Prepare
- using var list = new RecyclableList(testData);
-
- // Act
- list.Insert((int)itemsCount, -1);
-
- // Assert
- _ = list.Count.Should().Be((int)itemsCount + 1);
- _ = list[^1].Should().Be(-1);
- }
-
- [Theory]
- [MemberData(nameof(RecyclableLongListTestData.SourceDataVariants), MemberType = typeof(RecyclableLongListTestData))]
- public void RemoveAtFromTheBeginningShouldSucceed(string testCase, IEnumerable testData, long itemsCount)
- {
- // Prepare
- using var list = new RecyclableList(testData, (int)itemsCount);
-
- // Act & Validate
- for (var deleted = 1; deleted <= itemsCount; deleted++)
+ foreach (var itemIndex in itemIndexes)
{
// Act
- list.RemoveAt(0);
+ using RecyclableList list = new(testData, (int)itemsCount);
+ QuickSortExtensions.QuickSort(list);
// Validate
- _ = list.Count.Should().Be((int)(itemsCount - deleted));
- _ = list.Should().Equal(testData.Skip(deleted));
- }
+ _ = list.Count.Should().Be((int)itemsCount);
+ _ = list.Should().Equal(testData);
- _ = list.Should().BeEmpty();
- _ = list.Capacity.Should().BeGreaterThanOrEqualTo((int)itemsCount);
- }
-
- [Theory]
- [MemberData(nameof(RecyclableLongListTestData.SourceDataVariants), MemberType = typeof(RecyclableLongListTestData))]
- public void RemoveAtFromTheEndShouldSucceed(string testCase, IEnumerable testData, long itemsCount)
- {
- // Prepare
- using var list = new RecyclableList(testData, (int)itemsCount);
-
- // Act & Validate
- for (var deleted = 1; deleted <= itemsCount; deleted++)
- {
// Act
- list.RemoveAt(list.Count - 1);
+ list.Clear();
// Validate
- _ = list.Count.Should().Be((int)(itemsCount - deleted));
- _ = list.Should().Equal(testData.Take((int)(itemsCount - deleted)));
- }
+ _ = list.Count.Should().Be(0);
+ _ = list.Should().BeEmpty();
- _ = list.Should().BeEmpty();
- _ = list.Capacity.Should().BeGreaterThanOrEqualTo((int)itemsCount);
- }
-
- [Theory]
- [MemberData(nameof(RecyclableLongListTestData.SourceDataVariants), MemberType = typeof(RecyclableLongListTestData))]
- public void RemoveFromTheBeginningShouldRemoveTheCorrectItem(string testCase, IEnumerable testData, long itemsCount)
- {
- // Prepare
- using var list = new RecyclableList(testData, (int)itemsCount);
-
- // Act & Validate
- for (var deleted = 1; deleted <= itemsCount; deleted++)
- {
// Act
- _ = list.Remove(deleted).Should().BeTrue();
+ list.AddRange(testData);
// Validate
- _ = list.Count.Should().Be((int)(itemsCount - deleted));
- _ = list.Should().Equal(testData.Skip(deleted));
+ _ = list.Count.Should().Be((int)itemsCount);
+ _ = list.Should().Equal(testData);
+
+ // Act
+ _ = list.Remove(list[(int)itemIndex]).Should().BeTrue();
}
}
[Theory]
- [MemberData(nameof(RecyclableLongListTestData.SourceDataVariants), MemberType = typeof(RecyclableLongListTestData))]
- public void RemoveFromTheEndShouldRemoveTheCorrectItem(string testCase, IEnumerable testData, long itemsCount)
+ [MemberData(nameof(RecyclableLongListTestData.SourceDataWithItemIndexVariants), MemberType = typeof(RecyclableLongListTestData))]
+ public void InsertShouldMoveItems(string testCase, IEnumerable testData, long itemsCount, in long[] itemIndexes)
{
- // Act & Validate
- using var list = new RecyclableList(testData, (int)itemsCount);
- long deleted = 0;
- foreach (var item in testData.Reverse())
+ foreach (var itemIndex in itemIndexes)
{
+ // Prepare
+ using var list = new RecyclableList(testData, (int)itemsCount);
+ var item = list[(int)itemIndex];
+ var expectedItems = list.ToList();
+ expectedItems.Insert((int)itemIndex, item);
+
+ // Act
+ list.Insert((int)itemIndex, item);
+
+ // Validate
+ _ = list.Count.Should().Be((int)itemsCount + 1);
+ _ = list.Capacity.Should().BeGreaterThanOrEqualTo((int)itemsCount);
+ _ = list[(int)itemIndex].Should().Be(item);
+ _ = list[(int)itemIndex + 1].Should().Be(item);
+ _ = list.Should().Equal(expectedItems);
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(RecyclableLongListTestData.SourceDataWithItemIndexVariants), MemberType = typeof(RecyclableLongListTestData))]
+ public void RemoveAtShouldSucceed(string testCase, IEnumerable testData, long itemsCount, in long[] itemIndexes)
+ {
+ foreach (var itemIndex in itemIndexes)
+ {
+ // Prepare
+ using var list = new RecyclableList(testData, (int)itemsCount);
+ var expectedItems = testData.ToList();
+ expectedItems.RemoveAt((int)itemIndex);
+
+ // Act
+ list.RemoveAt((int)itemIndex);
+
+ // Validate
+ _ = list.Count.Should().Be((int)(itemsCount - 1));
+ _ = list.Should().Equal(expectedItems);
+ _ = list.Capacity.Should().BeGreaterThanOrEqualTo((int)itemsCount);
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(RecyclableLongListTestData.SourceDataWithItemIndexVariants), MemberType = typeof(RecyclableLongListTestData))]
+ public void RemoveShouldRemoveTheCorrectItem(string testCase, IEnumerable testData, long itemsCount, in long[] itemIndexes)
+ {
+ foreach (var itemIndex in itemIndexes)
+ {
+ // Prepare
+ using var list = new RecyclableList(testData, (int)itemsCount);
+ var item = list[(int)itemIndex];
+ var expectedItems = testData.ToList();
+ expectedItems.RemoveAt((int)itemIndex);
+
// Act
_ = list.Remove(item).Should().BeTrue();
- deleted++;
// Validate
- _ = list.Count.Should().Be((int)(itemsCount - deleted));
- _ = list.Should().Equal(testData.Take((int)(itemsCount - deleted)));
+ _ = list.Count.Should().Be((int)(itemsCount - 1));
+ _ = list.Should().Equal(expectedItems);
}
}
diff --git a/Recyclable.CollectionsTests/RecyclableLongListTestData.cs b/Recyclable.CollectionsTests/RecyclableLongListTestData.cs
index bf4d8b9..665c589 100644
--- a/Recyclable.CollectionsTests/RecyclableLongListTestData.cs
+++ b/Recyclable.CollectionsTests/RecyclableLongListTestData.cs
@@ -1,10 +1,17 @@
-using Recyclable.Collections;
+using MoreLinq;
+using Open.Numeric.Primes;
+using Recyclable.Collections;
+using System.Numerics;
namespace Recyclable.CollectionsTests
{
public static class RecyclableLongListTestData
{
- private static IEnumerable DoCreateTestData(long itemsCount)
+
+ private static readonly object[] _sourceRefData = Enumerable.Range(1, 100).Cast