File: System\Text\EncodingExtensionsTests.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.Text.Tests;
 
public class EncodingExtensionsTests
{
    [Fact]
    public void GetBytes_Span_ReturnsCorrectBytes()
    {
        Encoding encoding = Encoding.UTF8;
        ReadOnlySpan<char> source = "Hello".AsSpan();
        Span<byte> destination = stackalloc byte[10];
 
        int bytesWritten = encoding.GetBytes(source, destination);
 
        bytesWritten.Should().Be(5);
        destination[..5].SequenceEqual("Hello"u8).Should().BeTrue();
    }
 
    [Fact]
    public void GetBytes_Span_EmptyInput_ReturnsZero()
    {
        Encoding encoding = Encoding.UTF8;
        ReadOnlySpan<char> source = ReadOnlySpan<char>.Empty;
        Span<byte> destination = stackalloc byte[10];
 
        int bytesWritten = encoding.GetBytes(source, destination);
 
        bytesWritten.Should().Be(0);
    }
 
    [Fact]
    public void GetBytes_Span_UnicodeCharacters()
    {
        Encoding encoding = Encoding.UTF8;
        ReadOnlySpan<char> source = "\u00E9".AsSpan(); // é
        Span<byte> destination = stackalloc byte[10];
 
        int bytesWritten = encoding.GetBytes(source, destination);
 
        bytesWritten.Should().Be(2); // é is 2 bytes in UTF-8
    }
 
    [Fact]
    public void GetBytes_Span_MatchesByteArrayOverload()
    {
        Encoding encoding = Encoding.UTF8;
        string text = "Hello, World! \u00E9\u00F1\u00FC";
        byte[] expected = encoding.GetBytes(text);
 
        Span<byte> destination = stackalloc byte[expected.Length];
        int bytesWritten = encoding.GetBytes(text.AsSpan(), destination);
 
        bytesWritten.Should().Be(expected.Length);
        destination.SequenceEqual(expected).Should().BeTrue();
    }
 
    [Fact]
    public void GetString_Span_ReturnsCorrectString()
    {
        Encoding encoding = Encoding.UTF8;
        ReadOnlySpan<byte> source = "Hello"u8;
 
        string result = encoding.GetString(source);
 
        result.Should().Be("Hello");
    }
 
    [Fact]
    public void GetString_Span_EmptyInput_ReturnsEmpty()
    {
        Encoding encoding = Encoding.UTF8;
        ReadOnlySpan<byte> source = [];
 
        string result = encoding.GetString(source);
 
        result.Should().BeEmpty();
    }
 
    [Fact]
    public void GetString_Span_UnicodeBytes()
    {
        Encoding encoding = Encoding.UTF8;
        byte[] utf8Bytes = encoding.GetBytes("\u00E9"); // é
        ReadOnlySpan<byte> source = utf8Bytes;
 
        string result = encoding.GetString(source);
 
        result.Should().Be("\u00E9");
    }
 
    [Fact]
    public void GetString_Span_MatchesByteArrayOverload()
    {
        Encoding encoding = Encoding.UTF8;
        string original = "Hello, World! \u00E9\u00F1\u00FC";
        byte[] bytes = encoding.GetBytes(original);
 
        string fromSpan = encoding.GetString(bytes.AsSpan());
        string fromArray = encoding.GetString(bytes);
 
        fromSpan.Should().Be(fromArray);
        fromSpan.Should().Be(original);
    }
 
    [Fact]
    public void GetBytes_DifferentEncodings()
    {
        ReadOnlySpan<char> source = "Test".AsSpan();
 
        Span<byte> utf8Buffer = stackalloc byte[20];
        int utf8Written = Encoding.UTF8.GetBytes(source, utf8Buffer);
 
        Span<byte> asciiBuffer = stackalloc byte[20];
        int asciiWritten = Encoding.ASCII.GetBytes(source, asciiBuffer);
 
        // For simple ASCII text, both should be the same
        utf8Written.Should().Be(asciiWritten);
        utf8Buffer[..utf8Written].SequenceEqual(asciiBuffer[..asciiWritten]).Should().BeTrue();
    }
}