PowerLauncherSettings unit tests (#2276)

This commit is contained in:
Tomas Agustin Raies 2020-04-26 13:15:40 -07:00 committed by GitHub
parent ca7b6f139f
commit 7ec8d02c1f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 383 additions and 198 deletions

View File

@ -2,10 +2,14 @@
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System.Text.Json;
namespace Microsoft.PowerToys.Settings.UI.Lib
{
public class PowerLauncherSettings : BasePTModuleSettings
{
public const string POWERTOYNAME = "PowerLauncher";
public PowerLauncherProperties properties { get; set; }
public PowerLauncherSettings()
@ -14,5 +18,16 @@ namespace Microsoft.PowerToys.Settings.UI.Lib
version = "1";
name = "_unset_";
}
public virtual void Save()
{
// Save settings to file
var options = new JsonSerializerOptions
{
WriteIndented = true,
};
SettingsUtils.SaveSettings(JsonSerializer.Serialize(this, options), POWERTOYNAME);
}
}
}

View File

@ -12,19 +12,36 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
{
public class PowerLauncherViewModel : Observable
{
private const string POWERTOYNAME = "PowerLauncher";
private PowerLauncherSettings settings;
public delegate void SendCallback(PowerLauncherSettings settings);
private readonly SendCallback callback;
public PowerLauncherViewModel()
{
if (SettingsUtils.SettingsExists(POWERTOYNAME))
if (SettingsUtils.SettingsExists(PowerLauncherSettings.POWERTOYNAME))
{
settings = SettingsUtils.GetSettings<PowerLauncherSettings>(POWERTOYNAME);
settings = SettingsUtils.GetSettings<PowerLauncherSettings>(PowerLauncherSettings.POWERTOYNAME);
}
else
{
settings = new PowerLauncherSettings();
}
callback = (PowerLauncherSettings settings) =>
{
// Propagate changes to Power Launcher through IPC
var propertiesJson = JsonSerializer.Serialize(settings.properties);
ShellPage.DefaultSndMSGCallback(
string.Format("{{ \"{0}\": {1} }}", PowerLauncherSettings.POWERTOYNAME, JsonSerializer.Serialize(settings.properties)));
};
}
public PowerLauncherViewModel(PowerLauncherSettings settings, SendCallback callback)
{
this.settings = settings;
this.callback = callback;
}
private void UpdateSettings([CallerMemberName] string propertyName = null)
@ -32,17 +49,8 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
// Notify UI of property change
OnPropertyChanged(propertyName);
// Save settings to file
var options = new JsonSerializerOptions
{
WriteIndented = true,
};
SettingsUtils.SaveSettings(JsonSerializer.Serialize(settings, options), POWERTOYNAME);
// Propagate changes to Power Launcher through IPC
var propertiesJson = JsonSerializer.Serialize(settings.properties);
ShellPage.DefaultSndMSGCallback(
string.Format("{{ \"{0}\": {1} }}", POWERTOYNAME, JsonSerializer.Serialize(settings.properties)));
settings.Save();
callback(settings);
}
public bool EnablePowerLauncher

View File

@ -126,6 +126,7 @@
<Compile Include="UnitTestApp.xaml.cs">
<DependentUpon>UnitTestApp.xaml</DependentUpon>
</Compile>
<Compile Include="ViewModelTests\PowerLauncherViewModelTest.cs" />
<Compile Include="ViewModelTests\ShortcutGuideViewModelTest.cs" />
</ItemGroup>
<ItemGroup>

View File

@ -0,0 +1,159 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.PowerToys.Settings.UI.ViewModels;
using Microsoft.PowerToys.Settings.UI.Lib;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.Json;
namespace Microsoft.PowerToys.Settings.UnitTest.ViewModelTests
{
[TestClass]
public class PowerLauncherViewModelTest
{
class PowerLauncherSettingsMock : PowerLauncherSettings
{
public int TimesSaved { get; set; }
public override void Save()
{
TimesSaved++;
}
}
class SendCallbackMock
{
public int TimesSent { get; set; }
public void OnSend(PowerLauncherSettings settings)
{
TimesSent++;
}
}
private PowerLauncherViewModel viewModel;
private PowerLauncherSettingsMock mockSettings;
private SendCallbackMock sendCallbackMock;
[TestInitialize]
public void Initialize()
{
mockSettings = new PowerLauncherSettingsMock();
sendCallbackMock = new SendCallbackMock();
viewModel = new PowerLauncherViewModel(
mockSettings,
new PowerLauncherViewModel.SendCallback(sendCallbackMock.OnSend)
);
}
[TestMethod]
public void IsEnabled_ShouldEnableModule()
{
viewModel.EnablePowerLauncher = true;
Assert.AreEqual(sendCallbackMock.TimesSent, 1);
Assert.AreEqual(mockSettings.TimesSaved, 1);
Assert.IsTrue(mockSettings.properties.enable_powerlauncher == true);
}
[TestMethod]
public void SearchPreference_ShouldUpdatePreferences()
{
viewModel.SearchResultPreference = "SearchOptionsAreNotValidated";
viewModel.SearchTypePreference = "SearchOptionsAreNotValidated";
Assert.AreEqual(sendCallbackMock.TimesSent, 2);
Assert.AreEqual(mockSettings.TimesSaved, 2);
Assert.IsTrue(mockSettings.properties.search_result_preference == "SearchOptionsAreNotValidated");
Assert.IsTrue(mockSettings.properties.search_type_preference == "SearchOptionsAreNotValidated");
}
public void AssertHotkeySettings(HotkeySettings setting, bool win, bool ctrl, bool alt, bool shift, int code)
{
Assert.AreEqual(setting.Win, win);
Assert.AreEqual(setting.Ctrl, ctrl);
Assert.AreEqual(setting.Alt, alt);
Assert.AreEqual(setting.Shift, shift);
Assert.AreEqual(setting.Code, code);
}
[TestMethod]
public void Hotkeys_ShouldUpdateHotkeys()
{
var openPowerLauncher = new HotkeySettings();
openPowerLauncher.Win = true;
openPowerLauncher.Code = (int)Windows.System.VirtualKey.S;
var openFileLocation = new HotkeySettings();
openFileLocation.Ctrl = true;
openFileLocation.Code = (int)Windows.System.VirtualKey.A;
var openConsole = new HotkeySettings();
openConsole.Alt = true;
openConsole.Code = (int)Windows.System.VirtualKey.D;
var copyFileLocation = new HotkeySettings();
copyFileLocation.Shift = true;
copyFileLocation.Code = (int)Windows.System.VirtualKey.F;
viewModel.OpenPowerLauncher = openPowerLauncher;
viewModel.OpenFileLocation = openFileLocation;
viewModel.OpenConsole = openConsole;
viewModel.CopyPathLocation = copyFileLocation;
Assert.AreEqual(mockSettings.TimesSaved, 4);
Assert.AreEqual(sendCallbackMock.TimesSent, 4);
AssertHotkeySettings(
mockSettings.properties.open_powerlauncher,
true,
false,
false,
false,
(int)Windows.System.VirtualKey.S
);
AssertHotkeySettings(
mockSettings.properties.open_file_location,
false,
true,
false,
false,
(int)Windows.System.VirtualKey.A
);
AssertHotkeySettings(
mockSettings.properties.open_console,
false,
false,
true,
false,
(int)Windows.System.VirtualKey.D
);
AssertHotkeySettings(
mockSettings.properties.copy_path_location,
false,
false,
false,
true,
(int)Windows.System.VirtualKey.F
);
}
[TestMethod]
public void Override_ShouldUpdateOverrides()
{
viewModel.OverrideWinRKey = true;
viewModel.OverrideWinSKey = false;
Assert.AreEqual(sendCallbackMock.TimesSent, 1);
Assert.AreEqual(mockSettings.TimesSaved, 1);
Assert.IsTrue(mockSettings.properties.override_win_r_key);
Assert.IsFalse(mockSettings.properties.override_win_s_key);
}
}
}

View File

@ -52,6 +52,8 @@
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
<None Include="packages.config">
<Filter>Source Files</Filter>
</None>
</ItemGroup>
</Project>