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 }