339 lines
8.1 KiB
C#
339 lines
8.1 KiB
C#
namespace FlexArray.Test;
|
|
|
|
public class FlexArrayIntTests
|
|
{
|
|
[Fact]
|
|
public void Construction_NoSize()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
|
|
array.Should().NotBeNull();
|
|
array.Count.Should().Be(0, "no items added yet");
|
|
array.Capacity.Should().Be(FlexArrayInt.DefaultStartSize, "default capacity");
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(0)]
|
|
[InlineData(4)]
|
|
[InlineData(20)]
|
|
[InlineData(100_000)]
|
|
public void Construction_WithSize(int size)
|
|
{
|
|
var array = new FlexArrayInt(size);
|
|
|
|
array.Should().NotBeNull();
|
|
array.Count.Should().Be(0, "no items added yet");
|
|
array.Capacity.Should().Be(size, "initial capacity set to specified size");
|
|
}
|
|
|
|
[Fact]
|
|
public void Construction_WithInvalidSize()
|
|
{
|
|
var array = new FlexArrayInt(-5);
|
|
|
|
array.Should().NotBeNull();
|
|
array.Count.Should().Be(0);
|
|
array.Capacity.Should().Be(0, "negative size provided => set to 0");
|
|
}
|
|
|
|
[Fact]
|
|
public void AddItem_Single()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
|
|
array.Add(17);
|
|
|
|
array.Count.Should().Be(1, "one item added");
|
|
array.Capacity.Should().Be(FlexArrayInt.DefaultStartSize, "capacity unchanged");
|
|
}
|
|
|
|
[Fact]
|
|
public void AddItem_Multiple_NoGrowth()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
|
|
array.Add(17);
|
|
array.Add(20);
|
|
array.Add(-100);
|
|
|
|
array.Count.Should().Be(3, "three items added");
|
|
array.Capacity.Should().Be(FlexArrayInt.DefaultStartSize, "no growth required yet");
|
|
}
|
|
|
|
[Fact]
|
|
public void AddItem_Multiple_Growth()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
|
|
void AddItems(int count)
|
|
{
|
|
for (var i = 0; i < count; i++)
|
|
{
|
|
array.Add(i + 1);
|
|
}
|
|
}
|
|
|
|
AddItems(FlexArrayInt.DefaultStartSize);
|
|
array.Capacity.Should().Be(FlexArrayInt.DefaultStartSize);
|
|
|
|
AddItems(2);
|
|
array.Capacity.Should().BeGreaterThan(FlexArrayInt.DefaultStartSize, "capacity exceeded, had to grow");
|
|
array.Count.Should().Be(FlexArrayInt.DefaultStartSize + 2);
|
|
}
|
|
|
|
[Fact]
|
|
public void Contains_Success()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
array.Add(12);
|
|
array.Add(23);
|
|
array.Add(-900);
|
|
array.Add(76);
|
|
|
|
array.Contains(23)
|
|
.Should().BeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void Contains_Success_AfterGrowth()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
for (var i = 0; i <= FlexArrayInt.DefaultStartSize; i++)
|
|
{
|
|
array.Add(i);
|
|
}
|
|
|
|
array.Contains(FlexArrayInt.DefaultStartSize - 1)
|
|
.Should().BeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void Contains_Empty()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
|
|
array.Contains(23)
|
|
.Should().BeFalse("collection is empty");
|
|
}
|
|
|
|
[Fact]
|
|
public void Contains_NotFound()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
array.Add(-12);
|
|
array.Add(23);
|
|
|
|
array.Contains(12)
|
|
.Should().BeFalse("not contained in list");
|
|
}
|
|
|
|
[Fact]
|
|
public void Indexer_Simple()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
array.Add(89);
|
|
|
|
array[0].Should().Be(89);
|
|
}
|
|
|
|
[Fact]
|
|
public void Indexer_Multiple()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
for (var i = 0; i < 100; i++)
|
|
{
|
|
array.Add(i+1);
|
|
}
|
|
|
|
array[20].Should().Be(21);
|
|
array[88].Should().Be(89);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(-1, "negative index")]
|
|
[InlineData(2, "index too high")]
|
|
[InlineData(10, "index too high")]
|
|
public void Indexer_InvalidIndex(int index, string reason)
|
|
{
|
|
var array = new FlexArrayInt();
|
|
array.Add(-89);
|
|
|
|
array[index].Should().Be(-1, reason);
|
|
}
|
|
|
|
[Fact]
|
|
public void Iterate()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
for (var i = 0; i < 10; i++)
|
|
{
|
|
array.Add(i);
|
|
}
|
|
|
|
for (var i = 0; i < 10; i++)
|
|
{
|
|
array[i].Should().Be(i);
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Remove_ByIndex_Simple()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
array.Add(40);
|
|
|
|
array.Count.Should().Be(1);
|
|
array.RemoveAt(0).Should().BeTrue("index exists");
|
|
array.Count.Should().Be(0, "count has to be reduced");
|
|
}
|
|
|
|
[Fact]
|
|
public void Remove_ByIndex_Shifting()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
array.Add(30);
|
|
array.Add(31);
|
|
array.Add(32);
|
|
|
|
array.Count.Should().Be(3);
|
|
array.RemoveAt(1).Should().BeTrue();
|
|
array.Count.Should().Be(2);
|
|
array[1].Should().Be(32, "items to the right have to be shifted left after removal");
|
|
array.RemoveAt(2)
|
|
.Should().BeFalse("not a valid index any longer, despite a value still being there");
|
|
}
|
|
|
|
[Fact]
|
|
public void Remove_ByIndex_FromEnd()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
array.Add(30);
|
|
array.Add(31);
|
|
array.Add(32);
|
|
|
|
array.Count.Should().Be(3);
|
|
array.RemoveAt(2).Should().BeTrue();
|
|
array.Count.Should().Be(2);
|
|
array[1].Should().Be(31);
|
|
}
|
|
|
|
[Fact]
|
|
public void Remove_ByIndex_Invalid()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
array.Add(30);
|
|
|
|
array.RemoveAt(1)
|
|
.Should().BeFalse("the array is big enough for this index, but no value has been set there");
|
|
array.Count.Should().Be(1, "unchanged");
|
|
|
|
array.RemoveAt(-1)
|
|
.Should().BeFalse("negative index doesn't make any sense");
|
|
}
|
|
|
|
[Fact]
|
|
public void Remove_Single_OneOccurrence()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
array.Add(1);
|
|
array.Add(2);
|
|
array.Add(3);
|
|
|
|
array.Remove(2, true)
|
|
.Should().BeTrue("element was found");
|
|
array.Count.Should().Be(2, "element was removed");
|
|
}
|
|
|
|
[Fact]
|
|
public void Remove_Single_OnlyOccurrence()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
array.Add(1);
|
|
|
|
array.Remove(1, true)
|
|
.Should().BeTrue("element was found");
|
|
array.Count.Should().Be(0, "element was removed");
|
|
}
|
|
|
|
[Fact] public void Remove_Single_MultipleOccurrence()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
array.Add(1);
|
|
array.Add(2);
|
|
array.Add(2);
|
|
|
|
array.Remove(2, true)
|
|
.Should().BeTrue("element was found");
|
|
array.Count.Should().Be(2, "only one element was removed");
|
|
}
|
|
|
|
[Fact]
|
|
public void Remove_Single_NotFound()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
array.Add(1);
|
|
array.Add(2);
|
|
array.Add(3);
|
|
|
|
array.Remove(4, true)
|
|
.Should().BeFalse("element was not found");
|
|
array.Count.Should().Be(3, "unchanged");
|
|
}
|
|
|
|
[Fact]
|
|
public void Remove_Multiple_OneOccurrence()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
array.Add(1);
|
|
array.Add(2);
|
|
array.Add(3);
|
|
|
|
array.Remove(2, false)
|
|
.Should().BeTrue("element was found");
|
|
array.Count.Should().Be(2, "only one element was removed");
|
|
}
|
|
|
|
[Fact]
|
|
public void Remove_Multiple_MultipleOccurrence()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
array.Add(1);
|
|
array.Add(2);
|
|
array.Add(2);
|
|
array.Add(3);
|
|
array.Add(2);
|
|
array.Add(4);
|
|
array.Add(2);
|
|
|
|
array.Remove(2, false)
|
|
.Should().BeTrue("elements were found");
|
|
array.Count.Should().Be(3, "four elements were removed");
|
|
}
|
|
|
|
[Fact]
|
|
public void Remove_Multiple_OnlyOccurrence()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
array.Add(1);
|
|
array.Add(1);
|
|
array.Add(1);
|
|
|
|
|
|
array.Remove(1, false)
|
|
.Should().BeTrue("elements were found");
|
|
array.Count.Should().Be(0, "all elements were removed");
|
|
}
|
|
|
|
[Fact]
|
|
public void Remove_Multiple_NoOccurrence()
|
|
{
|
|
var array = new FlexArrayInt();
|
|
array.Add(1);
|
|
array.Add(2);
|
|
array.Add(3);
|
|
|
|
array.Remove(4, false)
|
|
.Should().BeFalse("element was not found");
|
|
array.Count.Should().Be(3, "unchanged");
|
|
}
|
|
}
|