File: SegmentWriteStreamTests.cs
Web Access
Project: src\src\Shared\test\Shared.Tests\Microsoft.AspNetCore.Shared.Tests.csproj (Microsoft.AspNetCore.Shared.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.WriteStream.Tests;
 
public class SegmentWriteStreamTests
{
    private static readonly byte[] WriteData = new byte[]
    {
            0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
    };
 
    [Theory]
    [InlineData(0)]
    [InlineData(-1)]
    public void SegmentWriteStream_InvalidSegmentSize_Throws(int segmentSize)
    {
        Assert.Throws<ArgumentOutOfRangeException>(() => new SegmentWriteStream(segmentSize));
    }
 
    [Fact]
    public void ReadAndSeekOperations_Throws()
    {
        var stream = new SegmentWriteStream(1);
 
        Assert.Throws<NotSupportedException>(() => stream.Read(new byte[1], 0, 0));
        Assert.Throws<NotSupportedException>(() => stream.Position = 0);
        Assert.Throws<NotSupportedException>(() => stream.Seek(0, SeekOrigin.Begin));
    }
 
    [Fact]
    public void GetSegments_ExtractionDisablesWriting()
    {
        var stream = new SegmentWriteStream(1);
 
        Assert.True(stream.CanWrite);
        Assert.Empty(stream.GetSegments());
        Assert.False(stream.CanWrite);
    }
 
    [Theory]
    [InlineData(4)]
    [InlineData(5)]
    [InlineData(6)]
    public void WriteByte_CanWriteAllBytes(int segmentSize)
    {
        var stream = new SegmentWriteStream(segmentSize);
 
        foreach (var datum in WriteData)
        {
            stream.WriteByte(datum);
        }
        var segments = stream.GetSegments();
 
        Assert.Equal(WriteData.Length, stream.Length);
        Assert.Equal((WriteData.Length + segmentSize - 1) / segmentSize, segments.Count);
 
        for (var i = 0; i < WriteData.Length; i += segmentSize)
        {
            var expectedSegmentSize = Math.Min(segmentSize, WriteData.Length - i);
            var expectedSegment = new byte[expectedSegmentSize];
            for (int j = 0; j < expectedSegmentSize; j++)
            {
                expectedSegment[j] = (byte)(i + j);
            }
            var segment = segments[i / segmentSize];
 
            Assert.Equal(expectedSegmentSize, segment.Length);
            Assert.True(expectedSegment.SequenceEqual(segment));
        }
    }
 
    [Theory]
    [InlineData(4)]
    [InlineData(5)]
    [InlineData(6)]
    public void Write_CanWriteAllBytes(int writeSize)
    {
        var segmentSize = 5;
        var stream = new SegmentWriteStream(segmentSize);
 
        for (var i = 0; i < WriteData.Length; i += writeSize)
        {
            stream.Write(WriteData, i, Math.Min(writeSize, WriteData.Length - i));
        }
        var segments = stream.GetSegments();
 
        Assert.Equal(WriteData.Length, stream.Length);
        Assert.Equal((WriteData.Length + segmentSize - 1) / segmentSize, segments.Count);
 
        for (var i = 0; i < WriteData.Length; i += segmentSize)
        {
            var expectedSegmentSize = Math.Min(segmentSize, WriteData.Length - i);
            var expectedSegment = new byte[expectedSegmentSize];
            for (int j = 0; j < expectedSegmentSize; j++)
            {
                expectedSegment[j] = (byte)(i + j);
            }
            var segment = segments[i / segmentSize];
 
            Assert.Equal(expectedSegmentSize, segment.Length);
            Assert.True(expectedSegment.SequenceEqual(segment));
        }
    }
}