namespace FlexArray.Test; public class FlexArrayStringTests { // Constructor tests [Fact] public void Construction_NoSize() { var array = new FlexArrayString(); array.Should().NotBeNull(); array.Count.Should().Be(0, "no items added yet"); array.Capacity.Should().Be(FlexArrayString.DefaultStartSize, "default capacity"); } [Theory] [InlineData(0)] [InlineData(4)] [InlineData(20)] [InlineData(100_000)] public void Construction_WithSize(int size) { var array = new FlexArrayString(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 FlexArrayString(-5); array.Should().NotBeNull(); array.Count.Should().Be(0); array.Capacity.Should().Be(0, "negative size provided => set to 0"); } // Add tests [Fact] public void AddItem_Single() { var array = new FlexArrayString(); array.Add("Hello"); array.Count.Should().Be(1, "one item added"); array.Capacity.Should().Be(FlexArrayString.DefaultStartSize, "capacity unchanged"); } [Fact] public void AddItem_Multiple_NoGrowth() { var array = new FlexArrayString(); array.Add("Hello"); array.Add("World"); array.Add("!"); array.Count.Should().Be(3, "three items added"); array.Capacity.Should().Be(FlexArrayString.DefaultStartSize, "no growth required yet"); } [Fact] public void AddItem_Multiple_Growth() { var array = new FlexArrayString(); void AddItems(int count) { for (var i = 0; i < count; i++) { // random string array.Add(Guid.NewGuid().ToString()); } } AddItems(FlexArrayString.DefaultStartSize); array.Capacity.Should().Be(FlexArrayString.DefaultStartSize); AddItems(2); array.Capacity.Should().BeGreaterThan(FlexArrayString.DefaultStartSize, "capacity exceeded, had to grow"); array.Count.Should().Be(FlexArrayString.DefaultStartSize + 2); } // Contains tests [Fact] public void Contains_Success() { var array = new FlexArrayString(); array.Add("Goodbye"); array.Add("World"); array.Add("!"); array.Add("bye..."); array.Contains("!") .Should().BeTrue(); } [Fact] public void Contains_Success_AfterGrowth() { var array = new FlexArrayString(); for (var i = 0; i <= FlexArrayString.DefaultStartSize; i++) { array.Add(i.ToString()); } array.Contains(array[FlexArrayString.DefaultStartSize - 1]) .Should().BeTrue(); } [Fact] public void Contains_Empty() { var array = new FlexArrayString(); array.Contains("Hi!") .Should().BeFalse("collection is empty"); } [Fact] public void Contains_NotFound() { var array = new FlexArrayString(); array.Add("Hello"); array.Add("World"); array.Contains("!") .Should().BeFalse("not contained in list"); } // Indexer tests [Fact] public void Indexer_Simple() { var array = new FlexArrayString(); array.Add("Goodbye World!"); array[0].Should().Be("Goodbye World!"); } [Fact] public void Indexer_Multiple() { var array = new FlexArrayString(); for (var i = 0; i < 100; i++) { array.Add((i+1).ToString()); } 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 FlexArrayString(); array.Add("Hello"); array[index].Should().Be(String.Empty, reason); } [Fact] public void Iterate() { var array = new FlexArrayString(); for (var i = 0; i < 10; i++) { array.Add(i.ToString()); } for (var i = 0; i < 10; i++) { array[i].Should().Be(i.ToString()); } } }