/ src / settings-ui / Settings.UI.UnitTests / ViewModelTests / PowerLauncherViewModelTest.cs
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  }