//----------------------------------------------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
//
// UI Automation tests for the certain key presses.
//----------------------------------------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using WEX.TestExecution;
using WEX.TestExecution.Markup;
using WEX.Logging.Interop;
using Conhost.UIA.Tests.Common;
using Conhost.UIA.Tests.Common.NativeMethods;
using Conhost.UIA.Tests.Elements;
using OpenQA.Selenium;
namespace Conhost.UIA.Tests
{
[TestClass]
class KeyPressTests
{
public TestContext TestContext { get; set; }
[TestMethod]
[TestProperty("Ignore", "True")] // GH#7282 - investigate and reenable
public void VerifyCtrlKeysBash()
{
using (RegistryHelper reg = new RegistryHelper())
{
reg.BackupRegistry();
using (CmdApp app = new CmdApp(CreateType.ProcessOnly, TestContext))
{
using (ViewportArea area = new ViewportArea(app))
{
IntPtr hConsole = app.GetStdOutHandle();
Verify.IsNotNull(hConsole, "Ensure the STDOUT handle is valid.");
// start up bash, run cat, type some keys with ctrl held down
app.UIRoot.SendKeys("bash");
app.UIRoot.SendKeys(Keys.Enter);
Globals.WaitForTimeout();
app.UIRoot.SendKeys("cat");
app.UIRoot.SendKeys(Keys.Enter);
Globals.WaitForTimeout();
app.UIRoot.SendKeys(Keys.Control + "ahz" + Keys.Control);
Globals.WaitForTimeout();
// make sure "^A^H^Z" showed up in the output
Rectangle rect = new Rectangle(0, 0, 10, 10);
IEnumerable text = area.GetLinesInRectangle(hConsole, rect);
bool foundCtrlChars = false;
foreach (string line in text)
{
if (line.Contains("^A^H^Z"))
{
foundCtrlChars = true;
break;
}
}
Verify.IsTrue(foundCtrlChars);
}
}
}
}
[TestMethod]
[TestProperty("Ignore", "True")] // GH#7282 - investigate and reenable
public void VerifyCtrlCBash()
{
using (RegistryHelper reg = new RegistryHelper())
{
reg.BackupRegistry();
using (CmdApp app = new CmdApp(CreateType.ProcessOnly, TestContext))
{
using (ViewportArea area = new ViewportArea(app))
{
IntPtr hConsole = app.GetStdOutHandle();
Verify.IsNotNull(hConsole, "Ensure the STDOUT handle is valid.");
// start up bash, run cat, type ctrl+c
app.UIRoot.SendKeys("bash");
app.UIRoot.SendKeys(Keys.Enter);
Globals.WaitForTimeout();
app.UIRoot.SendKeys("cat");
app.UIRoot.SendKeys(Keys.Enter);
Globals.WaitForTimeout();
app.UIRoot.SendKeys(Keys.Control + "c" + Keys.Control);
Globals.WaitForTimeout();
// make sure "^C" showed up in the output
Rectangle rect = new Rectangle(0, 0, 10, 10);
IEnumerable text = area.GetLinesInRectangle(hConsole, rect);
bool foundCtrlC = false;
foreach (string line in text)
{
if (line.Contains("^C"))
{
foundCtrlC = true;
break;
}
}
Verify.IsTrue(foundCtrlC);
}
}
}
}
[TestMethod]
public void VerifyCtrlZCmd()
{
using (RegistryHelper reg = new RegistryHelper())
{
reg.BackupRegistry();
using (CmdApp app = new CmdApp(CreateType.ProcessOnly, TestContext))
{
using (ViewportArea area = new ViewportArea(app))
{
IntPtr hConsole = app.GetStdOutHandle();
Verify.IsNotNull(hConsole, "Ensure the handle is valid.");
// get cursor location
WinCon.CONSOLE_SCREEN_BUFFER_INFO_EX screenBufferInfo = new WinCon.CONSOLE_SCREEN_BUFFER_INFO_EX();
WinCon.GetConsoleScreenBufferInfoEx(hConsole, ref screenBufferInfo);
// send ^Z
app.UIRoot.SendKeys(Keys.Control + "z" + Keys.Control);
Globals.WaitForTimeout();
// test that "^Z" exists on the screen
Rectangle rect = new Rectangle(0, 0, 200, 20);
IEnumerable text = area.GetLinesInRectangle(hConsole, rect);
bool foundCtrlZ = false;
foreach (string line in text)
{
if (line.Contains("^Z"))
{
foundCtrlZ = true;
break;
}
}
Verify.IsTrue(foundCtrlZ);
}
}
}
}
[TestMethod]
public void VerifyCtrlHCmd()
{
using (RegistryHelper reg = new RegistryHelper())
{
reg.BackupRegistry();
using (CmdApp app = new CmdApp(CreateType.ProcessOnly, TestContext))
{
using (ViewportArea area = new ViewportArea(app))
{
string testText = "1234blah5678";
IntPtr hConsole = app.GetStdOutHandle();
Verify.IsNotNull(hConsole, "Ensure the handle is valid.");
// get cursor location
WinCon.CONSOLE_SCREEN_BUFFER_INFO_EX screenBufferInfo = new WinCon.CONSOLE_SCREEN_BUFFER_INFO_EX();
WinCon.GetConsoleScreenBufferInfoEx(hConsole, ref screenBufferInfo);
// send some text and a ^H to remove the last character
app.UIRoot.SendKeys(testText + Keys.Control + "h" + Keys.Control);
Globals.WaitForTimeout();
// test that we're missing the last character of testText on the line
Rectangle rect = new Rectangle(0, 0, 200, 20);
IEnumerable text = area.GetLinesInRectangle(hConsole, rect);
bool foundCtrlH = false;
foreach (string line in text)
{
if (line.Contains(testText.Substring(0, testText.Length - 1)) && !line.Contains(testText))
{
foundCtrlH = true;
break;
}
}
Verify.IsTrue(foundCtrlH);
}
}
}
}
[TestMethod]
public void VerifyCtrlCCmd()
{
using (RegistryHelper reg = new RegistryHelper())
{
reg.BackupRegistry();
using (CmdApp app = new CmdApp(CreateType.ProcessOnly, TestContext))
{
using (ViewportArea area = new ViewportArea(app))
{
IntPtr hConsole = app.GetStdOutHandle();
Verify.IsNotNull(hConsole, "Ensure the handle is valid.");
Globals.WaitForTimeout();
// send ctrl-c sequence
const int keypressCount = 10;
for (int i = 0; i < keypressCount; ++i)
{
app.UIRoot.SendKeys(Keys.Control + "c" + Keys.Control);
}
Globals.WaitForTimeout();
// fetch the text
Rectangle rect = new Rectangle(0, 0, 50, 50);
IEnumerable text = area.GetLinesInRectangle(hConsole, rect);
// filter out the blank lines
List possiblePromptLines = new List();
for (int i = 0; i < text.Count(); ++i)
{
string line = text.ElementAt(i);
line = line.Trim(' ');
if (!line.Equals(""))
{
possiblePromptLines.Add(line);
}
}
// make sure that the prompt line shows up for each ^C key press
Verify.IsTrue(possiblePromptLines.Count() >= keypressCount);
possiblePromptLines.Reverse();
for (int i = 0; i < keypressCount; ++i)
{
Verify.AreEqual(possiblePromptLines[0], possiblePromptLines[1]);
possiblePromptLines.RemoveAt(0);
}
}
}
}
}
}
}