File: RemoteClientSettingsServiceTest.cs
Web Access
Project: src\src\Razor\src\Razor\test\Microsoft.VisualStudioCode.RazorExtension.UnitTests\Microsoft.VisualStudioCode.RazorExtension.UnitTests.csproj (Microsoft.VisualStudioCode.RazorExtension.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Razor.Logging;
using Microsoft.CodeAnalysis.Razor.Remote;
using Microsoft.CodeAnalysis.Razor.Settings;
using Microsoft.CodeAnalysis.Razor.Workspaces.Settings;
using Microsoft.VisualStudio.Razor.LanguageClient.Cohost;
using Microsoft.VisualStudioCode.RazorExtension.Services;
using Xunit;
using Xunit.Abstractions;
 
namespace Microsoft.VisualStudioCode.RazorExtension.Test;
 
public class RemoteClientSettingsServiceTest(ITestOutputHelper testOutput) : CohostEndpointTestBase(testOutput)
{
    [Fact]
    public async Task UpdateAsync_UpdatesOOPClientSettings()
    {
        var workspaceProvider = new VSCodeWorkspaceProvider();
        workspaceProvider.SetWorkspace(LocalWorkspace);
 
        var service = await InProcServiceFactory.CreateServiceAsync<IRemoteClientSettingsService>(
            new VSCodeBrokeredServiceInterceptor(),
            workspaceProvider,
            LoggerFactory);
 
        var expectedSettings = CreateTestSettings();
 
        await service.UpdateAsync(expectedSettings, DisposalToken);
 
        var remoteSettingsManager = OOPExportProvider.GetExportedValue<IClientSettingsManager>();
        Assert.Equal(expectedSettings, remoteSettingsManager.GetClientSettings());
    }
 
    [Fact]
    public async Task InitializerClientSettingsChangedPath_SyncsUpdatedSettingsToOOP()
    {
        var workspaceProvider = new VSCodeWorkspaceProvider();
        workspaceProvider.SetWorkspace(LocalWorkspace);
 
        var initializer = new VSCodeRemoteServicesInitializer(
            new VSCodeLanguageServerFeatureOptions(),
            SemanticTokensLegendService,
            workspaceProvider,
            ClientSettingsManager,
            LoggerFactory);
 
        await initializer.StartupAsync(ClientCapabilitiesService.ClientCapabilities, requestContext: default, DisposalToken);
 
        var expectedSettings = CreateTestSettings();
        ApplySettings(ClientSettingsManager, expectedSettings);
 
        var remoteSettingsManager = OOPExportProvider.GetExportedValue<IClientSettingsManager>();
        await WaitForRemoteSettingsAsync(remoteSettingsManager, expectedSettings);
    }
 
    private static ClientSettings CreateTestSettings()
        => new(
            new ClientSpaceSettings(IndentWithTabs: true, IndentSize: 2),
            new ClientCompletionSettings(AutoShowCompletion: false, AutoListParams: false),
            new ClientAdvancedSettings(
                FormatOnType: false,
                AutoClosingTags: false,
                AutoInsertAttributeQuotes: false,
                ColorBackground: true,
                CodeBlockBraceOnNextLine: true,
                AttributeIndentStyle: AttributeIndentStyle.IndentByOne,
                CommitElementsWithSpace: false,
                SnippetSetting: SnippetSetting.None,
                LogLevel: LogLevel.Trace,
                FormatOnPaste: false,
                TaskListDescriptors: ["TODO", "HACK"]));
 
    private static void ApplySettings(IClientSettingsManager clientSettingsManager, ClientSettings settings)
    {
        clientSettingsManager.Update(settings.ClientSpaceSettings);
        clientSettingsManager.Update(settings.ClientCompletionSettings);
        clientSettingsManager.Update(settings.AdvancedSettings);
    }
 
    private async Task WaitForRemoteSettingsAsync(IClientSettingsManager remoteSettingsManager, ClientSettings expectedSettings)
    {
        for (var i = 0; i < 100; i++)
        {
            if (expectedSettings.Equals(remoteSettingsManager.GetClientSettings()))
            {
                return;
            }
 
            await Task.Delay(10, DisposalToken);
        }
 
        Assert.Equal(expectedSettings, remoteSettingsManager.GetClientSettings());
    }
}