public async Task ClickSuppressedOnMouseUpWithinChild2()
        {
            // Agg currently fires mouse up events in child controls when the parent has the mouse captured
            // and is performing drag like operations. If the mouse goes down in the parent and comes up on the child
            // neither control should get a click event

            var testWindow        = new ClickTestsWindow(300, 200);
            var bounds            = testWindow.BlueWidget.BoundsRelativeToParent;
            var mouseDownPosition = new Vector2(bounds.Left + 25, bounds.Bottom + 4);

            var    childBounds = testWindow.OrangeWidget.BoundsRelativeToParent;
            double childX      = bounds.Left + childBounds.Center.X;
            double childY      = bounds.Bottom + childBounds.Center.Y;

            await AutomationRunner.ShowWindowAndExecuteTests(
                testWindow,
                (testRunner) =>
            {
                MouseEventArgs mouseEvent;

                // ** Click should occur on mouse[down/up] within the controls bounds **
                //
                // Move to a position within BlueWidget for mousedown
                mouseEvent = new MouseEventArgs(MouseButtons.Left, 1, mouseDownPosition.X, mouseDownPosition.Y, 0);
                testRunner.SetMouseCursorPosition(testWindow, (int)mouseEvent.X, (int)mouseEvent.Y);
                testWindow.OnMouseDown(mouseEvent);

                // Move to a position within BlueWidget for mouseup
                mouseEvent = new MouseEventArgs(MouseButtons.Left, 1, bounds.Center.X, bounds.Center.Y, 0);
                testRunner.SetMouseCursorPosition(testWindow, (int)mouseEvent.X, (int)mouseEvent.Y);
                testWindow.OnMouseUp(mouseEvent);

                Assert.AreEqual(1, testWindow.BlueWidget.ClickCount, "Expected 1 click on root widget");

                // ** Click should not occur when mouse up occurs on child controls **
                //
                // Move to a position within BlueWidget for mousedown
                mouseEvent = new MouseEventArgs(MouseButtons.Left, 1, mouseDownPosition.X, mouseDownPosition.Y, 0);
                testRunner.SetMouseCursorPosition(testWindow, (int)mouseEvent.X, (int)mouseEvent.Y);
                testWindow.OnMouseDown(mouseEvent);

                // Move to a position with the OrangeWidget for mouseup
                mouseEvent = new MouseEventArgs(MouseButtons.Left, 1, childX, childY, 0);
                testRunner.SetMouseCursorPosition(testWindow, (int)mouseEvent.X, (int)mouseEvent.Y);
                testWindow.OnMouseUp(mouseEvent);

                // There should be no increment in the click count
                Assert.AreEqual(1, testWindow.BlueWidget.ClickCount, "Expected click count to not increment on mouse up within child control");

                return(Task.CompletedTask);
            });
        }
        public async Task ClickSuppressedOnExternalMouseUp()
        {
            var testWindow        = new ClickTestsWindow(300, 200);
            var bounds            = testWindow.BlueWidget.BoundsRelativeToParent;
            var mouseDownPosition = new Vector2(bounds.Left + 25, bounds.Bottom + 4);

            await AutomationRunner.ShowWindowAndExecuteTests(
                testWindow,
                (testRunner) =>
            {
                MouseEventArgs mouseEvent;

                // ** Click should occur on mouse[down/up] within the controls bounds **
                //
                // Move to a position within the blueWidget for mousedown
                mouseEvent = new MouseEventArgs(MouseButtons.Left, 1, mouseDownPosition.X, mouseDownPosition.Y, 0);
                testRunner.SetMouseCursorPosition(testWindow, (int)mouseEvent.X, (int)mouseEvent.Y);
                testWindow.OnMouseDown(mouseEvent);

                // Move to a position within blueWidget for mouseup
                mouseEvent = new MouseEventArgs(MouseButtons.Left, 1, bounds.Center.X, bounds.Center.Y, 0);
                testRunner.SetMouseCursorPosition(testWindow, (int)mouseEvent.X, (int)mouseEvent.Y);
                testWindow.OnMouseUp(mouseEvent);

                Assert.AreEqual(1, testWindow.BlueWidget.ClickCount, "Expected 1 click on root widget");

                // ** Click should not occur when mouse up is outside of the control bounds **
                //
                // Move to a position within BlueWidget for mousedown
                mouseEvent = new MouseEventArgs(MouseButtons.Left, 1, mouseDownPosition.X, mouseDownPosition.Y, 0);
                testRunner.SetMouseCursorPosition(testWindow, (int)mouseEvent.X, (int)mouseEvent.Y);
                testWindow.OnMouseDown(mouseEvent);

                // Move to a position **outside** of BlueWidget for mouseup
                mouseEvent = new MouseEventArgs(MouseButtons.Left, 1, 50, 50, 0);
                testRunner.SetMouseCursorPosition(testWindow, (int)mouseEvent.X, (int)mouseEvent.Y);
                testWindow.OnMouseUp(mouseEvent);

                // There should be no increment in the click count
                Assert.AreEqual(1, testWindow.BlueWidget.ClickCount, "Expected 1 click on root widget");

                return(Task.CompletedTask);
            });
        }
        public async Task ClickFiresOnCorrectWidgets()
        {
            var testWindow = new ClickTestsWindow(300, 200);

            await AutomationRunner.ShowWindowAndExecuteTests(
                testWindow,
                (testRunner) =>
            {
                testRunner.ClickByName("blueWidget");
                testRunner.Delay(.1);
                Assert.AreEqual(1, testWindow.BlueWidget.ClickCount, "Unexpected click count on blue widget");
                Assert.AreEqual(0, testWindow.OrangeWidget.ClickCount, "Unexpected click count on orange widget");
                Assert.AreEqual(0, testWindow.PurpleWidget.ClickCount, "Unexpected click count on purple widget");

                testRunner.ClickByName("orangeWidget");
                testRunner.Delay(.1);
                Assert.AreEqual(1, testWindow.BlueWidget.ClickCount, "Unexpected click count on blue widget");
                Assert.AreEqual(1, testWindow.OrangeWidget.ClickCount, "Unexpected click count on orange widget");
                Assert.AreEqual(0, testWindow.PurpleWidget.ClickCount, "Unexpected click count on purple widget");

                testRunner.ClickByName("blueWidget");
                testRunner.Delay(.1);
                Assert.AreEqual(2, testWindow.BlueWidget.ClickCount, "Unexpected click count on blue widget");
                Assert.AreEqual(1, testWindow.OrangeWidget.ClickCount, "Unexpected click count on orange widget");
                Assert.AreEqual(0, testWindow.PurpleWidget.ClickCount, "Unexpected click count on purple widget");

                testRunner.ClickByName("orangeWidget");
                testRunner.Delay(.1);
                Assert.AreEqual(2, testWindow.BlueWidget.ClickCount, "Unexpected click count on root widget");
                Assert.AreEqual(2, testWindow.OrangeWidget.ClickCount, "Unexpected click count on orange widget");
                Assert.AreEqual(0, testWindow.PurpleWidget.ClickCount, "Unexpected click count on purple widget");

                testRunner.ClickByName("purpleWidget");
                testRunner.Delay(.1);
                Assert.AreEqual(2, testWindow.BlueWidget.ClickCount, "Unexpected click count on blue widget");
                Assert.AreEqual(2, testWindow.OrangeWidget.ClickCount, "Unexpected click count on orange widget");
                Assert.AreEqual(1, testWindow.PurpleWidget.ClickCount, "Unexpected click count on purple widget");

                return(Task.CompletedTask);
            });
        }