File: ReverseStringBuilderTest.cs
Web Access
Project: src\src\Components\Forms\test\Microsoft.AspNetCore.Components.Forms.Tests.csproj (Microsoft.AspNetCore.Components.Forms.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
namespace Microsoft.AspNetCore.Components.Forms;
 
public class ReverseStringBuilderTest
{
    [Fact]
    public void ToString_ReturnsEmptyString_WhenNoWritesOccur()
    {
        // Arrange
        Span<char> initialBuffer = stackalloc char[128];
        using var builder = new ReverseStringBuilder(initialBuffer);
 
        // Act
        var result = builder.ToString();
 
        // Assert
        Assert.Equal(string.Empty, result);
        Assert.Equal(0, builder.SequenceSegmentCount);
    }
 
    [Fact]
    public void ToString_ReturnsEmptyString_WhenBufferIsEmpty()
    {
        // Arrange
        using var builder = new ReverseStringBuilder(Span<char>.Empty);
 
        // Act
        var result = builder.ToString();
 
        // Assert
        Assert.Equal(string.Empty, result);
        Assert.Equal(0, builder.SequenceSegmentCount);
    }
 
    [Fact]
    public void ToString_Works_WhenOnlyUsingStackAllocatedBuffer()
    {
        // Arrange
        Span<char> initialBuffer = stackalloc char[128];
        using var builder = new ReverseStringBuilder(initialBuffer);
 
        // Act
        builder.InsertFront("world!");
        builder.InsertFront(" ");
        builder.InsertFront(",");
        builder.InsertFront("Hello");
        var result = builder.ToString();
 
        // Assert
        Assert.Equal("Hello, world!", result);
        Assert.Equal(0, builder.SequenceSegmentCount);
    }
 
    [Fact]
    public void ToString_Works_WithNumbers()
    {
        // Arrange
        Span<char> initialBuffer = stackalloc char[128];
        using var builder = new ReverseStringBuilder(initialBuffer);
 
        // Act
        builder.InsertFront("worlds!");
        builder.InsertFront(" ");
        builder.InsertFront(123);
        builder.InsertFront(", ");
        builder.InsertFront("Hello");
        var result = builder.ToString();
 
        // Assert
        Assert.Equal("Hello, 123 worlds!", result);
        Assert.Equal(0, builder.SequenceSegmentCount);
    }
 
    [Fact]
    public void ToString_Works_AfterExceedingStackAllocatedBuffer()
    {
        // Arrange
        Span<char> initialBuffer = stackalloc char[8];
        using var builder = new ReverseStringBuilder(initialBuffer);
 
        // Act
        builder.InsertFront("world!");
        builder.InsertFront(" ");
        builder.InsertFront(",");
        builder.InsertFront("Hello");
        var result = builder.ToString();
 
        // Assert
        Assert.Equal("Hello, world!", result);
        Assert.Equal(1, builder.SequenceSegmentCount);
    }
 
    [Fact]
    public void ToString_Works_AfterExceedingStackAllocatedBuffer_WithUnusedSpaceInInitialBuffer()
    {
        const int InitialBufferSize = 64;
        var builder = new ReverseStringBuilder(stackalloc char[InitialBufferSize]);
 
        var firstChunk = new string('A', InitialBufferSize - 10);
        var secondChunk = new string('B', 20);
 
        builder.InsertFront(firstChunk);
        builder.InsertFront(secondChunk);
 
        var expected = secondChunk + firstChunk;
        var actual = builder.ToString();
 
        Assert.Equal(expected, actual);
    }
 
    [Fact]
    public void ToString_Works_AfterExpandingIntoMultipleBuffersFromEstimatedStringSize()
    {
        // Arrange
        using var builder = new ReverseStringBuilder(8);
        var padding = new string('A', ReverseStringBuilder.MinimumRentedArraySize - 10);
        var expected = padding + "Hello, world!";
 
        // Act
        builder.InsertFront("world!");
        builder.InsertFront(" ");
        builder.InsertFront(",");
        builder.InsertFront("Hello");
        builder.InsertFront(padding);
        var result = builder.ToString();
 
        // Assert
        Assert.Equal(expected, result);
        Assert.Equal(2, builder.SequenceSegmentCount);
    }
 
    [Fact]
    public void ToString_Works_AfterUsingFallbackBuffer()
    {
        // Arrange
        using var builder = new ReverseStringBuilder(ReverseStringBuilder.MinimumRentedArraySize);
        var segmentCount = 5;
        var expected = string.Empty;
 
        // Act
        for (var i = 0; i < segmentCount; i++)
        {
            var c = (char)(i + 65);
 
            // Update the expected string.
            expected = new string(c, ReverseStringBuilder.MinimumRentedArraySize) + expected;
 
            // Append just one character to ensure we get a buffer with the minimum possible
            // length.
            builder.InsertFront(c.ToString());
 
            // Fill up the rest of the buffer.
            var s = new string(c, ReverseStringBuilder.MinimumRentedArraySize - 1);
            builder.InsertFront(s);
        }
 
        var actual = builder.ToString();
        Assert.Equal(expected, actual);
        Assert.Equal(segmentCount, builder.SequenceSegmentCount);
    }
}