File: Settings\ClientSettingsManagerTest.cs
Web Access
Project: src\src\Razor\src\Razor\test\Microsoft.VisualStudio.LanguageServices.Razor.UnitTests\Microsoft.VisualStudio.LanguageServices.Razor.UnitTests.csproj (Microsoft.VisualStudio.LanguageServices.Razor.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;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Razor.Test.Common.VisualStudio;
using Microsoft.CodeAnalysis.Razor.Logging;
using Microsoft.CodeAnalysis.Razor.Settings;
using Microsoft.CodeAnalysis.Razor.Workspaces.Settings;
using Xunit;
using Xunit.Abstractions;
 
namespace Microsoft.VisualStudio.Razor.Settings;
 
public class ClientSettingsManagerTest(ITestOutputHelper testOutput) : VisualStudioTestBase(testOutput)
{
    private readonly IEnumerable<IClientSettingsChangedTrigger> _clientSettingsChangeTriggers = [];
 
    [Fact]
    public void ChangeTriggersGetInitialized()
    {
        // Act
        var triggers = new TestChangeTrigger[]
        {
            new(),
            new(),
        };
 
        var manager = new ClientSettingsManager(triggers);
 
        // Assert
        Assert.All(triggers, (trigger) => Assert.True(trigger.Initialized));
    }
 
    [Fact]
    public void InitialSettingsAreDefault()
    {
        // Act
        var manager = new ClientSettingsManager(_clientSettingsChangeTriggers);
 
        // Assert
        Assert.Equal(ClientSettings.Default, manager.GetClientSettings());
    }
 
    [Fact]
    public void Update_TriggersChangedIfEditorSettingsAreDifferent()
    {
        // Arrange
        var manager = new ClientSettingsManager(_clientSettingsChangeTriggers);
        var called = false;
        manager.ClientSettingsChanged += (caller, args) => called = true;
        var settings = new ClientSpaceSettings(IndentWithTabs: true, IndentSize: 7);
 
        // Act
        manager.Update(settings);
 
        // Assert
        Assert.True(called);
        Assert.Equal(settings, manager.GetClientSettings().ClientSpaceSettings);
    }
 
    [Fact]
    public void Update_DoesNotTriggerChangedIfEditorSettingsAreSame()
    {
        // Arrange
        var manager = new ClientSettingsManager(_clientSettingsChangeTriggers);
        var called = false;
        manager.ClientSettingsChanged += (caller, args) => called = true;
        var originalSettings = manager.GetClientSettings();
 
        // Act
        manager.Update(ClientSpaceSettings.Default);
 
        // Assert
        Assert.False(called);
        Assert.Same(originalSettings, manager.GetClientSettings());
    }
 
    [Fact]
    public void Update_TriggersChangedIfAdvancedSettingsAreDifferent()
    {
        // Arrange
        var manager = new ClientSettingsManager(_clientSettingsChangeTriggers);
        var called = false;
        manager.ClientSettingsChanged += (caller, args) => called = true;
        var settings = new ClientAdvancedSettings(
            FormatOnType: false,
            AutoClosingTags: true,
            AutoInsertAttributeQuotes: true,
            ColorBackground: true,
            CodeBlockBraceOnNextLine: false,
            AttributeIndentStyle: AttributeIndentStyle.AlignWithFirst,
            CommitElementsWithSpace: false,
            SnippetSetting: SnippetSetting.All,
            LogLevel: LogLevel.None,
            FormatOnPaste: false,
            TaskListDescriptors: []);
 
        // Act
        manager.Update(settings);
 
        // Assert
        Assert.True(called);
        Assert.Equal(settings, manager.GetClientSettings().AdvancedSettings);
    }
 
    [Fact]
    public void Update_DoesNotTriggerChangedIfAdvancedSettingsAreSame()
    {
        // Arrange
        var manager = new ClientSettingsManager(_clientSettingsChangeTriggers);
        var called = false;
        manager.ClientSettingsChanged += (caller, args) => called = true;
        var originalSettings = manager.GetClientSettings();
 
        // Act
        manager.Update(ClientAdvancedSettings.Default);
 
        // Assert
        Assert.False(called);
        Assert.Same(originalSettings, manager.GetClientSettings());
    }
 
    [Fact]
    public void InitialSettingsStored()
    {
        var defaultSettings = ClientAdvancedSettings.Default;
        var expectedSettings = defaultSettings with
        {
            FormatOnType = !defaultSettings.FormatOnType
        };
 
        var manager = new ClientSettingsManager(_clientSettingsChangeTriggers, new AdvancedSettingsStorage(expectedSettings));
 
        Assert.Same(expectedSettings, manager.GetClientSettings().AdvancedSettings);
    }
 
    private class TestChangeTrigger : IClientSettingsChangedTrigger
    {
        public bool Initialized { get; private set; }
 
        public void Initialize(IClientSettingsManager clientSettingsManager)
        {
            Initialized = true;
        }
    }
 
    private sealed class AdvancedSettingsStorage(ClientAdvancedSettings settings) : IAdvancedSettingsStorage
    {
        public ClientAdvancedSettings GetAdvancedSettings() => settings;
        public Task OnChangedAsync(Action<ClientAdvancedSettings> changed) => Task.CompletedTask;
    }
}