private void TestSelectionImpl(CmdApp app, ViewportArea area, IntPtr hConsole, WinCon.CONSOLE_SCREEN_BUFFER_INFO_EX sbiex, Queue <EventData> expected, WinCon.CONSOLE_SCREEN_BUFFER_INFO_EX sbiexOriginal) { // A. Test single area click { // Move mouse pointer to where the cursor is NativeMethods.Win32BoolHelper(WinCon.GetConsoleScreenBufferInfoEx(hConsole, ref sbiex), "Update console data."); Point pt = new Point(sbiex.dwCursorPosition.X, sbiex.dwCursorPosition.Y); area.MouseMove(pt); // Click on this area. expected.Enqueue(new EventData(EventType.CaretSelection, sbiex.dwCursorPosition.X, sbiex.dwCursorPosition.Y)); area.MouseDown(); area.MouseUp(); Globals.WaitForTimeout(); VerifyQueue(expected); // We may receive more than one caret and that's OK. Clear it out. this.received.Clear(); // End selection with escape app.UIRoot.SendKeys(Keys.Escape); Globals.WaitForTimeout(); // Expect to see the caret again after leaving selection mode expected.Enqueue(new EventData(EventType.CaretVisible, sbiex.dwCursorPosition.X, sbiex.dwCursorPosition.Y)); VerifyQueue(expected); } // B. Drag area click { // Move mouse pointer to where the cursor is NativeMethods.Win32BoolHelper(WinCon.GetConsoleScreenBufferInfoEx(hConsole, ref sbiex), "Update console data."); Point pt = new Point(sbiex.dwCursorPosition.X, sbiex.dwCursorPosition.Y); area.MouseMove(pt); // Click on this area. expected.Enqueue(new EventData(EventType.CaretSelection, sbiex.dwCursorPosition.X, sbiex.dwCursorPosition.Y)); area.MouseDown(); Globals.WaitForTimeout(); Point ptDrag = pt; // Drag down and right for "some" distance. 10 isn't for a specific reason, it's just "some". ptDrag.X += 10; ptDrag.Y += 10; area.MouseMove(ptDrag); Globals.WaitForTimeout(); area.MouseUp(); Globals.WaitForTimeout(); // Verify that the first one in the queue starts with where we put the mouse down. VerifyQueue(expected); // Now we have to take the final message in the queue and make sure it is where we released the mouse EventData expectedLast = new EventData(EventType.CaretSelection, ptDrag.X, ptDrag.Y); EventData actualLast = received.Last(); Verify.AreEqual(expectedLast, actualLast); // Empty the received queue. received.Clear(); // End selection with escape app.UIRoot.SendKeys(Keys.Escape); Globals.WaitForTimeout(); // Expect to see the caret again after leaving selection mode expected.Enqueue(new EventData(EventType.CaretVisible, sbiex.dwCursorPosition.X, sbiex.dwCursorPosition.Y)); VerifyQueue(expected); } }
public void TestMouseSelection() { using (CmdApp app = new CmdApp(CreateType.ProcessOnly, TestContext)) { using (ViewportArea area = new ViewportArea(app)) { // Set up the area we're going to attempt to select Point startPoint = new Point(); Point endPoint = new Point(); startPoint.X = 1; startPoint.Y = 2; endPoint.X = 10; endPoint.Y = 10; // Save expected anchor WinCon.COORD expectedAnchor = new WinCon.COORD(); expectedAnchor.X = (short)startPoint.X; expectedAnchor.Y = (short)startPoint.Y; // Also save bottom right corner for the end of the selection WinCon.COORD expectedBottomRight = new WinCon.COORD(); expectedBottomRight.X = (short)endPoint.X; expectedBottomRight.Y = (short)endPoint.Y; // Prepare the mouse by moving it into the start position. Prepare the structure WinCon.CONSOLE_SELECTION_INFO csi; WinCon.SMALL_RECT expectedRect = new WinCon.SMALL_RECT(); WinCon.CONSOLE_SELECTION_INFO_FLAGS flagsExpected = WinCon.CONSOLE_SELECTION_INFO_FLAGS.CONSOLE_NO_SELECTION; // 1. Place mouse button down to start selection and check state area.MouseMove(startPoint); area.MouseDown(); Globals.WaitForTimeout(); // must wait after mouse operation. No good waiters since we have no UI objects flagsExpected |= WinCon.CONSOLE_SELECTION_INFO_FLAGS.CONSOLE_SELECTION_IN_PROGRESS; // a selection is occurring flagsExpected |= WinCon.CONSOLE_SELECTION_INFO_FLAGS.CONSOLE_MOUSE_SELECTION; // it's a "Select" mode not "Mark" mode selection flagsExpected |= WinCon.CONSOLE_SELECTION_INFO_FLAGS.CONSOLE_MOUSE_DOWN; // the mouse is still down flagsExpected |= WinCon.CONSOLE_SELECTION_INFO_FLAGS.CONSOLE_SELECTION_NOT_EMPTY; // mouse selections are never empty. minimum 1x1 expectedRect.Top = expectedAnchor.Y; // rectangle is just at the point itself 1x1 size expectedRect.Left = expectedAnchor.X; expectedRect.Bottom = expectedRect.Top; expectedRect.Right = expectedRect.Left; NativeMethods.Win32BoolHelper(WinCon.GetConsoleSelectionInfo(out csi), "Check state on mouse button down to start selection."); Log.Comment("Selection Info: {0}", csi); Verify.AreEqual(csi.Flags, flagsExpected, "Check initial mouse selection with button still down."); Verify.AreEqual(csi.SelectionAnchor, expectedAnchor, "Check that the anchor is equal to the start point."); Verify.AreEqual(csi.Selection, expectedRect, "Check that entire rectangle is the size of 1x1 and is just at the anchor point."); // 2. Move to end point and release cursor area.MouseMove(endPoint); area.MouseUp(); Globals.WaitForTimeout(); // must wait after mouse operation. No good waiters since we have no UI objects // on button up, remove mouse down flag flagsExpected &= ~WinCon.CONSOLE_SELECTION_INFO_FLAGS.CONSOLE_MOUSE_DOWN; // anchor remains the same // bottom right of rectangle now changes to the end point expectedRect.Bottom = expectedBottomRight.Y; expectedRect.Right = expectedBottomRight.X; NativeMethods.Win32BoolHelper(WinCon.GetConsoleSelectionInfo(out csi), "Check state after drag and release mouse."); Log.Comment("Selection Info: {0}", csi); Verify.AreEqual(csi.Flags, flagsExpected, "Check selection is still on and valid, but button is up."); Verify.AreEqual(csi.SelectionAnchor, expectedAnchor, "Check that the anchor is still equal to the start point."); Verify.AreEqual(csi.Selection, expectedRect, "Check that entire rectangle reaches from start to end point."); // 3. Leave mouse selection area.ExitModes(); flagsExpected = WinCon.CONSOLE_SELECTION_INFO_FLAGS.CONSOLE_NO_SELECTION; NativeMethods.Win32BoolHelper(WinCon.GetConsoleSelectionInfo(out csi), "Check state after exiting mouse selection."); Log.Comment("Selection Info: {0}", csi); Verify.AreEqual(csi.Flags, flagsExpected, "Check that selection state is reset."); } } }