File: System\IO\StreamExtensionsTests.cs
Web Access
Project: src\src\test\unit\Microsoft.Private.Windows.Polyfills\Microsoft.Private.Windows.Polyfills.Tests.csproj (Microsoft.Private.Windows.Polyfills.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
namespace System.IO.Tests;
 
public class StreamExtensionsTests
{
    [Fact]
    public void Read_Span_ReadsData()
    {
        byte[] data = [1, 2, 3, 4, 5];
        using MemoryStream stream = new(data);
 
        Span<byte> buffer = stackalloc byte[5];
        int bytesRead = stream.Read(buffer);
 
        bytesRead.Should().Be(5);
        buffer.SequenceEqual(data).Should().BeTrue();
    }
 
    [Fact]
    public void Read_Span_PartialRead()
    {
        byte[] data = [10, 20, 30, 40, 50];
        using MemoryStream stream = new(data);
 
        Span<byte> buffer = stackalloc byte[3];
        int bytesRead = stream.Read(buffer);
 
        bytesRead.Should().Be(3);
        buffer[0].Should().Be(10);
        buffer[1].Should().Be(20);
        buffer[2].Should().Be(30);
    }
 
    [Fact]
    public void Read_Span_EmptyBuffer_ReturnsZero()
    {
        byte[] data = [1, 2, 3];
        using MemoryStream stream = new(data);
 
        Span<byte> buffer = [];
        int bytesRead = stream.Read(buffer);
 
        bytesRead.Should().Be(0);
    }
 
    [Fact]
    public void Write_Span_WritesData()
    {
        using MemoryStream stream = new();
        ReadOnlySpan<byte> data = stackalloc byte[] { 1, 2, 3, 4, 5 };
 
        stream.Write(data);
 
        stream.ToArray().Should().Equal(1, 2, 3, 4, 5);
    }
 
    [Fact]
    public void Write_Span_EmptyData_WritesNothing()
    {
        using MemoryStream stream = new();
        ReadOnlySpan<byte> data = [];
 
        stream.Write(data);
 
        stream.Length.Should().Be(0);
    }
 
    [Fact]
    public void Write_Span_MultipleWrites()
    {
        using MemoryStream stream = new();
        ReadOnlySpan<byte> data1 = stackalloc byte[] { 1, 2 };
        ReadOnlySpan<byte> data2 = stackalloc byte[] { 3, 4 };
 
        stream.Write(data1);
        stream.Write(data2);
 
        stream.ToArray().Should().Equal(1, 2, 3, 4);
    }
 
    [Fact]
    public void ReadExactly_ReadsExactAmount()
    {
        byte[] data = [1, 2, 3, 4, 5];
        using MemoryStream stream = new(data);
 
        Span<byte> buffer = stackalloc byte[5];
        stream.ReadExactly(buffer);
 
        buffer.SequenceEqual(data).Should().BeTrue();
    }
 
    [Fact]
    public void ReadExactly_NotEnoughData_ThrowsEndOfStreamException()
    {
        byte[] data = [1, 2, 3];
        using MemoryStream stream = new(data);
 
        byte[] buffer = new byte[5];
        Action action = () => stream.ReadExactly(buffer);
 
        action.Should().Throw<EndOfStreamException>();
    }
 
    [Fact]
    public void ReadExactly_EmptyBuffer_Succeeds()
    {
        byte[] data = [1, 2, 3];
        using MemoryStream stream = new(data);
 
        Span<byte> buffer = [];
        stream.ReadExactly(buffer);
    }
 
    [Fact]
    public void ReadExactly_EmptyStream_ThrowsEndOfStreamException()
    {
        using MemoryStream stream = new([]);
 
        byte[] buffer = new byte[1];
        Action action = () => stream.ReadExactly(buffer);
 
        action.Should().Throw<EndOfStreamException>();
    }
 
    [Fact]
    public void Read_Write_RoundTrip()
    {
        byte[] original = [10, 20, 30, 40, 50, 60, 70, 80];
        using MemoryStream writeStream = new();
 
        writeStream.Write(original.AsSpan());
 
        writeStream.Position = 0;
        Span<byte> readBuffer = stackalloc byte[original.Length];
        int bytesRead = writeStream.Read(readBuffer);
 
        bytesRead.Should().Be(original.Length);
        readBuffer.SequenceEqual(original).Should().BeTrue();
    }
}