PowerRename.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.Text.Json;
  7  
  8  using Microsoft.PowerToys.Settings.UI.Library;
  9  using Microsoft.PowerToys.Settings.UI.UnitTests.BackwardsCompatibility;
 10  using Microsoft.PowerToys.Settings.UI.UnitTests.Mocks;
 11  using Microsoft.PowerToys.Settings.UI.ViewModels;
 12  using Microsoft.VisualStudio.TestTools.UnitTesting;
 13  using Moq;
 14  
 15  namespace ViewModelTests
 16  {
 17      [TestClass]
 18      public class PowerRename
 19      {
 20          public const string GeneralSettingsFileName = "Test\\PowerRename";
 21  
 22          private Mock<SettingsUtils> mockGeneralSettingsUtils;
 23  
 24          private Mock<SettingsUtils> mockPowerRenamePropertiesUtils;
 25  
 26          [TestInitialize]
 27          public void SetUpStubSettingUtils()
 28          {
 29              mockGeneralSettingsUtils = ISettingsUtilsMocks.GetStubSettingsUtils<GeneralSettings>();
 30              mockPowerRenamePropertiesUtils = ISettingsUtilsMocks.GetStubSettingsUtils<PowerRenameLocalProperties>();
 31          }
 32  
 33          /// <summary>
 34          /// Test if the original settings files were modified.
 35          /// </summary>
 36          [TestMethod]
 37          [DataRow("v0.18.2", "power-rename-settings.json")]
 38          [DataRow("v0.19.2", "power-rename-settings.json")]
 39          [DataRow("v0.20.1", "power-rename-settings.json")]
 40          [DataRow("v0.22.0", "power-rename-settings.json")]
 41          public void OriginalFilesModificationTest(string version, string fileName)
 42          {
 43              var settingPathMock = new Mock<SettingPath>();
 44              var mockIOProvider = BackCompatTestProperties.GetModuleIOProvider(version, PowerRenameSettings.ModuleName, fileName);
 45  
 46              var mockSettingsUtils = new SettingsUtils(mockIOProvider.Object, settingPathMock.Object);
 47              PowerRenameLocalProperties originalSettings = mockSettingsUtils.GetSettingsOrDefault<PowerRenameLocalProperties>(PowerRenameSettings.ModuleName);
 48  
 49              var mockGeneralIOProvider = BackCompatTestProperties.GetGeneralSettingsIOProvider(version);
 50  
 51              var mockGeneralSettingsUtils = new SettingsUtils(mockGeneralIOProvider.Object, settingPathMock.Object);
 52              GeneralSettings originalGeneralSettings = mockGeneralSettingsUtils.GetSettingsOrDefault<GeneralSettings>();
 53              var generalSettingsRepository = new BackCompatTestProperties.MockSettingsRepository<GeneralSettings>(mockGeneralSettingsUtils);
 54  
 55              // Initialise View Model with test Config files
 56              Func<string, int> sendMockIPCConfigMSG = msg => { return 0; };
 57              PowerRenameViewModel viewModel = new PowerRenameViewModel(mockSettingsUtils, generalSettingsRepository, sendMockIPCConfigMSG);
 58  
 59              // Verify that the old settings persisted
 60              Assert.AreEqual(originalGeneralSettings.Enabled.PowerRename, viewModel.IsEnabled);
 61              Assert.AreEqual(originalSettings.ExtendedContextMenuOnly, viewModel.EnabledOnContextExtendedMenu);
 62              Assert.AreEqual(originalSettings.MRUEnabled, viewModel.MRUEnabled);
 63              Assert.AreEqual(originalSettings.ShowIcon, viewModel.EnabledOnContextMenu);
 64  
 65              // Verify that the stub file was used
 66              var expectedCallCount = 2;  // once via the view model, and once by the test (GetSettings<T>)
 67              BackCompatTestProperties.VerifyModuleIOProviderWasRead(mockIOProvider, PowerRenameSettings.ModuleName, expectedCallCount);
 68              BackCompatTestProperties.VerifyGeneralSettingsIOProviderWasRead(mockGeneralIOProvider, expectedCallCount);
 69          }
 70  
 71          [TestMethod]
 72          public void IsEnabledShouldEnableModuleWhenSuccessful()
 73          {
 74              // Assert
 75              Func<string, int> sendMockIPCConfigMSG = msg =>
 76              {
 77                  OutGoingGeneralSettings snd = JsonSerializer.Deserialize<OutGoingGeneralSettings>(msg);
 78                  Assert.IsTrue(snd.GeneralSettings.Enabled.PowerRename);
 79                  return 0;
 80              };
 81  
 82              // arrange
 83              PowerRenameViewModel viewModel = new PowerRenameViewModel(mockPowerRenamePropertiesUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), sendMockIPCConfigMSG, GeneralSettingsFileName);
 84  
 85              // act
 86              viewModel.IsEnabled = true;
 87          }
 88  
 89          [TestMethod]
 90          public void MRUEnabledShouldSetValue2TrueWhenSuccessful()
 91          {
 92              // Assert
 93              Func<string, int> sendMockIPCConfigMSG = msg =>
 94              {
 95                  PowerRenameSettingsIPCMessage snd = JsonSerializer.Deserialize<PowerRenameSettingsIPCMessage>(msg);
 96                  Assert.IsTrue(snd.Powertoys.PowerRename.Properties.MRUEnabled.Value);
 97                  return 0;
 98              };
 99  
100              // arrange
101              PowerRenameViewModel viewModel = new PowerRenameViewModel(mockPowerRenamePropertiesUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), sendMockIPCConfigMSG, GeneralSettingsFileName);
102  
103              // act
104              viewModel.MRUEnabled = true;
105          }
106  
107          [TestMethod]
108          public void WhenIsEnabledIsOffAndMRUEnabledIsOffGlobalAndMruShouldBeOff()
109          {
110              Func<string, int> sendMockIPCConfigMSG = msg => { return 0; };
111              PowerRenameViewModel viewModel = new PowerRenameViewModel(mockPowerRenamePropertiesUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), sendMockIPCConfigMSG, GeneralSettingsFileName);
112  
113              viewModel.IsEnabled = false;
114              viewModel.MRUEnabled = false;
115  
116              Assert.IsFalse(viewModel.GlobalAndMruEnabled);
117          }
118  
119          [TestMethod]
120          public void WhenIsEnabledIsOffAndMRUEnabledIsOnGlobalAndMruShouldBeOff()
121          {
122              Func<string, int> sendMockIPCConfigMSG = msg => { return 0; };
123              PowerRenameViewModel viewModel = new PowerRenameViewModel(mockPowerRenamePropertiesUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), sendMockIPCConfigMSG, GeneralSettingsFileName);
124  
125              viewModel.IsEnabled = false;
126              viewModel.MRUEnabled = true;
127  
128              Assert.IsFalse(viewModel.GlobalAndMruEnabled);
129          }
130  
131          [TestMethod]
132          public void WhenIsEnabledIsOnAndMRUEnabledIsOffGlobalAndMruShouldBeOff()
133          {
134              Func<string, int> sendMockIPCConfigMSG = msg => { return 0; };
135              PowerRenameViewModel viewModel = new PowerRenameViewModel(mockPowerRenamePropertiesUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), sendMockIPCConfigMSG, GeneralSettingsFileName);
136  
137              viewModel.IsEnabled = true;
138              viewModel.MRUEnabled = false;
139  
140              Assert.IsFalse(viewModel.GlobalAndMruEnabled);
141          }
142  
143          [TestMethod]
144          public void WhenIsEnabledIsOnAndMRUEnabledIsOnGlobalAndMruShouldBeOn()
145          {
146              Func<string, int> sendMockIPCConfigMSG = msg => { return 0; };
147              PowerRenameViewModel viewModel = new PowerRenameViewModel(mockPowerRenamePropertiesUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), sendMockIPCConfigMSG, GeneralSettingsFileName);
148  
149              viewModel.IsEnabled = true;
150              viewModel.MRUEnabled = true;
151  
152              Assert.IsTrue(viewModel.GlobalAndMruEnabled);
153          }
154  
155          [TestMethod]
156          public void EnabledOnContextMenuShouldSetValue2TrueWhenSuccessful()
157          {
158              // Assert
159              Func<string, int> sendMockIPCConfigMSG = msg =>
160              {
161                  PowerRenameSettingsIPCMessage snd = JsonSerializer.Deserialize<PowerRenameSettingsIPCMessage>(msg);
162                  Assert.IsTrue(snd.Powertoys.PowerRename.Properties.ShowIcon.Value);
163                  return 0;
164              };
165  
166              // arrange
167              PowerRenameViewModel viewModel = new PowerRenameViewModel(mockPowerRenamePropertiesUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), sendMockIPCConfigMSG, GeneralSettingsFileName);
168  
169              // act
170              viewModel.EnabledOnContextMenu = true;
171          }
172  
173          [TestMethod]
174          public void EnabledOnContextExtendedMenuShouldSetValue2TrueWhenSuccessful()
175          {
176              // Assert
177              Func<string, int> sendMockIPCConfigMSG = msg =>
178              {
179                  PowerRenameSettingsIPCMessage snd = JsonSerializer.Deserialize<PowerRenameSettingsIPCMessage>(msg);
180                  Assert.IsTrue(snd.Powertoys.PowerRename.Properties.ShowIcon.Value);
181                  return 0;
182              };
183  
184              // arrange
185              PowerRenameViewModel viewModel = new PowerRenameViewModel(mockPowerRenamePropertiesUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), sendMockIPCConfigMSG, GeneralSettingsFileName);
186  
187              // act
188              viewModel.EnabledOnContextMenu = true;
189          }
190  
191          [TestMethod]
192          public void RestoreFlagsOnLaunchShouldSetValue2TrueWhenSuccessful()
193          {
194              // Assert
195              Func<string, int> sendMockIPCConfigMSG = msg =>
196              {
197                  PowerRenameSettingsIPCMessage snd = JsonSerializer.Deserialize<PowerRenameSettingsIPCMessage>(msg);
198                  Assert.IsTrue(snd.Powertoys.PowerRename.Properties.PersistState.Value);
199                  return 0;
200              };
201  
202              // arrange
203              PowerRenameViewModel viewModel = new PowerRenameViewModel(mockPowerRenamePropertiesUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), sendMockIPCConfigMSG, GeneralSettingsFileName);
204  
205              // act
206              viewModel.RestoreFlagsOnLaunch = true;
207          }
208  
209          [TestMethod]
210          public void MaxDispListNumShouldSetMaxSuggListTo20WhenSuccessful()
211          {
212              // Assert
213              Func<string, int> sendMockIPCConfigMSG = msg =>
214              {
215                  PowerRenameSettingsIPCMessage snd = JsonSerializer.Deserialize<PowerRenameSettingsIPCMessage>(msg);
216                  Assert.AreEqual(20, snd.Powertoys.PowerRename.Properties.MaxMRUSize.Value);
217                  return 0;
218              };
219  
220              // arrange
221              PowerRenameViewModel viewModel = new PowerRenameViewModel(mockPowerRenamePropertiesUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), sendMockIPCConfigMSG, GeneralSettingsFileName);
222  
223              // act
224              viewModel.MaxDispListNum = 20;
225          }
226      }
227  }