File: StubSettingsManagerHost.cs
Web Access
Project: src\src\EditorFeatures\TestUtilities\Microsoft.CodeAnalysis.EditorFeatures.Test.Utilities.csproj (Microsoft.CodeAnalysis.EditorFeatures.Test.Utilities)
// 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;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.ComponentModel;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.VisualStudio.PlatformUI;
using Microsoft.VisualStudio.Settings;
using Microsoft.VisualStudio.Settings.Telemetry;
 
namespace Microsoft.CodeAnalysis.Editor.UnitTests;
 
internal sealed class StubSettingsManagerHost : ISettingsManagerHost5
{
    Task ISettingsManagerHost.AppInitCompletionTask => throw new NotImplementedException();
 
    ISettingNameTranslator? ISettingsManagerHost.NameTranslator => null;
 
    IStringStorage ISettingsManagerHost.PrivateStorage { get; } = new StringStorage();
 
    ISettingsLogger? ISettingsManagerHost.Logger => null;
 
    string ISettingsManagerHost.CollectionName => throw new NotImplementedException();
 
    string? ISettingsManagerHost.TelemetrySettings => null;
 
    string ISettingsManagerHost.AppDir { get; } = Path.GetRandomFileName();
 
    IRemoteDefaultsStore? ISettingsManagerHost3.RemoteDefaultsStore => null;
 
    string ISettingsManagerHost4.DurableHostIdentity => "roslyn-CI";
 
    IStoreUpdateLogger? ISettingsManagerHost4.StoreUpdateLogger => null;
 
    bool ISettingsManagerHost4.IsRoamingEnabledByDefault => false;
 
    bool ISettingsManagerHost5.IsRoamingAndSharingAllowed => false;
 
    event EventHandler<IdleStateChangedEventArgs> ISettingsManagerHost.IdleStateChanged
    {
        add
        {
            throw new NotImplementedException();
        }
 
        remove
        {
            throw new NotImplementedException();
        }
    }
 
    event AsyncEventHandler ISettingsManagerHost.HostShuttingDown
    {
        add
        {
            throw new NotImplementedException();
        }
 
        remove
        {
            throw new NotImplementedException();
        }
    }
 
    bool ISettingsManagerHost.IsSharedOrRoamedSetting(string settingName)
    {
        // Don't roam settings in tests
        return false;
    }
 
    Task<string> ISettingsManagerHost2.GetTelemetrySettingsAsync()
    {
        throw new NotImplementedException();
    }
 
    Task<Stream> ISettingsManagerHost5.GetServiceStreamAsync(CancellationToken cancellationToken)
    {
        throw new NotImplementedException();
    }
 
    private sealed class StringStorage : IStringStorage2, IAsyncStringStorage
    {
        private ImmutableDictionary<string, VersionedString> _values = ImmutableDictionary<string, VersionedString>.Empty;
        private PropertyChangedEventHandler? _propertyChanged;
        private PropertyChangedAsyncEventHandler? _propertyChangedAsync;
 
        event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged
        {
            add => _propertyChanged += value;
            remove => _propertyChanged -= value;
        }
 
        event PropertyChangedAsyncEventHandler IStringStorage.PropertyChangedAsync
        {
            add => _propertyChangedAsync += value;
            remove => _propertyChangedAsync -= value;
        }
 
        event PropertyChangedAsyncEventHandler IAsyncStringStorage.PropertyChangedAsync
        {
            add => ((IStringStorage)this).PropertyChangedAsync += value;
            remove => ((IStringStorage)this).PropertyChangedAsync -= value;
        }
 
        event StoreUpdatedEventHandler IAsyncStringStorage.StoreUpdated
        {
            add
            {
                throw new NotImplementedException();
            }
 
            remove
            {
                throw new NotImplementedException();
            }
        }
 
        private async Task FireChangeEventAsync(string name)
        {
            _propertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
            await (_propertyChangedAsync?.RaiseEventAsync(this, new PropertyChangedEventArgs(name)) ?? Task.CompletedTask);
        }
 
        Task IStringStorage.ClearAsync(CancellationToken cancellationToken)
        {
            throw new NotImplementedException();
        }
 
        Task IAsyncStringStorage.ClearAsync(CancellationToken cancellationToken)
            => ((IStringStorage)this).ClearAsync(cancellationToken);
 
        async Task IStringStorage.DeleteIfExistsAsync(string name, CancellationToken cancellationToken)
        {
            if (ImmutableInterlocked.TryRemove(ref _values, name, out _))
            {
                await FireChangeEventAsync(name);
            }
        }
 
        Task IAsyncStringStorage.DeleteIfExistsAsync(string name, CancellationToken cancellationToken)
            => ((IStringStorage)this).DeleteIfExistsAsync(name, cancellationToken);
 
        StringWithMachineLocalFlag? IStringStorage.Get(string name)
        {
            return _values.GetValueOrDefault(name);
        }
 
        Task<IEnumerable<NamedVersionedString>> IAsyncStringStorage.GetAllSinceVersionAsync(int modifiedAfterRevision, CancellationToken cancellationToken)
        {
            throw new NotImplementedException();
        }
 
        Task<VersionedString?> IAsyncStringStorage.GetAsync(string name, CancellationToken cancellationToken)
        {
            return Task.FromResult(_values.GetValueOrDefault(name));
        }
 
        Task<string> IAsyncStringStorage.GetStoreIdentityAsync(CancellationToken cancellationToken)
        {
            throw new NotImplementedException();
        }
 
        string[] IStringStorage.NamesStartingWith(string prefix)
        {
            throw new NotImplementedException();
        }
 
        Task IStringStorage.SetAsync(string name, StringWithMachineLocalFlag value, Action onBeforePropertyChanged, CancellationToken cancellationToken)
        {
            throw new NotImplementedException();
        }
 
        Task<ServiceUploadResult> IAsyncStringStorage.SetAsync(NamedVersionedString value, CancellationToken cancellationToken)
        {
            throw new NotImplementedException();
        }
 
        void IStringStorage2.ForEachSettingNameStartingWith(string prefix, CharSpanProcessorDelegate processFunc)
        {
            throw new NotImplementedException();
        }
    }
}