139 lines
5.3 KiB
C#
139 lines
5.3 KiB
C#
//----------------------------------------------------------------------------------------------------------------------
|
|
// <copyright file="MouseWheelTests.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
// </copyright>
|
|
// <summary>UI Automation tests for ensuring mouse wheel functionality.</summary>
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
namespace Conhost.UIA.Tests
|
|
{
|
|
using System;
|
|
|
|
using WEX.Logging.Interop;
|
|
using WEX.TestExecution;
|
|
using WEX.TestExecution.Markup;
|
|
|
|
using Conhost.UIA.Tests.Common;
|
|
using Conhost.UIA.Tests.Common.NativeMethods;
|
|
using Conhost.UIA.Tests.Elements;
|
|
|
|
[TestClass]
|
|
public class MouseWheelTests
|
|
{
|
|
public TestContext TestContext { get; set; }
|
|
|
|
[TestMethod]
|
|
public void TestMouseWheel()
|
|
{
|
|
// Use a registry helper to backup and restore registry state before/after test
|
|
using (RegistryHelper reg = new RegistryHelper())
|
|
{
|
|
reg.BackupRegistry();
|
|
|
|
// Start our application to test
|
|
using (CmdApp app = new CmdApp(CreateType.ProcessOnly, TestContext))
|
|
{
|
|
Log.Comment("First ensure that word wrap is off so we can get scroll bars in both directions.");
|
|
// Make sure wrap is off
|
|
app.SetWrapState(false);
|
|
|
|
IntPtr handle = app.GetStdOutHandle();
|
|
Verify.IsNotNull(handle, "Ensure we have the output handle.");
|
|
|
|
Log.Comment("Set up the window so the buffer is larger than the window. Retrieve existing properties then set the viewport to smaller than the buffer.");
|
|
|
|
WinCon.CONSOLE_SCREEN_BUFFER_INFO_EX info = app.GetScreenBufferInfo(handle);
|
|
|
|
info.srWindow.Left = 0;
|
|
info.srWindow.Right = 30;
|
|
info.srWindow.Top = 0;
|
|
info.srWindow.Bottom = 30;
|
|
|
|
info.dwSize.X = 100;
|
|
info.dwSize.Y = 100;
|
|
app.SetScreenBufferInfo(handle, info);
|
|
|
|
Log.Comment("Now retrieve the starting position of the window viewport.");
|
|
|
|
Log.Comment("Scroll down one.");
|
|
VerifyScroll(app, ScrollDir.Vertical, -1);
|
|
|
|
Log.Comment("Scroll right one.");
|
|
VerifyScroll(app, ScrollDir.Horizontal, 1);
|
|
|
|
Log.Comment("Scroll left one.");
|
|
VerifyScroll(app, ScrollDir.Horizontal, -1);
|
|
|
|
Log.Comment("Scroll up one.");
|
|
VerifyScroll(app, ScrollDir.Vertical, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
enum ScrollDir
|
|
{
|
|
Vertical,
|
|
Horizontal
|
|
}
|
|
|
|
void VerifyScroll(CmdApp app, ScrollDir dir, int clicks)
|
|
{
|
|
WinCon.CONSOLE_SCREEN_BUFFER_INFO_EX beforeScroll;
|
|
WinCon.CONSOLE_SCREEN_BUFFER_INFO_EX afterScroll;
|
|
int deltaActual;
|
|
int deltaExpected;
|
|
|
|
beforeScroll = app.GetScreenBufferInfo();
|
|
|
|
switch (dir)
|
|
{
|
|
case ScrollDir.Vertical:
|
|
app.ScrollWindow(clicks);
|
|
break;
|
|
case ScrollDir.Horizontal:
|
|
app.HScrollWindow(clicks);
|
|
break;
|
|
default:
|
|
throw new NotSupportedException();
|
|
}
|
|
|
|
// Give the window message a moment to take effect.
|
|
Globals.WaitForTimeout();
|
|
|
|
switch (dir)
|
|
{
|
|
case ScrollDir.Vertical:
|
|
deltaExpected = clicks * app.GetRowsPerScroll();
|
|
break;
|
|
case ScrollDir.Horizontal:
|
|
deltaExpected = clicks * app.GetColsPerScroll();
|
|
break;
|
|
default:
|
|
throw new NotSupportedException();
|
|
}
|
|
|
|
afterScroll = app.GetScreenBufferInfo();
|
|
|
|
switch (dir)
|
|
{
|
|
case ScrollDir.Vertical:
|
|
// Scrolling "negative" vertically is pulling the wheel downward which makes the lines move down.
|
|
// This means that if you scroll down from the top, before = 0 and after = 3. 0 - 3 = -3.
|
|
// The - sign of the delta here then aligns with the down = negative rule.
|
|
deltaActual = beforeScroll.srWindow.Top - afterScroll.srWindow.Top;
|
|
break;
|
|
case ScrollDir.Horizontal:
|
|
// Scrolling "negative" horizontally is pushing the wheel left which makes lines move left.
|
|
// This means that if you scroll left, before = 3 and after = 0. 0 - 3 = -3.
|
|
// The - sign of the delta here then aligns with the left = negative rule.
|
|
deltaActual = afterScroll.srWindow.Left - beforeScroll.srWindow.Left;
|
|
break;
|
|
default:
|
|
throw new NotSupportedException();
|
|
}
|
|
|
|
Verify.AreEqual(deltaExpected, deltaActual);
|
|
}
|
|
}
|
|
}
|