File: Workspaces\TextFactoryTests.cs
Web Access
Project: src\src\EditorFeatures\Test\Microsoft.CodeAnalysis.EditorFeatures.UnitTests.csproj (Microsoft.CodeAnalysis.EditorFeatures.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Editor.Implementation.Workspaces;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Test.Utilities;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Test.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces;
 
[UseExportProvider]
public class TextFactoryTests
{
    private readonly byte[] _nonUtf8StringBytes = [0x80, 0x92, 0xA4, 0xB6, 0xC9, 0xDB, 0xED, 0xFF];
 
    [Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1038018"), WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1041792")]
    public void TestCreateTextFallsBackToSystemDefaultEncoding()
    {
        using var workspace = new AdhocWorkspace(EditorTestCompositions.EditorFeatures.GetHostServices());
        var textFactoryService = Assert.IsType<EditorTextFactoryService>(workspace.Services.GetRequiredService<ITextFactoryService>());
 
        TestCreateTextInferredEncoding(
            textFactoryService,
            _nonUtf8StringBytes,
            defaultEncoding: null,
            expectedEncoding: Encoding.Default);
    }
 
    [Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1038018")]
    public void TestCreateTextFallsBackToUTF8Encoding()
    {
        using var workspace = new AdhocWorkspace(EditorTestCompositions.EditorFeatures.GetHostServices());
        var textFactoryService = Assert.IsType<EditorTextFactoryService>(workspace.Services.GetRequiredService<ITextFactoryService>());
 
        TestCreateTextInferredEncoding(
            textFactoryService,
            new ASCIIEncoding().GetBytes("Test"),
            defaultEncoding: null,
            expectedEncoding: new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true));
    }
 
    [Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1038018")]
    public void TestCreateTextFallsBackToProvidedDefaultEncoding()
    {
        using var workspace = new AdhocWorkspace(EditorTestCompositions.EditorFeatures.GetHostServices());
        var textFactoryService = Assert.IsType<EditorTextFactoryService>(workspace.Services.GetRequiredService<ITextFactoryService>());
 
        TestCreateTextInferredEncoding(
            textFactoryService,
            new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true).GetBytes("Test"),
            defaultEncoding: Encoding.GetEncoding(1254),
            expectedEncoding: Encoding.GetEncoding(1254));
    }
 
    [Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1038018")]
    public void TestCreateTextUsesByteOrderMarkIfPresent()
    {
        using var workspace = new AdhocWorkspace(EditorTestCompositions.EditorFeatures.GetHostServices());
        var textFactoryService = Assert.IsType<EditorTextFactoryService>(workspace.Services.GetRequiredService<ITextFactoryService>());
 
        TestCreateTextInferredEncoding(
            textFactoryService,
            [
                .. Encoding.UTF8.GetPreamble(),
                .. new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true).GetBytes("Test"),
            ],
            defaultEncoding: Encoding.GetEncoding(1254),
            expectedEncoding: Encoding.UTF8);
    }
 
    [Fact]
    public async Task TestCreateFromTemporaryStorage()
    {
        using var workspace = new AdhocWorkspace(EditorTestCompositions.EditorFeatures.GetHostServices());
 
        var temporaryStorageService = Assert.IsType<TemporaryStorageService>(workspace.Services.GetRequiredService<ITemporaryStorageServiceInternal>());
 
        var text = SourceText.From("Hello, World!");
 
        // Write text into it
        var handle = await temporaryStorageService.WriteToTemporaryStorageAsync(text, CancellationToken.None);
 
        // Read text back from it
        var text2 = await handle.ReadFromTemporaryStorageAsync(CancellationToken.None);
 
        Assert.NotSame(text, text2);
        Assert.Equal(text.ToString(), text2.ToString());
        Assert.Null(text2.Encoding);
    }
 
    [Fact]
    public async Task TestCreateFromTemporaryStorageWithEncoding()
    {
        using var workspace = new AdhocWorkspace(EditorTestCompositions.EditorFeatures.GetHostServices());
 
        var temporaryStorageService = Assert.IsType<TemporaryStorageService>(workspace.Services.GetRequiredService<ITemporaryStorageServiceInternal>());
 
        var text = SourceText.From("Hello, World!", Encoding.ASCII);
 
        // Write text into it
        var handle = await temporaryStorageService.WriteToTemporaryStorageAsync(text, CancellationToken.None);
 
        // Read text back from it
        var text2 = await handle.ReadFromTemporaryStorageAsync(CancellationToken.None);
 
        Assert.NotSame(text, text2);
        Assert.Equal(text.ToString(), text2.ToString());
        Assert.Equal(text2.Encoding, Encoding.ASCII);
    }
 
    private static void TestCreateTextInferredEncoding(ITextFactoryService textFactoryService, byte[] bytes, Encoding? defaultEncoding, Encoding expectedEncoding)
    {
        using var stream = new MemoryStream(bytes);
        var text = textFactoryService.CreateText(stream, defaultEncoding, SourceHashAlgorithms.Default, CancellationToken.None);
        Assert.Equal(expectedEncoding, text.Encoding);
        Assert.Equal(SourceHashAlgorithms.Default, text.ChecksumAlgorithm);
    }
}