From 5e13152c73c33dd0a663beca8104db8e3e16fd15 Mon Sep 17 00:00:00 2001 From: Nkateko <58791731+laviusmotileng-ms@users.noreply.github.com> Date: Tue, 18 Aug 2020 13:43:58 -0700 Subject: [PATCH] [Settings] Migrated Image Resizer Tests (#5765) * added MSTest project * Migrated Image Resizer Tests * fixed links * removed exception --- .../ViewModels/ImageResizerViewModel.cs | 90 +++---- .../ViewModelTests/ImageResizer.cs | 230 ++++++++++++++++++ .../Microsoft.PowerToys.Settings.UI.csproj | 1 - .../Views/ImageResizerPage.xaml | 46 ++-- .../Views/ImageResizerPage.xaml.cs | 33 ++- 5 files changed, 318 insertions(+), 82 deletions(-) rename src/core/{Microsoft.PowerToys.Settings.UI => Microsoft.PowerToys.Settings.UI.Lib}/ViewModels/ImageResizerViewModel.cs (79%) create mode 100644 src/core/Microsoft.PowerToys.Settings.UI.UnitTests/ViewModelTests/ImageResizer.cs diff --git a/src/core/Microsoft.PowerToys.Settings.UI/ViewModels/ImageResizerViewModel.cs b/src/core/Microsoft.PowerToys.Settings.UI.Lib/ViewModels/ImageResizerViewModel.cs similarity index 79% rename from src/core/Microsoft.PowerToys.Settings.UI/ViewModels/ImageResizerViewModel.cs rename to src/core/Microsoft.PowerToys.Settings.UI.Lib/ViewModels/ImageResizerViewModel.cs index 991347015e..6cbb187452 100644 --- a/src/core/Microsoft.PowerToys.Settings.UI/ViewModels/ImageResizerViewModel.cs +++ b/src/core/Microsoft.PowerToys.Settings.UI.Lib/ViewModels/ImageResizerViewModel.cs @@ -2,15 +2,17 @@ // 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; +using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Windows.Input; -using Microsoft.PowerToys.Settings.UI.Helpers; using Microsoft.PowerToys.Settings.UI.Lib; -using Microsoft.PowerToys.Settings.UI.Views; +using Microsoft.PowerToys.Settings.UI.Lib.Helpers; +using Microsoft.PowerToys.Settings.UI.Lib.ViewModels.Commands; -namespace Microsoft.PowerToys.Settings.UI.ViewModels +namespace Microsoft.PowerToys.Settings.UI.Lib.ViewModels { public class ImageResizerViewModel : Observable { @@ -18,7 +20,9 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels private const string ModuleName = "ImageResizer"; - public ImageResizerViewModel() + private Func SendConfigMSG { get; } + + public ImageResizerViewModel(Func ipcMSGCallBackFunc) { try { @@ -42,14 +46,17 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels SettingsUtils.SaveSettings(generalSettings.ToJsonString(), string.Empty); } - _isEnabled = generalSettings.Enabled.ImageResizer; - _advancedSizes = Settings.Properties.ImageresizerSizes.Value; - _jpegQualityLevel = Settings.Properties.ImageresizerJpegQualityLevel.Value; - _pngInterlaceOption = Settings.Properties.ImageresizerPngInterlaceOption.Value; - _tiffCompressOption = Settings.Properties.ImageresizerTiffCompressOption.Value; - _fileName = Settings.Properties.ImageresizerFileName.Value; - _keepDateModified = Settings.Properties.ImageresizerKeepDateModified.Value; - _encoderGuidId = GetEncoderIndex(Settings.Properties.ImageresizerFallbackEncoder.Value); + // set the callback functions value to hangle outgoing IPC message. + SendConfigMSG = ipcMSGCallBackFunc; + + this._isEnabled = generalSettings.Enabled.ImageResizer; + this._advancedSizes = Settings.Properties.ImageresizerSizes.Value; + this._jpegQualityLevel = Settings.Properties.ImageresizerJpegQualityLevel.Value; + this._pngInterlaceOption = Settings.Properties.ImageresizerPngInterlaceOption.Value; + this._tiffCompressOption = Settings.Properties.ImageresizerTiffCompressOption.Value; + this._fileName = Settings.Properties.ImageresizerFileName.Value; + this._keepDateModified = Settings.Properties.ImageresizerKeepDateModified.Value; + this._encoderGuidId = GetEncoderIndex(Settings.Properties.ImageresizerFallbackEncoder.Value); int i = 0; foreach (ImageSize size in _advancedSizes) @@ -84,7 +91,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels GeneralSettings generalSettings = SettingsUtils.GetSettings(string.Empty); generalSettings.Enabled.ImageResizer = value; OutGoingGeneralSettings snd = new OutGoingGeneralSettings(generalSettings); - ShellPage.DefaultSndMSGCallback(snd.ToString()); + SendConfigMSG(snd.ToString()); OnPropertyChanged("IsEnabled"); } } @@ -99,10 +106,8 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels set { - SettingsUtils.SaveSettings(Settings.Properties.ImageresizerSizes.ToJsonString(), ModuleName, "sizes.json"); + SavesImageSizes(value); _advancedSizes = value; - Settings.Properties.ImageresizerSizes = new ImageResizerSizes(value); - SettingsUtils.SaveSettings(Settings.ToJsonString(), ModuleName); OnPropertyChanged("Sizes"); } } @@ -219,30 +224,6 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels } } - public ICommand SaveSizesEventHandler - { - get - { - return new RelayCommand(SavesImageSizes); - } - } - - public ICommand DeleteImageSizeEventHandler - { - get - { - return new RelayCommand(DeleteImageSize); - } - } - - public ICommand AddImageSizeEventHandler - { - get - { - return new RelayCommand(AddRow); - } - } - public void AddRow() { ObservableCollection imageSizes = Sizes; @@ -250,27 +231,24 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels ImageSize newSize = new ImageSize(maxId + 1); newSize.PropertyChanged += Size_PropertyChanged; imageSizes.Add(newSize); - Sizes = imageSizes; - OnPropertyChanged("Sizes"); + _advancedSizes = imageSizes; + SavesImageSizes(imageSizes); } public void DeleteImageSize(int id) { - try - { - ImageSize size = Sizes.Where(x => x.Id == id).First(); - ObservableCollection imageSizes = Sizes; - imageSizes.Remove(size); - Sizes = imageSizes; - OnPropertyChanged("Sizes"); - } - catch - { - } + ImageSize size = _advancedSizes.Where(x => x.Id == id).First(); + ObservableCollection imageSizes = Sizes; + imageSizes.Remove(size); + + _advancedSizes = imageSizes; + SavesImageSizes(imageSizes); } - public void SavesImageSizes() + public void SavesImageSizes(ObservableCollection imageSizes) { + SettingsUtils.SaveSettings(Settings.Properties.ImageresizerSizes.ToJsonString(), ModuleName, "sizes.json"); + Settings.Properties.ImageresizerSizes = new ImageResizerSizes(imageSizes); SettingsUtils.SaveSettings(Settings.ToJsonString(), ModuleName); } @@ -361,8 +339,8 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels ImageSize modifiedSize = (ImageSize)sender; ObservableCollection imageSizes = Sizes; imageSizes.Where(x => x.Id == modifiedSize.Id).First().Update(modifiedSize); - Sizes = imageSizes; - OnPropertyChanged("Sizes"); + _advancedSizes = imageSizes; + SavesImageSizes(imageSizes); } } } diff --git a/src/core/Microsoft.PowerToys.Settings.UI.UnitTests/ViewModelTests/ImageResizer.cs b/src/core/Microsoft.PowerToys.Settings.UI.UnitTests/ViewModelTests/ImageResizer.cs new file mode 100644 index 0000000000..1e18d186ca --- /dev/null +++ b/src/core/Microsoft.PowerToys.Settings.UI.UnitTests/ViewModelTests/ImageResizer.cs @@ -0,0 +1,230 @@ +// Copyright (c) Microsoft Corporation +// 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; +using System.IO; +using System.Linq; +using System.Text.Json; +using Microsoft.PowerToys.Settings.UI.Lib; +using Microsoft.PowerToys.Settings.UI.Lib.ViewModels; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace ViewModelTests +{ + [TestClass] + public class ImageResizer + { + public const string Module = "ImageResizer"; + + [TestInitialize] + public void Setup() + { + // initialize creation of test settings file. + // Test base path: + // C:\Users\\AppData\Local\Packages\08e1807b-8b6d-4bfa-adc4-79c64aae8e78_9abkseg265h2m\LocalState\Microsoft\PowerToys\ + GeneralSettings generalSettings = new GeneralSettings(); + ImageResizerSettings imageResizer = new ImageResizerSettings(); + + SettingsUtils.SaveSettings(generalSettings.ToJsonString()); + SettingsUtils.SaveSettings(imageResizer.ToJsonString(), imageResizer.Name); + } + + [TestCleanup] + public void CleanUp() + { + // delete folder created. + string generalSettings_file_name = string.Empty; + if (SettingsUtils.SettingsFolderExists(generalSettings_file_name)) + { + DeleteFolder(generalSettings_file_name); + } + + if (SettingsUtils.SettingsFolderExists(Module)) + { + DeleteFolder(Module); + } + } + + public void DeleteFolder(string powertoy) + { + Directory.Delete(Path.Combine(SettingsUtils.LocalApplicationDataFolder(), $"Microsoft\\PowerToys\\{powertoy}"), true); + } + + [TestMethod] + public void IsEnabled_ShouldEnableModule_WhenSuccessful() + { + // Assert + Func SendMockIPCConfigMSG = msg => + { + OutGoingGeneralSettings snd = JsonSerializer.Deserialize(msg); + Assert.IsTrue(snd.GeneralSettings.Enabled.ImageResizer); + return 0; + }; + + // arrange + ImageResizerViewModel viewModel = new ImageResizerViewModel(SendMockIPCConfigMSG); + + // act + viewModel.IsEnabled = true; + } + + [TestMethod] + public void JPEGQualityLevel_ShouldSetValueToTen_WhenSuccessful() + { + // arrange + Func SendMockIPCConfigMSG = msg => { return 0; }; + ImageResizerViewModel viewModel = new ImageResizerViewModel(SendMockIPCConfigMSG); + + // act + viewModel.JPEGQualityLevel = 10; + + // Assert + viewModel = new ImageResizerViewModel(SendMockIPCConfigMSG); + Assert.AreEqual(10, viewModel.JPEGQualityLevel); + } + + [TestMethod] + public void PngInterlaceOption_ShouldSetValueToTen_WhenSuccessful() + { + // arrange + Func SendMockIPCConfigMSG = msg => { return 0; }; + ImageResizerViewModel viewModel = new ImageResizerViewModel(SendMockIPCConfigMSG); + + // act + viewModel.PngInterlaceOption = 10; + + // Assert + viewModel = new ImageResizerViewModel(SendMockIPCConfigMSG); + Assert.AreEqual(10, viewModel.PngInterlaceOption); + } + + [TestMethod] + public void TiffCompressOption_ShouldSetValueToTen_WhenSuccessful() + { + // arrange + Func SendMockIPCConfigMSG = msg => { return 0; }; + ImageResizerViewModel viewModel = new ImageResizerViewModel(SendMockIPCConfigMSG); + + // act + viewModel.TiffCompressOption = 10; + + // Assert + viewModel = new ImageResizerViewModel(SendMockIPCConfigMSG); + Assert.AreEqual(10, viewModel.TiffCompressOption); + } + + [TestMethod] + public void FileName_ShouldUpdateValue_WhenSuccessful() + { + // arrange + Func SendMockIPCConfigMSG = msg => { return 0; }; + ImageResizerViewModel viewModel = new ImageResizerViewModel(SendMockIPCConfigMSG); + string expectedValue = "%1 (%3)"; + + // act + viewModel.FileName = expectedValue; + + // Assert + viewModel = new ImageResizerViewModel(SendMockIPCConfigMSG); + Assert.AreEqual(expectedValue, viewModel.FileName); + } + + [TestMethod] + public void KeepDateModified_ShouldUpdateValue_WhenSuccessful() + { + // arrange + Func SendMockIPCConfigMSG = msg => { return 0; }; + ImageResizerViewModel viewModel = new ImageResizerViewModel(SendMockIPCConfigMSG); + + // act + viewModel.KeepDateModified = true; + + // Assert + ImageResizerSettings settings = SettingsUtils.GetSettings(Module); + Assert.AreEqual(true, settings.Properties.ImageresizerKeepDateModified.Value); + } + + [TestMethod] + public void Encoder_ShouldUpdateValue_WhenSuccessful() + { + // arrange + Func SendMockIPCConfigMSG = msg => { return 0; }; + ImageResizerViewModel viewModel = new ImageResizerViewModel(SendMockIPCConfigMSG); + + // act + viewModel.Encoder = 3; + + // Assert + viewModel = new ImageResizerViewModel(SendMockIPCConfigMSG); + Assert.AreEqual("163bcc30-e2e9-4f0b-961d-a3e9fdb788a3", viewModel.GetEncoderGuid(viewModel.Encoder)); + Assert.AreEqual(3, viewModel.Encoder); + } + + [TestMethod] + public void AddRow_ShouldAddEmptyImageSize_WhenSuccessful() + { + // arrange + Func SendMockIPCConfigMSG = msg => { return 0; }; + ImageResizerViewModel viewModel = new ImageResizerViewModel(SendMockIPCConfigMSG); + int sizeOfOriginalArray = viewModel.Sizes.Count; + + // act + viewModel.AddRow(); + + // Assert + Assert.AreEqual(viewModel.Sizes.Count, sizeOfOriginalArray + 1); + } + + [TestMethod] + public void DeleteImageSize_ShouldDeleteImageSize_WhenSuccessful() + { + // arrange + Func SendMockIPCConfigMSG = msg => { return 0; }; + ImageResizerViewModel viewModel = new ImageResizerViewModel(SendMockIPCConfigMSG); + int sizeOfOriginalArray = viewModel.Sizes.Count; + ImageSize deleteCandidate = viewModel.Sizes.Where(x => x.Id == 0).First(); + + // act + viewModel.DeleteImageSize(0); + + // Assert + Assert.AreEqual(viewModel.Sizes.Count, sizeOfOriginalArray - 1); + Assert.IsFalse(viewModel.Sizes.Contains(deleteCandidate)); + } + + [TestMethod] + public void UpdateWidthAndHeight_ShouldUpateSize_WhenCorrectValuesAreProvided() + { + // arrange + ImageSize imageSize = new ImageSize() + { + Id = 0, + Name = "Test", + Fit = (int)ResizeFit.Fit, + Width = 30, + Height = 30, + Unit = (int)ResizeUnit.Pixel, + }; + + double negativeWidth = -2.0; + double negativeHeight = -2.0; + + // Act + imageSize.Width = negativeWidth; + imageSize.Height = negativeHeight; + + // Assert + Assert.AreEqual(0, imageSize.Width); + Assert.AreEqual(0, imageSize.Height); + + // Act + imageSize.Width = 50; + imageSize.Height = 50; + + // Assert + Assert.AreEqual(50, imageSize.Width); + Assert.AreEqual(50, imageSize.Height); + } + } +} diff --git a/src/core/Microsoft.PowerToys.Settings.UI/Microsoft.PowerToys.Settings.UI.csproj b/src/core/Microsoft.PowerToys.Settings.UI/Microsoft.PowerToys.Settings.UI.csproj index 987f7aca4b..96610744e6 100644 --- a/src/core/Microsoft.PowerToys.Settings.UI/Microsoft.PowerToys.Settings.UI.csproj +++ b/src/core/Microsoft.PowerToys.Settings.UI/Microsoft.PowerToys.Settings.UI.csproj @@ -110,7 +110,6 @@ - diff --git a/src/core/Microsoft.PowerToys.Settings.UI/Views/ImageResizerPage.xaml b/src/core/Microsoft.PowerToys.Settings.UI/Views/ImageResizerPage.xaml index 79ac699671..b3919a7bc3 100644 --- a/src/core/Microsoft.PowerToys.Settings.UI/Views/ImageResizerPage.xaml +++ b/src/core/Microsoft.PowerToys.Settings.UI/Views/ImageResizerPage.xaml @@ -2,17 +2,17 @@ x:Class="Microsoft.PowerToys.Settings.UI.Views.ImageResizerPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:viewModel="using:Microsoft.PowerToys.Settings.UI.ViewModels" xmlns:CustomControls="using:Microsoft.PowerToys.Settings.UI.Controls" xmlns:models="using:Microsoft.PowerToys.Settings.UI.Lib" + xmlns:viewModels="using:Microsoft.PowerToys.Settings.UI.Lib.ViewModels" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:muxc="using:Microsoft.UI.Xaml.Controls" + xmlns:muxc="using:Microsoft.UI.Xaml.Controls" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> - + @@ -58,7 +58,7 @@ Foreground="{x:Bind Mode=OneWay, Path=ViewModel.IsEnabled, Converter={StaticResource ModuleEnabledToForegroundConverter}}"/> @@ -146,16 +146,17 @@ -