File: CircularBufferTests.cs
Web Access
Project: src\tests\Aspire.Dashboard.Tests\Aspire.Dashboard.Tests.csproj (Aspire.Dashboard.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Xunit;
 
namespace Aspire.Dashboard.Tests;
 
public class CircularBufferTests
{
    private static CircularBuffer<string> CreateBuffer(int capacity) => new(capacity);
 
    [Fact]
    public void AddUntilFull()
    {
        var b = CreateBuffer(5);
 
        b.Add("0");
        b.Add("1");
        b.Add("2");
        b.Add("3");
        b.Add("4");
        b.Add("5");
        b.Add("6");
 
        Assert.Collection(b,
            i => Assert.Equal("2", i),
            i => Assert.Equal("3", i),
            i => Assert.Equal("4", i),
            i => Assert.Equal("5", i),
            i => Assert.Equal("6", i));
 
        Assert.Collection(b._buffer,
            i => Assert.Equal("5", i),
            i => Assert.Equal("6", i),
            i => Assert.Equal("2", i),
            i => Assert.Equal("3", i),
            i => Assert.Equal("4", i));
        Assert.Equal(2, b._start);
        Assert.Equal(2, b._end);
    }
 
    [Fact]
    public void InsertAtZeroUntilFull()
    {
        var b = CreateBuffer(5);
 
        b.Insert(0, "0");
        b.Insert(0, "1");
        b.Insert(0, "2");
        b.Insert(0, "3");
        b.Insert(0, "4");
        b.Insert(0, "5");
        b.Insert(0, "6");
 
        Assert.Collection(b,
            i => Assert.Equal("4", i),
            i => Assert.Equal("3", i),
            i => Assert.Equal("2", i),
            i => Assert.Equal("1", i),
            i => Assert.Equal("0", i));
    }
 
    [Fact]
    public void InsertAtEndUntilFull()
    {
        var b = CreateBuffer(5);
 
        b.Insert(0, "0");
        b.Insert(1, "1");
        b.Insert(2, "2");
        b.Insert(3, "3");
        b.Insert(4, "4");
        b.Insert(5, "5");
        b.Insert(5, "6");
 
        Assert.Collection(b,
            i => Assert.Equal("2", i),
            i => Assert.Equal("3", i),
            i => Assert.Equal("4", i),
            i => Assert.Equal("5", i),
            i => Assert.Equal("6", i));
    }
 
    [Fact]
    public void InsertAtPositionUntilFull()
    {
        var b = CreateBuffer(10);
 
        b.Insert(0, "1");
        b.Insert(1, "2");
        b.Insert(2, "3");
        b.Insert(3, "10");
        b.Insert(3, "9");
        b.Insert(3, "4");
        b.Insert(4, "5");
        b.Insert(5, "7");
        b.Insert(5, "6");
        b.Insert(7, "8");
 
        Assert.Collection(b,
            i => Assert.Equal("1", i),
            i => Assert.Equal("2", i),
            i => Assert.Equal("3", i),
            i => Assert.Equal("4", i),
            i => Assert.Equal("5", i),
            i => Assert.Equal("6", i),
            i => Assert.Equal("7", i),
            i => Assert.Equal("8", i),
            i => Assert.Equal("9", i),
            i => Assert.Equal("10", i));
    }
 
    [Fact]
    public void InsertInMiddleWhileFull()
    {
        var b = CreateBuffer(10);
 
        b.Add("0");
        b.Add("1");
        b.Add("2");
        b.Add("3");
        b.Add("4");
        b.Add("5");
        b.Add("6");
        b.Add("7");
        b.Add("8");
        b.Add("9");
        b.Add("10");
        b.Add("11");
 
        b.Insert(3, "4.5");
 
        Assert.Collection(b,
            i => Assert.Equal("3", i),
            i => Assert.Equal("4", i),
            i => Assert.Equal("4.5", i),
            i => Assert.Equal("5", i),
            i => Assert.Equal("6", i),
            i => Assert.Equal("7", i),
            i => Assert.Equal("8", i),
            i => Assert.Equal("9", i),
            i => Assert.Equal("10", i),
            i => Assert.Equal("11", i));
 
        Assert.Collection(b._buffer,
            i => Assert.Equal("9", i),
            i => Assert.Equal("10", i),
            i => Assert.Equal("11", i),
            i => Assert.Equal("3", i),
            i => Assert.Equal("4", i),
            i => Assert.Equal("4.5", i),
            i => Assert.Equal("5", i),
            i => Assert.Equal("6", i),
            i => Assert.Equal("7", i),
            i => Assert.Equal("8", i));
        Assert.Equal(3, b._start);
        Assert.Equal(3, b._end);
 
        b.Insert(7, "8.5");
 
        Assert.Collection(b,
            i => Assert.Equal("4", i),
            i => Assert.Equal("4.5", i),
            i => Assert.Equal("5", i),
            i => Assert.Equal("6", i),
            i => Assert.Equal("7", i),
            i => Assert.Equal("8", i),
            i => Assert.Equal("8.5", i),
            i => Assert.Equal("9", i),
            i => Assert.Equal("10", i),
            i => Assert.Equal("11", i));
 
        Assert.Collection(b._buffer,
            i => Assert.Equal("8.5", i),
            i => Assert.Equal("9", i),
            i => Assert.Equal("10", i),
            i => Assert.Equal("11", i),
            i => Assert.Equal("4", i),
            i => Assert.Equal("4.5", i),
            i => Assert.Equal("5", i),
            i => Assert.Equal("6", i),
            i => Assert.Equal("7", i),
            i => Assert.Equal("8", i));
        Assert.Equal(4, b._start);
        Assert.Equal(4, b._end);
 
        b.Insert(5, "7.5");
 
        Assert.Collection(b,
            i => Assert.Equal("4.5", i),
            i => Assert.Equal("5", i),
            i => Assert.Equal("6", i),
            i => Assert.Equal("7", i),
            i => Assert.Equal("7.5", i),
            i => Assert.Equal("8", i),
            i => Assert.Equal("8.5", i),
            i => Assert.Equal("9", i),
            i => Assert.Equal("10", i),
            i => Assert.Equal("11", i));
    }
 
    [Fact]
    public void InsertAfterRemove()
    {
        var b = CreateBuffer(5);
 
        b.Add("0");
        b.Add("1");
        b.Add("2");
        b.Add("3");
        b.Add("4");
        b.Add("5");
        b.Add("6");
 
        b.RemoveAt(2);
 
        b.Insert(3, "5.5");
 
        Assert.Collection(b,
            i => Assert.Equal("2", i),
            i => Assert.Equal("3", i),
            i => Assert.Equal("5", i),
            i => Assert.Equal("5.5", i),
            i => Assert.Equal("6", i));
 
        b.Add("7");
 
        Assert.Collection(b,
            i => Assert.Equal("3", i),
            i => Assert.Equal("5", i),
            i => Assert.Equal("5.5", i),
            i => Assert.Equal("6", i),
            i => Assert.Equal("7", i));
    }
 
    [Fact]
    public void RemoveAtMiddleUnderCapacity()
    {
        var b = CreateBuffer(10);
 
        b.Add("0");
        b.Add("1");
        b.Add("2");
        b.Add("3");
        b.Add("4");
        b.Add("5");
        b.Add("6");
 
        b.RemoveAt(2);
 
        Assert.Collection(b,
            i => Assert.Equal("0", i),
            i => Assert.Equal("1", i),
            i => Assert.Equal("3", i),
            i => Assert.Equal("4", i),
            i => Assert.Equal("5", i),
            i => Assert.Equal("6", i));
 
        b.Add("7");
        b.RemoveAt(2);
 
        Assert.Collection(b,
            i => Assert.Equal("0", i),
            i => Assert.Equal("1", i),
            i => Assert.Equal("4", i),
            i => Assert.Equal("5", i),
            i => Assert.Equal("6", i),
            i => Assert.Equal("7", i));
 
        b.Add("8");
        b.RemoveAt(4);
 
        Assert.Collection(b,
            i => Assert.Equal("0", i),
            i => Assert.Equal("1", i),
            i => Assert.Equal("4", i),
            i => Assert.Equal("5", i),
            i => Assert.Equal("7", i),
            i => Assert.Equal("8", i));
 
        b.Add("9");
        b.RemoveAt(5);
 
        Assert.Collection(b,
            i => Assert.Equal("0", i),
            i => Assert.Equal("1", i),
            i => Assert.Equal("4", i),
            i => Assert.Equal("5", i),
            i => Assert.Equal("7", i),
            i => Assert.Equal("9", i));
 
        b.Add("10");
        b.RemoveAt(0);
 
        Assert.Collection(b,
            i => Assert.Equal("1", i),
            i => Assert.Equal("4", i),
            i => Assert.Equal("5", i),
            i => Assert.Equal("7", i),
            i => Assert.Equal("9", i),
            i => Assert.Equal("10", i));
    }
 
    [Fact]
    public void InsertInMiddleLarge()
    {
        var b = CreateBuffer(5);
 
        b.Add("0");
        b.Add("1");
        b.Add("2");
        b.Add("3");
        b.Add("4");
        b.Add("5");
        b.Add("6");
        b.Add("7");
        b.Add("8");
        b.Add("9");
        b.Add("10");
        b.Add("11");
 
        b.Insert(0, "6.5");
        Assert.Collection(b,
            i => Assert.Equal("7", i),
            i => Assert.Equal("8", i),
            i => Assert.Equal("9", i),
            i => Assert.Equal("10", i),
            i => Assert.Equal("11", i));
 
        b.Insert(1, "7.5");
        Assert.Collection(b,
            i => Assert.Equal("7.5", i),
            i => Assert.Equal("8", i),
            i => Assert.Equal("9", i),
            i => Assert.Equal("10", i),
            i => Assert.Equal("11", i));
 
        b.Insert(2, "8.5");
        Assert.Collection(b,
            i => Assert.Equal("8", i),
            i => Assert.Equal("8.5", i),
            i => Assert.Equal("9", i),
            i => Assert.Equal("10", i),
            i => Assert.Equal("11", i));
 
        b.Insert(3, "9.5");
        Assert.Collection(b,
            i => Assert.Equal("8.5", i),
            i => Assert.Equal("9", i),
            i => Assert.Equal("9.5", i),
            i => Assert.Equal("10", i),
            i => Assert.Equal("11", i));
 
        b.Insert(4, "10.5");
        Assert.Collection(b,
            i => Assert.Equal("9", i),
            i => Assert.Equal("9.5", i),
            i => Assert.Equal("10", i),
            i => Assert.Equal("10.5", i),
            i => Assert.Equal("11", i));
 
        b.Insert(5, "11.5");
        Assert.Collection(b,
            i => Assert.Equal("9.5", i),
            i => Assert.Equal("10", i),
            i => Assert.Equal("10.5", i),
            i => Assert.Equal("11", i),
            i => Assert.Equal("11.5", i));
    }
 
    [Fact]
    public void RemoveAtInMiddleLarge()
    {
        var b = CreateBuffer(5);
 
        b.Add("0");
        b.Add("1");
        b.Add("2");
        b.Add("3");
        b.Add("4");
        b.Add("5");
        b.Add("6");
        b.Add("7");
        b.Add("8");
        b.Add("9");
        b.Add("10");
        b.Add("11");
 
        b.RemoveAt(1);
 
        Assert.Collection(b,
            i => Assert.Equal("7", i),
            i => Assert.Equal("9", i),
            i => Assert.Equal("10", i),
            i => Assert.Equal("11", i));
 
        b.RemoveAt(1);
 
        Assert.Collection(b,
            i => Assert.Equal("7", i),
            i => Assert.Equal("10", i),
            i => Assert.Equal("11", i));
 
        b.RemoveAt(1);
 
        Assert.Collection(b,
            i => Assert.Equal("7", i),
            i => Assert.Equal("11", i));
 
        b.Add("12");
        b.Add("13");
        b.Add("14");
 
        Assert.Collection(b,
            i => Assert.Equal("7", i),
            i => Assert.Equal("11", i),
            i => Assert.Equal("12", i),
            i => Assert.Equal("13", i),
            i => Assert.Equal("14", i));
 
        b.Add("15");
        b.Add("16");
 
        Assert.Collection(b,
            i => Assert.Equal("12", i),
            i => Assert.Equal("13", i),
            i => Assert.Equal("14", i),
            i => Assert.Equal("15", i),
            i => Assert.Equal("16", i));
    }
 
    [Fact]
    public void RemoveAtAndInsertMiddleLarge()
    {
        var b = CreateBuffer(5);
 
        b.Add("0");
        b.Add("1");
        b.Add("2");
        b.Add("3");
        b.Add("4");
        b.Add("5");
        b.Add("6");
        b.Add("7");
        b.Add("8");
        b.Add("9");
        b.Add("10");
        b.Add("11");
 
        b.RemoveAt(1);
 
        Assert.Collection(b,
            i => Assert.Equal("7", i),
            i => Assert.Equal("9", i),
            i => Assert.Equal("10", i),
            i => Assert.Equal("11", i));
 
        b.RemoveAt(1);
 
        Assert.Collection(b,
            i => Assert.Equal("7", i),
            i => Assert.Equal("10", i),
            i => Assert.Equal("11", i));
 
        b.RemoveAt(1);
 
        Assert.Collection(b,
            i => Assert.Equal("7", i),
            i => Assert.Equal("11", i));
 
        b.Insert(0, "6");
 
        Assert.Collection(b,
            i => Assert.Equal("6", i),
            i => Assert.Equal("7", i),
            i => Assert.Equal("11", i));
 
        b.Insert(1, "6.5");
 
        Assert.Collection(b,
            i => Assert.Equal("6", i),
            i => Assert.Equal("6.5", i),
            i => Assert.Equal("7", i),
            i => Assert.Equal("11", i));
 
        b.Insert(3, "7.5");
 
        Assert.Collection(b,
            i => Assert.Equal("6", i),
            i => Assert.Equal("6.5", i),
            i => Assert.Equal("7", i),
            i => Assert.Equal("7.5", i),
            i => Assert.Equal("11", i));
 
        b.Insert(5, "12");
 
        Assert.Collection(b,
            i => Assert.Equal("6.5", i),
            i => Assert.Equal("7", i),
            i => Assert.Equal("7.5", i),
            i => Assert.Equal("11", i),
            i => Assert.Equal("12", i));
    }
 
    [Fact]
    public void RemoveAtStartToZero()
    {
        var b = CreateBuffer(5);
 
        b.Add("0");
        b.Add("1");
        b.Add("2");
        b.Add("3");
        b.Add("4");
        b.Add("5");
        b.Add("6");
        b.Add("7");
        b.Add("8");
        b.Add("9");
        b.Add("10");
        b.Add("11");
 
        b.RemoveAt(0);
        Assert.Collection(b,
            i => Assert.Equal("8", i),
            i => Assert.Equal("9", i),
            i => Assert.Equal("10", i),
            i => Assert.Equal("11", i));
 
        b.RemoveAt(0);
        Assert.Collection(b,
            i => Assert.Equal("9", i),
            i => Assert.Equal("10", i),
            i => Assert.Equal("11", i));
 
        b.RemoveAt(0);
        Assert.Collection(b,
            i => Assert.Equal("10", i),
            i => Assert.Equal("11", i));
 
        b.RemoveAt(0);
        Assert.Collection(b,
            i => Assert.Equal("11", i));
 
        b.RemoveAt(0);
        Assert.Empty(b);
    }
 
    [Fact]
    public void RemoveAtEndToZero()
    {
        var b = CreateBuffer(5);
 
        b.Add("0");
        b.Add("1");
        b.Add("2");
        b.Add("3");
        b.Add("4");
        b.Add("5");
        b.Add("6");
        b.Add("7");
        b.Add("8");
        b.Add("9");
        b.Add("10");
        b.Add("11");
 
        b.RemoveAt(4);
        Assert.Collection(b,
            i => Assert.Equal("7", i),
            i => Assert.Equal("8", i),
            i => Assert.Equal("9", i),
            i => Assert.Equal("10", i));
 
        b.RemoveAt(3);
        Assert.Collection(b,
            i => Assert.Equal("7", i),
            i => Assert.Equal("8", i),
            i => Assert.Equal("9", i));
 
        b.RemoveAt(2);
        Assert.Collection(b,
            i => Assert.Equal("7", i),
            i => Assert.Equal("8", i));
 
        b.RemoveAt(1);
        Assert.Collection(b,
            i => Assert.Equal("7", i));
 
        b.RemoveAt(0);
        Assert.Empty(b);
    }
 
    [Fact]
    public void Insert_BeforeEnd_EndInMiddle()
    {
        var values = new List<string>
        {
            "10",
            "12",
            "0",
            "2",
            "2",
            "4",
            "4",
            "6",
            "6",
            "8",
        };
 
        var buffer = new CircularBuffer<string>(values, capacity: 10, start: 2, end: 2);
        buffer.Insert(9, "11");
 
        Assert.Collection(buffer,
            i => Assert.Equal("2", i),
            i => Assert.Equal("2", i),
            i => Assert.Equal("4", i),
            i => Assert.Equal("4", i),
            i => Assert.Equal("6", i),
            i => Assert.Equal("6", i),
            i => Assert.Equal("8", i),
            i => Assert.Equal("10", i),
            i => Assert.Equal("11", i),
            i => Assert.Equal("12", i));
    }
 
    [Fact]
    public void Clear_EmptiesBuffer_ResetsIndex()
    {
        var b = CreateBuffer(5);
 
        b.Insert(0, "0");
        b.Insert(0, "1");
        b.Insert(0, "2");
 
        b.Clear();
 
        Assert.Empty(b);
 
        b.Insert(0, "0");
        b.Insert(0, "1");
        b.Insert(0, "2");
 
        Assert.Collection(b,
            i => Assert.Equal("2", i),
            i => Assert.Equal("1", i),
            i => Assert.Equal("0", i));
    }
}