diff --git a/src/modules/fancyzones/FancyZonesEditorCommon/Data/Constants.cs b/src/modules/fancyzones/FancyZonesEditorCommon/Data/Constants.cs deleted file mode 100644 index 1cd84026890a..000000000000 --- a/src/modules/fancyzones/FancyZonesEditorCommon/Data/Constants.cs +++ /dev/null @@ -1,35 +0,0 @@ -// 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.Collections.Generic; -using System.Collections.ObjectModel; - -namespace FancyZonesEditorCommon.Data -{ - public static class Constants - { - public enum TemplateLayout - { - Empty, - Focus, - Rows, - Columns, - Grid, - PriorityGrid, - } - - public static readonly ReadOnlyDictionary TemplateLayoutJsonTags = new ReadOnlyDictionary( - new Dictionary() - { - { TemplateLayout.Empty, "blank" }, - { TemplateLayout.Focus, "focus" }, - { TemplateLayout.Rows, "rows" }, - { TemplateLayout.Columns, "columns" }, - { TemplateLayout.Grid, "grid" }, - { TemplateLayout.PriorityGrid, "priority-grid" }, - }); - - public const string CustomLayoutJsonTag = "custom"; - } -} diff --git a/src/modules/fancyzones/FancyZonesEditorCommon/Data/CustomLayoutEnumExtension.cs b/src/modules/fancyzones/FancyZonesEditorCommon/Data/CustomLayoutEnumExtension.cs new file mode 100644 index 000000000000..4f158b3acaef --- /dev/null +++ b/src/modules/fancyzones/FancyZonesEditorCommon/Data/CustomLayoutEnumExtension.cs @@ -0,0 +1,44 @@ +// 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. + +namespace FancyZonesEditorCommon.Data +{ + public enum CustomLayout + { + Canvas, + Grid, + } + + public static class CustomLayoutEnumExtension + { + private const string CanvasJsonTag = "canvas"; + private const string GridJsonTag = "grid"; + + public static string TypeToString(this CustomLayout value) + { + switch (value) + { + case CustomLayout.Canvas: + return CanvasJsonTag; + case CustomLayout.Grid: + return GridJsonTag; + } + + return CanvasJsonTag; + } + + public static CustomLayout TypeFromString(string value) + { + switch (value) + { + case CanvasJsonTag: + return CustomLayout.Canvas; + case GridJsonTag: + return CustomLayout.Grid; + } + + return CustomLayout.Canvas; + } + } +} diff --git a/src/modules/fancyzones/FancyZonesEditorCommon/Data/LayoutTypeEnumExtension.cs b/src/modules/fancyzones/FancyZonesEditorCommon/Data/LayoutTypeEnumExtension.cs new file mode 100644 index 000000000000..7956e69ed4dd --- /dev/null +++ b/src/modules/fancyzones/FancyZonesEditorCommon/Data/LayoutTypeEnumExtension.cs @@ -0,0 +1,70 @@ +// 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. + +namespace FancyZonesEditorCommon.Data +{ + public enum LayoutType + { + Blank, + Focus, + Columns, + Rows, + Grid, + PriorityGrid, + Custom, + } + + public static class LayoutTypeEnumExtension + { + private const string BlankJsonTag = "blank"; + private const string FocusJsonTag = "focus"; + private const string RowsJsonTag = "rows"; + private const string ColumnsJsonTag = "columns"; + private const string GridJsonTag = "grid"; + private const string PriorityGridJsonTag = "priority-grid"; + private const string CustomLayoutJsonTag = "custom"; + + public static string TypeToString(this LayoutType value) + { + switch (value) + { + case LayoutType.Blank: + return BlankJsonTag; + case LayoutType.Focus: + return FocusJsonTag; + case LayoutType.Rows: + return RowsJsonTag; + case LayoutType.Columns: + return ColumnsJsonTag; + case LayoutType.Grid: + return GridJsonTag; + case LayoutType.PriorityGrid: + return PriorityGridJsonTag; + } + + return CustomLayoutJsonTag; + } + + public static LayoutType TypeFromString(string value) + { + switch (value) + { + case BlankJsonTag: + return LayoutType.Blank; + case FocusJsonTag: + return LayoutType.Focus; + case RowsJsonTag: + return LayoutType.Rows; + case ColumnsJsonTag: + return LayoutType.Columns; + case GridJsonTag: + return LayoutType.Grid; + case PriorityGridJsonTag: + return LayoutType.PriorityGrid; + } + + return LayoutType.Custom; + } + } +} diff --git a/src/modules/fancyzones/FancyZonesEditorCommon/Data/MonitorConfigurationTypeEnumExtensions.cs b/src/modules/fancyzones/FancyZonesEditorCommon/Data/MonitorConfigurationTypeEnumExtensions.cs new file mode 100644 index 000000000000..481321bdfd56 --- /dev/null +++ b/src/modules/fancyzones/FancyZonesEditorCommon/Data/MonitorConfigurationTypeEnumExtensions.cs @@ -0,0 +1,44 @@ +// 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. + +namespace FancyZonesEditorCommon.Data +{ + public enum MonitorConfigurationType + { + Horizontal = 0, + Vertical, + } + + public static class MonitorConfigurationTypeEnumExtensions + { + private const string HorizontalJsonTag = "horizontal"; + private const string VerticalJsonTag = "vertical"; + + public static string TypeToString(this MonitorConfigurationType value) + { + switch (value) + { + case MonitorConfigurationType.Horizontal: + return HorizontalJsonTag; + case MonitorConfigurationType.Vertical: + return VerticalJsonTag; + } + + return HorizontalJsonTag; + } + + public static MonitorConfigurationType TypeFromString(string value) + { + switch (value) + { + case HorizontalJsonTag: + return MonitorConfigurationType.Horizontal; + case VerticalJsonTag: + return MonitorConfigurationType.Vertical; + } + + return MonitorConfigurationType.Horizontal; + } + } +} diff --git a/src/modules/fancyzones/UITests-FancyZonesEditor/ApplyLayoutTests.cs b/src/modules/fancyzones/UITests-FancyZonesEditor/ApplyLayoutTests.cs new file mode 100644 index 000000000000..768ad421d452 --- /dev/null +++ b/src/modules/fancyzones/UITests-FancyZonesEditor/ApplyLayoutTests.cs @@ -0,0 +1,319 @@ +// 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.Collections.Generic; +using System.Globalization; +using FancyZonesEditorCommon.Data; +using Microsoft.FancyZonesEditor.UnitTests.Utils; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenQA.Selenium; +using static Microsoft.FancyZonesEditor.UnitTests.Utils.FancyZonesEditorSession; + +namespace Microsoft.FancyZonesEditor.UITests +{ + [TestClass] + public class ApplyLayoutTests + { + private static readonly EditorParameters.ParamsWrapper Parameters = new EditorParameters.ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new EditorParameters.NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 96, + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + new EditorParameters.NativeMonitorDataWrapper + { + Monitor = "monitor-2", + MonitorInstanceId = "instance-id-2", + MonitorSerialNumber = "serial-number-2", + MonitorNumber = 2, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 96, + LeftCoordinate = 1920, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = false, + }, + }, + }; + + private static readonly CustomLayouts.CustomLayoutListWrapper CustomLayoutsList = new CustomLayouts.CustomLayoutListWrapper + { + CustomLayouts = new List + { + new CustomLayouts.CustomLayoutWrapper + { + Uuid = "{E7807D0D-6223-4883-B15B-1F3883944C09}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Custom layout", + Info = new CustomLayouts().ToJsonElement(new CustomLayouts.CanvasInfoWrapper + { + RefHeight = 952, + RefWidth = 1500, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + }, + }; + + private static readonly LayoutTemplates.TemplateLayoutsListWrapper TemplateLayoutsList = new LayoutTemplates.TemplateLayoutsListWrapper + { + LayoutTemplates = new List + { + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Blank.TypeToString(), + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Focus.TypeToString(), + ZoneCount = 10, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Rows.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 10, + SensitivityRadius = 10, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Columns.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 20, + SensitivityRadius = 20, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Grid.TypeToString(), + ZoneCount = 4, + ShowSpacing = false, + Spacing = 10, + SensitivityRadius = 30, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.PriorityGrid.TypeToString(), + ZoneCount = 3, + ShowSpacing = true, + Spacing = 1, + SensitivityRadius = 40, + }, + }, + }; + + private static FancyZonesEditorSession? _session; + private static TestContext? _context; + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + _context = testContext; + } + + [ClassCleanup] + public static void ClassCleanup() + { + _context = null; + } + + [TestInitialize] + public void TestInitialize() + { + EditorParameters editorParameters = new EditorParameters(); + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(Parameters)); + + LayoutTemplates layoutTemplates = new LayoutTemplates(); + FancyZonesEditorSession.Files.LayoutTemplatesIOHelper.WriteData(layoutTemplates.Serialize(TemplateLayoutsList)); + + CustomLayouts customLayouts = new CustomLayouts(); + FancyZonesEditorSession.Files.CustomLayoutsIOHelper.WriteData(customLayouts.Serialize(CustomLayoutsList)); + + DefaultLayouts defaultLayouts = new DefaultLayouts(); + DefaultLayouts.DefaultLayoutsListWrapper defaultLayoutsListWrapper = new DefaultLayouts.DefaultLayoutsListWrapper + { + DefaultLayouts = new List + { + new DefaultLayouts.DefaultLayoutWrapper + { + MonitorConfiguration = MonitorConfigurationType.Horizontal.TypeToString(), + Layout = new DefaultLayouts.DefaultLayoutWrapper.LayoutWrapper + { + Type = LayoutType.Focus.TypeToString(), + ZoneCount = 4, + ShowSpacing = true, + Spacing = 5, + SensitivityRadius = 20, + }, + }, + new DefaultLayouts.DefaultLayoutWrapper + { + MonitorConfiguration = MonitorConfigurationType.Vertical.TypeToString(), + Layout = new DefaultLayouts.DefaultLayoutWrapper.LayoutWrapper + { + Type = LayoutType.Custom.TypeToString(), + Uuid = "{0D6D2F58-9184-4804-81E4-4E4CC3476DC1}", + ZoneCount = 0, + ShowSpacing = false, + Spacing = 0, + SensitivityRadius = 0, + }, + }, + }, + }; + FancyZonesEditorSession.Files.DefaultLayoutsIOHelper.WriteData(defaultLayouts.Serialize(defaultLayoutsListWrapper)); + + LayoutHotkeys layoutHotkeys = new LayoutHotkeys(); + LayoutHotkeys.LayoutHotkeysWrapper layoutHotkeysWrapper = new LayoutHotkeys.LayoutHotkeysWrapper + { + LayoutHotkeys = new List { }, + }; + FancyZonesEditorSession.Files.LayoutHotkeysIOHelper.WriteData(layoutHotkeys.Serialize(layoutHotkeysWrapper)); + + AppliedLayouts appliedLayouts = new AppliedLayouts(); + AppliedLayouts.AppliedLayoutsListWrapper appliedLayoutsWrapper = new AppliedLayouts.AppliedLayoutsListWrapper + { + AppliedLayouts = new List { }, + }; + FancyZonesEditorSession.Files.AppliedLayoutsIOHelper.WriteData(appliedLayouts.Serialize(appliedLayoutsWrapper)); + + _session = new FancyZonesEditorSession(_context!); + } + + [TestCleanup] + public void TestCleanup() + { + _session?.Close(); + FancyZonesEditorSession.Files.Restore(); + } + + [TestMethod] + public void ApplyCustomLayout() + { + var layout = CustomLayoutsList.CustomLayouts[0]; + Assert.IsFalse(_session?.GetLayout(layout.Name)!.Selected); + _session?.Click(_session?.GetLayout(layout.Name)!); + + Assert.IsTrue(_session?.GetLayout(layout.Name)!.Selected); + + AppliedLayouts appliedLayouts = new AppliedLayouts(); + var data = appliedLayouts.Read(appliedLayouts.File); + Assert.AreEqual(Parameters.Monitors.Count, data.AppliedLayouts.Count); + Assert.AreEqual(layout.Uuid, data.AppliedLayouts[0].AppliedLayout.Uuid); + Assert.AreEqual(Parameters.Monitors[0].MonitorNumber, data.AppliedLayouts[0].Device.MonitorNumber); + } + + [TestMethod] + public void ApplyTemplateLayout() + { + var layoutType = LayoutType.Columns; + var layout = TestConstants.TemplateLayoutNames[layoutType]; + Assert.IsFalse(_session?.GetLayout(layout)!.Selected); + _session?.Click(_session?.GetLayout(layout)!); + + Assert.IsTrue(_session?.GetLayout(layout)!.Selected); + + AppliedLayouts appliedLayouts = new AppliedLayouts(); + var data = appliedLayouts.Read(appliedLayouts.File); + Assert.AreEqual(Parameters.Monitors.Count, data.AppliedLayouts.Count); + Assert.AreEqual(layoutType.TypeToString(), data.AppliedLayouts[0].AppliedLayout.Type); + Assert.AreEqual(Parameters.Monitors[0].MonitorNumber, data.AppliedLayouts[0].Device.MonitorNumber); + } + + [TestMethod] + public void ApplyLayoutsOnEachMonitor() + { + // apply the layout on the first monitor + var firstLayoutType = LayoutType.Columns; + var firstLayoutName = TestConstants.TemplateLayoutNames[firstLayoutType]; + _session?.Click(_session?.GetLayout(firstLayoutName)!); + Assert.IsTrue(_session?.GetLayout(firstLayoutName)!.Selected); + + // apply the layout on the second monitor + _session?.ClickMonitor(2); + var secondLayout = CustomLayoutsList.CustomLayouts[0]; + _session?.Click(_session?.GetLayout(secondLayout.Name)!); + Assert.IsTrue(_session?.GetLayout(secondLayout.Name)!.Selected); + + // verify the layout on the first monitor wasn't changed + _session?.ClickMonitor(1); + Assert.IsTrue(_session?.GetLayout(firstLayoutName)!.Selected); + + // verify the file + var appliedLayouts = new AppliedLayouts(); + var data = appliedLayouts.Read(appliedLayouts.File); + Assert.AreEqual(Parameters.Monitors.Count, data.AppliedLayouts.Count); + Assert.AreEqual(firstLayoutType.TypeToString(), data.AppliedLayouts.Find(x => x.Device.MonitorNumber == 1).AppliedLayout.Type); + Assert.AreEqual(secondLayout.Uuid, data.AppliedLayouts.Find(x => x.Device.MonitorNumber == 2).AppliedLayout.Uuid); + } + + [TestMethod] + public void ApplyTemplateWithDifferentParametersOnEachMonitor() + { + var layoutType = LayoutType.Columns; + var layoutName = TestConstants.TemplateLayoutNames[layoutType]; + + // apply the layout on the first monitor, set parameters + _session?.Click(_session?.GetLayout(layoutName)!); + _session?.ClickEditLayout(layoutName); + var slider = _session?.FindByAccessibilityId(AccessibilityId.TemplateZoneSlider); + Assert.IsNotNull(slider); + slider.SendKeys(Keys.Right); + slider.SendKeys(Keys.Right); + var expectedFirstLayoutZoneCount = int.Parse(slider.Text!, CultureInfo.InvariantCulture); + _session?.Click(ElementName.Save); + _session?.WaitUntilHidden(slider); // let the dialog window close + + // apply the layout on the second monitor, set different parameters + _session?.ClickMonitor(2); + _session?.Click(_session?.GetLayout(layoutName)!); + _session?.ClickEditLayout(layoutName); + slider = _session?.FindByAccessibilityId(AccessibilityId.TemplateZoneSlider); + Assert.IsNotNull(slider); + slider.SendKeys(Keys.Left); + var expectedSecondLayoutZoneCount = int.Parse(slider.Text!, CultureInfo.InvariantCulture); + _session?.Click(ElementName.Save); + _session?.WaitUntilHidden(slider); // let the dialog window close + + // verify the layout on the first monitor wasn't changed + _session?.ClickMonitor(1); + _session?.ClickEditLayout(layoutName); + slider = _session?.FindByAccessibilityId(AccessibilityId.TemplateZoneSlider); + Assert.IsNotNull(slider); + Assert.AreEqual(expectedFirstLayoutZoneCount, int.Parse(slider.Text!, CultureInfo.InvariantCulture)); + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(slider); // let the dialog window close + + // check the file + var appliedLayouts = new AppliedLayouts(); + var data = appliedLayouts.Read(appliedLayouts.File); + Assert.AreEqual(Parameters.Monitors.Count, data.AppliedLayouts.Count); + Assert.AreEqual(layoutType.TypeToString(), data.AppliedLayouts.Find(x => x.Device.MonitorNumber == 1).AppliedLayout.Type); + Assert.AreEqual(expectedFirstLayoutZoneCount, data.AppliedLayouts.Find(x => x.Device.MonitorNumber == 1).AppliedLayout.ZoneCount); + Assert.AreEqual(layoutType.TypeToString(), data.AppliedLayouts.Find(x => x.Device.MonitorNumber == 2).AppliedLayout.Type); + Assert.AreEqual(expectedSecondLayoutZoneCount, data.AppliedLayouts.Find(x => x.Device.MonitorNumber == 2).AppliedLayout.ZoneCount); + } + } +} diff --git a/src/modules/fancyzones/UITests-FancyZonesEditor/CopyLayoutTests.cs b/src/modules/fancyzones/UITests-FancyZonesEditor/CopyLayoutTests.cs new file mode 100644 index 000000000000..68026517737c --- /dev/null +++ b/src/modules/fancyzones/UITests-FancyZonesEditor/CopyLayoutTests.cs @@ -0,0 +1,356 @@ +// 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.Collections.Generic; +using FancyZonesEditorCommon.Data; +using Microsoft.FancyZonesEditor.UnitTests.Utils; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using static FancyZonesEditorCommon.Data.EditorParameters; +using static Microsoft.FancyZonesEditor.UnitTests.Utils.FancyZonesEditorSession; + +namespace Microsoft.FancyZonesEditor.UITests +{ + [TestClass] + public class CopyLayoutTests + { + private static readonly CustomLayouts.CustomLayoutListWrapper CustomLayouts = new CustomLayouts.CustomLayoutListWrapper + { + CustomLayouts = new List + { + new CustomLayouts.CustomLayoutWrapper + { + Uuid = "{0D6D2F58-9184-4804-81E4-4E4CC3476DC1}", + Type = CustomLayout.Grid.TypeToString(), + Name = "Grid custom layout", + Info = new CustomLayouts().ToJsonElement(new CustomLayouts.GridInfoWrapper + { + Rows = 2, + Columns = 3, + RowsPercentage = new List { 2967, 7033 }, + ColumnsPercentage = new List { 2410, 6040, 1550 }, + CellChildMap = new int[][] { [0, 1, 1], [0, 2, 3] }, + SensitivityRadius = 30, + Spacing = 26, + ShowSpacing = false, + }), + }, + }, + }; + + private static readonly LayoutHotkeys.LayoutHotkeysWrapper Hotkeys = new LayoutHotkeys.LayoutHotkeysWrapper + { + LayoutHotkeys = new List + { + new LayoutHotkeys.LayoutHotkeyWrapper + { + LayoutId = CustomLayouts.CustomLayouts[0].Uuid, + Key = 0, + }, + }, + }; + + private static readonly DefaultLayouts.DefaultLayoutsListWrapper DefaultLayouts = new DefaultLayouts.DefaultLayoutsListWrapper + { + DefaultLayouts = new List + { + new DefaultLayouts.DefaultLayoutWrapper + { + MonitorConfiguration = MonitorConfigurationType.Vertical.TypeToString(), + Layout = new DefaultLayouts.DefaultLayoutWrapper.LayoutWrapper + { + Type = "custom", + Uuid = CustomLayouts.CustomLayouts[0].Uuid, + }, + }, + }, + }; + + private static TestContext? _context; + private static FancyZonesEditorSession? _session; + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + _context = testContext; + } + + [ClassCleanup] + public static void ClassCleanup() + { + _context = null; + } + + [TestInitialize] + public void TestInitialize() + { + EditorParameters editorParameters = new EditorParameters(); + ParamsWrapper parameters = new ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 192, + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + }, + }; + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); + + CustomLayouts customLayouts = new CustomLayouts(); + FancyZonesEditorSession.Files.CustomLayoutsIOHelper.WriteData(customLayouts.Serialize(CustomLayouts)); + + LayoutTemplates layoutTemplates = new LayoutTemplates(); + LayoutTemplates.TemplateLayoutsListWrapper templateLayoutsListWrapper = new LayoutTemplates.TemplateLayoutsListWrapper + { + LayoutTemplates = new List + { + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Blank.TypeToString(), + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Focus.TypeToString(), + ZoneCount = 10, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Rows.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 10, + SensitivityRadius = 10, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Columns.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 20, + SensitivityRadius = 20, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Grid.TypeToString(), + ZoneCount = 4, + ShowSpacing = false, + Spacing = 10, + SensitivityRadius = 30, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.PriorityGrid.TypeToString(), + ZoneCount = 3, + ShowSpacing = true, + Spacing = 1, + SensitivityRadius = 40, + }, + }, + }; + FancyZonesEditorSession.Files.LayoutTemplatesIOHelper.WriteData(layoutTemplates.Serialize(templateLayoutsListWrapper)); + + DefaultLayouts defaultLayouts = new DefaultLayouts(); + FancyZonesEditorSession.Files.DefaultLayoutsIOHelper.WriteData(defaultLayouts.Serialize(DefaultLayouts)); + + LayoutHotkeys layoutHotkeys = new LayoutHotkeys(); + FancyZonesEditorSession.Files.LayoutHotkeysIOHelper.WriteData(layoutHotkeys.Serialize(Hotkeys)); + + AppliedLayouts appliedLayouts = new AppliedLayouts(); + AppliedLayouts.AppliedLayoutsListWrapper appliedLayoutsWrapper = new AppliedLayouts.AppliedLayoutsListWrapper + { + AppliedLayouts = new List { }, + }; + FancyZonesEditorSession.Files.AppliedLayoutsIOHelper.WriteData(appliedLayouts.Serialize(appliedLayoutsWrapper)); + + _session = new FancyZonesEditorSession(_context!); + } + + [TestCleanup] + public void TestCleanup() + { + _session?.Close(); + FancyZonesEditorSession.Files.Restore(); + } + + [TestMethod] + public void CopyTemplate_FromEditLayoutWindow() + { + string copiedLayoutName = TestConstants.TemplateLayoutNames[LayoutType.Focus] + " (1)"; + _session?.ClickEditLayout(TestConstants.TemplateLayoutNames[LayoutType.Focus]); + _session?.ClickCopyLayout(); + + // verify the layout is copied + Assert.IsNotNull(_session?.GetLayout(copiedLayoutName)); // new name is presented + + // verify the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + Assert.AreEqual(CustomLayouts.CustomLayouts.Count + 1, data.CustomLayouts.Count); + Assert.IsTrue(data.CustomLayouts.Exists(x => x.Name == copiedLayoutName)); + } + + [TestMethod] + public void CopyTemplate_FromContextMenu() + { + string copiedLayoutName = TestConstants.TemplateLayoutNames[LayoutType.Rows] + " (1)"; + _session?.ClickContextMenuItem(TestConstants.TemplateLayoutNames[LayoutType.Rows], ElementName.CreateCustomLayout); + + // verify the layout is copied + _session?.WaitElementDisplayedByName(copiedLayoutName); + Assert.IsNotNull(_session?.GetLayout(copiedLayoutName)); // new name is presented + + // verify the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + Assert.AreEqual(CustomLayouts.CustomLayouts.Count + 1, data.CustomLayouts.Count); + Assert.IsTrue(data.CustomLayouts.Exists(x => x.Name == copiedLayoutName)); + } + + [TestMethod] + public void CopyTemplate_DefaultLayout() + { + string copiedLayoutName = TestConstants.TemplateLayoutNames[LayoutType.PriorityGrid] + " (1)"; + _session?.ClickEditLayout(TestConstants.TemplateLayoutNames[LayoutType.PriorityGrid]); + _session?.ClickCopyLayout(); + + // verify the layout is copied + Assert.IsNotNull(_session?.GetLayout(copiedLayoutName)); // new name is presented + + // verify the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + Assert.AreEqual(CustomLayouts.CustomLayouts.Count + 1, data.CustomLayouts.Count); + + // verify the default layout wasn't changed + _session?.ClickEditLayout(TestConstants.TemplateLayoutNames[LayoutType.PriorityGrid]); + var horizontalDefaultButton = _session?.GetHorizontalDefaultButton(true); + Assert.IsNotNull(horizontalDefaultButton); + _session?.Click(ElementName.Cancel); + + _session?.ClickEditLayout(copiedLayoutName); + horizontalDefaultButton = _session?.GetHorizontalDefaultButton(false); + Assert.IsNotNull(horizontalDefaultButton); + _session?.Click(ElementName.Cancel); + + // verify the default layouts file wasn't changed + var defaultLayouts = new DefaultLayouts(); + var defaultLayoutData = defaultLayouts.Read(defaultLayouts.File); + Assert.AreEqual(defaultLayouts.Serialize(DefaultLayouts), defaultLayouts.Serialize(defaultLayoutData)); + } + + [TestMethod] + public void CopyCustomLayout_FromEditLayoutWindow() + { + string copiedLayoutName = CustomLayouts.CustomLayouts[0].Name + " (1)"; + _session?.ClickEditLayout(CustomLayouts.CustomLayouts[0].Name); + _session?.ClickCopyLayout(); + + // verify the layout is copied + Assert.IsNotNull(_session?.GetLayout(copiedLayoutName)); // new name is presented + + // verify the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + Assert.AreEqual(CustomLayouts.CustomLayouts.Count + 1, data.CustomLayouts.Count); + Assert.IsTrue(data.CustomLayouts.Exists(x => x.Name == copiedLayoutName)); + } + + [TestMethod] + public void CopyCustomLayout_FromContextMenu() + { + string copiedLayoutName = CustomLayouts.CustomLayouts[0].Name + " (1)"; + _session?.ClickContextMenuItem(CustomLayouts.CustomLayouts[0].Name, ElementName.Duplicate); + + // verify the layout is copied + _session?.WaitElementDisplayedByName(copiedLayoutName); + Assert.IsNotNull(_session?.GetLayout(copiedLayoutName)); // new name is presented + + // verify the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + Assert.AreEqual(CustomLayouts.CustomLayouts.Count + 1, data.CustomLayouts.Count); + Assert.IsTrue(data.CustomLayouts.Exists(x => x.Name == copiedLayoutName)); + } + + [TestMethod] + public void CopyCustomLayout_DefaultLayout() + { + string copiedLayoutName = CustomLayouts.CustomLayouts[0].Name + " (1)"; + _session?.ClickEditLayout(CustomLayouts.CustomLayouts[0].Name); + _session?.ClickCopyLayout(); + + // verify the layout is copied + Assert.IsNotNull(_session?.GetLayout(copiedLayoutName)); // new name is presented + + // verify the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + Assert.AreEqual(CustomLayouts.CustomLayouts.Count + 1, data.CustomLayouts.Count); + + // verify the default layout wasn't changed + _session?.ClickEditLayout(CustomLayouts.CustomLayouts[0].Name); + var horizontalDefaultButton = _session?.GetVerticalDefaultButton(true); + Assert.IsNotNull(horizontalDefaultButton); + _session?.Click(ElementName.Cancel); + + _session?.ClickEditLayout(copiedLayoutName); + horizontalDefaultButton = _session?.GetVerticalDefaultButton(false); + Assert.IsNotNull(horizontalDefaultButton); + _session?.Click(ElementName.Cancel); + + // verify the default layouts file wasn't changed + var defaultLayouts = new DefaultLayouts(); + var defaultLayoutData = defaultLayouts.Read(defaultLayouts.File); + Assert.AreEqual(defaultLayouts.Serialize(DefaultLayouts), defaultLayouts.Serialize(defaultLayoutData)); + } + + [TestMethod] + public void CopyCustomLayout_Hotkey() + { + string copiedLayoutName = CustomLayouts.CustomLayouts[0].Name + " (1)"; + _session?.ClickEditLayout(CustomLayouts.CustomLayouts[0].Name); + _session?.ClickCopyLayout(); + + // verify the layout is copied + Assert.IsNotNull(_session?.GetLayout(copiedLayoutName)); // new name is presented + + // verify the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + Assert.AreEqual(CustomLayouts.CustomLayouts.Count + 1, data.CustomLayouts.Count); + + // verify the hotkey wasn't changed + _session?.ClickEditLayout(CustomLayouts.CustomLayouts[0].Name); + var hotkeyComboBox = _session?.FindByAccessibilityId(AccessibilityId.HotkeyComboBox); + Assert.IsNotNull(hotkeyComboBox); + Assert.AreEqual("0", hotkeyComboBox.Text); + _session?.Click(ElementName.Cancel); + + _session?.ClickEditLayout(copiedLayoutName); + hotkeyComboBox = _session?.FindByAccessibilityId(AccessibilityId.HotkeyComboBox); + Assert.IsNotNull(hotkeyComboBox); + Assert.AreEqual("None", hotkeyComboBox.Text); + _session?.Click(ElementName.Cancel); + + // verify the hotkey file wasn't changed + var hotkeys = new LayoutHotkeys(); + var hotkeyData = hotkeys.Read(hotkeys.File); + Assert.AreEqual(hotkeys.Serialize(Hotkeys), hotkeys.Serialize(hotkeyData)); + } + } +} diff --git a/src/modules/fancyzones/UITests-FancyZonesEditor/CreateLayoutTests.cs b/src/modules/fancyzones/UITests-FancyZonesEditor/CreateLayoutTests.cs new file mode 100644 index 000000000000..e7ed8e9ce8e3 --- /dev/null +++ b/src/modules/fancyzones/UITests-FancyZonesEditor/CreateLayoutTests.cs @@ -0,0 +1,252 @@ +// 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.Collections.Generic; +using FancyZonesEditorCommon.Data; +using Microsoft.FancyZonesEditor.UnitTests.Utils; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using static Microsoft.FancyZonesEditor.UnitTests.Utils.FancyZonesEditorSession; + +namespace Microsoft.FancyZonesEditor.UITests +{ + [TestClass] + public class CreateLayoutTests + { + private static FancyZonesEditorSession? _session; + private static TestContext? _context; + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + _context = testContext; + } + + [ClassCleanup] + public static void ClassCleanup() + { + _context = null; + } + + [TestInitialize] + public void TestInitialize() + { + // prepare test editor parameters with 2 monitors before launching the editor + EditorParameters editorParameters = new EditorParameters(); + EditorParameters.ParamsWrapper parameters = new EditorParameters.ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new EditorParameters.NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 96, + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + }, + }; + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); + + LayoutTemplates layoutTemplates = new LayoutTemplates(); + LayoutTemplates.TemplateLayoutsListWrapper templateLayoutsListWrapper = new LayoutTemplates.TemplateLayoutsListWrapper + { + LayoutTemplates = new List + { + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Blank.TypeToString(), + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Focus.TypeToString(), + ZoneCount = 10, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Rows.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 10, + SensitivityRadius = 10, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Columns.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 20, + SensitivityRadius = 20, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Grid.TypeToString(), + ZoneCount = 4, + ShowSpacing = false, + Spacing = 10, + SensitivityRadius = 30, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.PriorityGrid.TypeToString(), + ZoneCount = 3, + ShowSpacing = true, + Spacing = 1, + SensitivityRadius = 40, + }, + }, + }; + FancyZonesEditorSession.Files.LayoutTemplatesIOHelper.WriteData(layoutTemplates.Serialize(templateLayoutsListWrapper)); + + CustomLayouts customLayouts = new CustomLayouts(); + CustomLayouts.CustomLayoutListWrapper customLayoutListWrapper = new CustomLayouts.CustomLayoutListWrapper + { + CustomLayouts = new List { }, + }; + FancyZonesEditorSession.Files.CustomLayoutsIOHelper.WriteData(customLayouts.Serialize(customLayoutListWrapper)); + + DefaultLayouts defaultLayouts = new DefaultLayouts(); + DefaultLayouts.DefaultLayoutsListWrapper defaultLayoutsListWrapper = new DefaultLayouts.DefaultLayoutsListWrapper + { + DefaultLayouts = new List { }, + }; + FancyZonesEditorSession.Files.DefaultLayoutsIOHelper.WriteData(defaultLayouts.Serialize(defaultLayoutsListWrapper)); + + LayoutHotkeys layoutHotkeys = new LayoutHotkeys(); + LayoutHotkeys.LayoutHotkeysWrapper layoutHotkeysWrapper = new LayoutHotkeys.LayoutHotkeysWrapper + { + LayoutHotkeys = new List { }, + }; + FancyZonesEditorSession.Files.LayoutHotkeysIOHelper.WriteData(layoutHotkeys.Serialize(layoutHotkeysWrapper)); + + AppliedLayouts appliedLayouts = new AppliedLayouts(); + AppliedLayouts.AppliedLayoutsListWrapper appliedLayoutsWrapper = new AppliedLayouts.AppliedLayoutsListWrapper + { + AppliedLayouts = new List { }, + }; + FancyZonesEditorSession.Files.AppliedLayoutsIOHelper.WriteData(appliedLayouts.Serialize(appliedLayoutsWrapper)); + + _session = new FancyZonesEditorSession(_context!); + } + + [TestCleanup] + public void TestCleanup() + { + _session?.Close(); + FancyZonesEditorSession.Files.Restore(); + } + + [TestMethod] + public void CreateWithDefaultName() + { + string name = "Custom layout 1"; + _session?.Click(_session?.FindByAccessibilityId(AccessibilityId.NewLayoutButton)); + _session?.ClickConfirm(); + _session?.Click(ElementName.Save); + + // verify new layout presented + Assert.IsNotNull(_session?.GetLayout(name)); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + Assert.AreEqual(1, data.CustomLayouts.Count); + Assert.IsTrue(data.CustomLayouts.Exists(x => x.Name == name)); + } + + [TestMethod] + public void CreateWithCustomName() + { + string name = "Layout Name"; + _session?.Click(_session?.FindByAccessibilityId(AccessibilityId.NewLayoutButton)); + var input = _session?.FindByClassName(ClassName.TextBox); + Assert.IsNotNull(input); + input.Clear(); + input.SendKeys(name); + _session?.ClickConfirm(); + _session?.Click(ElementName.Save); + + // verify new layout presented + Assert.IsNotNull(_session?.GetLayout(name)); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + Assert.AreEqual(1, data.CustomLayouts.Count); + Assert.IsTrue(data.CustomLayouts.Exists(x => x.Name == name)); + } + + [TestMethod] + public void CreateGrid() + { + CustomLayout type = CustomLayout.Grid; + _session?.Click(_session?.FindByAccessibilityId(AccessibilityId.NewLayoutButton)); + _session?.SelectNewLayoutType(type); + _session?.ClickConfirm(); + _session?.Click(ElementName.Save); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + Assert.AreEqual(1, data.CustomLayouts.Count); + Assert.IsTrue(data.CustomLayouts.Exists(x => x.Type == type.TypeToString())); + } + + [TestMethod] + public void CreateCanvas() + { + CustomLayout type = CustomLayout.Canvas; + _session?.Click(_session?.FindByAccessibilityId(AccessibilityId.NewLayoutButton)); + _session?.SelectNewLayoutType(type); + _session?.ClickConfirm(); + _session?.Click(ElementName.Save); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + Assert.AreEqual(1, data.CustomLayouts.Count); + Assert.IsTrue(data.CustomLayouts.Exists(x => x.Type == type.TypeToString())); + } + + [TestMethod] + public void CancelGridCreation() + { + CustomLayout type = CustomLayout.Grid; + _session?.Click(_session?.FindByAccessibilityId(AccessibilityId.NewLayoutButton)); + _session?.SelectNewLayoutType(type); + _session?.ClickConfirm(); + _session?.Click(ElementName.Cancel); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + Assert.AreEqual(0, data.CustomLayouts.Count); + } + + [TestMethod] + public void CancelCanvasCreation() + { + CustomLayout type = CustomLayout.Canvas; + _session?.Click(_session?.FindByAccessibilityId(AccessibilityId.NewLayoutButton)); + _session?.SelectNewLayoutType(type); + _session?.ClickConfirm(); + _session?.Click(ElementName.Cancel); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + Assert.AreEqual(0, data.CustomLayouts.Count); + } + } +} diff --git a/src/modules/fancyzones/UITests-FancyZonesEditor/CustomLayoutsTests.cs b/src/modules/fancyzones/UITests-FancyZonesEditor/CustomLayoutsTests.cs new file mode 100644 index 000000000000..93dad7e499d6 --- /dev/null +++ b/src/modules/fancyzones/UITests-FancyZonesEditor/CustomLayoutsTests.cs @@ -0,0 +1,468 @@ +// 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.Collections.Generic; +using FancyZonesEditorCommon.Data; +using Microsoft.FancyZonesEditor.UnitTests.Utils; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenQA.Selenium; +using static FancyZonesEditorCommon.Data.CustomLayouts; +using static FancyZonesEditorCommon.Data.EditorParameters; +using static Microsoft.FancyZonesEditor.UnitTests.Utils.FancyZonesEditorSession; + +namespace Microsoft.FancyZonesEditor.UITests +{ + [TestClass] + public class CustomLayoutsTests + { + private static readonly CustomLayoutListWrapper Layouts = new CustomLayoutListWrapper + { + CustomLayouts = new List + { + new CustomLayoutWrapper + { + Uuid = "{0D6D2F58-9184-4804-81E4-4E4CC3476DC1}", + Type = CustomLayout.Grid.TypeToString(), + Name = "Grid custom layout", + Info = new CustomLayouts().ToJsonElement(new GridInfoWrapper + { + Rows = 2, + Columns = 3, + RowsPercentage = new List { 2967, 7033 }, + ColumnsPercentage = new List { 2410, 6040, 1550 }, + CellChildMap = new int[][] { [0, 1, 1], [0, 2, 3] }, + SensitivityRadius = 30, + Spacing = 26, + ShowSpacing = false, + }), + }, + new CustomLayoutWrapper + { + Uuid = "{E7807D0D-6223-4883-B15B-1F3883944C09}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Canvas custom layout", + Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper + { + RefHeight = 952, + RefWidth = 1500, + SensitivityRadius = 10, + Zones = new List + { + new CanvasInfoWrapper.CanvasZoneWrapper + { + X = 0, + Y = 0, + Width = 900, + Height = 522, + }, + new CanvasInfoWrapper.CanvasZoneWrapper + { + X = 900, + Y = 0, + Width = 600, + Height = 750, + }, + new CanvasInfoWrapper.CanvasZoneWrapper + { + X = 0, + Y = 522, + Width = 1500, + Height = 430, + }, + }, + }), + }, + new CustomLayoutWrapper + { + Uuid = "{F1A94F38-82B6-4876-A653-70D0E882DE2A}", + Type = CustomLayout.Grid.TypeToString(), + Name = "Grid custom layout spacing enabled", + Info = new CustomLayouts().ToJsonElement(new GridInfoWrapper + { + Rows = 2, + Columns = 3, + RowsPercentage = new List { 2967, 7033 }, + ColumnsPercentage = new List { 2410, 6040, 1550 }, + CellChildMap = new int[][] { [0, 1, 1], [0, 2, 3] }, + SensitivityRadius = 30, + Spacing = 10, + ShowSpacing = true, + }), + }, + }, + }; + + private static TestContext? _context; + private static FancyZonesEditorSession? _session; + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + _context = testContext; + } + + [ClassCleanup] + public static void ClassCleanup() + { + _context = null; + } + + [TestInitialize] + public void TestInitialize() + { + CustomLayouts customLayouts = new CustomLayouts(); + FancyZonesEditorSession.Files.CustomLayoutsIOHelper.WriteData(customLayouts.Serialize(Layouts)); + + EditorParameters editorParameters = new EditorParameters(); + ParamsWrapper parameters = new ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 192, + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + }, + }; + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); + + LayoutTemplates layoutTemplates = new LayoutTemplates(); + LayoutTemplates.TemplateLayoutsListWrapper templateLayoutsListWrapper = new LayoutTemplates.TemplateLayoutsListWrapper + { + LayoutTemplates = new List + { + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Blank.TypeToString(), + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Focus.TypeToString(), + ZoneCount = 10, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Rows.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 10, + SensitivityRadius = 10, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Columns.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 20, + SensitivityRadius = 20, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Grid.TypeToString(), + ZoneCount = 4, + ShowSpacing = false, + Spacing = 10, + SensitivityRadius = 30, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.PriorityGrid.TypeToString(), + ZoneCount = 3, + ShowSpacing = true, + Spacing = 1, + SensitivityRadius = 40, + }, + }, + }; + FancyZonesEditorSession.Files.LayoutTemplatesIOHelper.WriteData(layoutTemplates.Serialize(templateLayoutsListWrapper)); + + DefaultLayouts defaultLayouts = new DefaultLayouts(); + DefaultLayouts.DefaultLayoutsListWrapper defaultLayoutsListWrapper = new DefaultLayouts.DefaultLayoutsListWrapper + { + DefaultLayouts = new List { }, + }; + FancyZonesEditorSession.Files.DefaultLayoutsIOHelper.WriteData(defaultLayouts.Serialize(defaultLayoutsListWrapper)); + + LayoutHotkeys layoutHotkeys = new LayoutHotkeys(); + LayoutHotkeys.LayoutHotkeysWrapper layoutHotkeysWrapper = new LayoutHotkeys.LayoutHotkeysWrapper + { + LayoutHotkeys = new List { }, + }; + FancyZonesEditorSession.Files.LayoutHotkeysIOHelper.WriteData(layoutHotkeys.Serialize(layoutHotkeysWrapper)); + + AppliedLayouts appliedLayouts = new AppliedLayouts(); + AppliedLayouts.AppliedLayoutsListWrapper appliedLayoutsWrapper = new AppliedLayouts.AppliedLayoutsListWrapper + { + AppliedLayouts = new List { }, + }; + FancyZonesEditorSession.Files.AppliedLayoutsIOHelper.WriteData(appliedLayouts.Serialize(appliedLayoutsWrapper)); + + _session = new FancyZonesEditorSession(_context!); + } + + [TestCleanup] + public void TestCleanup() + { + _session?.Close(); + FancyZonesEditorSession.Files.Restore(); + } + + [TestMethod] + public void Name_Initialize() + { + // verify all custom layouts are presented + foreach (var layout in Layouts.CustomLayouts) + { + Assert.IsNotNull(_session?.GetLayout(layout.Name)); + } + } + + [TestMethod] + public void Rename_Save() + { + string newName = "New layout name"; + var oldName = Layouts.CustomLayouts[0].Name; + + // rename the layout + _session?.ClickEditLayout(oldName); + var input = _session?.FindByClassName(ClassName.TextBox); + Assert.IsNotNull(input); + input.Clear(); + input.SendKeys(newName); + + // verify new name + _session?.Click(ElementName.Save); + Assert.IsNull(_session?.GetLayout(oldName)); // previous name isn't presented + Assert.IsNotNull(_session?.GetLayout(newName)); // new name is presented + } + + [TestMethod] + public void Rename_Cancel() + { + string newName = "New layout name"; + var oldName = Layouts.CustomLayouts[0].Name; + + // rename the layout + _session?.ClickEditLayout(oldName); + var input = _session?.FindByClassName(ClassName.TextBox); + Assert.IsNotNull(input); + input.Clear(); + input.SendKeys(newName); + + // verify new name + _session?.Click(ElementName.Cancel); + Assert.IsNotNull(_session?.GetLayout(oldName)); + Assert.IsNull(_session?.GetLayout(newName)); + } + + [TestMethod] + public void HighlightDistance_Initialize() + { + foreach (var layout in Layouts.CustomLayouts) + { + _session?.ClickEditLayout(layout.Name); + + var slider = _session?.FindByAccessibilityId(AccessibilityId.SensitivitySlider); + Assert.IsNotNull(slider); + var expected = layout.Type == CustomLayout.Canvas.TypeToString() ? + new CustomLayouts().CanvasFromJsonElement(layout.Info.GetRawText()).SensitivityRadius : + new CustomLayouts().GridFromJsonElement(layout.Info.GetRawText()).SensitivityRadius; + Assert.AreEqual($"{expected}", slider.Text); + + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(slider); + } + } + + [TestMethod] + public void HighlightDistance_Save() + { + var layout = Layouts.CustomLayouts[0]; + var type = layout.Type; + _session?.ClickEditLayout(layout.Name); + + var slider = _session?.FindByAccessibilityId(AccessibilityId.SensitivitySlider); + Assert.IsNotNull(slider); + slider.SendKeys(Keys.Right); + + var value = type == CustomLayout.Canvas.TypeToString() ? + new CustomLayouts().CanvasFromJsonElement(layout.Info.GetRawText()).SensitivityRadius : + new CustomLayouts().GridFromJsonElement(layout.Info.GetRawText()).SensitivityRadius; + var expected = value + 1; // one step right + + Assert.AreEqual($"{expected}", slider.Text); + + _session?.Click(ElementName.Save); + _session?.WaitUntilHidden(slider); // let the dialog window close + + // verify the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var actual = type == CustomLayout.Canvas.TypeToString() ? + new CustomLayouts().CanvasFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == layout.Uuid).Info.GetRawText()).SensitivityRadius : + new CustomLayouts().GridFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == layout.Uuid).Info.GetRawText()).SensitivityRadius; + Assert.AreEqual(expected, actual); + } + + [TestMethod] + public void HighlightDistance_Cancel() + { + var layout = Layouts.CustomLayouts[0]; + var type = layout.Type; + _session?.ClickEditLayout(layout.Name); + + var slider = _session?.FindByAccessibilityId(AccessibilityId.SensitivitySlider); + Assert.IsNotNull(slider); + slider.SendKeys(Keys.Right); + + var expected = type == CustomLayout.Canvas.TypeToString() ? + new CustomLayouts().CanvasFromJsonElement(layout.Info.GetRawText()).SensitivityRadius : + new CustomLayouts().GridFromJsonElement(layout.Info.GetRawText()).SensitivityRadius; + + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(slider); // let the dialog window close + + // verify the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var actual = type == CustomLayout.Canvas.TypeToString() ? + new CustomLayouts().CanvasFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == layout.Uuid).Info.GetRawText()).SensitivityRadius : + new CustomLayouts().GridFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == layout.Uuid).Info.GetRawText()).SensitivityRadius; + Assert.AreEqual(expected, actual); + } + + [TestMethod] + public void SpaceAroundZones_Initialize() + { + foreach (var layout in Layouts.CustomLayouts) + { + if (layout.Type != CustomLayout.Grid.TypeToString()) + { + // only for grid layouts + continue; + } + + _session?.ClickEditLayout(layout.Name); + + var toggle = _session?.FindByAccessibilityId(AccessibilityId.SpacingToggle); + Assert.IsNotNull(toggle); + var slider = _session?.FindByAccessibilityId(AccessibilityId.SpacingSlider); + Assert.IsNotNull(slider); + + var spacingEnabled = new CustomLayouts().GridFromJsonElement(layout.Info.GetRawText()).ShowSpacing; + Assert.AreEqual(spacingEnabled, slider.Enabled); + Assert.AreEqual(spacingEnabled, toggle.Selected); + + var expected = new CustomLayouts().GridFromJsonElement(layout.Info.GetRawText()).Spacing; + Assert.AreEqual($"{expected}", slider.Text); + + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(slider); // let the dialog window close + } + } + + [TestMethod] + public void SpaceAroundZones_Slider_Save() + { + var layout = Layouts.CustomLayouts.Find(x => x.Type == CustomLayout.Grid.TypeToString() && new CustomLayouts().GridFromJsonElement(x.Info.GetRawText()).ShowSpacing); + var expected = new CustomLayouts().GridFromJsonElement(layout.Info.GetRawText()).Spacing + 1; // one step right + _session?.ClickEditLayout(layout.Name); + + var slider = _session?.FindByAccessibilityId(AccessibilityId.SpacingSlider); + Assert.IsNotNull(slider); + slider.SendKeys(Keys.Right); + Assert.AreEqual($"{expected}", slider.Text); + + _session?.Click(ElementName.Save); + _session?.WaitUntilHidden(slider); // let the dialog window close + + // verify the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var actual = new CustomLayouts().GridFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == layout.Uuid).Info.GetRawText()).Spacing; + Assert.AreEqual(expected, actual); + } + + [TestMethod] + public void SpaceAroundZones_Slider_Cancel() + { + var layout = Layouts.CustomLayouts.Find(x => x.Type == CustomLayout.Grid.TypeToString() && new CustomLayouts().GridFromJsonElement(x.Info.GetRawText()).ShowSpacing); + _session?.ClickEditLayout(layout.Name); + var expected = new CustomLayouts().GridFromJsonElement(layout.Info.GetRawText()).Spacing; + + var slider = _session?.FindByAccessibilityId(AccessibilityId.SpacingSlider); + Assert.IsNotNull(slider); + slider.SendKeys(Keys.Right); + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(slider); // let the dialog window close + + // verify the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var actual = new CustomLayouts().GridFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == layout.Uuid).Info.GetRawText()).Spacing; + Assert.AreEqual(expected, actual); + } + + [TestMethod] + public void SpaceAroundZones_Toggle_Save() + { + var layout = Layouts.CustomLayouts.Find(x => x.Type == CustomLayout.Grid.TypeToString()); + var value = new CustomLayouts().GridFromJsonElement(layout.Info.GetRawText()).ShowSpacing; + var expected = !value; + _session?.ClickEditLayout(layout.Name); + + var toggle = _session?.FindByAccessibilityId(AccessibilityId.SpacingToggle); + Assert.IsNotNull(toggle); + toggle.Click(); + Assert.AreEqual(expected, toggle.Selected, "Toggle value not changed"); + Assert.AreEqual(expected, _session?.FindByAccessibilityId(AccessibilityId.SpacingSlider)?.Enabled); + + _session?.Click(ElementName.Save); + _session?.WaitUntilHidden(toggle); // let the dialog window close + + // verify the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var actual = new CustomLayouts().GridFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == layout.Uuid).Info.GetRawText()).ShowSpacing; + Assert.AreEqual(expected, actual); + } + + [TestMethod] + public void SpaceAroundZones_Toggle_Cancel() + { + var layout = Layouts.CustomLayouts.Find(x => x.Type == CustomLayout.Grid.TypeToString()); + var expected = new CustomLayouts().GridFromJsonElement(layout.Info.GetRawText()).ShowSpacing; + _session?.ClickEditLayout(layout.Name); + + var toggle = _session?.FindByAccessibilityId(AccessibilityId.SpacingToggle); + Assert.IsNotNull(toggle); + toggle.Click(); + Assert.AreNotEqual(expected, toggle.Selected, "Toggle value not changed"); + Assert.AreNotEqual(expected, _session?.FindByAccessibilityId(AccessibilityId.SpacingSlider)?.Enabled); + + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(toggle); // let the dialog window close + + // verify the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var actual = new CustomLayouts().GridFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == layout.Uuid).Info.GetRawText()).ShowSpacing; + Assert.AreEqual(expected, actual); + } + } +} diff --git a/src/modules/fancyzones/UITests-FancyZonesEditor/DefaultLayoutsTests.cs b/src/modules/fancyzones/UITests-FancyZonesEditor/DefaultLayoutsTests.cs new file mode 100644 index 000000000000..419366d651d2 --- /dev/null +++ b/src/modules/fancyzones/UITests-FancyZonesEditor/DefaultLayoutsTests.cs @@ -0,0 +1,342 @@ +// 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.Collections.Generic; +using FancyZonesEditorCommon.Data; +using Microsoft.FancyZonesEditor.UnitTests.Utils; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using static FancyZonesEditorCommon.Data.CustomLayouts; +using static FancyZonesEditorCommon.Data.DefaultLayouts; +using static FancyZonesEditorCommon.Data.EditorParameters; +using static Microsoft.FancyZonesEditor.UnitTests.Utils.FancyZonesEditorSession; + +namespace Microsoft.FancyZonesEditor.UITests +{ + [TestClass] + public class DefaultLayoutsTests + { + private static readonly string Vertical = MonitorConfigurationType.Vertical.TypeToString(); + private static readonly string Horizontal = MonitorConfigurationType.Horizontal.TypeToString(); + + private static readonly CustomLayoutListWrapper CustomLayouts = new CustomLayoutListWrapper + { + CustomLayouts = new List + { + new CustomLayoutWrapper + { + Uuid = "{0D6D2F58-9184-4804-81E4-4E4CC3476DC1}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Layout 0", + Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper + { + RefHeight = 1080, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + new CustomLayoutWrapper + { + Uuid = "{E7807D0D-6223-4883-B15B-1F3883944C09}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Layout 1", + Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper + { + RefHeight = 1080, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + new CustomLayoutWrapper + { + Uuid = "{F1A94F38-82B6-4876-A653-70D0E882DE2A}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Layout 2", + Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper + { + RefHeight = 1080, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + new CustomLayoutWrapper + { + Uuid = "{F5FDBC04-0760-4776-9F05-96AAC4AE613F}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Layout 3", + Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper + { + RefHeight = 1080, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + }, + }; + + private static readonly DefaultLayoutsListWrapper Layouts = new DefaultLayoutsListWrapper + { + DefaultLayouts = new List + { + new DefaultLayoutWrapper + { + MonitorConfiguration = Horizontal, + Layout = new DefaultLayoutWrapper.LayoutWrapper + { + Type = LayoutType.Grid.TypeToString(), + ZoneCount = 4, + ShowSpacing = true, + Spacing = 5, + SensitivityRadius = 20, + }, + }, + new DefaultLayoutWrapper + { + MonitorConfiguration = Vertical, + Layout = new DefaultLayoutWrapper.LayoutWrapper + { + Type = "custom", + Uuid = "{0D6D2F58-9184-4804-81E4-4E4CC3476DC1}", + ZoneCount = 0, + ShowSpacing = false, + Spacing = 0, + SensitivityRadius = 0, + }, + }, + }, + }; + + private static TestContext? _context; + private static FancyZonesEditorSession? _session; + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + _context = testContext; + } + + [ClassCleanup] + public static void ClassCleanup() + { + _context = null; + } + + [TestInitialize] + public void TestInitialize() + { + var defaultLayouts = new DefaultLayouts(); + FancyZonesEditorSession.Files.DefaultLayoutsIOHelper.WriteData(defaultLayouts.Serialize(Layouts)); + + EditorParameters editorParameters = new EditorParameters(); + ParamsWrapper parameters = new ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 192, + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + new NativeMonitorDataWrapper + { + Monitor = "monitor-2", + MonitorInstanceId = "instance-id-2", + MonitorSerialNumber = "serial-number-2", + MonitorNumber = 2, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 96, + LeftCoordinate = 1920, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = false, + }, + }, + }; + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); + + CustomLayouts customLayouts = new CustomLayouts(); + FancyZonesEditorSession.Files.CustomLayoutsIOHelper.WriteData(customLayouts.Serialize(CustomLayouts)); + + LayoutTemplates layoutTemplates = new LayoutTemplates(); + LayoutTemplates.TemplateLayoutsListWrapper templateLayoutsListWrapper = new LayoutTemplates.TemplateLayoutsListWrapper + { + LayoutTemplates = new List + { + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Blank.TypeToString(), + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Focus.TypeToString(), + ZoneCount = 10, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Rows.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 10, + SensitivityRadius = 10, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Columns.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 20, + SensitivityRadius = 20, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Grid.TypeToString(), + ZoneCount = 4, + ShowSpacing = false, + Spacing = 10, + SensitivityRadius = 30, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.PriorityGrid.TypeToString(), + ZoneCount = 3, + ShowSpacing = true, + Spacing = 1, + SensitivityRadius = 40, + }, + }, + }; + FancyZonesEditorSession.Files.LayoutTemplatesIOHelper.WriteData(layoutTemplates.Serialize(templateLayoutsListWrapper)); + + LayoutHotkeys layoutHotkeys = new LayoutHotkeys(); + LayoutHotkeys.LayoutHotkeysWrapper layoutHotkeysWrapper = new LayoutHotkeys.LayoutHotkeysWrapper + { + LayoutHotkeys = new List { }, + }; + FancyZonesEditorSession.Files.LayoutHotkeysIOHelper.WriteData(layoutHotkeys.Serialize(layoutHotkeysWrapper)); + + AppliedLayouts appliedLayouts = new AppliedLayouts(); + AppliedLayouts.AppliedLayoutsListWrapper appliedLayoutsWrapper = new AppliedLayouts.AppliedLayoutsListWrapper + { + AppliedLayouts = new List { }, + }; + FancyZonesEditorSession.Files.AppliedLayoutsIOHelper.WriteData(appliedLayouts.Serialize(appliedLayoutsWrapper)); + + _session = new FancyZonesEditorSession(_context!); + } + + [TestCleanup] + public void TestCleanup() + { + _session?.Close(); + FancyZonesEditorSession.Files.Restore(); + } + + [TestMethod] + public void Initialize() + { + CheckTemplateLayouts(LayoutType.Grid, null); + CheckCustomLayouts(string.Empty, CustomLayouts.CustomLayouts[0].Uuid); + } + + [TestMethod] + public void Assign_Cancel() + { + // assign Focus as a default horizontal and vertical layout + _session?.ClickEditLayout(TestConstants.TemplateLayoutNames[LayoutType.Focus]); + var horizontalDefaultButton = _session?.GetHorizontalDefaultButton(false); + horizontalDefaultButton?.Click(); + var verticalDefaultButton = _session?.GetVerticalDefaultButton(false); + verticalDefaultButton?.Click(); + + // cancel + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(horizontalDefaultButton!); + + // check that default layouts weren't changed + CheckTemplateLayouts(LayoutType.Grid, null); + CheckCustomLayouts(string.Empty, CustomLayouts.CustomLayouts[0].Uuid); + } + + [TestMethod] + public void Assign_Save() + { + // assign Focus as a default horizontal and vertical layout + _session?.ClickEditLayout(TestConstants.TemplateLayoutNames[LayoutType.Focus]); + var horizontalDefaultButton = _session?.GetHorizontalDefaultButton(false); + horizontalDefaultButton?.Click(); + var verticalDefaultButton = _session?.GetVerticalDefaultButton(false); + verticalDefaultButton?.Click(); + + // save + _session?.Click(ElementName.Save); + _session?.WaitUntilHidden(horizontalDefaultButton!); + + // check that default layout was changed + CheckTemplateLayouts(LayoutType.Focus, LayoutType.Focus); + CheckCustomLayouts(string.Empty, string.Empty); + } + + private void CheckTemplateLayouts(LayoutType? horizontalDefault, LayoutType? verticalDefault) + { + foreach (var (key, name) in TestConstants.TemplateLayoutNames) + { + if (key == LayoutType.Blank) + { + continue; + } + + _session?.ClickEditLayout(name); + + bool isCheckedHorizontal = key == horizontalDefault; + bool isCheckedVertical = key == verticalDefault; + + var horizontalDefaultButton = _session?.GetHorizontalDefaultButton(isCheckedHorizontal); + Assert.IsNotNull(horizontalDefaultButton, "Incorrect horizontal default layout set at " + name); + var verticalDefaultButton = _session?.GetVerticalDefaultButton(isCheckedVertical); + Assert.IsNotNull(verticalDefaultButton, "Incorrect vertical default layout set at " + name); + + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(horizontalDefaultButton!); + } + } + + private void CheckCustomLayouts(string horizontalDefaultLayoutUuid, string verticalDefaultLayoutUuid) + { + foreach (var layout in CustomLayouts.CustomLayouts) + { + _session?.ClickEditLayout(layout.Name); + + bool isCheckedHorizontal = layout.Uuid == horizontalDefaultLayoutUuid; + var horizontalDefaultButton = _session?.GetHorizontalDefaultButton(isCheckedHorizontal); + Assert.IsNotNull(horizontalDefaultButton, "Incorrect horizontal custom layout set at " + layout.Name); + + bool isCheckedVertical = layout.Uuid == verticalDefaultLayoutUuid; + var verticalDefaultButton = _session?.GetVerticalDefaultButton(isCheckedVertical); + Assert.IsNotNull(verticalDefaultButton, "Incorrect vertical custom layout set at " + layout.Name); + + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(horizontalDefaultButton!); + } + } + } +} diff --git a/src/modules/fancyzones/UITests-FancyZonesEditor/DeleteLayoutTests.cs b/src/modules/fancyzones/UITests-FancyZonesEditor/DeleteLayoutTests.cs new file mode 100644 index 000000000000..19b1c79f51a7 --- /dev/null +++ b/src/modules/fancyzones/UITests-FancyZonesEditor/DeleteLayoutTests.cs @@ -0,0 +1,371 @@ +// 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.Collections.Generic; +using FancyZonesEditorCommon.Data; +using Microsoft.FancyZonesEditor.UnitTests.Utils; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using static FancyZonesEditorCommon.Data.CustomLayouts; +using static FancyZonesEditorCommon.Data.DefaultLayouts; +using static FancyZonesEditorCommon.Data.EditorParameters; +using static FancyZonesEditorCommon.Data.LayoutHotkeys; +using static Microsoft.FancyZonesEditor.UnitTests.Utils.FancyZonesEditorSession; + +namespace Microsoft.FancyZonesEditor.UITests +{ + [TestClass] + public class DeleteLayoutTests + { + private static readonly CustomLayoutListWrapper CustomLayouts = new CustomLayoutListWrapper + { + CustomLayouts = new List + { + new CustomLayoutWrapper + { + Uuid = "{0D6D2F58-9184-4804-81E4-4E4CC3476DC1}", + Type = CustomLayout.Grid.TypeToString(), + Name = "Custom layout 1", + Info = new CustomLayouts().ToJsonElement(new CustomLayouts.GridInfoWrapper + { + Rows = 2, + Columns = 3, + RowsPercentage = new List { 2967, 7033 }, + ColumnsPercentage = new List { 2410, 6040, 1550 }, + CellChildMap = new int[][] { [0, 1, 1], [0, 2, 3] }, + SensitivityRadius = 30, + Spacing = 26, + ShowSpacing = false, + }), + }, + new CustomLayoutWrapper + { + Uuid = "{E7807D0D-6223-4883-B15B-1F3883944C09}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Custom layout 2", + Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper + { + RefHeight = 952, + RefWidth = 1500, + SensitivityRadius = 10, + Zones = new List + { + new CanvasInfoWrapper.CanvasZoneWrapper + { + X = 0, + Y = 0, + Width = 900, + Height = 522, + }, + new CanvasInfoWrapper.CanvasZoneWrapper + { + X = 900, + Y = 0, + Width = 600, + Height = 750, + }, + new CanvasInfoWrapper.CanvasZoneWrapper + { + X = 0, + Y = 522, + Width = 1500, + Height = 430, + }, + }, + }), + }, + }, + }; + + private static readonly DefaultLayouts.DefaultLayoutsListWrapper DefaultLayoutsList = new DefaultLayouts.DefaultLayoutsListWrapper + { + DefaultLayouts = new List + { + new DefaultLayoutWrapper + { + MonitorConfiguration = MonitorConfigurationType.Horizontal.TypeToString(), + Layout = new DefaultLayoutWrapper.LayoutWrapper + { + Type = LayoutType.Custom.TypeToString(), + Uuid = CustomLayouts.CustomLayouts[1].Uuid, + }, + }, + }, + }; + + private static readonly LayoutHotkeys.LayoutHotkeysWrapper Hotkeys = new LayoutHotkeys.LayoutHotkeysWrapper + { + LayoutHotkeys = new List + { + new LayoutHotkeyWrapper + { + LayoutId = CustomLayouts.CustomLayouts[1].Uuid, + Key = 0, + }, + }, + }; + + private static readonly ParamsWrapper Parameters = new ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 192, + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + }, + }; + + private static TestContext? _context; + private static FancyZonesEditorSession? _session; + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + _context = testContext; + } + + [ClassCleanup] + public static void ClassCleanup() + { + _context = null; + } + + [TestInitialize] + public void TestInitialize() + { + EditorParameters editorParameters = new EditorParameters(); + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(Parameters)); + + CustomLayouts customLayouts = new CustomLayouts(); + FancyZonesEditorSession.Files.CustomLayoutsIOHelper.WriteData(customLayouts.Serialize(CustomLayouts)); + + LayoutTemplates layoutTemplates = new LayoutTemplates(); + LayoutTemplates.TemplateLayoutsListWrapper templateLayoutsListWrapper = new LayoutTemplates.TemplateLayoutsListWrapper + { + LayoutTemplates = new List + { + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Blank.TypeToString(), + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Focus.TypeToString(), + ZoneCount = 10, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Rows.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 10, + SensitivityRadius = 10, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Columns.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 20, + SensitivityRadius = 20, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Grid.TypeToString(), + ZoneCount = 4, + ShowSpacing = false, + Spacing = 10, + SensitivityRadius = 30, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.PriorityGrid.TypeToString(), + ZoneCount = 3, + ShowSpacing = true, + Spacing = 1, + SensitivityRadius = 40, + }, + }, + }; + FancyZonesEditorSession.Files.LayoutTemplatesIOHelper.WriteData(layoutTemplates.Serialize(templateLayoutsListWrapper)); + + DefaultLayouts defaultLayouts = new DefaultLayouts(); + FancyZonesEditorSession.Files.DefaultLayoutsIOHelper.WriteData(defaultLayouts.Serialize(DefaultLayoutsList)); + + LayoutHotkeys layoutHotkeys = new LayoutHotkeys(); + FancyZonesEditorSession.Files.LayoutHotkeysIOHelper.WriteData(layoutHotkeys.Serialize(Hotkeys)); + + AppliedLayouts appliedLayouts = new AppliedLayouts(); + AppliedLayouts.AppliedLayoutsListWrapper appliedLayoutsWrapper = new AppliedLayouts.AppliedLayoutsListWrapper + { + AppliedLayouts = new List { }, + }; + FancyZonesEditorSession.Files.AppliedLayoutsIOHelper.WriteData(appliedLayouts.Serialize(appliedLayoutsWrapper)); + + _session = new FancyZonesEditorSession(_context!); + _session.Click(_session.GetLayout(CustomLayouts.CustomLayouts[0].Name)!); + } + + [TestCleanup] + public void TestCleanup() + { + _session?.Close(); + FancyZonesEditorSession.Files.Restore(); + } + + [TestMethod] + public void DeleteNotAppliedLayout() + { + var deletedLayout = CustomLayouts.CustomLayouts[1].Name; + _session?.ClickEditLayout(deletedLayout); + _session?.Click(_session.FindByAccessibilityId(AccessibilityId.DeleteLayoutButton)); + _session?.ClickConfirmDialog(); + _session?.WaitFor(1); + + // verify the layout is removed + Assert.IsNull(_session?.GetLayout(deletedLayout)); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + Assert.AreEqual(CustomLayouts.CustomLayouts.Count - 1, data.CustomLayouts.Count); + Assert.IsFalse(data.CustomLayouts.Exists(x => x.Name == deletedLayout)); + } + + [TestMethod] + public void DeleteAppliedLayout() + { + var deletedLayout = CustomLayouts.CustomLayouts[0].Name; + _session?.ClickEditLayout(deletedLayout); + _session?.Click(_session.FindByAccessibilityId(AccessibilityId.DeleteLayoutButton)); + _session?.ClickConfirmDialog(); + _session?.WaitFor(1); + + // verify the layout is removed + Assert.IsNull(_session?.GetLayout(deletedLayout)); + + // verify the empty layout is selected + Assert.IsTrue(_session?.GetLayout(TestConstants.TemplateLayoutNames[LayoutType.Blank])!.Selected); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + Assert.AreEqual(CustomLayouts.CustomLayouts.Count - 1, data.CustomLayouts.Count); + Assert.IsFalse(data.CustomLayouts.Exists(x => x.Name == deletedLayout)); + + var appliedLayouts = new AppliedLayouts(); + var appliedLayoutsData = appliedLayouts.Read(appliedLayouts.File); + Assert.AreEqual(LayoutType.Blank.TypeToString(), appliedLayoutsData.AppliedLayouts.Find(x => x.Device.Monitor == Parameters.Monitors[0].Monitor).AppliedLayout.Type); + } + + [TestMethod] + public void CancelDeletion() + { + var deletedLayout = CustomLayouts.CustomLayouts[1].Name; + _session?.ClickEditLayout(deletedLayout); + _session?.Click(_session.FindByAccessibilityId(AccessibilityId.DeleteLayoutButton)); + _session?.ClickCancelDialog(); + _session?.WaitFor(1); + + // verify the layout is not removed + Assert.IsNotNull(_session?.GetLayout(deletedLayout)); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + Assert.AreEqual(CustomLayouts.CustomLayouts.Count, data.CustomLayouts.Count); + Assert.IsTrue(data.CustomLayouts.Exists(x => x.Name == deletedLayout)); + } + + [TestMethod] + public void DeleteFromContextMenu() + { + var deletedLayout = CustomLayouts.CustomLayouts[1].Name; + _session?.ClickContextMenuItem(deletedLayout, ElementName.Delete); + _session?.ClickConfirmDialog(); + _session?.WaitFor(1); + + // verify the layout is removed + Assert.IsNull(_session?.GetLayout(deletedLayout)); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + Assert.AreEqual(CustomLayouts.CustomLayouts.Count - 1, data.CustomLayouts.Count); + Assert.IsFalse(data.CustomLayouts.Exists(x => x.Name == deletedLayout)); + } + + [TestMethod] + public void DeleteDefaultLayout() + { + var deletedLayout = CustomLayouts.CustomLayouts[1].Name; + _session?.ClickContextMenuItem(deletedLayout, ElementName.Delete); + _session?.ClickConfirmDialog(); + _session?.WaitFor(1); + + // verify the default layout is reset to the "default" default + _session?.ClickEditLayout(TestConstants.TemplateLayoutNames[LayoutType.PriorityGrid]); + Assert.IsNotNull(_session?.GetHorizontalDefaultButton(true)); + _session?.Click(ElementName.Cancel); + + // check the file + var defaultLayouts = new DefaultLayouts(); + var data = defaultLayouts.Read(defaultLayouts.File); + string configuration = MonitorConfigurationType.Horizontal.TypeToString(); + Assert.AreEqual(LayoutType.PriorityGrid.TypeToString(), data.DefaultLayouts.Find(x => x.MonitorConfiguration == configuration).Layout.Type); + } + + [TestMethod] + public void DeleteLayoutWithHotkey() + { + var deletedLayout = CustomLayouts.CustomLayouts[1].Name; + _session?.ClickContextMenuItem(deletedLayout, ElementName.Delete); + _session?.ClickConfirmDialog(); + _session?.WaitFor(1); + + // verify the hotkey is available + _session?.ClickEditLayout(CustomLayouts.CustomLayouts[0].Name); + var hotkeyComboBox = _session?.FindByAccessibilityId(AccessibilityId.HotkeyComboBox); + Assert.IsNotNull(hotkeyComboBox); + hotkeyComboBox.Click(); + + _session?.WaitElementDisplayedByClassName(ClassName.Popup); + var popup = _session?.FindByClassName(ClassName.Popup); + Assert.IsNotNull(popup); + try + { + for (int i = 0; i < 10; i++) + { + popup.FindElementByName($"{i}"); + } + } + catch + { + _session?.Click(ElementName.Cancel); + Assert.Fail("Hotkey not found"); + } + + _session?.Click(ElementName.Cancel); + + // check the file + var hotkeys = new LayoutHotkeys(); + var data = hotkeys.Read(hotkeys.File); + Assert.AreEqual(0, data.LayoutHotkeys.Count); + } + } +} diff --git a/src/modules/fancyzones/UITests-FancyZonesEditor/EditLayoutTests.cs b/src/modules/fancyzones/UITests-FancyZonesEditor/EditLayoutTests.cs new file mode 100644 index 000000000000..ffc5d33aa958 --- /dev/null +++ b/src/modules/fancyzones/UITests-FancyZonesEditor/EditLayoutTests.cs @@ -0,0 +1,634 @@ +// 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.Collections.Generic; +using System.Linq; +using FancyZonesEditorCommon.Data; +using Microsoft.FancyZonesEditor.UnitTests.Utils; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenQA.Selenium.Appium.Windows; +using static FancyZonesEditorCommon.Data.CustomLayouts; +using static FancyZonesEditorCommon.Data.EditorParameters; +using static Microsoft.FancyZonesEditor.UnitTests.Utils.FancyZonesEditorSession; + +namespace Microsoft.FancyZonesEditor.UITests +{ + [TestClass] + public class EditLayoutTests + { + private static readonly CustomLayouts.CustomLayoutListWrapper Layouts = new CustomLayouts.CustomLayoutListWrapper + { + CustomLayouts = new List + { + new CustomLayoutWrapper + { + Uuid = "{0D6D2F58-9184-4804-81E4-4E4CC3476DC1}", + Type = CustomLayout.Grid.TypeToString(), + Name = "Grid custom layout", + Info = new CustomLayouts().ToJsonElement(new GridInfoWrapper + { + Rows = 2, + Columns = 2, + RowsPercentage = new List { 5000, 5000 }, + ColumnsPercentage = new List { 5000, 5000 }, + CellChildMap = new int[][] { [0, 1], [2, 3] }, + SensitivityRadius = 30, + Spacing = 26, + ShowSpacing = false, + }), + }, + new CustomLayoutWrapper + { + Uuid = "{0EB9BF3E-010E-46D7-8681-1879D1E111E1}", + Type = CustomLayout.Grid.TypeToString(), + Name = "Grid-9", + Info = new CustomLayouts().ToJsonElement(new GridInfoWrapper + { + Rows = 3, + Columns = 3, + RowsPercentage = new List { 3333, 3333, 3334 }, + ColumnsPercentage = new List { 3333, 3333, 3334 }, + CellChildMap = new int[][] { [0, 1, 2], [3, 4, 5], [6, 7, 8] }, + SensitivityRadius = 20, + Spacing = 3, + ShowSpacing = false, + }), + }, + new CustomLayoutWrapper + { + Uuid = "{E7807D0D-6223-4883-B15B-1F3883944C09}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Canvas custom layout", + Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper + { + RefHeight = 1040, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List + { + new CanvasInfoWrapper.CanvasZoneWrapper + { + X = 0, + Y = 0, + Width = 500, + Height = 250, + }, + new CanvasInfoWrapper.CanvasZoneWrapper + { + X = 500, + Y = 0, + Width = 1420, + Height = 500, + }, + new CanvasInfoWrapper.CanvasZoneWrapper + { + X = 0, + Y = 250, + Width = 1920, + Height = 500, + }, + }, + }), + }, + }, + }; + + private static TestContext? _context; + private static FancyZonesEditorSession? _session; + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + _context = testContext; + } + + [ClassCleanup] + public static void ClassCleanup() + { + _context = null; + } + + [TestInitialize] + public void TestInitialize() + { + EditorParameters editorParameters = new EditorParameters(); + ParamsWrapper parameters = new ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 192, + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + }, + }; + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); + + LayoutTemplates layoutTemplates = new LayoutTemplates(); + LayoutTemplates.TemplateLayoutsListWrapper templateLayoutsListWrapper = new LayoutTemplates.TemplateLayoutsListWrapper + { + LayoutTemplates = new List + { + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Blank.TypeToString(), + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Focus.TypeToString(), + ZoneCount = 10, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Rows.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 10, + SensitivityRadius = 10, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Columns.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 20, + SensitivityRadius = 20, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Grid.TypeToString(), + ZoneCount = 4, + ShowSpacing = false, + Spacing = 10, + SensitivityRadius = 30, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.PriorityGrid.TypeToString(), + ZoneCount = 3, + ShowSpacing = true, + Spacing = 1, + SensitivityRadius = 40, + }, + }, + }; + FancyZonesEditorSession.Files.LayoutTemplatesIOHelper.WriteData(layoutTemplates.Serialize(templateLayoutsListWrapper)); + + CustomLayouts customLayouts = new CustomLayouts(); + FancyZonesEditorSession.Files.CustomLayoutsIOHelper.WriteData(customLayouts.Serialize(Layouts)); + + DefaultLayouts defaultLayouts = new DefaultLayouts(); + DefaultLayouts.DefaultLayoutsListWrapper defaultLayoutsListWrapper = new DefaultLayouts.DefaultLayoutsListWrapper + { + DefaultLayouts = new List { }, + }; + FancyZonesEditorSession.Files.DefaultLayoutsIOHelper.WriteData(defaultLayouts.Serialize(defaultLayoutsListWrapper)); + + LayoutHotkeys layoutHotkeys = new LayoutHotkeys(); + LayoutHotkeys.LayoutHotkeysWrapper layoutHotkeysWrapper = new LayoutHotkeys.LayoutHotkeysWrapper + { + LayoutHotkeys = new List { }, + }; + FancyZonesEditorSession.Files.LayoutHotkeysIOHelper.WriteData(layoutHotkeys.Serialize(layoutHotkeysWrapper)); + + AppliedLayouts appliedLayouts = new AppliedLayouts(); + AppliedLayouts.AppliedLayoutsListWrapper appliedLayoutsWrapper = new AppliedLayouts.AppliedLayoutsListWrapper + { + AppliedLayouts = new List { }, + }; + FancyZonesEditorSession.Files.AppliedLayoutsIOHelper.WriteData(appliedLayouts.Serialize(appliedLayoutsWrapper)); + + _session = new FancyZonesEditorSession(_context!); + } + + [TestCleanup] + public void TestCleanup() + { + _session?.Close(); + FancyZonesEditorSession.Files.Restore(); + } + + [TestMethod] + public void OpenEditMode() + { + _session?.ClickEditLayout(Layouts.CustomLayouts[0].Name); + _session?.Click(_session?.FindByAccessibilityId(AccessibilityId.EditZonesButton)); + Assert.IsNotNull(_session?.FindByName(ElementName.GridLayoutEditor)); + _session?.Click(ElementName.Cancel); + } + + [TestMethod] + public void OpenEditModeFromContextMenu() + { + _session?.ClickContextMenuItem(Layouts.CustomLayouts[0].Name, FancyZonesEditorSession.ElementName.EditZones); + Assert.IsNotNull(_session?.FindByName(ElementName.GridLayoutEditor)); + _session?.Click(ElementName.Cancel); + } + + [TestMethod] + public void Canvas_AddZone_Save() + { + var canvas = Layouts.CustomLayouts.Find(x => x.Type == CustomLayout.Canvas.TypeToString()); + _session?.ClickContextMenuItem(canvas.Name, FancyZonesEditorSession.ElementName.EditZones); + _session?.Click(_session?.FindByAccessibilityId(AccessibilityId.NewZoneButton)); + _session?.Click(ElementName.Save); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var expected = customLayouts.CanvasFromJsonElement(canvas.Info.ToString()); + var actual = customLayouts.CanvasFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == canvas.Uuid).Info.GetRawText()); + Assert.AreEqual(expected.Zones.Count + 1, actual.Zones.Count); + } + + [TestMethod] + public void Canvas_AddZone_Cancel() + { + var canvas = Layouts.CustomLayouts.Find(x => x.Type == CustomLayout.Canvas.TypeToString()); + _session?.ClickContextMenuItem(canvas.Name, FancyZonesEditorSession.ElementName.EditZones); + _session?.Click(_session?.FindByAccessibilityId(AccessibilityId.NewZoneButton)); + _session?.Click(ElementName.Cancel); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var expected = customLayouts.CanvasFromJsonElement(canvas.Info.ToString()); + var actual = customLayouts.CanvasFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == canvas.Uuid).Info.GetRawText()); + Assert.AreEqual(expected.Zones.Count, actual.Zones.Count); + } + + [TestMethod] + public void Canvas_DeleteZone_Save() + { + var canvas = Layouts.CustomLayouts.Find(x => x.Type == CustomLayout.Canvas.TypeToString()); + _session?.ClickContextMenuItem(canvas.Name, FancyZonesEditorSession.ElementName.EditZones); + _session?.WaitElementDisplayedByName(FancyZonesEditorSession.ElementName.CanvasEditorWindow); + _session?.ClickDeleteZone(1); + _session?.Click(ElementName.Save); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var expected = customLayouts.CanvasFromJsonElement(canvas.Info.ToString()); + var actual = customLayouts.CanvasFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == canvas.Uuid).Info.GetRawText()); + Assert.AreEqual(expected.Zones.Count - 1, actual.Zones.Count); + } + + [TestMethod] + public void Canvas_DeleteZone_Cancel() + { + var canvas = Layouts.CustomLayouts.Find(x => x.Type == CustomLayout.Canvas.TypeToString()); + _session?.ClickContextMenuItem(canvas.Name, FancyZonesEditorSession.ElementName.EditZones); + _session?.ClickDeleteZone(1); + _session?.Click(ElementName.Cancel); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var expected = customLayouts.CanvasFromJsonElement(canvas.Info.ToString()); + var actual = customLayouts.CanvasFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == canvas.Uuid).Info.GetRawText()); + Assert.AreEqual(expected.Zones.Count, actual.Zones.Count); + } + + [TestMethod] + public void Canvas_MoveZone_Save() + { + int zoneNumber = 1; + int xOffset = 100; + int yOffset = 100; + var canvas = Layouts.CustomLayouts.Find(x => x.Type == CustomLayout.Canvas.TypeToString()); + _session?.ClickContextMenuItem(canvas.Name, FancyZonesEditorSession.ElementName.EditZones); + + _session?.Drag(_session.GetZone(zoneNumber, FancyZonesEditorSession.ClassName.CanvasZone)!, xOffset, yOffset); + _session?.Click(ElementName.Save); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var expected = customLayouts.CanvasFromJsonElement(canvas.Info.ToString()); + var actual = customLayouts.CanvasFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == canvas.Uuid).Info.GetRawText()); + + // changed zone, exact offset may vary depending on screen resolution + Assert.IsTrue(expected.Zones[zoneNumber - 1].X < actual.Zones[zoneNumber - 1].X, $"X: {expected.Zones[zoneNumber - 1].X} > {actual.Zones[zoneNumber - 1].X}"); + Assert.IsTrue(expected.Zones[zoneNumber - 1].Y < actual.Zones[zoneNumber - 1].Y, $"Y: {expected.Zones[zoneNumber - 1].Y} > {actual.Zones[zoneNumber - 1].Y}"); + Assert.AreEqual(expected.Zones[zoneNumber - 1].Width, actual.Zones[zoneNumber - 1].Width); + Assert.AreEqual(expected.Zones[zoneNumber - 1].Height, actual.Zones[zoneNumber - 1].Height); + + // other zones + for (int i = 0; i < expected.Zones.Count; i++) + { + if (i != zoneNumber - 1) + { + Assert.AreEqual(expected.Zones[i].X, actual.Zones[i].X); + Assert.AreEqual(expected.Zones[i].Y, actual.Zones[i].Y); + Assert.AreEqual(expected.Zones[i].Width, actual.Zones[i].Width); + Assert.AreEqual(expected.Zones[i].Height, actual.Zones[i].Height); + } + } + } + + [TestMethod] + public void Canvas_MoveZone_Cancel() + { + int zoneNumber = 1; + var canvas = Layouts.CustomLayouts.Find(x => x.Type == CustomLayout.Canvas.TypeToString()); + _session?.ClickContextMenuItem(canvas.Name, FancyZonesEditorSession.ElementName.EditZones); + + _session?.Drag(_session.GetZone(zoneNumber, FancyZonesEditorSession.ClassName.CanvasZone)!, 100, 100); + _session?.Click(ElementName.Cancel); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var expected = customLayouts.CanvasFromJsonElement(canvas.Info.ToString()); + var actual = customLayouts.CanvasFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == canvas.Uuid).Info.GetRawText()); + for (int i = 0; i < expected.Zones.Count; i++) + { + Assert.AreEqual(expected.Zones[i].X, actual.Zones[i].X); + Assert.AreEqual(expected.Zones[i].Y, actual.Zones[i].Y); + Assert.AreEqual(expected.Zones[i].Width, actual.Zones[i].Width); + Assert.AreEqual(expected.Zones[i].Height, actual.Zones[i].Height); + } + } + + [TestMethod] + public void Canvas_ResizeZone_Save() + { + int zoneNumber = 1; + int xOffset = 100; + int yOffset = 100; + var canvas = Layouts.CustomLayouts.Find(x => x.Type == CustomLayout.Canvas.TypeToString()); + _session?.ClickContextMenuItem(canvas.Name, FancyZonesEditorSession.ElementName.EditZones); + + _session?.Drag((WindowsElement)_session.GetZone(zoneNumber, FancyZonesEditorSession.ClassName.CanvasZone)?.FindElementByAccessibilityId(FancyZonesEditorSession.AccessibilityId.TopRightCorner)!, xOffset, yOffset); + _session?.Click(ElementName.Save); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var expected = customLayouts.CanvasFromJsonElement(canvas.Info.ToString()); + var actual = customLayouts.CanvasFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == canvas.Uuid).Info.GetRawText()); + + // changed zone, exact offset may vary depending on screen resolution + Assert.AreEqual(expected.Zones[zoneNumber - 1].X, actual.Zones[zoneNumber - 1].X); + Assert.IsTrue(expected.Zones[zoneNumber - 1].Y < actual.Zones[zoneNumber - 1].Y, $"Y: {expected.Zones[zoneNumber - 1].Y} > {actual.Zones[zoneNumber - 1].Y}"); + Assert.IsTrue(expected.Zones[zoneNumber - 1].Width < actual.Zones[zoneNumber - 1].Width, $"Width: {expected.Zones[zoneNumber - 1].Width} < {actual.Zones[zoneNumber - 1].Width}"); + Assert.IsTrue(expected.Zones[zoneNumber - 1].Height > actual.Zones[zoneNumber - 1].Height, $"Height: {expected.Zones[zoneNumber - 1].Height} < {actual.Zones[zoneNumber - 1].Height}"); + + // other zones + for (int i = 0; i < expected.Zones.Count; i++) + { + if (i != zoneNumber - 1) + { + Assert.AreEqual(expected.Zones[i].X, actual.Zones[i].X); + Assert.AreEqual(expected.Zones[i].Y, actual.Zones[i].Y); + Assert.AreEqual(expected.Zones[i].Width, actual.Zones[i].Width); + Assert.AreEqual(expected.Zones[i].Height, actual.Zones[i].Height); + } + } + } + + [TestMethod] + public void Canvas_ResizeZone_Cancel() + { + int zoneNumber = 1; + int xOffset = 100; + int yOffset = 100; + var canvas = Layouts.CustomLayouts.Find(x => x.Type == CustomLayout.Canvas.TypeToString()); + _session?.ClickContextMenuItem(canvas.Name, FancyZonesEditorSession.ElementName.EditZones); + + _session?.Drag((WindowsElement)_session.GetZone(zoneNumber, FancyZonesEditorSession.ClassName.CanvasZone)?.FindElementByAccessibilityId(FancyZonesEditorSession.AccessibilityId.TopRightCorner)!, xOffset, yOffset); + _session?.Click(ElementName.Cancel); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var expected = customLayouts.CanvasFromJsonElement(canvas.Info.ToString()); + var actual = customLayouts.CanvasFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == canvas.Uuid).Info.GetRawText()); + + for (int i = 0; i < expected.Zones.Count; i++) + { + Assert.AreEqual(expected.Zones[i].X, actual.Zones[i].X); + Assert.AreEqual(expected.Zones[i].Y, actual.Zones[i].Y); + Assert.AreEqual(expected.Zones[i].Width, actual.Zones[i].Width); + Assert.AreEqual(expected.Zones[i].Height, actual.Zones[i].Height); + } + } + + [TestMethod] + public void Grid_SplitZone_Save() + { + int zoneNumber = 1; + var grid = Layouts.CustomLayouts.Find(x => x.Type == CustomLayout.Grid.TypeToString()); + _session?.ClickContextMenuItem(grid.Name, FancyZonesEditorSession.ElementName.EditZones); + + _session?.GetZone(zoneNumber, FancyZonesEditorSession.ClassName.GridZone)!.Click(); // horizontal split in the middle of the zone + _session?.Click(ElementName.Save); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var expected = customLayouts.GridFromJsonElement(grid.Info.ToString()); + var actual = customLayouts.GridFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == grid.Uuid).Info.GetRawText()); + + // new column added + Assert.AreEqual(expected.Columns + 1, actual.Columns); + Assert.AreEqual(expected.ColumnsPercentage[0], actual.ColumnsPercentage[0] + actual.ColumnsPercentage[1]); + Assert.AreEqual(expected.ColumnsPercentage[1], actual.ColumnsPercentage[2]); + + // rows are not changed + Assert.AreEqual(expected.Rows, actual.Rows); + for (int i = 0; i < expected.Rows; i++) + { + Assert.AreEqual(expected.RowsPercentage[i], actual.RowsPercentage[i]); + } + } + + [TestMethod] + public void Grid_SplitZone_Cancel() + { + int zoneNumber = 1; + var grid = Layouts.CustomLayouts.Find(x => x.Type == CustomLayout.Grid.TypeToString()); + _session?.ClickContextMenuItem(grid.Name, FancyZonesEditorSession.ElementName.EditZones); + + _session?.GetZone(zoneNumber, FancyZonesEditorSession.ClassName.GridZone)!.Click(); // horizontal split in the middle of the zone + _session?.Click(ElementName.Cancel); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var expected = customLayouts.GridFromJsonElement(grid.Info.ToString()); + var actual = customLayouts.GridFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == grid.Uuid).Info.GetRawText()); + + // columns are not changed + Assert.AreEqual(expected.Columns, actual.Columns); + for (int i = 0; i < expected.Columns; i++) + { + Assert.AreEqual(expected.ColumnsPercentage[i], actual.ColumnsPercentage[i]); + } + + // rows are not changed + Assert.AreEqual(expected.Rows, actual.Rows); + for (int i = 0; i < expected.Rows; i++) + { + Assert.AreEqual(expected.RowsPercentage[i], actual.RowsPercentage[i]); + } + } + + [TestMethod] + public void Grid_MergeZones_Save() + { + var grid = Layouts.CustomLayouts.Find(x => x.Type == CustomLayout.Grid.TypeToString()); + _session?.ClickContextMenuItem(grid.Name, FancyZonesEditorSession.ElementName.EditZones); + + _session?.MergeGridZones(1, 2); + _session?.Click(ElementName.Save); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var expected = customLayouts.GridFromJsonElement(grid.Info.ToString()); + var actual = customLayouts.GridFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == grid.Uuid).Info.GetRawText()); + + // columns are not changed + Assert.AreEqual(expected.Columns, actual.Columns); + for (int i = 0; i < expected.Columns; i++) + { + Assert.AreEqual(expected.ColumnsPercentage[i], actual.ColumnsPercentage[i]); + } + + // rows are not changed + Assert.AreEqual(expected.Rows, actual.Rows); + for (int i = 0; i < expected.Rows; i++) + { + Assert.AreEqual(expected.RowsPercentage[i], actual.RowsPercentage[i]); + } + + // cells are updated to [0,0][1,2] + Assert.IsTrue(actual.CellChildMap[0].SequenceEqual([0, 0])); + Assert.IsTrue(actual.CellChildMap[1].SequenceEqual([1, 2])); + } + + [TestMethod] + public void Grid_MergeZones_Cancel() + { + var grid = Layouts.CustomLayouts.Find(x => x.Type == CustomLayout.Grid.TypeToString()); + _session?.ClickContextMenuItem(grid.Name, FancyZonesEditorSession.ElementName.EditZones); + + _session?.MergeGridZones(1, 2); + _session?.Click(ElementName.Cancel); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var expected = customLayouts.GridFromJsonElement(grid.Info.ToString()); + var actual = customLayouts.GridFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == grid.Uuid).Info.GetRawText()); + + // columns are not changed + Assert.AreEqual(expected.Columns, actual.Columns); + for (int i = 0; i < expected.Columns; i++) + { + Assert.AreEqual(expected.ColumnsPercentage[i], actual.ColumnsPercentage[i]); + } + + // rows are not changed + Assert.AreEqual(expected.Rows, actual.Rows); + for (int i = 0; i < expected.Rows; i++) + { + Assert.AreEqual(expected.RowsPercentage[i], actual.RowsPercentage[i]); + } + + // cells are not changed + for (int i = 0; i < expected.CellChildMap.Length; i++) + { + Assert.IsTrue(actual.CellChildMap[i].SequenceEqual(expected.CellChildMap[i])); + } + } + + [TestMethod] + public void Grid_MoveSplitter_Save() + { + var grid = Layouts.CustomLayouts.Find(x => x.Type == CustomLayout.Grid.TypeToString() && x.Name == "Grid-9"); + _session?.ClickContextMenuItem(grid.Name, FancyZonesEditorSession.ElementName.EditZones); + + _session?.MoveSplitter(2, -100, 0); + _session?.Click(ElementName.Save); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var expected = customLayouts.GridFromJsonElement(grid.Info.ToString()); + var actual = customLayouts.GridFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == grid.Uuid).Info.GetRawText()); + + // rows are not changed + Assert.AreEqual(expected.Rows, actual.Rows); + for (int i = 0; i < expected.Rows; i++) + { + Assert.AreEqual(expected.RowsPercentage[i], actual.RowsPercentage[i]); + } + + // Columns are changed + Assert.AreEqual(expected.Columns, actual.Columns); + Assert.IsTrue(expected.ColumnsPercentage[0] > actual.ColumnsPercentage[0]); + Assert.IsTrue(expected.ColumnsPercentage[1] < actual.ColumnsPercentage[1]); + Assert.AreEqual(expected.ColumnsPercentage[2], actual.ColumnsPercentage[2]); + + // cells are not changed + for (int i = 0; i < expected.CellChildMap.Length; i++) + { + Assert.IsTrue(actual.CellChildMap[i].SequenceEqual(expected.CellChildMap[i])); + } + } + + [TestMethod] + public void Grid_MoveSplitter_Cancel() + { + var grid = Layouts.CustomLayouts.Find(x => x.Type == CustomLayout.Grid.TypeToString() && x.Name == "Grid-9"); + _session?.ClickContextMenuItem(grid.Name, FancyZonesEditorSession.ElementName.EditZones); + + _session?.MoveSplitter(2, -100, 0); + _session?.Click(ElementName.Cancel); + + // check the file + var customLayouts = new CustomLayouts(); + var data = customLayouts.Read(customLayouts.File); + var expected = customLayouts.GridFromJsonElement(grid.Info.ToString()); + var actual = customLayouts.GridFromJsonElement(data.CustomLayouts.Find(x => x.Uuid == grid.Uuid).Info.GetRawText()); + + // columns are not changed + Assert.AreEqual(expected.Columns, actual.Columns); + for (int i = 0; i < expected.Columns; i++) + { + Assert.AreEqual(expected.ColumnsPercentage[i], actual.ColumnsPercentage[i]); + } + + // rows are not changed + Assert.AreEqual(expected.Rows, actual.Rows); + for (int i = 0; i < expected.Rows; i++) + { + Assert.AreEqual(expected.RowsPercentage[i], actual.RowsPercentage[i]); + } + + // cells are not changed + for (int i = 0; i < expected.CellChildMap.Length; i++) + { + Assert.IsTrue(actual.CellChildMap[i].SequenceEqual(expected.CellChildMap[i])); + } + } + } +} diff --git a/src/modules/fancyzones/UITests-FancyZonesEditor/LayoutHotkeysTests.cs b/src/modules/fancyzones/UITests-FancyZonesEditor/LayoutHotkeysTests.cs new file mode 100644 index 000000000000..e29e904ee061 --- /dev/null +++ b/src/modules/fancyzones/UITests-FancyZonesEditor/LayoutHotkeysTests.cs @@ -0,0 +1,600 @@ +// 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.Collections.Generic; +using System.Globalization; +using System.Linq; +using FancyZonesEditorCommon.Data; +using Microsoft.FancyZonesEditor.UnitTests.Utils; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using static FancyZonesEditorCommon.Data.CustomLayouts; +using static FancyZonesEditorCommon.Data.EditorParameters; +using static FancyZonesEditorCommon.Data.LayoutHotkeys; +using static Microsoft.FancyZonesEditor.UnitTests.Utils.FancyZonesEditorSession; + +namespace Microsoft.FancyZonesEditor.UITests +{ + [TestClass] + public class LayoutHotkeysTests + { + private static readonly CustomLayoutListWrapper CustomLayouts = new CustomLayoutListWrapper + { + CustomLayouts = new List + { + new CustomLayoutWrapper + { + Uuid = "{0D6D2F58-9184-4804-81E4-4E4CC3476DC1}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Layout 0", + Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper + { + RefHeight = 1080, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + new CustomLayoutWrapper + { + Uuid = "{E7807D0D-6223-4883-B15B-1F3883944C09}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Layout 1", + Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper + { + RefHeight = 1080, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + new CustomLayoutWrapper + { + Uuid = "{F1A94F38-82B6-4876-A653-70D0E882DE2A}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Layout 2", + Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper + { + RefHeight = 1080, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + new CustomLayoutWrapper + { + Uuid = "{F5FDBC04-0760-4776-9F05-96AAC4AE613F}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Layout 3", + Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper + { + RefHeight = 1080, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + new CustomLayoutWrapper + { + Uuid = "{1CDB1CC5-51B1-4E49-9C8C-B7A371CCB489}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Layout 4", + Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper + { + RefHeight = 1080, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + new CustomLayoutWrapper + { + Uuid = "{B1F600A5-9C2B-44C1-BF96-42D39E9DC004}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Layout 5", + Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper + { + RefHeight = 1080, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + new CustomLayoutWrapper + { + Uuid = "{DFBE08C3-7C34-482B-811F-C7DBFE368A96}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Layout 6", + Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper + { + RefHeight = 1080, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + new CustomLayoutWrapper + { + Uuid = "{4DB29206-24CE-421C-BFF4-35987D1A744B}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Layout 7", + Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper + { + RefHeight = 1080, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + new CustomLayoutWrapper + { + Uuid = "{51E1BBBA-1C6F-4E3C-85A2-4BFBAE154963}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Layout 8", + Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper + { + RefHeight = 1080, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + new CustomLayoutWrapper + { + Uuid = "{61F9E568-DB74-44FF-8AA8-4093E80D9BCF}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Layout 9", + Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper + { + RefHeight = 1080, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + new CustomLayoutWrapper + { + Uuid = "{8D328880-9E16-4CA8-B4A3-F6AE1C762CD5}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Layout 10", + Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper + { + RefHeight = 1080, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + }, + }; + + private static readonly LayoutHotkeysWrapper Hotkeys = new LayoutHotkeysWrapper + { + LayoutHotkeys = new List + { + new LayoutHotkeyWrapper + { + LayoutId = "{0D6D2F58-9184-4804-81E4-4E4CC3476DC1}", + Key = 0, + }, + new LayoutHotkeyWrapper + { + LayoutId = "{E7807D0D-6223-4883-B15B-1F3883944C09}", + Key = 1, + }, + }, + }; + + private static TestContext? _context; + private static FancyZonesEditorSession? _session; + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + _context = testContext; + } + + [ClassCleanup] + public static void ClassCleanup() + { + _context = null; + } + + [TestInitialize] + public void TestInitialize() + { + EditorParameters editorParameters = new EditorParameters(); + ParamsWrapper parameters = new ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 192, + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + }, + }; + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); + + CustomLayouts customLayouts = new CustomLayouts(); + FancyZonesEditorSession.Files.CustomLayoutsIOHelper.WriteData(customLayouts.Serialize(CustomLayouts)); + + var layoutHotkeys = new LayoutHotkeys(); + FancyZonesEditorSession.Files.LayoutHotkeysIOHelper.WriteData(layoutHotkeys.Serialize(Hotkeys)); + + LayoutTemplates layoutTemplates = new LayoutTemplates(); + LayoutTemplates.TemplateLayoutsListWrapper templateLayoutsListWrapper = new LayoutTemplates.TemplateLayoutsListWrapper + { + LayoutTemplates = new List + { + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Blank.TypeToString(), + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Focus.TypeToString(), + ZoneCount = 10, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Rows.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 10, + SensitivityRadius = 10, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Columns.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 20, + SensitivityRadius = 20, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Grid.TypeToString(), + ZoneCount = 4, + ShowSpacing = false, + Spacing = 10, + SensitivityRadius = 30, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.PriorityGrid.TypeToString(), + ZoneCount = 3, + ShowSpacing = true, + Spacing = 1, + SensitivityRadius = 40, + }, + }, + }; + FancyZonesEditorSession.Files.LayoutTemplatesIOHelper.WriteData(layoutTemplates.Serialize(templateLayoutsListWrapper)); + + DefaultLayouts defaultLayouts = new DefaultLayouts(); + DefaultLayouts.DefaultLayoutsListWrapper defaultLayoutsListWrapper = new DefaultLayouts.DefaultLayoutsListWrapper + { + DefaultLayouts = new List { }, + }; + FancyZonesEditorSession.Files.DefaultLayoutsIOHelper.WriteData(defaultLayouts.Serialize(defaultLayoutsListWrapper)); + + AppliedLayouts appliedLayouts = new AppliedLayouts(); + AppliedLayouts.AppliedLayoutsListWrapper appliedLayoutsWrapper = new AppliedLayouts.AppliedLayoutsListWrapper + { + AppliedLayouts = new List { }, + }; + FancyZonesEditorSession.Files.AppliedLayoutsIOHelper.WriteData(appliedLayouts.Serialize(appliedLayoutsWrapper)); + + try + { + _session = new FancyZonesEditorSession(_context!); + } + catch (Exception ex) + { + _context?.WriteLine("Unable to start session. " + ex.Message); + } + } + + [TestCleanup] + public void TestCleanup() + { + try + { + _session?.Click(ElementName.Cancel); // in case if test has failed + } + catch + { + } + + _session?.Close(); + FancyZonesEditorSession.Files.Restore(); + } + + [TestMethod] + public void Initialize() + { + foreach (var layout in CustomLayouts.CustomLayouts) + { + _session?.ClickEditLayout(layout.Name); + + var hotkeyComboBox = _session?.FindByAccessibilityId(AccessibilityId.HotkeyComboBox); + Assert.IsNotNull(hotkeyComboBox); + + // verify the selected key + string expected = "None"; + if (Hotkeys.LayoutHotkeys.Any(x => x.LayoutId == layout.Uuid)) + { + expected = $"{Hotkeys.LayoutHotkeys.Find(x => x.LayoutId == layout.Uuid).Key}"; + } + + Assert.AreEqual($"{expected}", hotkeyComboBox.Text); + + // verify the available values + hotkeyComboBox.Click(); + + _session?.WaitElementDisplayedByClassName(ClassName.Popup); + var popup = _session?.FindByClassName(ClassName.Popup); + Assert.IsNotNull(popup, "Hotkey combo box wasn't opened"); + + try + { + popup.FindElementByName(expected); // the current value should be available + + // 0 and 1 are assigned, all others should be available + for (int i = 2; i < 10; i++) + { + popup.FindElementByName($"{i}"); + } + } + catch + { + Assert.Fail("Hotkey is missed"); + } + + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(hotkeyComboBox); // let the dialog window close + } + } + + [TestMethod] + public void Assign_Save() + { + var layout = CustomLayouts.CustomLayouts[4]; // a layout without assigned hotkey + _session?.ClickEditLayout(layout.Name); + + // assign hotkey + const string key = "3"; + var hotkeyComboBox = _session?.FindByAccessibilityId(AccessibilityId.HotkeyComboBox); + Assert.IsNotNull(hotkeyComboBox); + hotkeyComboBox.Click(); + + _session?.WaitElementDisplayedByClassName(ClassName.Popup); + var popup = _session?.FindByClassName(ClassName.Popup); + Assert.IsNotNull(popup); + + _session?.Click(popup.FindElementByName($"{key}")!); // assign a free hotkey + Assert.AreEqual(key, hotkeyComboBox.Text); + + // verify the file + _session?.Click(ElementName.Save); + _session?.WaitUntilHidden(hotkeyComboBox); // let the dialog window close + var hotkeys = new LayoutHotkeys(); + var actualData = hotkeys.Read(hotkeys.File); + Assert.IsTrue(actualData.LayoutHotkeys.Contains(new LayoutHotkeyWrapper { Key = int.Parse(key, CultureInfo.InvariantCulture), LayoutId = layout.Uuid })); + + // verify the availability + _session?.ClickEditLayout(CustomLayouts.CustomLayouts[5].Name); + hotkeyComboBox = _session?.FindByAccessibilityId(AccessibilityId.HotkeyComboBox); + Assert.IsNotNull(hotkeyComboBox); + hotkeyComboBox.Click(); + + _session?.WaitElementDisplayedByClassName(ClassName.Popup); + popup = _session?.FindByClassName(ClassName.Popup); + Assert.IsNotNull(popup); + try + { + popup.FindElementByName($"{key}"); // verify the key is not available + Assert.Fail(key, "The assigned key is still available for other layouts."); + } + catch + { + // key not found as expected + } + } + + [TestMethod] + public void Assign_Cancel() + { + var layout = CustomLayouts.CustomLayouts[4]; // a layout without assigned hotkey + _session?.ClickEditLayout(layout.Name); + + // assign a hotkey + const string key = "3"; + var hotkeyComboBox = _session?.FindByAccessibilityId(AccessibilityId.HotkeyComboBox); + Assert.IsNotNull(hotkeyComboBox); + hotkeyComboBox.Click(); + _session?.WaitElementDisplayedByClassName(ClassName.Popup); + var popup = _session?.FindByClassName(ClassName.Popup); + Assert.IsNotNull(popup); + _session?.Click(popup.FindElementByName($"{key}")!); + Assert.AreEqual(key, hotkeyComboBox.Text); + + // verify the file + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(hotkeyComboBox); // let the dialog window close + var hotkeys = new LayoutHotkeys(); + var actualData = hotkeys.Read(hotkeys.File); + Assert.AreEqual(Hotkeys.ToString(), actualData.ToString()); + + // verify the availability + _session?.ClickEditLayout(CustomLayouts.CustomLayouts[5].Name); + hotkeyComboBox = _session?.FindByAccessibilityId(AccessibilityId.HotkeyComboBox); + Assert.IsNotNull(hotkeyComboBox); + hotkeyComboBox.Click(); + _session?.WaitElementDisplayedByClassName(ClassName.Popup); + popup = _session?.FindByClassName(ClassName.Popup); + Assert.IsNotNull(popup); + try + { + popup.FindElementByName($"{key}"); // verify the key is available + } + catch + { + Assert.Fail("The key is not available for other layouts."); + } + } + + [TestMethod] + public void Assign_AllPossibleValues() + { + for (int i = 0; i < 10; i++) + { + string layoutName = $"Layout {i}"; + _session?.ClickEditLayout(layoutName); + + var hotkeyComboBox = _session?.FindByAccessibilityId(AccessibilityId.HotkeyComboBox); + Assert.IsNotNull(hotkeyComboBox); + hotkeyComboBox.Click(); + _session?.WaitElementDisplayedByClassName(ClassName.Popup); + var popup = _session?.FindByClassName(ClassName.Popup); + Assert.IsNotNull(popup); + _session?.Click(popup.FindElementByName($"{i}")!); + + _session?.Click(ElementName.Save); + _session?.WaitUntilHidden(hotkeyComboBox); // let the dialog window close + } + + // check there nothing except None + { + int layout = 10; + string layoutName = $"Layout {layout}"; + _session?.ClickEditLayout(layoutName); + var hotkeyComboBox = _session?.FindByAccessibilityId(AccessibilityId.HotkeyComboBox); + Assert.IsNotNull(hotkeyComboBox); + hotkeyComboBox.Click(); + _session?.WaitElementDisplayedByClassName(ClassName.Popup); + var popup = _session?.FindByClassName(ClassName.Popup); + Assert.IsNotNull(popup); + + for (int i = 0; i < 10; i++) + { + try + { + popup.FindElementByName($"{i}"); + Assert.Fail("The assigned key is still available for other layouts."); + } + catch + { + } + } + + _session?.Click(popup.FindElementByName($"None")!); + _session?.Click(ElementName.Save); + _session?.WaitUntilHidden(hotkeyComboBox); // let the dialog window close + } + } + + [TestMethod] + public void Reset_Save() + { + var layout = CustomLayouts.CustomLayouts[0]; // a layout with assigned hotkey + int assignedKey = Hotkeys.LayoutHotkeys.Find(x => x.LayoutId == layout.Uuid).Key; + _session?.ClickEditLayout(layout.Name); + const string None = "None"; + + // reset the hotkey + var hotkeyComboBox = _session?.FindByAccessibilityId(AccessibilityId.HotkeyComboBox); + Assert.IsNotNull(hotkeyComboBox); + hotkeyComboBox.Click(); + _session?.WaitElementDisplayedByClassName(ClassName.Popup); + var popup = _session?.FindByClassName(ClassName.Popup); + Assert.IsNotNull(popup); + _session?.Click(popup.FindElementByName(None)!); + Assert.AreEqual(None, hotkeyComboBox.Text); + + // verify the file + _session?.Click(ElementName.Save); + _session?.WaitUntilHidden(hotkeyComboBox); // let the dialog window close + var hotkeys = new LayoutHotkeys(); + var actualData = hotkeys.Read(hotkeys.File); + Assert.IsFalse(actualData.LayoutHotkeys.Contains(new LayoutHotkeyWrapper { Key = assignedKey, LayoutId = layout.Uuid })); + + // verify the previously assigned key is available + _session?.ClickEditLayout(CustomLayouts.CustomLayouts[6].Name); + hotkeyComboBox = _session?.FindByAccessibilityId(AccessibilityId.HotkeyComboBox); + Assert.IsNotNull(hotkeyComboBox); + hotkeyComboBox.Click(); + _session?.WaitElementDisplayedByClassName(ClassName.Popup); + popup = _session?.FindByClassName(ClassName.Popup); + Assert.IsNotNull(popup); + try + { + popup.FindElementByName($"{assignedKey}"); // verify the key is available + } + catch + { + Assert.Fail("The key is not available for other layouts."); + } + } + + [TestMethod] + public void Reset_Cancel() + { + var layout = CustomLayouts.CustomLayouts[0]; // a layout with assigned hotkey + int assignedKey = Hotkeys.LayoutHotkeys.Find(x => x.LayoutId == layout.Uuid).Key; + _session?.ClickEditLayout(layout.Name); + const string None = "None"; + + // assign hotkey + var hotkeyComboBox = _session?.FindByAccessibilityId(AccessibilityId.HotkeyComboBox); + Assert.IsNotNull(hotkeyComboBox); + hotkeyComboBox.Click(); + _session?.WaitElementDisplayedByClassName(ClassName.Popup); + var popup = _session?.FindByClassName(ClassName.Popup); + Assert.IsNotNull(popup); + _session?.Click(popup.FindElementByName(None)!); // reset the hotkey + Assert.AreEqual(None, hotkeyComboBox.Text); + + // verify the file + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(hotkeyComboBox); // let the dialog window close + var hotkeys = new LayoutHotkeys(); + var actualData = hotkeys.Read(hotkeys.File); + Assert.IsTrue(actualData.LayoutHotkeys.Contains(new LayoutHotkeyWrapper { Key = assignedKey, LayoutId = layout.Uuid })); + + // verify the previously assigned key is not available + _session?.ClickEditLayout(CustomLayouts.CustomLayouts[6].Name); + hotkeyComboBox = _session?.FindByAccessibilityId(AccessibilityId.HotkeyComboBox); + Assert.IsNotNull(hotkeyComboBox); + hotkeyComboBox.Click(); + _session?.WaitElementDisplayedByClassName(ClassName.Popup); + popup = _session?.FindByClassName(ClassName.Popup); + Assert.IsNotNull(popup); + try + { + popup.FindElementByName($"{assignedKey}"); // verify the key is not available + Assert.Fail("The key is still available for other layouts."); + } + catch + { + // the key is not available as expected + } + } + } +} diff --git a/src/modules/fancyzones/UITests-FancyZonesEditor/RunFancyZonesEditorTest.cs b/src/modules/fancyzones/UITests-FancyZonesEditor/RunFancyZonesEditorTest.cs index a20559f130e1..eb361078f65f 100644 --- a/src/modules/fancyzones/UITests-FancyZonesEditor/RunFancyZonesEditorTest.cs +++ b/src/modules/fancyzones/UITests-FancyZonesEditor/RunFancyZonesEditorTest.cs @@ -1,14 +1,14 @@ -// Copyright (c) Microsoft Corporation +// 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.Collections.Generic; using FancyZonesEditorCommon.Data; -using Microsoft.FancyZonesEditor.UITests; using Microsoft.FancyZonesEditor.UnitTests.Utils; using Microsoft.VisualStudio.TestTools.UnitTesting; +using static Microsoft.FancyZonesEditor.UnitTests.Utils.FancyZonesEditorSession; -namespace UITests_FancyZonesEditor +namespace Microsoft.FancyZonesEditor.UITests { [TestClass] public class RunFancyZonesEditorTest @@ -21,7 +21,7 @@ public static void ClassInitialize(TestContext testContext) { _context = testContext; - // prepare files to launch Editor without errors + // prepare test editor parameters with 2 monitors before launching the editor EditorParameters editorParameters = new EditorParameters(); EditorParameters.ParamsWrapper parameters = new EditorParameters.ParamsWrapper { @@ -45,6 +45,22 @@ public static void ClassInitialize(TestContext testContext) MonitorWidth = 1920, IsSelected = true, }, + new EditorParameters.NativeMonitorDataWrapper + { + Monitor = "monitor-2", + MonitorInstanceId = "instance-id-2", + MonitorSerialNumber = "serial-number-2", + MonitorNumber = 2, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 96, + LeftCoordinate = 1920, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = false, + }, }, }; FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); @@ -56,16 +72,16 @@ public static void ClassInitialize(TestContext testContext) { new LayoutTemplates.TemplateLayoutWrapper { - Type = Constants.TemplateLayoutJsonTags[Constants.TemplateLayout.Empty], + Type = LayoutType.Blank.TypeToString(), }, new LayoutTemplates.TemplateLayoutWrapper { - Type = Constants.TemplateLayoutJsonTags[Constants.TemplateLayout.Focus], + Type = LayoutType.Focus.TypeToString(), ZoneCount = 10, }, new LayoutTemplates.TemplateLayoutWrapper { - Type = Constants.TemplateLayoutJsonTags[Constants.TemplateLayout.Rows], + Type = LayoutType.Rows.TypeToString(), ZoneCount = 2, ShowSpacing = true, Spacing = 10, @@ -73,7 +89,7 @@ public static void ClassInitialize(TestContext testContext) }, new LayoutTemplates.TemplateLayoutWrapper { - Type = Constants.TemplateLayoutJsonTags[Constants.TemplateLayout.Columns], + Type = LayoutType.Columns.TypeToString(), ZoneCount = 2, ShowSpacing = true, Spacing = 20, @@ -81,7 +97,7 @@ public static void ClassInitialize(TestContext testContext) }, new LayoutTemplates.TemplateLayoutWrapper { - Type = Constants.TemplateLayoutJsonTags[Constants.TemplateLayout.Grid], + Type = LayoutType.Grid.TypeToString(), ZoneCount = 4, ShowSpacing = false, Spacing = 10, @@ -89,7 +105,7 @@ public static void ClassInitialize(TestContext testContext) }, new LayoutTemplates.TemplateLayoutWrapper { - Type = Constants.TemplateLayoutJsonTags[Constants.TemplateLayout.PriorityGrid], + Type = LayoutType.PriorityGrid.TypeToString(), ZoneCount = 3, ShowSpacing = true, Spacing = 1, @@ -102,7 +118,22 @@ public static void ClassInitialize(TestContext testContext) CustomLayouts customLayouts = new CustomLayouts(); CustomLayouts.CustomLayoutListWrapper customLayoutListWrapper = new CustomLayouts.CustomLayoutListWrapper { - CustomLayouts = new List { }, + CustomLayouts = new List + { + new CustomLayouts.CustomLayoutWrapper + { + Uuid = "{E7807D0D-6223-4883-B15B-1F3883944C09}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Custom layout", + Info = new CustomLayouts().ToJsonElement(new CustomLayouts.CanvasInfoWrapper + { + RefHeight = 952, + RefWidth = 1500, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + }, }; FancyZonesEditorSession.Files.CustomLayoutsIOHelper.WriteData(customLayouts.Serialize(customLayoutListWrapper)); @@ -144,34 +175,64 @@ public void TestInitialize() [TestCleanup] public void TestCleanup() { - _session?.Close(_context!); + _session?.Close(); } [TestMethod] - public void OpenEditorWindow() // verify the session is initialized + public void OpenNewLayoutDialog() // verify the new layout dialog is opened { - Assert.IsNotNull(_session?.Session); + _session?.Click(_session?.FindByAccessibilityId(AccessibilityId.NewLayoutButton)); + Assert.IsNotNull(_session?.FindByName("Choose layout type")); // check the pane header } [TestMethod] - public void OpenNewLayoutDialog() // verify the new layout dialog is opened + public void OpenEditLayoutDialog() // verify the edit layout dialog is opened { - _session?.Click_CreateNewLayout(); - Assert.IsNotNull(_session?.Session?.FindElementsByName("Choose layout type")); // check the pane header + _session?.ClickEditLayout(TestConstants.TemplateLayoutNames[LayoutType.Grid]); + Assert.IsNotNull(_session?.FindByAccessibilityId(FancyZonesEditorSession.AccessibilityId.DialogTitle)); // check the pane header + Assert.IsNotNull(_session?.FindByName($"Edit '{TestConstants.TemplateLayoutNames[LayoutType.Grid]}'")); // verify it's opened for the correct layout } [TestMethod] - public void OpenEditLayoutDialog() // verify the edit layout dialog is opened + public void OpenEditLayoutDialog_ByContextMenu_TemplateLayout() // verify the edit layout dialog is opened + { + _session?.ClickContextMenuItem(TestConstants.TemplateLayoutNames[LayoutType.Grid], FancyZonesEditorSession.ElementName.Edit); + _session?.WaitElementDisplayedById(FancyZonesEditorSession.AccessibilityId.DialogTitle); + Assert.IsNotNull(_session?.FindByAccessibilityId(FancyZonesEditorSession.AccessibilityId.DialogTitle)); // check the pane header + Assert.IsNotNull(_session?.FindByName($"Edit '{TestConstants.TemplateLayoutNames[LayoutType.Grid]}'")); // verify it's opened for the correct layout + } + + [TestMethod] + public void OpenEditLayoutDialog_ByContextMenu_CustomLayout() // verify the edit layout dialog is opened { - _session?.Click_EditLayout(TestConstants.TemplateLayoutNames[Constants.TemplateLayout.Grid]); - Assert.IsNotNull(_session?.Session?.FindElementByAccessibilityId("EditLayoutDialogTitle")); // check the pane header - Assert.IsNotNull(_session?.Session?.FindElementsByName("Edit 'Grid'")); // verify it's opened for the correct layout + string layoutName = "Custom layout"; + _session?.ClickContextMenuItem(layoutName, FancyZonesEditorSession.ElementName.Edit); + _session?.WaitElementDisplayedById(FancyZonesEditorSession.AccessibilityId.DialogTitle); + Assert.IsNotNull(_session?.FindByAccessibilityId(FancyZonesEditorSession.AccessibilityId.DialogTitle)); // check the pane header + Assert.IsNotNull(_session?.FindByName($"Edit '{layoutName}'")); // verify it's opened for the correct layout } [TestMethod] public void OpenContextMenu() // verify the context menu is opened { - Assert.IsNotNull(_session?.OpenContextMenu(TestConstants.TemplateLayoutNames[Constants.TemplateLayout.Columns])); + Assert.IsNotNull(_session?.OpenContextMenu(TestConstants.TemplateLayoutNames[LayoutType.Columns])); + } + + [TestMethod] + public void ClickMonitor() + { + Assert.IsNotNull(_session?.GetMonitorItem(1)); + Assert.IsNotNull(_session?.GetMonitorItem(2)); + + // verify that the monitor 1 is selected initially + Assert.IsTrue(_session?.GetMonitorItem(1).Selected); + Assert.IsFalse(_session?.GetMonitorItem(2).Selected); + + _session?.ClickMonitor(2); + + // verify that the monitor 2 is selected after click + Assert.IsFalse(_session?.GetMonitorItem(1).Selected); + Assert.IsTrue(_session?.GetMonitorItem(2).Selected); } } } diff --git a/src/modules/fancyzones/UITests-FancyZonesEditor/TemplateLayoutsTests.cs b/src/modules/fancyzones/UITests-FancyZonesEditor/TemplateLayoutsTests.cs new file mode 100644 index 000000000000..8b0cece70cf3 --- /dev/null +++ b/src/modules/fancyzones/UITests-FancyZonesEditor/TemplateLayoutsTests.cs @@ -0,0 +1,463 @@ +// 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.Collections.Generic; +using FancyZonesEditorCommon.Data; +using Microsoft.FancyZonesEditor.UnitTests.Utils; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using OpenQA.Selenium; +using static FancyZonesEditorCommon.Data.AppliedLayouts; +using static FancyZonesEditorCommon.Data.DefaultLayouts; +using static FancyZonesEditorCommon.Data.EditorParameters; +using static FancyZonesEditorCommon.Data.LayoutTemplates; +using static Microsoft.FancyZonesEditor.UnitTests.Utils.FancyZonesEditorSession; + +namespace Microsoft.FancyZonesEditor.UITests +{ + [TestClass] + public class TemplateLayoutsTests + { + private static readonly TemplateLayoutsListWrapper Layouts = new TemplateLayoutsListWrapper + { + LayoutTemplates = new List + { + new TemplateLayoutWrapper + { + Type = LayoutType.Blank.TypeToString(), + }, + new TemplateLayoutWrapper + { + Type = LayoutType.Focus.TypeToString(), + ZoneCount = 10, + }, + new TemplateLayoutWrapper + { + Type = LayoutType.Rows.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 10, + SensitivityRadius = 10, + }, + new TemplateLayoutWrapper + { + Type = LayoutType.Columns.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 20, + SensitivityRadius = 20, + }, + new TemplateLayoutWrapper + { + Type = LayoutType.Grid.TypeToString(), + ZoneCount = 4, + ShowSpacing = false, + Spacing = 10, + SensitivityRadius = 30, + }, + new TemplateLayoutWrapper + { + Type = LayoutType.PriorityGrid.TypeToString(), + ZoneCount = 3, + ShowSpacing = true, + Spacing = 1, + SensitivityRadius = 40, + }, + }, + }; + + private static TestContext? _context; + private static FancyZonesEditorSession? _session; + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + _context = testContext; + } + + [ClassCleanup] + public static void ClassCleanup() + { + FancyZonesEditorSession.Files.Restore(); + _context = null; + } + + [TestInitialize] + public void TestInitialize() + { + LayoutTemplates layoutTemplates = new LayoutTemplates(); + FancyZonesEditorSession.Files.LayoutTemplatesIOHelper.WriteData(layoutTemplates.Serialize(Layouts)); + + // Default layouts should match templates + DefaultLayouts defaultLayouts = new DefaultLayouts(); + DefaultLayoutsListWrapper defaultLayoutsList = new DefaultLayoutsListWrapper + { + DefaultLayouts = new List + { + new DefaultLayoutWrapper + { + MonitorConfiguration = MonitorConfigurationType.Vertical.TypeToString(), + Layout = new DefaultLayoutWrapper.LayoutWrapper + { + Type = LayoutType.Rows.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 10, + SensitivityRadius = 10, + }, + }, + new DefaultLayoutWrapper + { + MonitorConfiguration = MonitorConfigurationType.Horizontal.TypeToString(), + Layout = new DefaultLayoutWrapper.LayoutWrapper + { + Type = LayoutType.PriorityGrid.TypeToString(), + ZoneCount = 3, + ShowSpacing = true, + Spacing = 1, + SensitivityRadius = 40, + }, + }, + }, + }; + FancyZonesEditorSession.Files.DefaultLayoutsIOHelper.WriteData(defaultLayouts.Serialize(defaultLayoutsList)); + + EditorParameters editorParameters = new EditorParameters(); + ParamsWrapper parameters = new ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 192, + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + }, + }; + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); + + // Make sure applied layouts don't replate template settings + AppliedLayouts appliedLayouts = new AppliedLayouts(); + AppliedLayoutsListWrapper appliedLayoutsList = new AppliedLayoutsListWrapper + { + AppliedLayouts = new List + { + new AppliedLayoutWrapper + { + Device = new AppliedLayoutWrapper.DeviceIdWrapper + { + Monitor = "monitor-1", + MonitorInstance = "instance-id-1", + MonitorNumber = 1, + SerialNumber = "serial-number-1", + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + }, + AppliedLayout = new AppliedLayoutWrapper.LayoutWrapper + { + Uuid = "{72409DFC-2B87-469B-AAC4-557273791C26}", + Type = LayoutType.PriorityGrid.TypeToString(), + ZoneCount = 3, + ShowSpacing = true, + Spacing = 1, + SensitivityRadius = 40, + }, + }, + }, + }; + FancyZonesEditorSession.Files.AppliedLayoutsIOHelper.WriteData(appliedLayouts.Serialize(appliedLayoutsList)); + + CustomLayouts customLayouts = new CustomLayouts(); + CustomLayouts.CustomLayoutListWrapper customLayoutListWrapper = new CustomLayouts.CustomLayoutListWrapper + { + CustomLayouts = new List { }, + }; + FancyZonesEditorSession.Files.CustomLayoutsIOHelper.WriteData(customLayouts.Serialize(customLayoutListWrapper)); + + LayoutHotkeys layoutHotkeys = new LayoutHotkeys(); + LayoutHotkeys.LayoutHotkeysWrapper layoutHotkeysWrapper = new LayoutHotkeys.LayoutHotkeysWrapper + { + LayoutHotkeys = new List { }, + }; + FancyZonesEditorSession.Files.LayoutHotkeysIOHelper.WriteData(layoutHotkeys.Serialize(layoutHotkeysWrapper)); + + _session = new FancyZonesEditorSession(_context!); + } + + [TestCleanup] + public void TestCleanup() + { + _session?.Close(); + FancyZonesEditorSession.Files.Restore(); + } + + [TestMethod] + public void ZoneNumber_Initialize() + { + foreach (var (key, name) in TestConstants.TemplateLayoutNames) + { + if (key == LayoutType.Blank) + { + continue; + } + + _session?.ClickEditLayout(name); + + var slider = _session?.FindByAccessibilityId(AccessibilityId.TemplateZoneSlider); + Assert.IsNotNull(slider); + var expected = Layouts.LayoutTemplates.Find(x => x.Type == key.TypeToString()).ZoneCount; + Assert.AreEqual($"{expected}", slider.Text); + + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(slider); // let the dialog window close + } + } + + [TestMethod] + public void ZoneNumber_Save() + { + var type = LayoutType.Columns; + var layout = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString()); + var value = layout.ZoneCount; + var expected = value - 1; + _session?.ClickEditLayout(TestConstants.TemplateLayoutNames[type]); + + var slider = _session?.FindByAccessibilityId(AccessibilityId.TemplateZoneSlider); + Assert.IsNotNull(slider); + slider.SendKeys(Keys.Left); + Assert.AreEqual($"{expected}", slider.Text); + + _session?.Click(ElementName.Save); + _session?.WaitUntilHidden(slider); // let the dialog window close + + // verify the file + var templateLayouts = new LayoutTemplates(); + var data = templateLayouts.Read(templateLayouts.File); + var actual = data.LayoutTemplates.Find(x => x.Type == type.TypeToString()).ZoneCount; + Assert.AreEqual(expected, actual); + } + + [TestMethod] + public void ZoneNumber_Cancel() + { + var type = LayoutType.Rows; + var layout = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString()); + var expected = layout.ZoneCount; + _session?.ClickEditLayout(TestConstants.TemplateLayoutNames[type]); + + var slider = _session?.FindByAccessibilityId(AccessibilityId.TemplateZoneSlider); + Assert.IsNotNull(slider); + slider.SendKeys(Keys.Left); + + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(slider); // let the dialog window close + + // verify the file + var templateLayouts = new LayoutTemplates(); + var data = templateLayouts.Read(templateLayouts.File); + var actual = data.LayoutTemplates.Find(x => x.Type == type.TypeToString()).ZoneCount; + Assert.AreEqual(expected, actual); + } + + [TestMethod] + public void HighlightDistance_Initialize() + { + foreach (var (type, name) in TestConstants.TemplateLayoutNames) + { + if (type == LayoutType.Blank) + { + continue; + } + + _session?.ClickEditLayout(name); + + var slider = _session?.FindByAccessibilityId(AccessibilityId.SensitivitySlider); + Assert.IsNotNull(slider); + var expected = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString()).SensitivityRadius; + Assert.AreEqual($"{expected}", slider.Text); + + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(slider); // let the dialog window close + } + } + + [TestMethod] + public void HighlightDistance_Save() + { + var type = LayoutType.Focus; + var layout = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString()); + var value = layout.SensitivityRadius; + _session?.ClickEditLayout(TestConstants.TemplateLayoutNames[type]); + + var slider = _session?.FindByAccessibilityId(AccessibilityId.SensitivitySlider); + Assert.IsNotNull(slider); + slider.SendKeys(Keys.Right); + + var expected = value + 1; // one step right + Assert.AreEqual($"{expected}", slider.Text); + + _session?.Click(ElementName.Save); + _session?.WaitUntilHidden(slider); // let the dialog window close + + // verify the file + var templateLayouts = new LayoutTemplates(); + var data = templateLayouts.Read(templateLayouts.File); + var actual = data.LayoutTemplates.Find(x => x.Type == type.TypeToString()).SensitivityRadius; + Assert.AreEqual(expected, actual); + } + + [TestMethod] + public void HighlightDistance_Cancel() + { + var type = LayoutType.Focus; + var layout = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString()); + var expected = layout.SensitivityRadius; + _session?.ClickEditLayout(TestConstants.TemplateLayoutNames[type]); + + var slider = _session?.FindByAccessibilityId(AccessibilityId.SensitivitySlider); + Assert.IsNotNull(slider); + slider.SendKeys(Keys.Right); + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(slider); // let the dialog window close + + // verify the file + var templateLayouts = new LayoutTemplates(); + var data = templateLayouts.Read(templateLayouts.File); + var actual = data.LayoutTemplates.Find(x => x.Type == type.TypeToString()).SensitivityRadius; + Assert.AreEqual(expected, actual); + } + + [TestMethod] + public void SpaceAroundZones_Initialize() + { + foreach (var (type, name) in TestConstants.TemplateLayoutNames) + { + if (type == LayoutType.Blank || type == LayoutType.Focus) + { + // only for grid layouts + continue; + } + + _session?.ClickEditLayout(name); + + var slider = _session?.FindByAccessibilityId(AccessibilityId.SpacingSlider); + Assert.IsNotNull(slider); + + var spacingEnabled = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString()).ShowSpacing; + Assert.AreEqual(spacingEnabled, slider.Enabled); + + var expected = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString()).Spacing; + Assert.AreEqual($"{expected}", slider.Text); + + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(slider); // let the dialog window close + } + } + + [TestMethod] + public void SpaceAroundZones_Slider_Save() + { + var type = LayoutType.PriorityGrid; + var layout = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString()); + var expected = layout.Spacing + 1; + _session?.ClickEditLayout(TestConstants.TemplateLayoutNames[type]); + + var slider = _session?.FindByAccessibilityId(AccessibilityId.SpacingSlider); + Assert.IsNotNull(slider); + slider.SendKeys(Keys.Right); + Assert.AreEqual($"{expected}", slider.Text); + + _session?.Click(ElementName.Save); + _session?.WaitUntilHidden(slider); // let the dialog window close + + // verify the file + var templateLayouts = new LayoutTemplates(); + var data = templateLayouts.Read(templateLayouts.File); + var actual = data.LayoutTemplates.Find(x => x.Type == type.TypeToString()).Spacing; + Assert.AreEqual(expected, actual); + } + + [TestMethod] + public void SpaceAroundZones_Slider_Cancel() + { + var type = LayoutType.PriorityGrid; + var layout = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString()); + var expected = layout.Spacing; + _session?.ClickEditLayout(TestConstants.TemplateLayoutNames[type]); + + var slider = _session?.FindByAccessibilityId(AccessibilityId.SpacingSlider); + Assert.IsNotNull(slider); + slider.SendKeys(Keys.Right); + Assert.AreEqual($"{expected + 1}", slider.Text); + + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(slider); // let the dialog window close + + // verify the file + var templateLayouts = new LayoutTemplates(); + var data = templateLayouts.Read(templateLayouts.File); + var actual = data.LayoutTemplates.Find(x => x.Type == type.TypeToString()).Spacing; + Assert.AreEqual(expected, actual); + } + + [TestMethod] + public void SpaceAroundZones_Toggle_Save() + { + var type = LayoutType.PriorityGrid; + var layout = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString()); + var expected = !layout.ShowSpacing; + _session?.ClickEditLayout(TestConstants.TemplateLayoutNames[type]); + + var toggle = _session?.FindByAccessibilityId(AccessibilityId.SpacingToggle); + Assert.IsNotNull(toggle); + toggle.Click(); + Assert.AreEqual(expected, toggle.Selected); + Assert.AreEqual(expected, _session?.FindByAccessibilityId(AccessibilityId.SpacingSlider)?.Enabled); + + _session?.Click(ElementName.Save); + _session?.WaitUntilHidden(toggle); // let the dialog window close + + // verify the file + var templateLayouts = new LayoutTemplates(); + var data = templateLayouts.Read(templateLayouts.File); + var actual = data.LayoutTemplates.Find(x => x.Type == type.TypeToString()).ShowSpacing; + Assert.AreEqual(expected, actual); + } + + [TestMethod] + public void SpaceAroundZones_Toggle_Cancel() + { + var type = LayoutType.PriorityGrid; + var layout = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString()); + var expected = layout.ShowSpacing; + _session?.ClickEditLayout(TestConstants.TemplateLayoutNames[type]); + + var toggle = _session?.FindByAccessibilityId(AccessibilityId.SpacingToggle); + Assert.IsNotNull(toggle); + toggle.Click(); + Assert.AreNotEqual(expected, toggle.Selected); + Assert.AreNotEqual(expected, _session?.FindByAccessibilityId(AccessibilityId.SpacingSlider)?.Enabled); + + _session?.Click(ElementName.Cancel); + _session?.WaitUntilHidden(toggle); // let the dialog window close + + // verify the file + var templateLayouts = new LayoutTemplates(); + var data = templateLayouts.Read(templateLayouts.File); + var actual = data.LayoutTemplates.Find(x => x.Type == type.TypeToString()).ShowSpacing; + Assert.AreEqual(expected, actual); + } + } +} diff --git a/src/modules/fancyzones/UITests-FancyZonesEditor/TestConstants.cs b/src/modules/fancyzones/UITests-FancyZonesEditor/TestConstants.cs index 1a6b9b5d66f9..44fb4608991e 100644 --- a/src/modules/fancyzones/UITests-FancyZonesEditor/TestConstants.cs +++ b/src/modules/fancyzones/UITests-FancyZonesEditor/TestConstants.cs @@ -3,20 +3,20 @@ // See the LICENSE file in the project root for more information. using System.Collections.Generic; -using static FancyZonesEditorCommon.Data.Constants; +using FancyZonesEditorCommon.Data; namespace Microsoft.FancyZonesEditor.UITests { public static class TestConstants { - public static readonly Dictionary TemplateLayoutNames = new Dictionary() + public static readonly Dictionary TemplateLayoutNames = new Dictionary() { - { TemplateLayout.Empty, "No layout" }, - { TemplateLayout.Focus, "Focus" }, - { TemplateLayout.Rows, "Rows" }, - { TemplateLayout.Columns, "Columns" }, - { TemplateLayout.Grid, "Grid" }, - { TemplateLayout.PriorityGrid, "PriorityGrid" }, + { LayoutType.Blank, "No layout" }, + { LayoutType.Focus, "Focus" }, + { LayoutType.Rows, "Rows" }, + { LayoutType.Columns, "Columns" }, + { LayoutType.Grid, "Grid" }, + { LayoutType.PriorityGrid, "Priority Grid" }, }; } } diff --git a/src/modules/fancyzones/UITests-FancyZonesEditor/UIInitializationTests.cs b/src/modules/fancyzones/UITests-FancyZonesEditor/UIInitializationTests.cs new file mode 100644 index 000000000000..6c35a7608c9b --- /dev/null +++ b/src/modules/fancyzones/UITests-FancyZonesEditor/UIInitializationTests.cs @@ -0,0 +1,849 @@ +// 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.Collections.Generic; +using System.Globalization; +using FancyZonesEditorCommon.Data; +using Microsoft.FancyZonesEditor.UnitTests.Utils; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using static FancyZonesEditorCommon.Data.EditorParameters; +using static Microsoft.FancyZonesEditor.UnitTests.Utils.FancyZonesEditorSession; + +namespace Microsoft.FancyZonesEditor.UITests +{ + [TestClass] + public class UIInitializationTests + { + private static TestContext? _context; + private static FancyZonesEditorSession? _session; + + [ClassInitialize] + public static void ClassInitialize(TestContext testContext) + { + _context = testContext; + } + + [ClassCleanup] + public static void ClassCleanup() + { + _context = null; + } + + [TestInitialize] + public void TestInitialize() + { + LayoutTemplates layoutTemplates = new LayoutTemplates(); + LayoutTemplates.TemplateLayoutsListWrapper templateLayoutsListWrapper = new LayoutTemplates.TemplateLayoutsListWrapper + { + LayoutTemplates = new List + { + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Blank.TypeToString(), + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Focus.TypeToString(), + ZoneCount = 10, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Rows.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 10, + SensitivityRadius = 10, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Columns.TypeToString(), + ZoneCount = 2, + ShowSpacing = true, + Spacing = 20, + SensitivityRadius = 20, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.Grid.TypeToString(), + ZoneCount = 4, + ShowSpacing = false, + Spacing = 10, + SensitivityRadius = 30, + }, + new LayoutTemplates.TemplateLayoutWrapper + { + Type = LayoutType.PriorityGrid.TypeToString(), + ZoneCount = 3, + ShowSpacing = true, + Spacing = 1, + SensitivityRadius = 40, + }, + }, + }; + FancyZonesEditorSession.Files.LayoutTemplatesIOHelper.WriteData(layoutTemplates.Serialize(templateLayoutsListWrapper)); + + CustomLayouts customLayouts = new CustomLayouts(); + CustomLayouts.CustomLayoutListWrapper customLayoutListWrapper = new CustomLayouts.CustomLayoutListWrapper + { + CustomLayouts = new List { }, + }; + FancyZonesEditorSession.Files.CustomLayoutsIOHelper.WriteData(customLayouts.Serialize(customLayoutListWrapper)); + + DefaultLayouts defaultLayouts = new DefaultLayouts(); + DefaultLayouts.DefaultLayoutsListWrapper defaultLayoutsListWrapper = new DefaultLayouts.DefaultLayoutsListWrapper + { + DefaultLayouts = new List { }, + }; + FancyZonesEditorSession.Files.DefaultLayoutsIOHelper.WriteData(defaultLayouts.Serialize(defaultLayoutsListWrapper)); + + LayoutHotkeys layoutHotkeys = new LayoutHotkeys(); + LayoutHotkeys.LayoutHotkeysWrapper layoutHotkeysWrapper = new LayoutHotkeys.LayoutHotkeysWrapper + { + LayoutHotkeys = new List { }, + }; + FancyZonesEditorSession.Files.LayoutHotkeysIOHelper.WriteData(layoutHotkeys.Serialize(layoutHotkeysWrapper)); + + AppliedLayouts appliedLayouts = new AppliedLayouts(); + AppliedLayouts.AppliedLayoutsListWrapper appliedLayoutsWrapper = new AppliedLayouts.AppliedLayoutsListWrapper + { + AppliedLayouts = new List { }, + }; + FancyZonesEditorSession.Files.AppliedLayoutsIOHelper.WriteData(appliedLayouts.Serialize(appliedLayoutsWrapper)); + } + + [TestCleanup] + public void TestCleanup() + { + _session?.Close(); + FancyZonesEditorSession.Files.Restore(); + } + + [TestMethod] + public void EditorParams_VerifySelectedMonitor() + { + EditorParameters editorParameters = new EditorParameters(); + ParamsWrapper parameters = new ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 96, + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = false, + }, + new NativeMonitorDataWrapper + { + Monitor = "monitor-2", + MonitorInstanceId = "instance-id-2", + MonitorSerialNumber = "serial-number-2", + MonitorNumber = 2, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 96, + LeftCoordinate = 1920, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + }, + }; + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); + + _session = new FancyZonesEditorSession(_context!); + + Assert.IsFalse(_session.GetMonitorItem(1)?.Selected); + Assert.IsTrue(_session.GetMonitorItem(2)?.Selected); + } + + [TestMethod] + public void EditorParams_VerifyMonitorScaling() + { + EditorParameters editorParameters = new EditorParameters(); + ParamsWrapper parameters = new ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 192, // 200% scaling + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + }, + }; + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); + + _session = new FancyZonesEditorSession(_context!); + var monitor = _session.GetMonitorItem(1); + var scaling = monitor.FindElementByAccessibilityId("ScalingText"); + Assert.AreEqual("200%", scaling.Text); + } + + [TestMethod] + public void EditorParams_VerifyMonitorResolution() + { + EditorParameters editorParameters = new EditorParameters(); + ParamsWrapper parameters = new ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 192, + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + }, + }; + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); + + _session = new FancyZonesEditorSession(_context!); + var monitor = _session.GetMonitorItem(1); + var resolution = monitor.FindElementByAccessibilityId("ResolutionText"); + Assert.AreEqual("1920 × 1080", resolution.Text); + } + + [TestMethod] + public void EditorParams_SpanAcrossMonitors() + { + EditorParameters editorParameters = new EditorParameters(); + ParamsWrapper parameters = new ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = true, + Monitors = new List + { + new NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 192, + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + }, + }; + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); + + _session = new FancyZonesEditorSession(_context!); + var monitor = _session.GetMonitorItem(1); + Assert.IsNotNull(monitor); + Assert.IsTrue(monitor.Selected); + } + + [TestMethod] + public void AppliedLayouts_LayoutsApplied() + { + EditorParameters editorParameters = new EditorParameters(); + ParamsWrapper parameters = new ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 96, + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + new NativeMonitorDataWrapper + { + Monitor = "monitor-2", + MonitorInstanceId = "instance-id-2", + MonitorSerialNumber = "serial-number-2", + MonitorNumber = 2, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 96, + LeftCoordinate = 1920, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = false, + }, + }, + }; + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); + + CustomLayouts customLayouts = new CustomLayouts(); + CustomLayouts.CustomLayoutListWrapper customLayoutListWrapper = new CustomLayouts.CustomLayoutListWrapper + { + CustomLayouts = new List + { + new CustomLayouts.CustomLayoutWrapper + { + Uuid = "{0D6D2F58-9184-4804-81E4-4E4CC3476DC1}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Layout 0", + Info = new CustomLayouts().ToJsonElement(new CustomLayouts.CanvasInfoWrapper + { + RefHeight = 1080, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + }, + }; + FancyZonesEditorSession.Files.CustomLayoutsIOHelper.WriteData(customLayouts.Serialize(customLayoutListWrapper)); + + AppliedLayouts appliedLayouts = new AppliedLayouts(); + AppliedLayouts.AppliedLayoutsListWrapper appliedLayoutsWrapper = new AppliedLayouts.AppliedLayoutsListWrapper + { + AppliedLayouts = new List + { + new AppliedLayouts.AppliedLayoutWrapper + { + Device = new AppliedLayouts.AppliedLayoutWrapper.DeviceIdWrapper + { + Monitor = "monitor-1", + MonitorInstance = "instance-id-1", + SerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + }, + AppliedLayout = new AppliedLayouts.AppliedLayoutWrapper.LayoutWrapper + { + Uuid = "{00000000-0000-0000-0000-000000000000}", + Type = LayoutType.Columns.TypeToString(), + ShowSpacing = true, + Spacing = 10, + ZoneCount = 1, + SensitivityRadius = 20, + }, + }, + new AppliedLayouts.AppliedLayoutWrapper + { + Device = new AppliedLayouts.AppliedLayoutWrapper.DeviceIdWrapper + { + Monitor = "monitor-2", + MonitorInstance = "instance-id-2", + SerialNumber = "serial-number-2", + MonitorNumber = 2, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + }, + AppliedLayout = new AppliedLayouts.AppliedLayoutWrapper.LayoutWrapper + { + Uuid = customLayoutListWrapper.CustomLayouts[0].Uuid, + Type = LayoutType.Custom.TypeToString(), + }, + }, + }, + }; + FancyZonesEditorSession.Files.AppliedLayoutsIOHelper.WriteData(appliedLayouts.Serialize(appliedLayoutsWrapper)); + + _session = new FancyZonesEditorSession(_context!); + + // check layout on monitor 1 + var layoutOnMonitor1 = _session?.GetLayout(TestConstants.TemplateLayoutNames[LayoutType.Columns]); + Assert.IsNotNull(layoutOnMonitor1); + Assert.IsTrue(layoutOnMonitor1.Selected); + + // check layout on monitor 2 + _session?.ClickMonitor(2); + var layoutOnMonitor2 = _session?.GetLayout(customLayoutListWrapper.CustomLayouts[0].Name); + Assert.IsNotNull(layoutOnMonitor2); + Assert.IsTrue(layoutOnMonitor2.Selected); + } + + [TestMethod] + public void AppliedLayouts_CustomLayoutsApplied_LayoutIdNotFound() + { + EditorParameters editorParameters = new EditorParameters(); + ParamsWrapper parameters = new ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 96, + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + }, + }; + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); + + CustomLayouts customLayouts = new CustomLayouts(); + CustomLayouts.CustomLayoutListWrapper customLayoutListWrapper = new CustomLayouts.CustomLayoutListWrapper + { + CustomLayouts = new List + { + new CustomLayouts.CustomLayoutWrapper + { + Uuid = "{0D6D2F58-9184-4804-81E4-4E4CC3476DC1}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Layout 0", + Info = new CustomLayouts().ToJsonElement(new CustomLayouts.CanvasInfoWrapper + { + RefHeight = 1080, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + }, + }; + FancyZonesEditorSession.Files.CustomLayoutsIOHelper.WriteData(customLayouts.Serialize(customLayoutListWrapper)); + + AppliedLayouts appliedLayouts = new AppliedLayouts(); + AppliedLayouts.AppliedLayoutsListWrapper appliedLayoutsWrapper = new AppliedLayouts.AppliedLayoutsListWrapper + { + AppliedLayouts = new List + { + new AppliedLayouts.AppliedLayoutWrapper + { + Device = new AppliedLayouts.AppliedLayoutWrapper.DeviceIdWrapper + { + Monitor = "monitor-1", + MonitorInstance = "instance-id-1", + SerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + }, + AppliedLayout = new AppliedLayouts.AppliedLayoutWrapper.LayoutWrapper + { + Uuid = "{00000000-0000-0000-0000-000000000000}", + Type = LayoutType.Custom.TypeToString(), + }, + }, + }, + }; + FancyZonesEditorSession.Files.AppliedLayoutsIOHelper.WriteData(appliedLayouts.Serialize(appliedLayoutsWrapper)); + + _session = new FancyZonesEditorSession(_context!); + + var emptyLayout = _session?.GetLayout(TestConstants.TemplateLayoutNames[LayoutType.Blank]); + Assert.IsNotNull(emptyLayout); + Assert.IsTrue(emptyLayout.Selected); + } + + [TestMethod] + public void AppliedLayouts_NoLayoutsApplied_CustomDefaultLayout() + { + EditorParameters editorParameters = new EditorParameters(); + ParamsWrapper parameters = new ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 96, + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + }, + }; + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); + + CustomLayouts customLayouts = new CustomLayouts(); + CustomLayouts.CustomLayoutListWrapper customLayoutListWrapper = new CustomLayouts.CustomLayoutListWrapper + { + CustomLayouts = new List + { + new CustomLayouts.CustomLayoutWrapper + { + Uuid = "{0D6D2F58-9184-4804-81E4-4E4CC3476DC1}", + Type = CustomLayout.Canvas.TypeToString(), + Name = "Layout 0", + Info = new CustomLayouts().ToJsonElement(new CustomLayouts.CanvasInfoWrapper + { + RefHeight = 1080, + RefWidth = 1920, + SensitivityRadius = 10, + Zones = new List { }, + }), + }, + }, + }; + FancyZonesEditorSession.Files.CustomLayoutsIOHelper.WriteData(customLayouts.Serialize(customLayoutListWrapper)); + + DefaultLayouts defaultLayouts = new DefaultLayouts(); + DefaultLayouts.DefaultLayoutsListWrapper defaultLayoutsListWrapper = new DefaultLayouts.DefaultLayoutsListWrapper + { + DefaultLayouts = new List + { + new DefaultLayouts.DefaultLayoutWrapper + { + MonitorConfiguration = MonitorConfigurationType.Horizontal.TypeToString(), + Layout = new DefaultLayouts.DefaultLayoutWrapper.LayoutWrapper + { + Type = LayoutType.Custom.TypeToString(), + Uuid = customLayoutListWrapper.CustomLayouts[0].Uuid, + }, + }, + }, + }; + FancyZonesEditorSession.Files.DefaultLayoutsIOHelper.WriteData(defaultLayouts.Serialize(defaultLayoutsListWrapper)); + + _session = new FancyZonesEditorSession(_context!); + + var defaultLayout = _session?.GetLayout(customLayoutListWrapper.CustomLayouts[0].Name); + Assert.IsNotNull(defaultLayout); + Assert.IsTrue(defaultLayout.Selected); + } + + [TestMethod] + public void AppliedLayouts_NoLayoutsApplied_TemplateDefaultLayout() + { + EditorParameters editorParameters = new EditorParameters(); + ParamsWrapper parameters = new ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 96, + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + }, + }; + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); + + DefaultLayouts defaultLayouts = new DefaultLayouts(); + DefaultLayouts.DefaultLayoutsListWrapper defaultLayoutsListWrapper = new DefaultLayouts.DefaultLayoutsListWrapper + { + DefaultLayouts = new List + { + new DefaultLayouts.DefaultLayoutWrapper + { + MonitorConfiguration = MonitorConfigurationType.Horizontal.TypeToString(), + Layout = new DefaultLayouts.DefaultLayoutWrapper.LayoutWrapper + { + Type = LayoutType.Grid.TypeToString(), + ZoneCount = 6, + ShowSpacing = true, + Spacing = 5, + SensitivityRadius = 20, + }, + }, + }, + }; + FancyZonesEditorSession.Files.DefaultLayoutsIOHelper.WriteData(defaultLayouts.Serialize(defaultLayoutsListWrapper)); + + _session = new FancyZonesEditorSession(_context!); + + var defaultLayout = _session?.GetLayout(TestConstants.TemplateLayoutNames[LayoutType.Grid]); + Assert.IsNotNull(defaultLayout); + Assert.IsTrue(defaultLayout.Selected); + + // check the number of zones and spacing + _session?.ClickEditLayout(TestConstants.TemplateLayoutNames[LayoutType.Grid]); + Assert.AreEqual(defaultLayoutsListWrapper.DefaultLayouts[0].Layout.ZoneCount, int.Parse(_session?.FindByAccessibilityId(AccessibilityId.TemplateZoneSlider)?.Text!, CultureInfo.InvariantCulture)); + Assert.AreEqual(defaultLayoutsListWrapper.DefaultLayouts[0].Layout.Spacing, int.Parse(_session?.FindByAccessibilityId(AccessibilityId.SpacingSlider)?.Text!, CultureInfo.InvariantCulture)); + Assert.AreEqual(defaultLayoutsListWrapper.DefaultLayouts[0].Layout.ShowSpacing, _session?.FindByAccessibilityId(AccessibilityId.SpacingSlider)?.Enabled); + Assert.AreEqual(defaultLayoutsListWrapper.DefaultLayouts[0].Layout.ShowSpacing, _session?.FindByAccessibilityId(AccessibilityId.SpacingToggle)?.Selected); + Assert.AreEqual(defaultLayoutsListWrapper.DefaultLayouts[0].Layout.SensitivityRadius, int.Parse(_session?.FindByAccessibilityId(AccessibilityId.SensitivitySlider)?.Text!, CultureInfo.InvariantCulture)); + Assert.IsNotNull(_session?.GetHorizontalDefaultButton(true)); + } + + [TestMethod] + public void AppliedLayouts_VerifyDisconnectedMonitorsLayoutsAreNotChanged() + { + EditorParameters editorParameters = new EditorParameters(); + ParamsWrapper parameters = new ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 96, + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + }, + }; + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); + + AppliedLayouts appliedLayouts = new AppliedLayouts(); + AppliedLayouts.AppliedLayoutsListWrapper appliedLayoutsWrapper = new AppliedLayouts.AppliedLayoutsListWrapper + { + AppliedLayouts = new List + { + new AppliedLayouts.AppliedLayoutWrapper + { + Device = new AppliedLayouts.AppliedLayoutWrapper.DeviceIdWrapper + { + Monitor = "monitor-2", + MonitorInstance = "instance-id-2", + SerialNumber = "serial-number-2", + MonitorNumber = 2, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + }, + AppliedLayout = new AppliedLayouts.AppliedLayoutWrapper.LayoutWrapper + { + Uuid = "{00000000-0000-0000-0000-000000000000}", + Type = LayoutType.Focus.TypeToString(), + ShowSpacing = true, + Spacing = 10, + ZoneCount = 4, + SensitivityRadius = 30, + }, + }, + new AppliedLayouts.AppliedLayoutWrapper + { + Device = new AppliedLayouts.AppliedLayoutWrapper.DeviceIdWrapper + { + Monitor = "monitor-3", + MonitorInstance = "instance-id-3", + SerialNumber = "serial-number-3", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + }, + AppliedLayout = new AppliedLayouts.AppliedLayoutWrapper.LayoutWrapper + { + Uuid = "{00000000-0000-0000-0000-000000000000}", + Type = LayoutType.Columns.TypeToString(), + ShowSpacing = true, + Spacing = 10, + ZoneCount = 1, + SensitivityRadius = 20, + }, + }, + }, + }; + FancyZonesEditorSession.Files.AppliedLayoutsIOHelper.WriteData(appliedLayouts.Serialize(appliedLayoutsWrapper)); + + _session = new FancyZonesEditorSession(_context!); + _session?.Click(_session?.GetLayout(TestConstants.TemplateLayoutNames[LayoutType.Rows])!); + + // check the file + var data = appliedLayouts.Read(appliedLayouts.File); + Assert.AreEqual(parameters.Monitors.Count + appliedLayoutsWrapper.AppliedLayouts.Count, data.AppliedLayouts.Count); + + foreach (var monitor in parameters.Monitors) + { + Assert.IsNotNull(data.AppliedLayouts.Find(x => x.Device.Monitor == monitor.Monitor)); + } + + foreach (var layout in appliedLayoutsWrapper.AppliedLayouts) + { + Assert.IsNotNull(data.AppliedLayouts.Find(x => x.Device.Monitor == layout.Device.Monitor)); + } + } + + [TestMethod] + public void AppliedLayouts_VerifyOtherVirtualDesktopsAreNotChanged() + { + string virtualDesktop1 = "{11111111-1111-1111-1111-111111111111}"; + string virtualDesktop2 = "{22222222-2222-2222-2222-222222222222}"; + + EditorParameters editorParameters = new EditorParameters(); + ParamsWrapper parameters = new ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = virtualDesktop1, + Dpi = 96, + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + }, + }; + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); + + AppliedLayouts appliedLayouts = new AppliedLayouts(); + AppliedLayouts.AppliedLayoutsListWrapper appliedLayoutsWrapper = new AppliedLayouts.AppliedLayoutsListWrapper + { + AppliedLayouts = new List + { + new AppliedLayouts.AppliedLayoutWrapper + { + Device = new AppliedLayouts.AppliedLayoutWrapper.DeviceIdWrapper + { + Monitor = "monitor-1", + MonitorInstance = "instance-id-1", + SerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = virtualDesktop2, + }, + AppliedLayout = new AppliedLayouts.AppliedLayoutWrapper.LayoutWrapper + { + Uuid = "{00000000-0000-0000-0000-000000000000}", + Type = LayoutType.Focus.TypeToString(), + ShowSpacing = true, + Spacing = 10, + ZoneCount = 4, + SensitivityRadius = 30, + }, + }, + }, + }; + FancyZonesEditorSession.Files.AppliedLayoutsIOHelper.WriteData(appliedLayouts.Serialize(appliedLayoutsWrapper)); + + _session = new FancyZonesEditorSession(_context!); + _session?.Click(_session?.GetLayout(TestConstants.TemplateLayoutNames[LayoutType.Rows])!); + + // check the file + var data = appliedLayouts.Read(appliedLayouts.File); + Assert.AreEqual(parameters.Monitors.Count + appliedLayoutsWrapper.AppliedLayouts.Count, data.AppliedLayouts.Count); + Assert.IsNotNull(data.AppliedLayouts.Find(x => x.Device.VirtualDesktop == virtualDesktop1)); + Assert.IsNotNull(data.AppliedLayouts.Find(x => x.Device.VirtualDesktop == virtualDesktop2)); + Assert.AreEqual(appliedLayoutsWrapper.AppliedLayouts[0].AppliedLayout.Type, data.AppliedLayouts.Find(x => x.Device.VirtualDesktop == virtualDesktop2).AppliedLayout.Type); + Assert.AreEqual(LayoutType.Rows.TypeToString(), data.AppliedLayouts.Find(x => x.Device.VirtualDesktop == virtualDesktop1).AppliedLayout.Type); + } + + [TestMethod] + public void FirstLaunch() + { + EditorParameters editorParameters = new EditorParameters(); + ParamsWrapper parameters = new ParamsWrapper + { + ProcessId = 1, + SpanZonesAcrossMonitors = false, + Monitors = new List + { + new NativeMonitorDataWrapper + { + Monitor = "monitor-1", + MonitorInstanceId = "instance-id-1", + MonitorSerialNumber = "serial-number-1", + MonitorNumber = 1, + VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}", + Dpi = 192, // 200% scaling + LeftCoordinate = 0, + TopCoordinate = 0, + WorkAreaHeight = 1040, + WorkAreaWidth = 1920, + MonitorHeight = 1080, + MonitorWidth = 1920, + IsSelected = true, + }, + }, + }; + FancyZonesEditorSession.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters)); + + // files not yet exist + FancyZonesEditorSession.Files.LayoutTemplatesIOHelper.DeleteFile(); + FancyZonesEditorSession.Files.CustomLayoutsIOHelper.DeleteFile(); + FancyZonesEditorSession.Files.LayoutHotkeysIOHelper.DeleteFile(); + FancyZonesEditorSession.Files.DefaultLayoutsIOHelper.DeleteFile(); + + // verify editor opens without errors + _session = new FancyZonesEditorSession(_context!); + Assert.IsNotNull(_session.FindByAccessibilityId(FancyZonesEditorSession.AccessibilityId.MainWindow)); + } + } +} diff --git a/src/modules/fancyzones/UITests-FancyZonesEditor/Utils/FancyZonesEditorSession.cs b/src/modules/fancyzones/UITests-FancyZonesEditor/Utils/FancyZonesEditorSession.cs index e87c5576f3d2..8cd542eba3d8 100644 --- a/src/modules/fancyzones/UITests-FancyZonesEditor/Utils/FancyZonesEditorSession.cs +++ b/src/modules/fancyzones/UITests-FancyZonesEditor/Utils/FancyZonesEditorSession.cs @@ -1,23 +1,33 @@ -// Copyright (c) Microsoft Corporation +// 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.Collections.ObjectModel; +using System.Diagnostics; +using System.Globalization; using System.IO; using System.Reflection; +using System.Xml.Linq; +using FancyZonesEditorCommon.Data; using Microsoft.FancyZonesEditor.UITests.Utils; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Appium; using OpenQA.Selenium.Appium.Windows; using OpenQA.Selenium.Interactions; +using OpenQA.Selenium.Support.UI; namespace Microsoft.FancyZonesEditor.UnitTests.Utils { public class FancyZonesEditorSession { - protected const string WindowsApplicationDriverUrl = "http://127.0.0.1:4723"; - private const string FancyZonesEditorPath = @"\..\..\..\PowerToys.FancyZonesEditor.exe"; + private const string WindowsApplicationDriverUrl = "http://127.0.0.1:4723"; + private const string FancyZonesEditorName = "PowerToys.FancyZonesEditor"; + private const string FancyZonesEditorPath = @"\..\..\..\" + FancyZonesEditorName + ".exe"; + private TestContext context; + + private WindowsDriver Session { get; } private static FancyZonesEditorFiles? _files; @@ -34,9 +44,81 @@ public static FancyZonesEditorFiles Files } } - public WindowsDriver? Session { get; } + public static class AccessibilityId + { + // main window + public const string MainWindow = "MainWindow1"; + public const string Monitors = "Monitors"; + public const string NewLayoutButton = "NewLayoutButton"; + + // layout card + public const string EditLayoutButton = "EditLayoutButton"; + + // edit layout window: common for template and custom layouts + public const string DialogTitle = "EditLayoutDialogTitle"; + public const string SensitivitySlider = "SensitivityInput"; + public const string SpacingSlider = "Spacing"; + public const string SpacingToggle = "spaceAroundSetting"; + public const string HorizontalDefaultButtonUnchecked = "SetLayoutAsHorizontalDefaultButton"; + public const string VerticalDefaultButtonUnchecked = "SetLayoutAsVerticalDefaultButton"; + public const string HorizontalDefaultButtonChecked = "HorizontalDefaultLayoutButton"; + public const string VerticalDefaultButtonChecked = "VerticalDefaultLayoutButton"; + + // edit template layout window + public const string CopyTemplate = "createFromTemplateLayoutButton"; + public const string TemplateZoneSlider = "TemplateZoneCount"; + + // edit custom layout window + public const string DuplicateLayoutButton = "duplicateLayoutButton"; + public const string DeleteLayoutButton = "deleteLayoutButton"; + public const string KeySelectionComboBox = "quickKeySelectionComboBox"; + public const string EditZonesButton = "editZoneLayoutButton"; + public const string DeleteTextButton = "DeleteButton"; + public const string HotkeyComboBox = "quickKeySelectionComboBox"; + public const string NewZoneButton = "newZoneButton"; + public const string TopRightCorner = "NEResize"; + + // layout creation dialog + public const string GridRadioButton = "GridLayoutRadioButton"; + public const string CanvasRadioButton = "CanvasLayoutRadioButton"; + + // confirmation dialog + public const string PrimaryButton = "PrimaryButton"; + public const string SecondaryButton = "SecondaryButton"; + } + + public static class ElementName + { + public const string Save = "Save"; + public const string Cancel = "Cancel"; + + // context menu + public const string Edit = "Edit"; + public const string EditZones = "Edit zones"; + public const string Delete = "Delete"; + public const string Duplicate = "Duplicate"; + public const string CreateCustomLayout = "Create custom layout"; + + // canvas layout editor + public const string CanvasEditorWindow = "Canvas layout editor"; + + // grid layout editor + public const string GridLayoutEditor = "Grid layout editor"; + public const string MergeZonesButton = "Merge zones"; + } + + public static class ClassName + { + public const string ContextMenu = "ContextMenu"; + public const string TextBox = "TextBox"; + public const string Popup = "Popup"; - public WindowsElement? MainEditorWindow { get; } + // layout editor + public const string CanvasZone = "CanvasZone"; + public const string GridZone = "GridZone"; + public const string Button = "Button"; + public const string Thumb = "Thumb"; + } public FancyZonesEditorSession(TestContext testContext) { @@ -60,78 +142,468 @@ public FancyZonesEditorSession(TestContext testContext) testContext.WriteLine("Session: " + Session.SessionId.ToString()); testContext.WriteLine("Title: " + Session.Title); - // Set implicit timeout to make element search to retry every 500 ms - Session.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(3); + context = testContext; + } - // Find main editor window + public void Close() + { + // Close the session try { - MainEditorWindow = Session.FindElementByAccessibilityId("MainWindow1"); + // in case if something went wrong and an error message is shown + var dialog = Session.FindElementByName("Editor data parsing error."); + Session.CloseApp(); // will close the dialog + + // session can't access new Editor instance created after closing the dialog + // kill the process + IntPtr appTopLevelWindowHandle = IntPtr.Zero; + foreach (Process clsProcess in Process.GetProcesses()) + { + if (clsProcess.ProcessName.Equals(FancyZonesEditorName, StringComparison.OrdinalIgnoreCase)) + { + clsProcess.Kill(); + break; + } + } } catch { - Assert.IsNotNull(MainEditorWindow, "Main editor window not found"); } + + try + { + // FZEditor application can be closed by explicitly closing main editor window + var mainEditorWindow = Session.FindElementByAccessibilityId(AccessibilityId.MainWindow); + mainEditorWindow?.SendKeys(Keys.Alt + Keys.F4); + } + catch (Exception ex) + { + context.WriteLine("Unable to close main window. ", ex.Message); + } + + Session.Quit(); + Session.Dispose(); } - public void Close(TestContext testContext) + public WindowsElement? GetLayout(string layoutName) { - // Close the session - if (Session != null) + try + { + return Session.FindElementByName(layoutName); + } + catch (Exception) + { + context.WriteLine("Layout " + layoutName + " not found"); + return null; + } + } + + public WindowsElement OpenContextMenu(string layoutName) + { + RightClickLayout(layoutName); + return Session.FindElementByClassName(ClassName.ContextMenu); + } + + public WindowsElement? GetMonitorsList() + { + return FindByAccessibilityId(AccessibilityId.Monitors); + } + + public WindowsElement GetMonitorItem(int monitorNumber) + { + try + { + var monitorsList = GetMonitorsList(); + Assert.IsNotNull(monitorsList, "Monitors list not found"); + var listItem = monitorsList?.FindElementByName($"{monitorNumber}"); + Assert.IsNotNull(listItem, "Monitor " + monitorNumber + " not found"); + return (WindowsElement)listItem; + } + catch (Exception) + { + Assert.Fail("Monitor " + monitorNumber + " not found"); + return null; + } + } + + public WindowsElement? GetHorizontalDefaultButton(bool isChecked) + { + if (isChecked) + { + return FindByAccessibilityId(AccessibilityId.HorizontalDefaultButtonChecked); + } + else + { + return FindByAccessibilityId(AccessibilityId.HorizontalDefaultButtonUnchecked); + } + } + + public WindowsElement? GetVerticalDefaultButton(bool isChecked) + { + if (isChecked) + { + return FindByAccessibilityId(AccessibilityId.VerticalDefaultButtonChecked); + } + else + { + return FindByAccessibilityId(AccessibilityId.VerticalDefaultButtonUnchecked); + } + } + + public WindowsElement? GetZone(int zoneNumber, string zoneClassName) + { + ReadOnlyCollection zones = Session.FindElementsByClassName(zoneClassName); + foreach (WindowsElement zone in zones) { try { - // FZEditor application can be closed by explicitly closing main editor window - MainEditorWindow?.SendKeys(Keys.Alt + Keys.F4); + zone.FindElementByName(zoneNumber.ToString(CultureInfo.InvariantCulture)); + return zone; } - catch (Exception ex) + catch { - testContext.WriteLine(ex.Message); + // required number not found in the zone } - - Session.Quit(); - Session.Dispose(); } + + return null; } - private WindowsElement? GetLayout(string layoutName) + public void Click(WindowsElement? element) { - var listItem = Session?.FindElementByName(layoutName); - Assert.IsNotNull(listItem, "Layout " + layoutName + " not found"); - return listItem; + Assert.IsNotNull(element); + element.Click(); } - public WindowsElement? OpenContextMenu(string layoutName) + public void Click(string name) { - RightClick_Layout(layoutName); - var menu = Session?.FindElementByClassName("ContextMenu"); - Assert.IsNotNull(menu, "Context menu not found"); - return menu; + Click(Session.FindElementByName(name)); } - public void Click_CreateNewLayout() + public void ClickEditLayout(string layoutName) { - var button = Session?.FindElementByAccessibilityId("NewLayoutButton"); - Assert.IsNotNull(button, "Create new layout button not found"); - button?.Click(); + var layout = GetLayout(layoutName); + Assert.IsNotNull(layout, $"Layout \"{layoutName}\" not found"); + + // added retry attempts, because Click can fail for some reason + bool opened = false; + int retryAttempts = 10; + while (!opened && retryAttempts > 0) + { + var editButton = layout?.FindElementByAccessibilityId(AccessibilityId.EditLayoutButton); + Assert.IsNotNull(editButton, $"Edit button at \"{layoutName}\" not found"); + editButton.Click(); + + // wait until the dialog is opened + opened = WaitElementDisplayedByName($"Edit '{layoutName}'"); + retryAttempts--; + } + + Assert.IsTrue(WaitElementDisplayedByName($"Edit '{layoutName}'"), $"Edit window for \"{layoutName}\" not found"); } - public void Click_EditLayout(string layoutName) + public void RightClickLayout(string layoutName) { var layout = GetLayout(layoutName); - var editButton = layout?.FindElementByAccessibilityId("EditLayoutButton"); - Assert.IsNotNull(editButton, "Edit button not found"); - editButton.Click(); + Assert.IsNotNull(layout); + ContextClick(layout); } - public void RightClick_Layout(string layoutName) + public void ClickMonitor(int monitorNumber) + { + var monitor = GetMonitorItem(monitorNumber); + Assert.IsNotNull(monitor, $"Monitor {monitorNumber} not found"); + Click(monitor); + } + + public void ClickCopyLayout() + { + WindowsElement? button = null; + try + { + button = Session.FindElementByAccessibilityId(AccessibilityId.CopyTemplate); + } + catch + { + } + + try + { + button = Session.FindElementByAccessibilityId(AccessibilityId.DuplicateLayoutButton); + } + catch + { + } + + Assert.IsNotNull(button, "No Copy button"); + button.Click(); + } + + public void ClickConfirm() + { + WaitElementDisplayedById(AccessibilityId.PrimaryButton); + WindowsElement button = Session.FindElementByAccessibilityId(AccessibilityId.PrimaryButton); + button.Click(); + WaitUntilHidden(button); + } + + public void ClickConfirmDialog() { - var layout = GetLayout(layoutName); Actions actions = new Actions(Session); - actions.MoveToElement(layout); - actions.MoveByOffset(30, 30); + actions.SendKeys(Keys.Tab).SendKeys(Keys.Enter); + actions.Build().Perform(); + } + + public void ClickCancelDialog() + { + Actions actions = new Actions(Session); + actions.SendKeys(Keys.Tab).SendKeys(Keys.Tab).SendKeys(Keys.Enter); + actions.Build().Perform(); + } + + public void ClickContextMenuItem(string layoutName, string menuItem) + { + WindowsElement menu = OpenContextMenu(layoutName); + Click(menu.FindElementByName(menuItem)); + } + + public void ClickDeleteZone(int zoneNumber) + { + var zone = GetZone(zoneNumber, ClassName.CanvasZone); + Assert.IsNotNull(zone); + var button = zone.FindElementByClassName(ClassName.Button); + Assert.IsNotNull(button); + button.Click(); + } + + public void MergeGridZones(int zoneNumber1, int zoneNumber2) + { + var zone1 = GetZone(zoneNumber1, ClassName.GridZone); + var zone2 = GetZone(zoneNumber2, ClassName.GridZone); + if (zone1 == null || zone2 == null) + { + return; + } + + Actions actions = new Actions(Session); + actions.MoveToElement(zone1).ClickAndHold(); + int dx = (zone2.Rect.X - zone1.Rect.X) / 10; + int dy = (zone2.Rect.Y - zone1.Rect.Y) / 10; + for (int i = 0; i < 10; i++) + { + actions.MoveByOffset(dx, dy); + } + + actions.MoveToElement(zone2).Release(); + actions.Build().Perform(); + + Click(Session.FindElementByName(ElementName.MergeZonesButton)!); + } + + public void MoveSplitter(int index, int xOffset, int yOffset) + { + ReadOnlyCollection thumbs = Session.FindElementsByClassName(ClassName.Thumb); + if (thumbs.Count == 0 || index >= thumbs.Count) + { + return; + } + + Actions actions = new Actions(Session); + actions.MoveToElement(thumbs[index]).ClickAndHold(); + int dx = xOffset / 10; + int dy = yOffset / 10; + for (int i = 0; i < 10; i++) + { + actions.MoveByOffset(dx, dy); + } + + actions.Release(); + actions.Build().Perform(); + } + + public void SelectNewLayoutType(CustomLayout type) + { + WindowsElement? button = null; + switch (type) + { + case CustomLayout.Canvas: + button = FindByAccessibilityId(AccessibilityId.CanvasRadioButton); + break; + case CustomLayout.Grid: + button = FindByAccessibilityId(AccessibilityId.GridRadioButton); + break; + } + + Assert.IsNotNull(button); + Click(button); + } + + public WindowsElement? FindByAccessibilityId(string name) + { + try + { + return Session.FindElementByAccessibilityId(name); + } + catch (Exception) + { + context.WriteLine($"{name} not found"); + return null; + } + } + + public WindowsElement? FindByName(string name) + { + try + { + return Session.FindElementByName(name); + } + catch (Exception) + { + context.WriteLine($"{name} not found"); + return null; + } + } + + public WindowsElement? FindByClassName(string name) + { + try + { + return Session.FindElementByClassName(name); + } + catch (Exception) + { + context.WriteLine($"{name} not found"); + return null; + } + } + + public bool WaitElementDisplayedByName(string name) + { + try + { + WebDriverWait wait = new WebDriverWait(Session, TimeSpan.FromSeconds(1)); + return wait.Until(pred => + { + try + { + var element = Session.FindElementByName(name); + if (element != null) + { + return element.Displayed; + } + } + catch (Exception e) + { + context.WriteLine(e.Message); + } + + return false; + }); + } + catch (Exception e) + { + context.WriteLine(e.Message); + return false; + } + } + + public bool WaitElementDisplayedById(string id) + { + try + { + WebDriverWait wait = new WebDriverWait(Session, TimeSpan.FromSeconds(1)); + return wait.Until(pred => + { + try + { + var element = Session.FindElementByAccessibilityId(id); + if (element != null) + { + return element.Displayed; + } + } + catch (Exception e) + { + context.WriteLine(e.Message); + } + + return false; + }); + } + catch (Exception e) + { + context.WriteLine(e.Message); + return false; + } + } + + public bool WaitElementDisplayedByClassName(string className) + { + try + { + WebDriverWait wait = new WebDriverWait(Session, TimeSpan.FromSeconds(1)); + return wait.Until(pred => + { + try + { + var element = Session.FindElementByClassName(className); + if (element != null) + { + return element.Displayed; + } + } + catch (Exception e) + { + context.WriteLine(e.Message); + } + + return false; + }); + } + catch (Exception e) + { + context.WriteLine(e.Message); + return false; + } + } + + public void WaitUntilHidden(WindowsElement element) + { + WebDriverWait wait = new WebDriverWait(Session, TimeSpan.FromSeconds(3)); + wait.Until(pred => + { + return !element.Displayed; + }); + } + + public void WaitFor(int seconds) + { + System.Threading.Thread.Sleep(seconds * 1000); + } + + public void ContextClick(WindowsElement element) + { + Actions actions = new Actions(Session); + actions.MoveToElement(element); + actions.MoveByOffset(10, 10); actions.ContextClick(); actions.Build().Perform(); } + + public void Click(AppiumWebElement element) + { + Actions actions = new Actions(Session); + actions.MoveToElement(element); + actions.MoveByOffset(10, 10); + actions.Click(); + actions.Build().Perform(); + } + + public void Drag(WindowsElement element, int offsetX, int offsetY) + { + Actions actions = new Actions(Session); + actions.MoveToElement(element).MoveByOffset(10, 10).ClickAndHold(element).MoveByOffset(offsetX, offsetY).Release(); + actions.Build().Perform(); + } } } diff --git a/src/modules/fancyzones/UITests-FancyZonesEditor/Utils/IOTestHelper.cs b/src/modules/fancyzones/UITests-FancyZonesEditor/Utils/IOTestHelper.cs index d472154ac578..fc9f9823ef28 100644 --- a/src/modules/fancyzones/UITests-FancyZonesEditor/Utils/IOTestHelper.cs +++ b/src/modules/fancyzones/UITests-FancyZonesEditor/Utils/IOTestHelper.cs @@ -31,11 +31,6 @@ public IOTestHelper(string file) } } - ~IOTestHelper() - { - RestoreData(); - } - public void RestoreData() { if (_data != string.Empty) diff --git a/src/modules/fancyzones/UnitTests-FancyZonesEditor/DefaultLayoutsModelTests.cs b/src/modules/fancyzones/UnitTests-FancyZonesEditor/DefaultLayoutsModelTests.cs index 2c6f33f18efe..bdbb0aa0e210 100644 --- a/src/modules/fancyzones/UnitTests-FancyZonesEditor/DefaultLayoutsModelTests.cs +++ b/src/modules/fancyzones/UnitTests-FancyZonesEditor/DefaultLayoutsModelTests.cs @@ -1,7 +1,9 @@ // 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 FancyZonesEditor.Models; +using FancyZonesEditorCommon.Data; namespace UnitTestsFancyZonesEditor; diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Converters/LayoutModelTypeBlankToVisibilityConverter.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Converters/LayoutModelTypeBlankToVisibilityConverter.cs index 6dea0953668d..4c681548660a 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Converters/LayoutModelTypeBlankToVisibilityConverter.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/Converters/LayoutModelTypeBlankToVisibilityConverter.cs @@ -6,7 +6,7 @@ using System.Globalization; using System.Windows; using System.Windows.Data; -using FancyZonesEditor.Models; +using FancyZonesEditorCommon.Data; namespace FancyZonesEditor.Converters { diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Converters/LayoutTypeCustomToVisibilityConverter.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Converters/LayoutTypeCustomToVisibilityConverter.cs index 67f685de71b2..5851531ecc05 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Converters/LayoutTypeCustomToVisibilityConverter.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/Converters/LayoutTypeCustomToVisibilityConverter.cs @@ -6,7 +6,7 @@ using System.Globalization; using System.Windows; using System.Windows.Data; -using FancyZonesEditor.Models; +using FancyZonesEditorCommon.Data; namespace FancyZonesEditor.Converters { diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Converters/LayoutTypeTemplateToVisibilityConverter.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Converters/LayoutTypeTemplateToVisibilityConverter.cs index c525f2a11f58..9c0ccc1c2856 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Converters/LayoutTypeTemplateToVisibilityConverter.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/Converters/LayoutTypeTemplateToVisibilityConverter.cs @@ -6,7 +6,7 @@ using System.Globalization; using System.Windows; using System.Windows.Data; -using FancyZonesEditor.Models; +using FancyZonesEditorCommon.Data; namespace FancyZonesEditor.Converters { diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/EditorWindow.cs b/src/modules/fancyzones/editor/FancyZonesEditor/EditorWindow.cs index 81993a5cf2b3..5769257359b1 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/EditorWindow.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/EditorWindow.cs @@ -5,6 +5,7 @@ using System; using System.Windows; using FancyZonesEditor.Models; +using FancyZonesEditorCommon.Data; using ManagedCommon; namespace FancyZonesEditor diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/LayoutBackup.cs b/src/modules/fancyzones/editor/FancyZonesEditor/LayoutBackup.cs index a245db0e26b2..88c0e1f553bd 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/LayoutBackup.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/LayoutBackup.cs @@ -1,10 +1,10 @@ -// Copyright (c) Microsoft Corporation +// 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.Collections.Generic; using FancyZonesEditor.Models; -using FancyZonesEditor.Utils; +using FancyZonesEditorCommon.Data; namespace FancyZonesEditor { diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/MainWindow.xaml b/src/modules/fancyzones/editor/FancyZonesEditor/MainWindow.xaml index 86b65e9ed224..caa93d64b9c9 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/MainWindow.xaml +++ b/src/modules/fancyzones/editor/FancyZonesEditor/MainWindow.xaml @@ -337,6 +337,7 @@ QuickKeysAvailable List result = new List(); foreach (var pair in MainWindowSettingsModel.LayoutHotkeys.SelectedKeys) { - if (string.IsNullOrEmpty(pair.Value) || pair.Value == Uuid) + if (pair.Key == Properties.Resources.Quick_Key_None || string.IsNullOrEmpty(pair.Value) || pair.Value == Uuid) { result.Add(pair.Key); } @@ -344,6 +344,7 @@ public void RestoreTo(LayoutModel layout) { layout.SensitivityRadius = SensitivityRadius; layout.TemplateZoneCount = TemplateZoneCount; + layout.Name = Name; } // Adds new custom Layout @@ -391,6 +392,8 @@ public void LayoutHotkeys_PropertyChanged(object sender, PropertyChangedEventArg break; } } + + FirePropertyChanged(nameof(QuickKeysAvailable)); } public void DefaultLayouts_PropertyChanged(object sender, PropertyChangedEventArgs e) diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Models/LayoutSettings.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Models/LayoutSettings.cs index dfc325874549..c6dd46af9749 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Models/LayoutSettings.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/Models/LayoutSettings.cs @@ -2,7 +2,6 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using FancyZonesEditor.Models; using FancyZonesEditorCommon.Data; namespace FancyZonesEditor diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Models/LayoutType.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Models/LayoutType.cs deleted file mode 100644 index 2d514449ecc9..000000000000 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Models/LayoutType.cs +++ /dev/null @@ -1,17 +0,0 @@ -// 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. - -namespace FancyZonesEditor.Models -{ - public enum LayoutType - { - Blank = 0, - Focus, - Columns, - Rows, - Grid, - PriorityGrid, - Custom, - } -} diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Models/MainWindowSettingsModel.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Models/MainWindowSettingsModel.cs index 58ee764d59dc..6081b862b5cc 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Models/MainWindowSettingsModel.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/Models/MainWindowSettingsModel.cs @@ -8,6 +8,7 @@ using System.ComponentModel; using System.Runtime.CompilerServices; using FancyZonesEditor.Models; +using FancyZonesEditorCommon.Data; namespace FancyZonesEditor { diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Models/Monitor.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Models/Monitor.cs index ab0096862de3..e3f9618ed0fc 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Models/Monitor.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/Models/Monitor.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation +// 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. @@ -7,6 +7,7 @@ using System.Windows; using System.Windows.Media; using FancyZonesEditor.Utils; +using FancyZonesEditorCommon.Data; namespace FancyZonesEditor.Models { diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Models/MonitorConfigurationType.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Models/MonitorConfigurationType.cs deleted file mode 100644 index 6530e904ba24..000000000000 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Models/MonitorConfigurationType.cs +++ /dev/null @@ -1,12 +0,0 @@ -// 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. - -namespace FancyZonesEditor.Models -{ - public enum MonitorConfigurationType - { - Horizontal = 0, - Vertical, - } -} diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Utils/FancyZonesEditorIO.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Utils/FancyZonesEditorIO.cs index f88b474d44f8..166752cab9d5 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Utils/FancyZonesEditorIO.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/Utils/FancyZonesEditorIO.cs @@ -18,10 +18,6 @@ namespace FancyZonesEditor.Utils { public class FancyZonesEditorIO { - // Non-localizable strings: JSON tags - private const string HorizontalJsonTag = "horizontal"; - private const string VerticalJsonTag = "vertical"; - // Non-localizable string: default virtual desktop id private const string DefaultVirtualDesktopGuid = "{00000000-0000-0000-0000-000000000000}"; @@ -289,7 +285,7 @@ public void SerializeAppliedLayouts() AppliedLayout = new AppliedLayouts.AppliedLayoutWrapper.LayoutWrapper { Uuid = zoneset.ZonesetUuid, - Type = LayoutTypeToJsonTag(zoneset.Type), + Type = zoneset.Type.TypeToString(), ShowSpacing = zoneset.ShowSpacing, Spacing = zoneset.Spacing, ZoneCount = zoneset.ZoneCount, @@ -365,7 +361,7 @@ public void SerializeLayoutTemplates() { LayoutTemplates.TemplateLayoutWrapper wrapper = new LayoutTemplates.TemplateLayoutWrapper { - Type = LayoutTypeToJsonTag(layout.Type), + Type = layout.Type.TypeToString(), SensitivityRadius = layout.SensitivityRadius, ZoneCount = layout.TemplateZoneCount, }; @@ -405,7 +401,7 @@ public void SerializeCustomLayouts() if (layout is CanvasLayoutModel) { - type = CanvasLayoutModel.ModelTypeID; + type = CustomLayout.Canvas.TypeToString(); var canvasLayout = layout as CanvasLayoutModel; var canvasRect = canvasLayout.CanvasRect; @@ -437,7 +433,7 @@ public void SerializeCustomLayouts() } else if (layout is GridLayoutModel) { - type = GridLayoutModel.ModelTypeID; + type = CustomLayout.Grid.TypeToString(); var gridLayout = layout as GridLayoutModel; var cells = new int[gridLayout.Rows][]; @@ -505,7 +501,7 @@ public void SerializeDefaultLayouts() DefaultLayouts.DefaultLayoutWrapper.LayoutWrapper layoutWrapper = new DefaultLayouts.DefaultLayoutWrapper.LayoutWrapper { Uuid = string.Empty, - Type = LayoutTypeToJsonTag(layout.Type), + Type = layout.Type.TypeToString(), SensitivityRadius = layout.SensitivityRadius, ZoneCount = layout.TemplateZoneCount, }; @@ -521,7 +517,7 @@ public void SerializeDefaultLayouts() { DefaultLayouts.DefaultLayoutWrapper wrapper = new DefaultLayouts.DefaultLayoutWrapper { - MonitorConfiguration = MonitorConfigurationTypeToJsonTag(MonitorConfigurationType.Horizontal), + MonitorConfiguration = MonitorConfigurationType.Horizontal.TypeToString(), Layout = layoutWrapper, }; @@ -532,7 +528,7 @@ public void SerializeDefaultLayouts() { DefaultLayouts.DefaultLayoutWrapper wrapper = new DefaultLayouts.DefaultLayoutWrapper { - MonitorConfiguration = MonitorConfigurationTypeToJsonTag(MonitorConfigurationType.Vertical), + MonitorConfiguration = MonitorConfigurationType.Vertical.TypeToString(), Layout = layoutWrapper, }; @@ -548,7 +544,7 @@ public void SerializeDefaultLayouts() DefaultLayouts.DefaultLayoutWrapper.LayoutWrapper layoutWrapper = new DefaultLayouts.DefaultLayoutWrapper.LayoutWrapper { Uuid = layout.Uuid, - Type = LayoutTypeToJsonTag(LayoutType.Custom), + Type = LayoutType.Custom.TypeToString(), }; if (layout is GridLayoutModel grid) @@ -562,7 +558,7 @@ public void SerializeDefaultLayouts() { DefaultLayouts.DefaultLayoutWrapper wrapper = new DefaultLayouts.DefaultLayoutWrapper { - MonitorConfiguration = MonitorConfigurationTypeToJsonTag(MonitorConfigurationType.Horizontal), + MonitorConfiguration = MonitorConfigurationType.Horizontal.TypeToString(), Layout = layoutWrapper, }; @@ -573,7 +569,7 @@ public void SerializeDefaultLayouts() { DefaultLayouts.DefaultLayoutWrapper wrapper = new DefaultLayouts.DefaultLayoutWrapper { - MonitorConfiguration = MonitorConfigurationTypeToJsonTag(MonitorConfigurationType.Vertical), + MonitorConfiguration = MonitorConfigurationType.Vertical.TypeToString(), Layout = layoutWrapper, }; @@ -619,7 +615,7 @@ private bool SetAppliedLayouts(List layouts continue; } - LayoutType layoutType = JsonTagToLayoutType(layout.AppliedLayout.Type); + LayoutType layoutType = LayoutTypeEnumExtension.TypeFromString(layout.AppliedLayout.Type); LayoutSettings settings = new LayoutSettings { ZonesetUuid = layout.AppliedLayout.Uuid, @@ -705,11 +701,11 @@ private bool SetCustomLayouts(List customLayo LayoutModel layout = null; try { - if (zoneSet.Type == CanvasLayoutModel.ModelTypeID) + if (zoneSet.Type == CustomLayout.Canvas.TypeToString()) { layout = ParseCanvasInfo(zoneSet); } - else if (zoneSet.Type == GridLayoutModel.ModelTypeID) + else if (zoneSet.Type == CustomLayout.Grid.TypeToString()) { layout = ParseGridInfo(zoneSet); } @@ -746,7 +742,7 @@ private bool SetTemplateLayouts(List temp foreach (var wrapper in templateLayouts) { - LayoutType type = JsonTagToLayoutType(wrapper.Type); + LayoutType type = LayoutTypeEnumExtension.TypeFromString(wrapper.Type); LayoutModel layout = MainWindowSettingsModel.TemplateModels[(int)type]; layout.SensitivityRadius = wrapper.SensitivityRadius; @@ -789,7 +785,7 @@ private bool SetDefaultLayouts(List layouts foreach (var layout in layouts) { LayoutModel defaultLayoutModel = null; - MonitorConfigurationType type = JsonTagToMonitorConfigurationType(layout.MonitorConfiguration); + MonitorConfigurationType type = MonitorConfigurationTypeEnumExtensions.TypeFromString(layout.MonitorConfiguration); if (layout.Layout.Uuid != null && layout.Layout.Uuid != string.Empty) { @@ -805,7 +801,7 @@ private bool SetDefaultLayouts(List layouts } else { - LayoutType layoutType = JsonTagToLayoutType(layout.Layout.Type); + LayoutType layoutType = LayoutTypeEnumExtension.TypeFromString(layout.Layout.Type); defaultLayoutModel = MainWindowSettingsModel.TemplateModels[(int)layoutType]; defaultLayoutModel.TemplateZoneCount = layout.Layout.ZoneCount; defaultLayoutModel.SensitivityRadius = layout.Layout.SensitivityRadius; @@ -907,84 +903,5 @@ private GridLayoutModel ParseGridInfo(CustomLayouts.CustomLayoutWrapper wrapper) layout.Spacing = info.Spacing; return layout; } - - private LayoutType JsonTagToLayoutType(string tag) - { - if (tag == Constants.TemplateLayoutJsonTags[Constants.TemplateLayout.Empty]) - { - return LayoutType.Blank; - } - else if (tag == Constants.TemplateLayoutJsonTags[Constants.TemplateLayout.Focus]) - { - return LayoutType.Focus; - } - else if (tag == Constants.TemplateLayoutJsonTags[Constants.TemplateLayout.Rows]) - { - return LayoutType.Rows; - } - else if (tag == Constants.TemplateLayoutJsonTags[Constants.TemplateLayout.Columns]) - { - return LayoutType.Columns; - } - else if (tag == Constants.TemplateLayoutJsonTags[Constants.TemplateLayout.Grid]) - { - return LayoutType.Grid; - } - else if (tag == Constants.TemplateLayoutJsonTags[Constants.TemplateLayout.PriorityGrid]) - { - return LayoutType.PriorityGrid; - } - - return LayoutType.Custom; - } - - private string LayoutTypeToJsonTag(LayoutType type) - { - switch (type) - { - case LayoutType.Blank: - return Constants.TemplateLayoutJsonTags[Constants.TemplateLayout.Empty]; - case LayoutType.Focus: - return Constants.TemplateLayoutJsonTags[Constants.TemplateLayout.Focus]; - case LayoutType.Columns: - return Constants.TemplateLayoutJsonTags[Constants.TemplateLayout.Columns]; - case LayoutType.Rows: - return Constants.TemplateLayoutJsonTags[Constants.TemplateLayout.Rows]; - case LayoutType.Grid: - return Constants.TemplateLayoutJsonTags[Constants.TemplateLayout.Grid]; - case LayoutType.PriorityGrid: - return Constants.TemplateLayoutJsonTags[Constants.TemplateLayout.PriorityGrid]; - case LayoutType.Custom: - return Constants.CustomLayoutJsonTag; - default: - return string.Empty; - } - } - - private MonitorConfigurationType JsonTagToMonitorConfigurationType(string tag) - { - switch (tag) - { - case HorizontalJsonTag: - return MonitorConfigurationType.Horizontal; - case VerticalJsonTag: - return MonitorConfigurationType.Vertical; - } - - return MonitorConfigurationType.Horizontal; - } - - private string MonitorConfigurationTypeToJsonTag(MonitorConfigurationType type) - { - switch (type) - { - case MonitorConfigurationType.Horizontal: - return HorizontalJsonTag; - case MonitorConfigurationType.Vertical: - return VerticalJsonTag; - } - - return HorizontalJsonTag; - } } }