ShortcutGuide.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.IO.Abstractions;
  7  using System.Text.Json;
  8  
  9  using Microsoft.PowerToys.Settings.UI.Library;
 10  using Microsoft.PowerToys.Settings.UI.UnitTests.BackwardsCompatibility;
 11  using Microsoft.PowerToys.Settings.UI.UnitTests.Mocks;
 12  using Microsoft.PowerToys.Settings.UI.ViewModels;
 13  using Microsoft.VisualStudio.TestTools.UnitTesting;
 14  using Moq;
 15  
 16  namespace ViewModelTests
 17  {
 18      [TestClass]
 19      public class ShortcutGuide
 20      {
 21          public const string ShortCutGuideTestFolderName = "Test\\ShortCutGuide";
 22  
 23          /// <summary>
 24          /// Test if the original settings files were modified.
 25          /// </summary>
 26          [TestMethod]
 27          [DataRow("v0.18.2", "settings.json")]
 28          [DataRow("v0.19.2", "settings.json")]
 29          [DataRow("v0.20.1", "settings.json")]
 30          [DataRow("v0.21.1", "settings.json")]
 31          [DataRow("v0.22.0", "settings.json")]
 32          public void OriginalFilesModificationTest(string version, string fileName)
 33          {
 34              var settingPathMock = new Mock<SettingPath>();
 35              var mockIOProvider = BackCompatTestProperties.GetModuleIOProvider(version, ShortcutGuideSettings.ModuleName, fileName);
 36              var mockSettingsUtils = new SettingsUtils(mockIOProvider.Object, settingPathMock.Object);
 37              ShortcutGuideSettings originalSettings = mockSettingsUtils.GetSettingsOrDefault<ShortcutGuideSettings>(ShortcutGuideSettings.ModuleName);
 38  
 39              var mockGeneralIOProvider = BackCompatTestProperties.GetGeneralSettingsIOProvider(version);
 40              var mockGeneralSettingsUtils = new SettingsUtils(mockGeneralIOProvider.Object, settingPathMock.Object);
 41              GeneralSettings originalGeneralSettings = mockGeneralSettingsUtils.GetSettingsOrDefault<GeneralSettings>();
 42              var generalSettingsRepository = new BackCompatTestProperties.MockSettingsRepository<GeneralSettings>(mockGeneralSettingsUtils);
 43              var shortcutSettingsRepository = new BackCompatTestProperties.MockSettingsRepository<ShortcutGuideSettings>(mockSettingsUtils);
 44  
 45              // Initialise View Model with test Config files
 46              Func<string, int> sendMockIPCConfigMSG = msg => { return 0; };
 47              ShortcutGuideViewModel viewModel = new ShortcutGuideViewModel(mockSettingsUtils, generalSettingsRepository, shortcutSettingsRepository, sendMockIPCConfigMSG);
 48  
 49              // Verify that the old settings persisted
 50              Assert.AreEqual(originalGeneralSettings.Enabled.ShortcutGuide, viewModel.IsEnabled);
 51              Assert.AreEqual(originalSettings.Properties.OverlayOpacity.Value, viewModel.OverlayOpacity);
 52  
 53              // Verify that the stub file was used
 54              var expectedCallCount = 2;  // once via the view model, and once by the test (GetSettings<T>)
 55              BackCompatTestProperties.VerifyModuleIOProviderWasRead(mockIOProvider, ShortcutGuideSettings.ModuleName, expectedCallCount);
 56              BackCompatTestProperties.VerifyGeneralSettingsIOProviderWasRead(mockGeneralIOProvider, expectedCallCount);
 57          }
 58  
 59          private Mock<SettingsUtils> mockGeneralSettingsUtils;
 60  
 61          private Mock<SettingsUtils> mockShortcutGuideSettingsUtils;
 62  
 63          [TestInitialize]
 64          public void SetUpStubSettingUtils()
 65          {
 66              mockGeneralSettingsUtils = ISettingsUtilsMocks.GetStubSettingsUtils<GeneralSettings>();
 67              mockShortcutGuideSettingsUtils = ISettingsUtilsMocks.GetStubSettingsUtils<ShortcutGuideSettings>();
 68          }
 69  
 70          [TestMethod]
 71          public void IsEnabledShouldEnableModuleWhenSuccessful()
 72          {
 73              var settingsUtilsMock = new Mock<SettingsUtils>(new FileSystem(), null);
 74  
 75              // Assert
 76              // Initialize mock function of sending IPC message.
 77              Func<string, int> sendMockIPCConfigMSG = msg =>
 78              {
 79                  OutGoingGeneralSettings snd = JsonSerializer.Deserialize<OutGoingGeneralSettings>(msg);
 80                  Assert.IsTrue(snd.GeneralSettings.Enabled.ShortcutGuide);
 81                  return 0;
 82              };
 83  
 84              // Arrange
 85              ShortcutGuideViewModel viewModel = new ShortcutGuideViewModel(settingsUtilsMock.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<ShortcutGuideSettings>.GetInstance(mockShortcutGuideSettingsUtils.Object), sendMockIPCConfigMSG, ShortCutGuideTestFolderName);
 86  
 87              // Act
 88              viewModel.IsEnabled = true;
 89          }
 90  
 91          [TestMethod]
 92          public void ThemeIndexShouldSetThemeToDarkWhenSuccessful()
 93          {
 94              // Arrange
 95              var settingsUtilsMock = new Mock<SettingsUtils>(new FileSystem(), null);
 96              ShortcutGuideViewModel viewModel = new ShortcutGuideViewModel(settingsUtilsMock.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<ShortcutGuideSettings>.GetInstance(mockShortcutGuideSettingsUtils.Object), msg => { return 0; }, ShortCutGuideTestFolderName);
 97  
 98              // Initialize shortcut guide settings theme to 'system' to be in sync with shortcut_guide.h.
 99              Assert.AreEqual(2, viewModel.ThemeIndex);
100  
101              // Act
102              viewModel.ThemeIndex = 0;
103  
104              // Assert
105              Func<string, bool> isDark = s => JsonSerializer.Deserialize<ShortcutGuideSettings>(s).Properties.Theme.Value == "dark";
106              settingsUtilsMock.Verify(x => x.SaveSettings(It.Is<string>(y => isDark(y)), It.IsAny<string>(), It.IsAny<string>()), Times.Once);
107          }
108  
109          [TestMethod]
110          public void OverlayOpacityShouldSeOverlayOpacityToOneHundredWhenSuccessful()
111          {
112              // Arrange
113              var settingsUtilsMock = new Mock<SettingsUtils>(new FileSystem(), null);
114              ShortcutGuideViewModel viewModel = new ShortcutGuideViewModel(settingsUtilsMock.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<ShortcutGuideSettings>.GetInstance(mockShortcutGuideSettingsUtils.Object), msg => { return 0; }, ShortCutGuideTestFolderName);
115              Assert.AreEqual(90, viewModel.OverlayOpacity);
116  
117              // Act
118              viewModel.OverlayOpacity = 100;
119  
120              // Assert
121              Func<string, bool> equal100 = s => JsonSerializer.Deserialize<ShortcutGuideSettings>(s).Properties.OverlayOpacity.Value == 100;
122              settingsUtilsMock.Verify(x => x.SaveSettings(It.Is<string>(y => equal100(y)), It.IsAny<string>(), It.IsAny<string>()), Times.Once);
123          }
124      }
125  }