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 }