/ src / settings-ui / Settings.UI.UnitTests / BackwardsCompatibility / BackCompatTestProperties.cs
BackCompatTestProperties.cs
  1  // Copyright (c) Microsoft Corporation
  2  // The Microsoft Corporation licenses this file to you under the MIT license.
  3  // See the LICENSE file in the project root for more information.
  4  
  5  using System;
  6  using System.Globalization;
  7  using System.IO.Abstractions;
  8  using System.Linq.Expressions;
  9  using System.Text;
 10  
 11  using Microsoft.PowerToys.Settings.UI.Library;
 12  using Microsoft.PowerToys.Settings.UI.Library.Interfaces;
 13  using Microsoft.PowerToys.Settings.UI.UnitTests.Mocks;
 14  using Moq;
 15  
 16  namespace Microsoft.PowerToys.Settings.UI.UnitTests.BackwardsCompatibility
 17  {
 18      public static class BackCompatTestProperties
 19      {
 20          public const string RootPathStubFiles = "..\\..\\..\\..\\..\\src\\settings-ui\\Settings.UI.UnitTests\\BackwardsCompatibility\\TestFiles\\{0}\\Microsoft\\PowerToys\\{1}\\{2}";
 21  
 22          // Using Ordinal since this is used internally for a path
 23          private static readonly Expression<Func<string, bool>> SettingsFilterExpression = s => s == null || s.Contains("Microsoft\\PowerToys\\settings.json", StringComparison.Ordinal);
 24  
 25          private static readonly CompositeFormat RootPathStubFilesCompositeFormat = System.Text.CompositeFormat.Parse(BackCompatTestProperties.RootPathStubFiles);
 26  
 27          internal sealed class MockSettingsRepository<T> : ISettingsRepository<T>
 28              where T : ISettingsConfig, new()
 29          {
 30              private readonly SettingsUtils _settingsUtils;
 31              private T _settingsConfig;
 32  
 33              // Implements ISettingsRepository<T>.SettingsChanged
 34  #pragma warning disable CS0067
 35              public event System.Action<T> SettingsChanged;
 36  #pragma warning restore CS0067
 37  
 38              public MockSettingsRepository(SettingsUtils settingsUtils)
 39              {
 40                  _settingsUtils = settingsUtils;
 41              }
 42  
 43              public T SettingsConfig
 44              {
 45                  get
 46                  {
 47                      T settingsItem = new T();
 48                      _settingsConfig = _settingsUtils.GetSettingsOrDefault<T>(settingsItem.GetModuleName());
 49                      return _settingsConfig;
 50                  }
 51  
 52                  set
 53                  {
 54                      if (value != null)
 55                      {
 56                          _settingsConfig = value;
 57                      }
 58                  }
 59              }
 60  
 61              public bool ReloadSettings()
 62              {
 63                  try
 64                  {
 65                      T settingsItem = new T();
 66                      _settingsConfig = _settingsUtils.GetSettingsOrDefault<T>(settingsItem.GetModuleName());
 67  
 68                      SettingsConfig = _settingsConfig;
 69  
 70                      return true;
 71                  }
 72                  catch
 73                  {
 74                      return false;
 75                  }
 76              }
 77          }
 78  
 79          public static Mock<IFile> GetModuleIOProvider(string version, string module, string fileName)
 80          {
 81              var stubSettingsPath = StubSettingsPath(version, module, fileName);
 82              Expression<Func<string, bool>> filterExpression = ModuleFilterExpression(module);
 83              return IIOProviderMocks.GetMockIOReadWithStubFile(stubSettingsPath, filterExpression);
 84          }
 85  
 86          public static string StubGeneralSettingsPath(string version)
 87          {
 88              return StubSettingsPath(version, string.Empty, "settings.json");
 89          }
 90  
 91          public static string StubSettingsPath(string version, string module, string fileName)
 92          {
 93              return string.Format(CultureInfo.InvariantCulture, RootPathStubFilesCompositeFormat, version, module, fileName);
 94          }
 95  
 96          public static void VerifyModuleIOProviderWasRead(Mock<IFile> provider, string module, int expectedCallCount)
 97          {
 98              ArgumentNullException.ThrowIfNull(provider);
 99  
100              Expression<Func<string, bool>> filterExpression = ModuleFilterExpression(module);
101  
102              IIOProviderMocks.VerifyIOReadWithStubFile(provider, filterExpression, expectedCallCount);
103          }
104  
105          private static Expression<Func<string, bool>> ModuleFilterExpression(string module)
106          {
107              // Using Ordinal since this is used internally for a path
108              return s => s == null || s.Contains(module, StringComparison.Ordinal);
109          }
110  
111          public static Mock<IFile> GetGeneralSettingsIOProvider(string version)
112          {
113              var stubGeneralSettingsPath = StubGeneralSettingsPath(version);
114              return IIOProviderMocks.GetMockIOReadWithStubFile(stubGeneralSettingsPath, SettingsFilterExpression);
115          }
116  
117          public static void VerifyGeneralSettingsIOProviderWasRead(Mock<IFile> provider, int expectedCallCount)
118          {
119              ArgumentNullException.ThrowIfNull(provider);
120  
121              IIOProviderMocks.VerifyIOReadWithStubFile(provider, SettingsFilterExpression, expectedCallCount);
122          }
123      }
124  }