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 }