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 }