PowerLauncherViewModelTest.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 Microsoft.PowerToys.Settings.UI.Library; 7 using Microsoft.PowerToys.Settings.UI.Library.Interfaces; 8 using Microsoft.PowerToys.Settings.UI.UnitTests.BackwardsCompatibility; 9 using Microsoft.PowerToys.Settings.UI.ViewModels; 10 using Microsoft.VisualStudio.TestTools.UnitTesting; 11 using Moq; 12 13 namespace ViewModelTests 14 { 15 [TestClass] 16 public class PowerLauncherViewModelTest : IDisposable 17 { 18 private sealed class SendCallbackMock 19 { 20 public int TimesSent { get; set; } 21 22 // PowerLauncherSettings is unused, but required according to SendCallback's signature. 23 // Naming parameter with discard symbol to suppress StyleCop warnings. 24 [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", "SA1313:Parameter names should begin with lower-case letter", Justification = "We actually don't validate setting, just calculate it was sent")] 25 public void OnSend(PowerLauncherSettings _) 26 { 27 TimesSent++; 28 } 29 30 [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.NamingRules", "SA1313:Parameter names should begin with lower-case letter", Justification = "We actually don't validate setting, just calculate it was sent")] 31 public int OnSendIPC(string _) 32 { 33 TimesSent++; 34 return 0; 35 } 36 } 37 38 private PowerLauncherViewModel viewModel; 39 private PowerLauncherSettings mockSettings; 40 private SendCallbackMock sendCallbackMock; 41 private BackCompatTestProperties.MockSettingsRepository<GeneralSettings> mockGeneralSettingsRepository; 42 43 [TestInitialize] 44 public void Initialize() 45 { 46 mockSettings = new PowerLauncherSettings(); 47 sendCallbackMock = new SendCallbackMock(); 48 49 var settingPathMock = new Mock<SettingPath>(); 50 var mockGeneralIOProvider = BackCompatTestProperties.GetGeneralSettingsIOProvider("v0.22.0"); 51 var mockGeneralSettingsUtils = new SettingsUtils(mockGeneralIOProvider.Object, settingPathMock.Object); 52 mockGeneralSettingsRepository = new BackCompatTestProperties.MockSettingsRepository<GeneralSettings>(mockGeneralSettingsUtils); 53 54 viewModel = new PowerLauncherViewModel( 55 mockSettings, 56 mockGeneralSettingsRepository, 57 sendCallbackMock.OnSendIPC, 58 () => false); 59 } 60 61 [TestCleanup] 62 public void Cleanup() 63 { 64 viewModel?.Dispose(); 65 } 66 67 public void Dispose() 68 { 69 viewModel?.Dispose(); 70 GC.SuppressFinalize(this); 71 } 72 73 /// <summary> 74 /// Test if the original settings files were modified. 75 /// </summary> 76 [TestMethod] 77 [DataRow("v0.18.2", "settings.json")] 78 [DataRow("v0.19.2", "settings.json")] 79 [DataRow("v0.20.1", "settings.json")] 80 [DataRow("v0.21.1", "settings.json")] 81 [DataRow("v0.22.0", "settings.json")] 82 public void OriginalFilesModificationTest(string version, string fileName) 83 { 84 var settingPathMock = new Mock<SettingPath>(); 85 86 var mockIOProvider = BackCompatTestProperties.GetModuleIOProvider(version, PowerLauncherSettings.ModuleName, fileName); 87 var mockSettingsUtils = new SettingsUtils(mockIOProvider.Object, settingPathMock.Object); 88 PowerLauncherSettings originalSettings = mockSettingsUtils.GetSettingsOrDefault<PowerLauncherSettings>(PowerLauncherSettings.ModuleName); 89 90 var mockGeneralIOProvider = BackCompatTestProperties.GetGeneralSettingsIOProvider(version); 91 var mockGeneralSettingsUtils = new SettingsUtils(mockGeneralIOProvider.Object, settingPathMock.Object); 92 GeneralSettings originalGeneralSettings = mockGeneralSettingsUtils.GetSettingsOrDefault<GeneralSettings>(); 93 94 var generalSettingsRepository = new BackCompatTestProperties.MockSettingsRepository<GeneralSettings>(mockGeneralSettingsUtils); 95 96 // Initialise View Model with test Config files 97 Func<string, int> sendMockIPCConfigMSG = msg => { return 0; }; 98 using PowerLauncherViewModel viewModel = new PowerLauncherViewModel(originalSettings, generalSettingsRepository, sendMockIPCConfigMSG, () => true); 99 100 // Verify that the old settings persisted 101 Assert.AreEqual(originalGeneralSettings.Enabled.PowerLauncher, viewModel.EnablePowerLauncher); 102 Assert.AreEqual(originalSettings.Properties.ClearInputOnLaunch, viewModel.ClearInputOnLaunch); 103 Assert.AreEqual(originalSettings.Properties.TabSelectsContextButtons, viewModel.TabSelectsContextButtons); 104 Assert.AreEqual(originalSettings.Properties.CopyPathLocation.ToString(), viewModel.CopyPathLocation.ToString()); 105 Assert.AreEqual(originalSettings.Properties.IgnoreHotkeysInFullscreen, viewModel.IgnoreHotkeysInFullScreen); 106 Assert.AreEqual(originalSettings.Properties.MaximumNumberOfResults, viewModel.MaximumNumberOfResults); 107 Assert.AreEqual(originalSettings.Properties.OpenPowerLauncher.ToString(), viewModel.OpenPowerLauncher.ToString()); 108 Assert.AreEqual(originalSettings.Properties.OverrideWinkeyR, viewModel.OverrideWinRKey); 109 Assert.AreEqual(originalSettings.Properties.OverrideWinkeyS, viewModel.OverrideWinSKey); 110 Assert.AreEqual(originalSettings.Properties.SearchResultPreference, viewModel.SearchResultPreference); 111 Assert.AreEqual(originalSettings.Properties.SearchTypePreference, viewModel.SearchTypePreference); 112 Assert.AreEqual(originalSettings.Properties.GenerateThumbnailsFromFiles, viewModel.GenerateThumbnailsFromFiles); 113 Assert.AreEqual(originalSettings.Properties.UsePinyin, viewModel.UsePinyin); 114 Assert.AreEqual(originalSettings.Properties.ShowPluginsOverview, viewModel.ShowPluginsOverviewIndex); 115 Assert.AreEqual(originalSettings.Properties.TitleFontSize, viewModel.TitleFontSize); 116 117 // Verify that the stub file was used 118 var expectedCallCount = 2; // once via the view model, and once by the test (GetSettings<T>) 119 BackCompatTestProperties.VerifyGeneralSettingsIOProviderWasRead(mockGeneralIOProvider, expectedCallCount); 120 } 121 122 [TestMethod] 123 public void SearchPreferenceShouldUpdatePreferences() 124 { 125 viewModel.SearchResultPreference = "SearchOptionsAreNotValidated"; 126 viewModel.SearchTypePreference = "SearchOptionsAreNotValidated"; 127 128 Assert.AreEqual(sendCallbackMock.TimesSent, 2); 129 Assert.IsTrue(mockSettings.Properties.SearchResultPreference == "SearchOptionsAreNotValidated"); 130 Assert.IsTrue(mockSettings.Properties.SearchTypePreference == "SearchOptionsAreNotValidated"); 131 } 132 133 public static void AssertHotkeySettings(HotkeySettings setting, bool win, bool ctrl, bool alt, bool shift, int code) 134 { 135 if (setting != null) 136 { 137 Assert.AreEqual(win, setting.Win); 138 Assert.AreEqual(ctrl, setting.Ctrl); 139 Assert.AreEqual(alt, setting.Alt); 140 Assert.AreEqual(shift, setting.Shift); 141 Assert.AreEqual(code, setting.Code); 142 } 143 else 144 { 145 Assert.Fail("setting parameter is null"); 146 } 147 } 148 149 [TestMethod] 150 public void HotkeysShouldUpdateHotkeys() 151 { 152 var openPowerLauncher = new HotkeySettings(); 153 openPowerLauncher.Win = true; 154 openPowerLauncher.Code = 83; 155 156 var openFileLocation = new HotkeySettings(); 157 openFileLocation.Ctrl = true; 158 openFileLocation.Code = 65; 159 160 var openConsole = new HotkeySettings(); 161 openConsole.Alt = true; 162 openConsole.Code = 68; 163 164 var copyFileLocation = new HotkeySettings(); 165 copyFileLocation.Shift = true; 166 copyFileLocation.Code = 70; 167 168 viewModel.OpenPowerLauncher = openPowerLauncher; 169 viewModel.OpenFileLocation = openFileLocation; 170 viewModel.CopyPathLocation = copyFileLocation; 171 172 Assert.AreEqual(3, sendCallbackMock.TimesSent); 173 174 AssertHotkeySettings( 175 mockSettings.Properties.OpenPowerLauncher, 176 true, 177 false, 178 false, 179 false, 180 83); 181 AssertHotkeySettings( 182 mockSettings.Properties.OpenFileLocation, 183 false, 184 true, 185 false, 186 false, 187 65); 188 AssertHotkeySettings( 189 mockSettings.Properties.CopyPathLocation, 190 false, 191 false, 192 false, 193 true, 194 70); 195 } 196 197 [TestMethod] 198 public void OverrideShouldUpdateOverrides() 199 { 200 viewModel.OverrideWinRKey = true; 201 viewModel.OverrideWinSKey = false; 202 203 Assert.AreEqual(1, sendCallbackMock.TimesSent); 204 205 Assert.IsTrue(mockSettings.Properties.OverrideWinkeyR); 206 Assert.IsFalse(mockSettings.Properties.OverrideWinkeyS); 207 } 208 } 209 }