diff --git a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/RingBuffer.cs b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/RingBuffer.cs index 51ce375..2cd1898 100644 --- a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/RingBuffer.cs +++ b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/RingBuffer.cs @@ -157,6 +157,11 @@ namespace ObservableCollections public RingBufferSpan GetSpan() { + if (count == 0) + { + return new RingBufferSpan(Array.Empty(), Array.Empty(), 0); + } + var start = head & mask; var end = (head + count) & mask; @@ -206,6 +211,8 @@ namespace ObservableCollections public IEnumerable Reverse() { + if (count == 0) yield break; + var start = head & mask; var end = (head + count) & mask; diff --git a/src/ObservableCollections/RingBuffer.cs b/src/ObservableCollections/RingBuffer.cs index 409bacc..3d45700 100644 --- a/src/ObservableCollections/RingBuffer.cs +++ b/src/ObservableCollections/RingBuffer.cs @@ -157,6 +157,11 @@ namespace ObservableCollections public RingBufferSpan GetSpan() { + if (count == 0) + { + return new RingBufferSpan(Array.Empty(), Array.Empty(), 0); + } + var start = head & mask; var end = (head + count) & mask; @@ -206,6 +211,8 @@ namespace ObservableCollections public IEnumerable Reverse() { + if (count == 0) yield break; + var start = head & mask; var end = (head + count) & mask; diff --git a/tests/ObservableCollections.Tests/RingBufferTest.cs b/tests/ObservableCollections.Tests/RingBufferTest.cs index e8f59a0..1d5991a 100644 --- a/tests/ObservableCollections.Tests/RingBufferTest.cs +++ b/tests/ObservableCollections.Tests/RingBufferTest.cs @@ -126,6 +126,46 @@ namespace ObservableCollections.Tests } + [Fact] + public void Iteration() + { + var empty = new RingBuffer(); + empty.ToArray().Should().BeEmpty(); + + + for (int i = 0; i < 10; i++) + { + var buffer = new RingBuffer(); + for (int j = 0; j < i; j++) + { + buffer.AddLast(j); + } + buffer.ToArray().Should().Equal(Enumerable.Range(0, i).ToArray()); + } + + for (int i = 0; i < 10; i++) + { + var buffer = new RingBuffer(); + for (int j = 0; j < i; j++) + { + buffer.AddFirst(j); + } + buffer.ToArray().Should().Equal(Enumerable.Range(0, i).Reverse().ToArray()); + } + } + + [Fact] + public void RandomIteration() + { + var buffer = new RingBuffer(); + buffer.AddFirst(10); + buffer.AddLast(20); + buffer.AddLast(30); + buffer.AddFirst(40); + + buffer.ToArray().Should().Equal(40, 10, 20, 30); + } + [Fact] public void BinarySearchTest() {