/ src / modules / fancyzones / FancyZonesEditor.UITests / DeleteLayoutTests.cs
DeleteLayoutTests.cs
  1  // Copyright (c) Microsoft Corporation
  2  // The Microsoft Corporation licenses this file to you under the MIT license.
  3  // See the LICENSE file in the project root for more information.
  4  
  5  using System.Collections.Generic;
  6  using FancyZonesEditor.Models;
  7  using FancyZonesEditorCommon.Data;
  8  using Microsoft.FancyZonesEditor.UnitTests.Utils;
  9  using Microsoft.PowerToys.UITest;
 10  using Microsoft.VisualStudio.TestTools.UnitTesting;
 11  using ModernWpf.Controls;
 12  using OpenQA.Selenium;
 13  using static FancyZonesEditorCommon.Data.CustomLayouts;
 14  using static FancyZonesEditorCommon.Data.DefaultLayouts;
 15  using static FancyZonesEditorCommon.Data.EditorParameters;
 16  using static FancyZonesEditorCommon.Data.LayoutHotkeys;
 17  using static Microsoft.FancyZonesEditor.UnitTests.Utils.FancyZonesEditorHelper;
 18  
 19  namespace Microsoft.FancyZonesEditor.UITests
 20  {
 21      [TestClass]
 22      public class DeleteLayoutTests : UITestBase
 23      {
 24          public DeleteLayoutTests()
 25              : base(PowerToysModule.FancyZone, WindowSize.UnSpecified)
 26          {
 27          }
 28  
 29          private static readonly CustomLayoutListWrapper CustomLayouts = new CustomLayoutListWrapper
 30          {
 31              CustomLayouts = new List<CustomLayoutWrapper>
 32              {
 33                  new CustomLayoutWrapper
 34                  {
 35                      Uuid = "{0D6D2F58-9184-4804-81E4-4E4CC3476DC1}",
 36                      Type = CustomLayout.Grid.TypeToString(),
 37                      Name = "Custom layout 1",
 38                      Info = new CustomLayouts().ToJsonElement(new CustomLayouts.GridInfoWrapper
 39                      {
 40                          Rows = 2,
 41                          Columns = 3,
 42                          RowsPercentage = new List<int> { 2967, 7033 },
 43                          ColumnsPercentage = new List<int> { 2410, 6040, 1550 },
 44                          CellChildMap = new int[][] { [0, 1, 1], [0, 2, 3] },
 45                          SensitivityRadius = 30,
 46                          Spacing = 26,
 47                          ShowSpacing = false,
 48                      }),
 49                  },
 50                  new CustomLayoutWrapper
 51                  {
 52                      Uuid = "{E7807D0D-6223-4883-B15B-1F3883944C09}",
 53                      Type = CustomLayout.Canvas.TypeToString(),
 54                      Name = "Custom layout 2",
 55                      Info = new CustomLayouts().ToJsonElement(new CanvasInfoWrapper
 56                      {
 57                          RefHeight = 952,
 58                          RefWidth = 1500,
 59                          SensitivityRadius = 10,
 60                          Zones = new List<CanvasInfoWrapper.CanvasZoneWrapper>
 61                          {
 62                              new CanvasInfoWrapper.CanvasZoneWrapper
 63                              {
 64                                  X = 0,
 65                                  Y = 0,
 66                                  Width = 900,
 67                                  Height = 522,
 68                              },
 69                              new CanvasInfoWrapper.CanvasZoneWrapper
 70                              {
 71                                  X = 900,
 72                                  Y = 0,
 73                                  Width = 600,
 74                                  Height = 750,
 75                              },
 76                              new CanvasInfoWrapper.CanvasZoneWrapper
 77                              {
 78                                  X = 0,
 79                                  Y = 522,
 80                                  Width = 1500,
 81                                  Height = 430,
 82                              },
 83                          },
 84                      }),
 85                  },
 86              },
 87          };
 88  
 89          private static readonly DefaultLayouts.DefaultLayoutsListWrapper DefaultLayoutsList = new DefaultLayouts.DefaultLayoutsListWrapper
 90          {
 91              DefaultLayouts = new List<DefaultLayouts.DefaultLayoutWrapper>
 92              {
 93                  new DefaultLayoutWrapper
 94                  {
 95                      MonitorConfiguration = MonitorConfigurationType.Horizontal.TypeToString(),
 96                      Layout = new DefaultLayoutWrapper.LayoutWrapper
 97                      {
 98                          Type = LayoutType.Custom.TypeToString(),
 99                          Uuid = CustomLayouts.CustomLayouts[1].Uuid,
100                      },
101                  },
102              },
103          };
104  
105          private static readonly LayoutHotkeys.LayoutHotkeysWrapper Hotkeys = new LayoutHotkeys.LayoutHotkeysWrapper
106          {
107              LayoutHotkeys = new List<LayoutHotkeys.LayoutHotkeyWrapper>
108              {
109                  new LayoutHotkeyWrapper
110                  {
111                      LayoutId = CustomLayouts.CustomLayouts[1].Uuid,
112                      Key = 0,
113                  },
114              },
115          };
116  
117          private static readonly ParamsWrapper Parameters = new ParamsWrapper
118          {
119              ProcessId = 1,
120              SpanZonesAcrossMonitors = false,
121              Monitors = new List<NativeMonitorDataWrapper>
122              {
123                  new NativeMonitorDataWrapper
124                  {
125                      Monitor = "monitor-1",
126                      MonitorInstanceId = "instance-id-1",
127                      MonitorSerialNumber = "serial-number-1",
128                      MonitorNumber = 1,
129                      VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}",
130                      Dpi = 192,
131                      LeftCoordinate = 0,
132                      TopCoordinate = 0,
133                      WorkAreaHeight = 1040,
134                      WorkAreaWidth = 1920,
135                      MonitorHeight = 1080,
136                      MonitorWidth = 1920,
137                      IsSelected = true,
138                  },
139              },
140          };
141  
142          [TestInitialize]
143          public void TestInitialize()
144          {
145              FancyZonesEditorHelper.Files.Restore();
146              EditorParameters editorParameters = new EditorParameters();
147              FancyZonesEditorHelper.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(Parameters));
148  
149              CustomLayouts customLayouts = new CustomLayouts();
150              FancyZonesEditorHelper.Files.CustomLayoutsIOHelper.WriteData(customLayouts.Serialize(CustomLayouts));
151  
152              LayoutTemplates layoutTemplates = new LayoutTemplates();
153              LayoutTemplates.TemplateLayoutsListWrapper templateLayoutsListWrapper = new LayoutTemplates.TemplateLayoutsListWrapper
154              {
155                  LayoutTemplates = new List<LayoutTemplates.TemplateLayoutWrapper>
156                  {
157                      new LayoutTemplates.TemplateLayoutWrapper
158                      {
159                          Type = LayoutType.Blank.TypeToString(),
160                      },
161                      new LayoutTemplates.TemplateLayoutWrapper
162                      {
163                          Type = LayoutType.Focus.TypeToString(),
164                          ZoneCount = 10,
165                      },
166                      new LayoutTemplates.TemplateLayoutWrapper
167                      {
168                          Type = LayoutType.Rows.TypeToString(),
169                          ZoneCount = 2,
170                          ShowSpacing = true,
171                          Spacing = 10,
172                          SensitivityRadius = 10,
173                      },
174                      new LayoutTemplates.TemplateLayoutWrapper
175                      {
176                          Type = LayoutType.Columns.TypeToString(),
177                          ZoneCount = 2,
178                          ShowSpacing = true,
179                          Spacing = 20,
180                          SensitivityRadius = 20,
181                      },
182                      new LayoutTemplates.TemplateLayoutWrapper
183                      {
184                          Type = LayoutType.Grid.TypeToString(),
185                          ZoneCount = 4,
186                          ShowSpacing = false,
187                          Spacing = 10,
188                          SensitivityRadius = 30,
189                      },
190                      new LayoutTemplates.TemplateLayoutWrapper
191                      {
192                          Type = LayoutType.PriorityGrid.TypeToString(),
193                          ZoneCount = 3,
194                          ShowSpacing = true,
195                          Spacing = 1,
196                          SensitivityRadius = 40,
197                      },
198                  },
199              };
200              FancyZonesEditorHelper.Files.LayoutTemplatesIOHelper.WriteData(layoutTemplates.Serialize(templateLayoutsListWrapper));
201  
202              DefaultLayouts defaultLayouts = new DefaultLayouts();
203              FancyZonesEditorHelper.Files.DefaultLayoutsIOHelper.WriteData(defaultLayouts.Serialize(DefaultLayoutsList));
204  
205              LayoutHotkeys layoutHotkeys = new LayoutHotkeys();
206              FancyZonesEditorHelper.Files.LayoutHotkeysIOHelper.WriteData(layoutHotkeys.Serialize(Hotkeys));
207  
208              AppliedLayouts appliedLayouts = new AppliedLayouts();
209              AppliedLayouts.AppliedLayoutsListWrapper appliedLayoutsWrapper = new AppliedLayouts.AppliedLayoutsListWrapper
210              {
211                  AppliedLayouts = new List<AppliedLayouts.AppliedLayoutWrapper> { },
212              };
213              FancyZonesEditorHelper.Files.AppliedLayoutsIOHelper.WriteData(appliedLayouts.Serialize(appliedLayoutsWrapper));
214  
215              this.RestartScopeExe();
216              Session.Find<Element>(CustomLayouts.CustomLayouts[0].Name).Click();
217          }
218  
219          [TestMethod("FancyZonesEditor.Basic.DeleteNotAppliedLayout")]
220          [TestCategory("FancyZones Editor #5")]
221          public void DeleteNotAppliedLayout()
222          {
223              var deletedLayout = CustomLayouts.CustomLayouts[1].Name;
224              Session.Find<Element>(deletedLayout).Find<Button>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.EditLayoutButton)).Click();
225              Session.Find<Button>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.DeleteLayoutButton)).Click();
226              Session.SendKeySequence(Key.Tab, Key.Enter);
227  
228              // verify the layout is removed
229              Assert.IsTrue(Session.FindAll<Element>(deletedLayout).Count == 0);
230  
231              // check the file
232              var customLayouts = new CustomLayouts();
233              var data = customLayouts.Read(customLayouts.File);
234              Assert.AreEqual(CustomLayouts.CustomLayouts.Count - 1, data.CustomLayouts.Count);
235              Assert.IsFalse(data.CustomLayouts.Exists(x => x.Name == deletedLayout));
236          }
237  
238          [TestMethod("FancyZonesEditor.Basic.DeleteAppliedLayout")]
239          [TestCategory("FancyZones Editor #5")]
240          public void DeleteAppliedLayout()
241          {
242              var deletedLayout = CustomLayouts.CustomLayouts[0].Name;
243              Session.Find<Element>(deletedLayout).Find<Button>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.EditLayoutButton)).Click();
244              Session.Find<Button>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.DeleteLayoutButton)).Click();
245  
246              Session.SendKeySequence(Key.Tab, Key.Enter);
247  
248              // verify the layout is removed
249              Assert.IsTrue(Session.FindAll<Element>(deletedLayout).Count == 0);
250  
251              // verify the empty layout is selected
252              Assert.IsTrue(Session.Find<Element>(TestConstants.TemplateLayoutNames[LayoutType.Blank])!.Selected);
253  
254              // check the file
255              var customLayouts = new CustomLayouts();
256              var data = customLayouts.Read(customLayouts.File);
257              Assert.AreEqual(CustomLayouts.CustomLayouts.Count - 1, data.CustomLayouts.Count);
258              Assert.IsFalse(data.CustomLayouts.Exists(x => x.Name == deletedLayout));
259  
260              var appliedLayouts = new AppliedLayouts();
261              var appliedLayoutsData = appliedLayouts.Read(appliedLayouts.File);
262              Assert.AreEqual(LayoutType.Blank.TypeToString(), appliedLayoutsData.AppliedLayouts.Find(x => x.Device.Monitor == Parameters.Monitors[0].Monitor).AppliedLayout.Type);
263          }
264  
265          [TestMethod("FancyZonesEditor.Basic.CancelDeletion")]
266          [TestCategory("FancyZones Editor #5")]
267          public void CancelDeletion()
268          {
269              var deletedLayout = CustomLayouts.CustomLayouts[1].Name;
270              Session.Find<Element>(deletedLayout).Find<Button>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.EditLayoutButton)).Click();
271              Session.Find<Button>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.DeleteLayoutButton)).Click();
272              Session.SendKeySequence(Key.Tab, Key.Tab, Key.Enter);
273  
274              // verify the layout is not removed
275              Assert.IsNotNull(Session.Find<Element>(deletedLayout));
276  
277              // check the file
278              var customLayouts = new CustomLayouts();
279              var data = customLayouts.Read(customLayouts.File);
280              Assert.AreEqual(CustomLayouts.CustomLayouts.Count, data.CustomLayouts.Count);
281              Assert.IsTrue(data.CustomLayouts.Exists(x => x.Name == deletedLayout));
282          }
283  
284          [TestMethod("FancyZonesEditor.Basic.DeleteFromContextMenu")]
285          [TestCategory("FancyZones Editor #5")]
286          public void DeleteFromContextMenu()
287          {
288              var deletedLayout = CustomLayouts.CustomLayouts[1].Name;
289              FancyZonesEditorHelper.ClickContextMenuItem(Session, deletedLayout, FancyZonesEditorHelper.ElementName.Delete);
290              Session.SendKeySequence(Key.Tab, Key.Enter);
291  
292              // verify the layout is removed
293              Assert.IsTrue(Session.FindAll<Element>(deletedLayout).Count == 0);
294  
295              // check the file
296              var customLayouts = new CustomLayouts();
297              var data = customLayouts.Read(customLayouts.File);
298              Assert.AreEqual(CustomLayouts.CustomLayouts.Count - 1, data.CustomLayouts.Count);
299              Assert.IsFalse(data.CustomLayouts.Exists(x => x.Name == deletedLayout));
300          }
301  
302          [TestMethod("FancyZonesEditor.Basic.DeleteDefaultLayout")]
303          [TestCategory("FancyZones Editor #5")]
304          public void DeleteDefaultLayout()
305          {
306              var deletedLayout = CustomLayouts.CustomLayouts[1].Name;
307              FancyZonesEditorHelper.ClickContextMenuItem(Session, deletedLayout, FancyZonesEditorHelper.ElementName.Delete);
308              Session.SendKeySequence(Key.Tab, Key.Enter);
309  
310              // verify the default layout is reset to the "default" default
311              Session.Find<Element>(TestConstants.TemplateLayoutNames[LayoutType.PriorityGrid]).Find<Button>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.EditLayoutButton)).Click();
312              Assert.IsNotNull(Session.Find<Element>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.HorizontalDefaultButtonChecked)));
313              Session.Find<Button>(ElementName.Cancel).Click();
314  
315              // check the file
316              var defaultLayouts = new DefaultLayouts();
317              var data = defaultLayouts.Read(defaultLayouts.File);
318              string configuration = MonitorConfigurationType.Horizontal.TypeToString();
319              Assert.AreEqual(LayoutType.PriorityGrid.TypeToString(), data.DefaultLayouts.Find(x => x.MonitorConfiguration == configuration).Layout.Type);
320          }
321  
322          [TestMethod("FancyZonesEditor.Basic.DeleteLayoutWithHotkey")]
323          [TestCategory("FancyZones Editor #5")]
324          public void DeleteLayoutWithHotkey()
325          {
326              var deletedLayout = CustomLayouts.CustomLayouts[1].Name;
327              FancyZonesEditorHelper.ClickContextMenuItem(Session, deletedLayout, FancyZonesEditorHelper.ElementName.Delete);
328              Session.SendKeySequence(Key.Tab, Key.Enter);
329  
330              // verify the hotkey is available
331              Session.Find<Element>(CustomLayouts.CustomLayouts[0].Name).Find<Button>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.EditLayoutButton)).Click();
332              var hotkeyComboBox = Session.Find<Element>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.HotkeyComboBox));
333              Assert.IsNotNull(hotkeyComboBox);
334              hotkeyComboBox.Click();
335  
336              var popup = Session.Find<Element>(PowerToys.UITest.By.ClassName(ClassName.Popup));
337              Assert.IsNotNull(popup);
338              try
339              {
340                  for (int i = 0; i < 10; i++)
341                  {
342                      popup.Find<Element>($"{i}");
343                  }
344              }
345              catch
346              {
347                  Assert.Fail("Hotkey not found");
348              }
349  
350              Session.Find<Button>(ElementName.Cancel).DoubleClick();
351  
352              // check the file
353              var hotkeys = new LayoutHotkeys();
354              var data = hotkeys.Read(hotkeys.File);
355              int layoutHotkeyCount = 0;
356              foreach (var layout in data.LayoutHotkeys)
357              {
358                  if (layout.Key != -1)
359                  {
360                      layoutHotkeyCount++;
361                  }
362              }
363  
364              Assert.AreEqual(0, layoutHotkeyCount);
365          }
366      }
367  }