/ src / modules / fancyzones / FancyZonesEditor.UITests / TemplateLayoutsTests.cs
TemplateLayoutsTests.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.UITests;
  9  using Microsoft.FancyZonesEditor.UITests.Utils;
 10  using Microsoft.FancyZonesEditor.UnitTests.Utils;
 11  using Microsoft.PowerToys.UITest;
 12  using Microsoft.VisualStudio.TestTools.UnitTesting;
 13  using OpenQA.Selenium;
 14  using Windows.UI;
 15  using static FancyZonesEditorCommon.Data.AppliedLayouts;
 16  using static FancyZonesEditorCommon.Data.DefaultLayouts;
 17  using static FancyZonesEditorCommon.Data.EditorParameters;
 18  using static FancyZonesEditorCommon.Data.LayoutTemplates;
 19  using static Microsoft.ApplicationInsights.MetricDimensionNames.TelemetryContext;
 20  using static Microsoft.FancyZonesEditor.UnitTests.Utils.FancyZonesEditorHelper;
 21  
 22  namespace Microsoft.FancyZonesEditor.UITests
 23  {
 24      [TestClass]
 25      public class TemplateLayoutsTests : UITestBase
 26      {
 27          private static readonly TemplateLayoutsListWrapper Layouts = new TemplateLayoutsListWrapper
 28          {
 29              LayoutTemplates = new List<TemplateLayoutWrapper>
 30              {
 31                  new TemplateLayoutWrapper
 32                  {
 33                      Type = LayoutType.Blank.TypeToString(),
 34                  },
 35                  new TemplateLayoutWrapper
 36                  {
 37                      Type = LayoutType.Focus.TypeToString(),
 38                      ZoneCount = 10,
 39                  },
 40                  new TemplateLayoutWrapper
 41                  {
 42                      Type = LayoutType.Rows.TypeToString(),
 43                      ZoneCount = 2,
 44                      ShowSpacing = true,
 45                      Spacing = 10,
 46                      SensitivityRadius = 10,
 47                  },
 48                  new TemplateLayoutWrapper
 49                  {
 50                      Type = LayoutType.Columns.TypeToString(),
 51                      ZoneCount = 2,
 52                      ShowSpacing = true,
 53                      Spacing = 20,
 54                      SensitivityRadius = 20,
 55                  },
 56                  new TemplateLayoutWrapper
 57                  {
 58                      Type = LayoutType.Grid.TypeToString(),
 59                      ZoneCount = 4,
 60                      ShowSpacing = false,
 61                      Spacing = 10,
 62                      SensitivityRadius = 30,
 63                  },
 64                  new TemplateLayoutWrapper
 65                  {
 66                      Type = LayoutType.PriorityGrid.TypeToString(),
 67                      ZoneCount = 3,
 68                      ShowSpacing = true,
 69                      Spacing = 1,
 70                      SensitivityRadius = 40,
 71                  },
 72              },
 73          };
 74  
 75          public TemplateLayoutsTests()
 76              : base(PowerToysModule.FancyZone, WindowSize.UnSpecified)
 77          {
 78          }
 79  
 80          [TestInitialize]
 81          public void TestInitialize()
 82          {
 83              FancyZonesEditorHelper.Files.Restore();
 84              EditorParameters editorParameters = new EditorParameters();
 85              ParamsWrapper parameters = new ParamsWrapper
 86              {
 87                  ProcessId = 1,
 88                  SpanZonesAcrossMonitors = false,
 89                  Monitors = new List<NativeMonitorDataWrapper>
 90                  {
 91                      new NativeMonitorDataWrapper
 92                      {
 93                          Monitor = "monitor-1",
 94                          MonitorInstanceId = "instance-id-1",
 95                          MonitorSerialNumber = "serial-number-1",
 96                          MonitorNumber = 1,
 97                          VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}",
 98                          Dpi = 192,
 99                          LeftCoordinate = 0,
100                          TopCoordinate = 0,
101                          WorkAreaHeight = 1040,
102                          WorkAreaWidth = 1920,
103                          MonitorHeight = 1080,
104                          MonitorWidth = 1920,
105                          IsSelected = true,
106                      },
107                  },
108              };
109              FancyZonesEditorHelper.Files.ParamsIOHelper.WriteData(editorParameters.Serialize(parameters));
110  
111              LayoutTemplates layoutTemplates = new LayoutTemplates();
112              FancyZonesEditorHelper.Files.LayoutTemplatesIOHelper.WriteData(layoutTemplates.Serialize(Layouts));
113  
114              // Default layouts should match templates
115              DefaultLayouts defaultLayouts = new DefaultLayouts();
116              DefaultLayoutsListWrapper defaultLayoutsList = new DefaultLayoutsListWrapper
117              {
118                  DefaultLayouts = new List<DefaultLayoutWrapper>
119                  {
120                      new DefaultLayoutWrapper
121                      {
122                          MonitorConfiguration = MonitorConfigurationType.Vertical.ToString(),
123                          Layout = new DefaultLayoutWrapper.LayoutWrapper
124                          {
125                              Type = LayoutType.Rows.TypeToString(),
126                              ZoneCount = 2,
127                              ShowSpacing = true,
128                              Spacing = 10,
129                              SensitivityRadius = 10,
130                          },
131                      },
132                      new DefaultLayoutWrapper
133                      {
134                          MonitorConfiguration = MonitorConfigurationType.Horizontal.ToString(),
135                          Layout = new DefaultLayoutWrapper.LayoutWrapper
136                          {
137                              Type = LayoutType.PriorityGrid.TypeToString(),
138                              ZoneCount = 3,
139                              ShowSpacing = true,
140                              Spacing = 1,
141                              SensitivityRadius = 40,
142                          },
143                      },
144                  },
145              };
146              FancyZonesEditorHelper.Files.DefaultLayoutsIOHelper.WriteData(defaultLayouts.Serialize(defaultLayoutsList));
147  
148              // Make sure applied layouts don't replate template settings
149              AppliedLayouts appliedLayouts = new AppliedLayouts();
150              AppliedLayoutsListWrapper appliedLayoutsList = new AppliedLayoutsListWrapper
151              {
152                  AppliedLayouts = new List<AppliedLayoutWrapper>
153                  {
154                      new AppliedLayoutWrapper
155                      {
156                          Device = new AppliedLayoutWrapper.DeviceIdWrapper
157                          {
158                              Monitor = "monitor-1",
159                              MonitorInstance = "instance-id-1",
160                              MonitorNumber = 1,
161                              SerialNumber = "serial-number-1",
162                              VirtualDesktop = "{FF34D993-73F3-4B8C-AA03-73730A01D6A8}",
163                          },
164                          AppliedLayout = new AppliedLayoutWrapper.LayoutWrapper
165                          {
166                              Uuid = "{72409DFC-2B87-469B-AAC4-557273791C26}",
167                              Type = LayoutType.PriorityGrid.TypeToString(),
168                              ZoneCount = 3,
169                              ShowSpacing = true,
170                              Spacing = 1,
171                              SensitivityRadius = 40,
172                          },
173                      },
174                  },
175              };
176              FancyZonesEditorHelper.Files.AppliedLayoutsIOHelper.WriteData(appliedLayouts.Serialize(appliedLayoutsList));
177  
178              CustomLayouts customLayouts = new CustomLayouts();
179              CustomLayouts.CustomLayoutListWrapper customLayoutListWrapper = new CustomLayouts.CustomLayoutListWrapper
180              {
181                  CustomLayouts = new List<CustomLayouts.CustomLayoutWrapper> { },
182              };
183              FancyZonesEditorHelper.Files.CustomLayoutsIOHelper.WriteData(customLayouts.Serialize(customLayoutListWrapper));
184  
185              LayoutHotkeys layoutHotkeys = new LayoutHotkeys();
186              LayoutHotkeys.LayoutHotkeysWrapper layoutHotkeysWrapper = new LayoutHotkeys.LayoutHotkeysWrapper
187              {
188                  LayoutHotkeys = new List<LayoutHotkeys.LayoutHotkeyWrapper> { },
189              };
190              FancyZonesEditorHelper.Files.LayoutHotkeysIOHelper.WriteData(layoutHotkeys.Serialize(layoutHotkeysWrapper));
191  
192              this.RestartScopeExe();
193          }
194  
195          [TestMethod("FancyZonesEditor.Basic.ZoneNumber_Cancel")]
196          [TestCategory("FancyZones Editor #6")]
197          public void ZoneNumber_Cancel()
198          {
199              var type = LayoutType.Rows;
200              var layout = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString());
201              var expected = layout.ZoneCount;
202              Session.Find<Button>(TestConstants.TemplateLayoutNames[type]).Click();
203  
204              var slider = Session.Find<Custom>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.TemplateZoneSlider));
205              Assert.IsNotNull(slider);
206              slider.SendKeys(Key.Left);
207  
208              Session.Find<Button>(ElementName.Cancel).Click();
209  
210              // verify the file
211              var templateLayouts = new LayoutTemplates();
212              var data = templateLayouts.Read(templateLayouts.File);
213              var actual = data.LayoutTemplates.Find(x => x.Type == type.TypeToString()).ZoneCount;
214              Assert.AreEqual(expected, actual);
215          }
216  
217          [TestMethod("FancyZonesEditor.Basic.HighlightDistance_Initialize")]
218          [TestCategory("FancyZones Editor #6")]
219          public void HighlightDistance_Initialize()
220          {
221              foreach (var (type, name) in TestConstants.TemplateLayoutNames)
222              {
223                  if (type == LayoutType.Blank)
224                  {
225                      continue;
226                  }
227  
228                  Session.Find<Button>(name).Click();
229  
230                  var slider = Session.Find<Element>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.SensitivitySlider));
231                  Assert.IsNotNull(slider);
232                  var expected = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString()).SensitivityRadius;
233                  Assert.AreEqual($"{expected}", slider.Text);
234  
235                  Session.Find<Button>(ElementName.Cancel).Click();
236              }
237          }
238  
239          [TestMethod("FancyZonesEditor.Basic.HighlightDistance_Save")]
240          [TestCategory("FancyZones Editor #6")]
241          public void HighlightDistance_Save()
242          {
243              var type = LayoutType.Focus;
244              var layout = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString());
245              var value = layout.SensitivityRadius;
246              Session.Find<Button>(TestConstants.TemplateLayoutNames[type]).Click();
247  
248              var slider = Session.Find<Custom>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.SensitivitySlider));
249              Assert.IsNotNull(slider);
250              slider.SendKeys(Key.Right);
251  
252              var expected = value; // one step right
253              Assert.AreEqual($"{expected}", slider.Text);
254  
255              Session.Find<Button>(ElementName.Save).Click();
256  
257              // verify the file
258              var templateLayouts = new LayoutTemplates();
259              var data = templateLayouts.Read(templateLayouts.File);
260              var actual = data.LayoutTemplates.Find(x => x.Type == type.TypeToString()).SensitivityRadius;
261              Assert.AreEqual(expected, actual);
262          }
263  
264          [TestMethod("FancyZonesEditor.Basic.HighlightDistance_Cancel")]
265          [TestCategory("FancyZones Editor #6")]
266          public void HighlightDistance_Cancel()
267          {
268              var type = LayoutType.Focus;
269              var layout = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString());
270              var expected = layout.SensitivityRadius;
271              Session.Find<Button>(TestConstants.TemplateLayoutNames[type]).Click();
272  
273              var slider = Session.Find<Custom>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.SensitivitySlider));
274              Assert.IsNotNull(slider);
275              slider.SendKeys(Key.Right);
276              Session.Find<Button>(ElementName.Cancel).Click();
277  
278              // verify the file
279              var templateLayouts = new LayoutTemplates();
280              var data = templateLayouts.Read(templateLayouts.File);
281              var actual = data.LayoutTemplates.Find(x => x.Type == type.TypeToString()).SensitivityRadius;
282              Assert.AreEqual(expected, actual);
283          }
284  
285          [TestMethod("FancyZonesEditor.Basic.SpaceAroundZones_Initialize")]
286          [TestCategory("FancyZones Editor #6")]
287          public void SpaceAroundZones_Initialize()
288          {
289              foreach (var (type, name) in TestConstants.TemplateLayoutNames)
290              {
291                  if (type == LayoutType.Blank || type == LayoutType.Focus)
292                  {
293                      // only for grid layouts
294                      continue;
295                  }
296  
297                  Session.Find<Button>(name).Click();
298  
299                  var slider = Session.Find<Element>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.SpacingSlider));
300                  Assert.IsNotNull(slider);
301  
302                  var spacingEnabled = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString()).ShowSpacing;
303                  Assert.AreEqual(spacingEnabled, slider.Enabled);
304  
305                  var expected = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString()).Spacing;
306                  Assert.AreEqual($"{expected}", slider.Text);
307  
308                  Session.Find<Button>(ElementName.Cancel).Click();
309              }
310          }
311  
312          [TestMethod("FancyZonesEditor.Basic.SpaceAroundZones_Slider_Save")]
313          [TestCategory("FancyZones Editor #6")]
314          public void SpaceAroundZones_Slider_Save()
315          {
316              var type = LayoutType.PriorityGrid;
317              var layout = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString());
318              var expected = layout.Spacing;
319              Session.Find<Button>(TestConstants.TemplateLayoutNames[type]).Click();
320  
321              var slider = Session.Find<Custom>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.SpacingSlider));
322              Assert.IsNotNull(slider);
323              slider.SendKeys(Key.Right);
324              Assert.AreEqual($"{expected}", slider.Text);
325  
326              Session.Find<Button>(ElementName.Save).Click();
327  
328              // verify the file
329              var templateLayouts = new LayoutTemplates();
330              var data = templateLayouts.Read(templateLayouts.File);
331              var actual = data.LayoutTemplates.Find(x => x.Type == type.TypeToString()).Spacing;
332              Assert.AreEqual(expected, actual);
333          }
334  
335          [TestMethod("FancyZonesEditor.Basic.SpaceAroundZones_Slider_Cancel")]
336          [TestCategory("FancyZones Editor #6")]
337          public void SpaceAroundZones_Slider_Cancel()
338          {
339              var type = LayoutType.PriorityGrid;
340              var layout = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString());
341              var expected = layout.Spacing;
342              Session.Find<Button>(TestConstants.TemplateLayoutNames[type]).Click();
343  
344              var slider = Session.Find<Custom>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.SpacingSlider));
345              Assert.IsNotNull(slider);
346              slider.SendKeys(Key.Right);
347              Assert.AreEqual($"{expected}", slider.Text);
348  
349              Session.Find<Button>(ElementName.Cancel).Click();
350  
351              // verify the file
352              var templateLayouts = new LayoutTemplates();
353              var data = templateLayouts.Read(templateLayouts.File);
354              var actual = data.LayoutTemplates.Find(x => x.Type == type.TypeToString()).Spacing;
355              Assert.AreEqual(expected, actual);
356          }
357  
358          [TestMethod("FancyZonesEditor.Basic.SpaceAroundZones_Toggle_Save")]
359          [TestCategory("FancyZones Editor #6")]
360          public void SpaceAroundZones_Toggle_Save()
361          {
362              var type = LayoutType.PriorityGrid;
363              var layout = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString());
364              var expected = !layout.ShowSpacing;
365              Session.Find<Button>(TestConstants.TemplateLayoutNames[type]).Click();
366  
367              var toggle = Session.Find<Element>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.SpacingToggle));
368              Assert.IsNotNull(toggle);
369              toggle.Click();
370              Assert.AreEqual(expected, toggle.Selected);
371              Assert.AreEqual(expected, Session.Find<Element>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.SpacingSlider))?.Enabled);
372  
373              Session.Find<Button>(ElementName.Save).Click();
374  
375              // verify the file
376              var templateLayouts = new LayoutTemplates();
377              var data = templateLayouts.Read(templateLayouts.File);
378              var actual = data.LayoutTemplates.Find(x => x.Type == type.TypeToString()).ShowSpacing;
379              Assert.AreEqual(expected, actual);
380          }
381  
382          [TestMethod("FancyZonesEditor.Basic.SpaceAroundZones_Toggle_Cancel")]
383          [TestCategory("FancyZones Editor #6")]
384          public void SpaceAroundZones_Toggle_Cancel()
385          {
386              var type = LayoutType.PriorityGrid;
387              var layout = Layouts.LayoutTemplates.Find(x => x.Type == type.TypeToString());
388              var expected = layout.ShowSpacing;
389              Session.Find<Button>(TestConstants.TemplateLayoutNames[type]).Click();
390  
391              var toggle = Session.Find<Element>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.SpacingToggle));
392              Assert.IsNotNull(toggle);
393              toggle.Click();
394              Assert.AreNotEqual(expected, toggle.Selected);
395              Assert.AreNotEqual(expected, Session.Find<Element>(PowerToys.UITest.By.AccessibilityId(AccessibilityId.SpacingSlider))?.Enabled);
396  
397              Session.Find<Button>(ElementName.Cancel).Click();
398  
399              // verify the file
400              var templateLayouts = new LayoutTemplates();
401              var data = templateLayouts.Read(templateLayouts.File);
402              var actual = data.LayoutTemplates.Find(x => x.Type == type.TypeToString()).ShowSpacing;
403              Assert.AreEqual(expected, actual);
404          }
405      }
406  }