FancyZones.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.Library.Interfaces;
 11  using Microsoft.PowerToys.Settings.UI.UnitTests.BackwardsCompatibility;
 12  using Microsoft.PowerToys.Settings.UI.UnitTests.Mocks;
 13  using Microsoft.PowerToys.Settings.UI.ViewModels;
 14  using Microsoft.VisualStudio.TestTools.UnitTesting;
 15  using Moq;
 16  
 17  namespace ViewModelTests
 18  {
 19      [TestClass]
 20      public class FancyZones
 21      {
 22          public const string FancyZonesTestFolderName = "Test\\FancyZones";
 23  
 24          /// <summary>
 25          /// Test if the original settings files were modified.
 26          /// </summary>
 27          [TestMethod]
 28          [DataRow("v0.18.2", "settings.json")]
 29          [DataRow("v0.19.2", "settings.json")]
 30          [DataRow("v0.20.1", "settings.json")]
 31          [DataRow("v0.21.1", "settings.json")]
 32          [DataRow("v0.22.0", "settings.json")]
 33          public void OriginalFilesModificationTest(string version, string fileName)
 34          {
 35              var settingPathMock = new Mock<SettingPath>();
 36  
 37              var fileMock = BackCompatTestProperties.GetModuleIOProvider(version, FancyZonesSettings.ModuleName, fileName);
 38              var mockSettingsUtils = new SettingsUtils(fileMock.Object, settingPathMock.Object);
 39              FancyZonesSettings originalSettings = mockSettingsUtils.GetSettingsOrDefault<FancyZonesSettings>(FancyZonesSettings.ModuleName);
 40  
 41              var mockGeneralIOProvider = BackCompatTestProperties.GetGeneralSettingsIOProvider(version);
 42              var mockGeneralSettingsUtils = new SettingsUtils(mockGeneralIOProvider.Object, settingPathMock.Object);
 43              GeneralSettings originalGeneralSettings = mockGeneralSettingsUtils.GetSettingsOrDefault<GeneralSettings>();
 44  
 45              var generalSettingsRepository = new BackCompatTestProperties.MockSettingsRepository<GeneralSettings>(mockGeneralSettingsUtils);
 46              var fancyZonesRepository = new BackCompatTestProperties.MockSettingsRepository<FancyZonesSettings>(mockSettingsUtils);
 47  
 48              // Initialise View Model with test Config files
 49              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils, generalSettingsRepository, fancyZonesRepository, ColorPickerIsEnabledByDefault_IPC);
 50  
 51              // Verify that the old settings persisted
 52              Assert.AreEqual(originalGeneralSettings.Enabled.FancyZones, viewModel.IsEnabled);
 53              Assert.AreEqual(originalSettings.Properties.FancyzonesAppLastZoneMoveWindows.Value, viewModel.AppLastZoneMoveWindows);
 54              Assert.AreEqual(originalSettings.Properties.FancyzonesBorderColor.Value, viewModel.ZoneBorderColor);
 55              Assert.AreEqual(originalSettings.Properties.FancyzonesDisplayOrWorkAreaChangeMoveWindows.Value, viewModel.DisplayOrWorkAreaChangeMoveWindows);
 56              Assert.AreEqual(originalSettings.Properties.FancyzonesEditorHotkey.Value.ToString(), viewModel.EditorHotkey.ToString());
 57              Assert.AreEqual(originalSettings.Properties.FancyzonesWindowSwitching.Value, viewModel.WindowSwitching);
 58              Assert.AreEqual(originalSettings.Properties.FancyzonesNextTabHotkey.Value.ToString(), viewModel.NextTabHotkey.ToString());
 59              Assert.AreEqual(originalSettings.Properties.FancyzonesPrevTabHotkey.Value.ToString(), viewModel.PrevTabHotkey.ToString());
 60              Assert.AreEqual(originalSettings.Properties.FancyzonesExcludedApps.Value, viewModel.ExcludedApps);
 61              Assert.AreEqual(originalSettings.Properties.FancyzonesHighlightOpacity.Value, viewModel.HighlightOpacity);
 62              Assert.AreEqual(originalSettings.Properties.FancyzonesInActiveColor.Value, viewModel.ZoneInActiveColor);
 63              Assert.AreEqual(originalSettings.Properties.FancyzonesMakeDraggedWindowTransparent.Value, viewModel.MakeDraggedWindowsTransparent);
 64              Assert.AreEqual(originalSettings.Properties.FancyzonesMouseSwitch.Value, viewModel.MouseSwitch);
 65              Assert.AreEqual(originalSettings.Properties.FancyzonesMoveWindowsAcrossMonitors.Value, viewModel.MoveWindowsAcrossMonitors);
 66              Assert.AreEqual(originalSettings.Properties.FancyzonesMoveWindowsBasedOnPosition.Value, viewModel.MoveWindowsBasedOnPosition);
 67              Assert.AreEqual(originalSettings.Properties.FancyzonesOpenWindowOnActiveMonitor.Value, viewModel.OpenWindowOnActiveMonitor);
 68              Assert.AreEqual(originalSettings.Properties.FancyzonesOverrideSnapHotkeys.Value, viewModel.OverrideSnapHotkeys);
 69              Assert.AreEqual(originalSettings.Properties.FancyzonesRestoreSize.Value, viewModel.RestoreSize);
 70              Assert.AreEqual(originalSettings.Properties.FancyzonesShiftDrag.Value, viewModel.ShiftDrag);
 71              Assert.AreEqual(originalSettings.Properties.FancyzonesShowOnAllMonitors.Value, viewModel.ShowOnAllMonitors);
 72              Assert.AreEqual(originalSettings.Properties.FancyzonesSpanZonesAcrossMonitors.Value, viewModel.SpanZonesAcrossMonitors);
 73              Assert.AreEqual(originalSettings.Properties.FancyzonesZoneHighlightColor.Value, viewModel.ZoneHighlightColor);
 74              Assert.AreEqual(originalSettings.Properties.FancyzonesZoneSetChangeMoveWindows.Value, viewModel.ZoneSetChangeMoveWindows);
 75              Assert.AreEqual(originalSettings.Properties.UseCursorposEditorStartupscreen.Value, viewModel.UseCursorPosEditorStartupScreen);
 76              Assert.AreEqual(originalSettings.Properties.FancyzonesAllowChildWindowSnap.Value, viewModel.AllowChildWindowSnap);
 77              Assert.AreEqual(originalSettings.Properties.FancyzonesDisableRoundCornersOnSnap.Value, viewModel.DisableRoundCornersOnWindowSnap);
 78  
 79              // Verify that the stub file was used
 80              var expectedCallCount = 2;  // once via the view model, and once by the test (GetSettings<T>)
 81              BackCompatTestProperties.VerifyModuleIOProviderWasRead(fileMock, FancyZonesSettings.ModuleName, expectedCallCount);
 82              BackCompatTestProperties.VerifyGeneralSettingsIOProviderWasRead(mockGeneralIOProvider, expectedCallCount);
 83          }
 84  
 85          private int ColorPickerIsEnabledByDefault_IPC(string msg)
 86          {
 87              OutGoingGeneralSettings snd = JsonSerializer.Deserialize<OutGoingGeneralSettings>(msg);
 88              Assert.IsTrue(snd.GeneralSettings.Enabled.ColorPicker);
 89              return 0;
 90          }
 91  
 92          private Mock<SettingsUtils> mockGeneralSettingsUtils;
 93  
 94          private Mock<SettingsUtils> mockFancyZonesSettingsUtils;
 95  
 96          private Func<string, int> sendMockIPCConfigMSG = msg => { return 0; };
 97  
 98          [TestInitialize]
 99          public void SetUpStubSettingUtils()
100          {
101              mockGeneralSettingsUtils = ISettingsUtilsMocks.GetStubSettingsUtils<GeneralSettings>();
102              mockFancyZonesSettingsUtils = ISettingsUtilsMocks.GetStubSettingsUtils<FancyZonesSettings>();
103          }
104  
105          [TestCleanup]
106          public void CleanUp()
107          {
108              // Reset singleton instances to prevent state pollution between tests
109              ResetSettingsRepository<GeneralSettings>();
110              ResetSettingsRepository<FancyZonesSettings>();
111          }
112  
113          private void ResetSettingsRepository<T>()
114              where T : class, ISettingsConfig, new()
115          {
116              var repositoryType = typeof(SettingsRepository<T>);
117              var field = repositoryType.GetField("settingsRepository", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
118              field?.SetValue(null, null);
119          }
120  
121          [TestMethod]
122          public void IsEnabledShouldDisableModuleWhenSuccessful()
123          {
124              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
125  
126              Func<string, int> sendMockIPCConfigMSG = msg =>
127              {
128                  OutGoingGeneralSettings snd = JsonSerializer.Deserialize<OutGoingGeneralSettings>(msg);
129                  Assert.IsFalse(snd.GeneralSettings.Enabled.FancyZones);
130                  return 0;
131              };
132  
133              // arrange
134              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
135              Assert.IsTrue(viewModel.IsEnabled); // check if the module is enabled.
136  
137              // act
138              viewModel.IsEnabled = false;
139          }
140  
141          [TestMethod]
142          public void ShiftDragShouldSetValue2FalseWhenSuccessful()
143          {
144              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
145  
146              // arrange
147              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
148              Assert.IsTrue(viewModel.ShiftDrag); // check if value was initialized to false.
149  
150              // act
151              viewModel.ShiftDrag = false;
152  
153              // assert
154              var expected = viewModel.ShiftDrag;
155              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesShiftDrag.Value;
156              Assert.AreEqual(expected, actual);
157          }
158  
159          [TestMethod]
160          public void OverrideSnapHotkeysShouldSetValue2TrueWhenSuccessful()
161          {
162              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
163  
164              // arrange
165              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
166              Assert.IsFalse(viewModel.OverrideSnapHotkeys); // check if value was initialized to false.
167  
168              // act
169              viewModel.OverrideSnapHotkeys = true;
170  
171              // assert
172              var expected = viewModel.OverrideSnapHotkeys;
173              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesOverrideSnapHotkeys.Value;
174              Assert.AreEqual(expected, actual);
175          }
176  
177          [TestMethod]
178          public void MoveWindowsAcrossMonitorsShouldSetValue2TrueWhenSuccessful()
179          {
180              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
181  
182              // arrange
183              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
184              Assert.IsFalse(viewModel.MoveWindowsAcrossMonitors); // check if value was initialized to false.
185  
186              // act
187              viewModel.MoveWindowsAcrossMonitors = true;
188  
189              // assert
190              var expected = viewModel.MoveWindowsAcrossMonitors;
191              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesMoveWindowsAcrossMonitors.Value;
192              Assert.AreEqual(expected, actual);
193          }
194  
195          [TestMethod]
196          public void MoveWindowsBasedOnPositionShouldSetValue2TrueWhenSuccessful()
197          {
198              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
199  
200              // arrange
201              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
202              Assert.IsFalse(viewModel.MoveWindowsBasedOnPosition); // check if value was initialized to false.
203              Assert.IsTrue(viewModel.MoveWindowsBasedOnZoneIndex); // check if value was initialized to true.
204  
205              // act
206              viewModel.MoveWindowsBasedOnPosition = true;
207  
208              // assert
209              var basedOnPositionExpected = viewModel.MoveWindowsBasedOnPosition;
210              var basedOnPositionActual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesMoveWindowsBasedOnPosition.Value;
211              Assert.AreEqual(basedOnPositionExpected, basedOnPositionActual);
212  
213              var basedOnZoneIndexExpected = viewModel.MoveWindowsBasedOnZoneIndex;
214              var basedOnZoneIndexActual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesMoveWindowsBasedOnPosition.Value;
215              Assert.AreNotEqual(basedOnZoneIndexExpected, basedOnZoneIndexActual);
216          }
217  
218          [TestMethod]
219          public void QuickLayoutSwitchShouldSetValue2FalseWhenSuccessful()
220          {
221              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
222  
223              // arrange
224              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
225              Assert.IsTrue(viewModel.QuickLayoutSwitch); // check if value was initialized to true.
226  
227              // act
228              viewModel.QuickLayoutSwitch = false;
229  
230              // assert
231              var expected = viewModel.QuickLayoutSwitch;
232              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesQuickLayoutSwitch.Value;
233              Assert.AreEqual(expected, actual);
234          }
235  
236          [TestMethod]
237          public void FlashZonesOnQuickSwitchShouldSetValue2FalseWhenSuccessful()
238          {
239              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
240  
241              // arrange
242              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
243              Assert.IsTrue(viewModel.FlashZonesOnQuickSwitch); // check if value was initialized to true.
244  
245              // act
246              viewModel.FlashZonesOnQuickSwitch = false;
247  
248              // assert
249              var expected = viewModel.FlashZonesOnQuickSwitch;
250              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesFlashZonesOnQuickSwitch.Value;
251              Assert.AreEqual(expected, actual);
252          }
253  
254          [TestMethod]
255          public void MakeDraggedWindowsTransparentShouldSetValue2TrueWhenSuccessful()
256          {
257              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
258  
259              // arrange
260              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
261              Assert.IsFalse(viewModel.MakeDraggedWindowsTransparent); // check if value was initialized to false.
262  
263              // act
264              viewModel.MakeDraggedWindowsTransparent = true;
265  
266              // assert
267              var expected = viewModel.MakeDraggedWindowsTransparent;
268              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesMakeDraggedWindowTransparent.Value;
269              Assert.AreEqual(expected, actual);
270          }
271  
272          [TestMethod]
273          public void MouseSwitchShouldSetValue2TrueWhenSuccessful()
274          {
275              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
276  
277              // arrange
278              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
279              Assert.IsFalse(viewModel.MouseSwitch); // check if value was initialized to false.
280  
281              // act
282              viewModel.MouseSwitch = true;
283  
284              // assert
285              var expected = viewModel.MouseSwitch;
286              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesMouseSwitch.Value;
287              Assert.AreEqual(expected, actual);
288          }
289  
290          [TestMethod]
291          public void DisplayOrWorkAreaChangeMoveWindowsShouldSetValue2FalseWhenSuccessful()
292          {
293              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
294  
295              // arrange
296              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
297              Assert.IsTrue(viewModel.DisplayOrWorkAreaChangeMoveWindows); // check if value was initialized to true.
298  
299              // act
300              viewModel.DisplayOrWorkAreaChangeMoveWindows = false;
301  
302              // assert
303              var expected = viewModel.DisplayOrWorkAreaChangeMoveWindows;
304              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesDisplayOrWorkAreaChangeMoveWindows.Value;
305              Assert.AreEqual(expected, actual);
306          }
307  
308          [TestMethod]
309          public void ZoneSetChangeMoveWindowsShouldSetValue2TrueWhenSuccessful()
310          {
311              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
312  
313              // arrange
314              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
315              Assert.IsFalse(viewModel.ZoneSetChangeMoveWindows); // check if value was initialized to false.
316  
317              // act
318              viewModel.ZoneSetChangeMoveWindows = true;
319  
320              // assert
321              var expected = viewModel.ZoneSetChangeMoveWindows;
322              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesZoneSetChangeMoveWindows.Value;
323              Assert.AreEqual(expected, actual);
324          }
325  
326          [TestMethod]
327          public void AppLastZoneMoveWindowsShouldSetValue2TrueWhenSuccessful()
328          {
329              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
330  
331              // arrange
332              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
333              Assert.IsFalse(viewModel.AppLastZoneMoveWindows); // check if value was initialized to false.
334  
335              // act
336              viewModel.AppLastZoneMoveWindows = true;
337  
338              // assert
339              var expected = viewModel.AppLastZoneMoveWindows;
340              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesAppLastZoneMoveWindows.Value;
341              Assert.AreEqual(expected, actual);
342          }
343  
344          [TestMethod]
345          public void OpenWindowOnActiveMonitorShouldSetValue2TrueWhenSuccessful()
346          {
347              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
348  
349              // arrange
350              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
351              Assert.IsFalse(viewModel.OpenWindowOnActiveMonitor); // check if value was initialized to false.
352  
353              // act
354              viewModel.OpenWindowOnActiveMonitor = true;
355  
356              // assert
357              var expected = viewModel.OpenWindowOnActiveMonitor;
358              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesOpenWindowOnActiveMonitor.Value;
359              Assert.AreEqual(expected, actual);
360          }
361  
362          [TestMethod]
363          public void RestoreSizeShouldSetValue2TrueWhenSuccessful()
364          {
365              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
366  
367              // arrange
368              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
369              Assert.IsFalse(viewModel.RestoreSize); // check if value was initialized to false.
370  
371              // act
372              viewModel.RestoreSize = true;
373  
374              // assert
375              var expected = viewModel.RestoreSize;
376              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesRestoreSize.Value;
377              Assert.AreEqual(expected, actual);
378          }
379  
380          [TestMethod]
381          public void UseCursorPosEditorStartupScreenShouldSetValue2FalseWhenSuccessful()
382          {
383              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
384  
385              // arrange
386              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
387              Assert.IsTrue(viewModel.UseCursorPosEditorStartupScreen); // check if value was initialized to false.
388  
389              // act
390              viewModel.UseCursorPosEditorStartupScreen = true;
391  
392              // assert
393              var expected = viewModel.UseCursorPosEditorStartupScreen;
394              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.UseCursorposEditorStartupscreen.Value;
395              Assert.AreEqual(expected, actual);
396          }
397  
398          [TestMethod]
399          public void ShowOnAllMonitorsShouldSetValue2TrueWhenSuccessful()
400          {
401              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
402  
403              // arrange
404              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
405              Assert.IsFalse(viewModel.ShowOnAllMonitors); // check if value was initialized to false.
406  
407              // act
408              viewModel.ShowOnAllMonitors = true;
409  
410              // assert
411              var expected = viewModel.ShowOnAllMonitors;
412              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesShowOnAllMonitors.Value;
413              Assert.AreEqual(expected, actual);
414          }
415  
416          [TestMethod]
417          public void SpanZonesAcrossMonitorsShouldSetValue2TrueWhenSuccessful()
418          {
419              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
420  
421              // arrange
422              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
423              Assert.IsFalse(viewModel.SpanZonesAcrossMonitors); // check if value was initialized to false.
424  
425              // act
426              viewModel.SpanZonesAcrossMonitors = true;
427  
428              // assert
429              var expected = viewModel.SpanZonesAcrossMonitors;
430              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesSpanZonesAcrossMonitors.Value;
431              Assert.AreEqual(expected, actual);
432          }
433  
434          [TestMethod]
435          public void OverlappingZonesAlgorithmIndexShouldSetValue2AnotherWhenSuccessful()
436          {
437              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
438  
439              // arrange
440              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
441              Assert.AreEqual(0, viewModel.OverlappingZonesAlgorithmIndex); // check if value was initialized to false.
442  
443              // act
444              viewModel.OverlappingZonesAlgorithmIndex = 1;
445  
446              // assert
447              var expected = viewModel.OverlappingZonesAlgorithmIndex;
448              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesOverlappingZonesAlgorithm.Value;
449              Assert.AreEqual(expected, actual);
450          }
451  
452          [TestMethod]
453          public void AllowChildWindowsToSnapShouldSetValue2TrueWhenSuccessful()
454          {
455              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
456  
457              // arrange
458              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
459              Assert.IsFalse(viewModel.AllowChildWindowSnap); // check if value was initialized to false.
460  
461              // act
462              viewModel.AllowChildWindowSnap = true;
463  
464              // assert
465              var expected = viewModel.AllowChildWindowSnap;
466              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesAllowChildWindowSnap.Value;
467              Assert.AreEqual(expected, actual);
468          }
469  
470          [TestMethod]
471          public void DisableRoundCornersOnSnapShouldSetValue2TrueWhenSuccessful()
472          {
473              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
474  
475              // arrange
476              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
477              Assert.IsFalse(viewModel.DisableRoundCornersOnWindowSnap); // check if value was initialized to false.
478  
479              // act
480              viewModel.DisableRoundCornersOnWindowSnap = true;
481  
482              // assert
483              var expected = viewModel.DisableRoundCornersOnWindowSnap;
484              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesDisableRoundCornersOnSnap.Value;
485              Assert.AreEqual(expected, actual);
486          }
487  
488          [TestMethod]
489          public void ZoneHighlightColorShouldSetColorValue2WhiteWhenSuccessful()
490          {
491              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
492  
493              // arrange
494              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
495              Assert.AreEqual(ConfigDefaults.DefaultFancyZonesZoneHighlightColor, viewModel.ZoneHighlightColor);
496  
497              // act
498              viewModel.ZoneHighlightColor = "#FFFFFF";
499  
500              // assert
501              var expected = viewModel.ZoneHighlightColor;
502              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesZoneHighlightColor.Value;
503              Assert.AreEqual(expected, actual);
504          }
505  
506          [TestMethod]
507          public void ZoneBorderColorShouldSetColorValue2WhiteWhenSuccessful()
508          {
509              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
510  
511              // arrange
512              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
513              Assert.AreEqual(ConfigDefaults.DefaultFancyzonesBorderColor, viewModel.ZoneBorderColor);
514  
515              // act
516              viewModel.ZoneBorderColor = "#FFFFFF";
517  
518              // assert
519              var expected = viewModel.ZoneBorderColor;
520              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesBorderColor.Value;
521              Assert.AreEqual(expected, actual);
522          }
523  
524          [TestMethod]
525          public void ZoneInActiveColorShouldSetColorValue2WhiteWhenSuccessful()
526          {
527              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
528  
529              // arrange
530              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
531              Assert.AreEqual(ConfigDefaults.DefaultFancyZonesInActiveColor, viewModel.ZoneInActiveColor);
532  
533              // act
534              viewModel.ZoneInActiveColor = "#FFFFFF";
535  
536              // assert
537              var expected = viewModel.ZoneInActiveColor;
538              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesInActiveColor.Value;
539              Assert.AreEqual(expected, actual);
540          }
541  
542          [TestMethod]
543          public void ExcludedAppsShouldSetColorValue2WhiteWhenSuccessful()
544          {
545              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
546  
547              // arrange
548              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
549              Assert.AreEqual(string.Empty, viewModel.ExcludedApps);
550  
551              // act
552              viewModel.ExcludedApps = "Sample";
553  
554              // assert
555              var expected = viewModel.ExcludedApps;
556              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesExcludedApps.Value;
557              Assert.AreEqual(expected, actual);
558          }
559  
560          [TestMethod]
561          public void HighlightOpacityShouldSetOpacityValueTo60WhenSuccessful()
562          {
563              Mock<SettingsUtils> mockSettingsUtils = new Mock<SettingsUtils>(new FileSystem(), null);
564  
565              // arrange
566              FancyZonesViewModel viewModel = new FancyZonesViewModel(mockSettingsUtils.Object, SettingsRepository<GeneralSettings>.GetInstance(mockGeneralSettingsUtils.Object), SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object), sendMockIPCConfigMSG, FancyZonesTestFolderName);
567              Assert.AreEqual(50, viewModel.HighlightOpacity);
568  
569              // act
570              viewModel.HighlightOpacity = 60;
571  
572              // assert
573              var expected = viewModel.HighlightOpacity;
574              var actual = SettingsRepository<FancyZonesSettings>.GetInstance(mockFancyZonesSettingsUtils.Object).SettingsConfig.Properties.FancyzonesHighlightOpacity.Value;
575              Assert.AreEqual(expected, actual);
576          }
577      }
578  }