public async Task WindowTest3()
        {
            string targetWidget = "targetA";

            var systemWindow = new PopupsTestWindow(800, 600)
            {
                Details = new Dictionary <string, string>()
                {
                    ["Task"]     = "Top-Left Anchor : Bottom-Left Popup",
                    ["Expected"] = "Popup should appear above left of anchor click"
                }
            };

            systemWindow.Padding = systemWindow.Padding.Clone(bottom: 180);

            await systemWindow.RunTest(testRunner =>
            {
                var row = new FlowLayoutWidget()
                {
                    //Mate = Mate.Center | Mate.Fit,
                    VAnchor = VAnchor.Top | VAnchor.Fit,
                    HAnchor = HAnchor.Left | HAnchor.Fit,
                    Margin  = new BorderDouble(left: 120)
                };
                systemWindow.AddChild(row);

                var button = new TextButton("Popup", systemWindow.Theme)
                {
                    Name    = "targetA",
                    VAnchor = VAnchor.Bottom,
                };
                row.AddChild(button);

                var spacer = new GuiWidget()
                {
                    Width = 100,
                };
                row.AddChild(spacer);

                var button2 = new GuiWidget(140, 140)
                {
                    BackgroundColor = Color.Blue,
                    Name            = "targetB"
                };

                var hitBounds = new RectangleDouble(65, 45, 65 + 32, 45 + 32);

                button2.AfterDraw += (s, e) =>
                {
                    e.Graphics2D.Rectangle(hitBounds, Color.White);
                };
                row.AddChild(button2);

                var anchor = new MatePoint()
                {
                    Mate = new MateOptions()
                    {
                        HorizontalEdge = MateEdge.Right,
                        VerticalEdge   = MateEdge.Bottom,
                    },
                    Widget = button,
                };

                var popup = new MatePoint()
                {
                    Mate = new MateOptions()
                    {
                        HorizontalEdge = MateEdge.Left,
                        VerticalEdge   = MateEdge.Top,
                    }
                };

                button.Click += (s, e) =>
                {
                    popup.Widget = new GuiWidget(180d, 100d)
                    {
                        BackgroundColor = Color.LightBlue,
                        Border          = 2,
                        BorderColor     = Color.LightBlue.Blend(Color.Black, 0.4)
                    };

                    systemWindow.ShowPopup(anchor, popup);
                };

                button2.Click += (s, e) =>
                {
                    popup.Widget = new GuiWidget(180d, 100d)
                    {
                        BackgroundColor = Color.LightBlue,
                        Border          = 2,
                        BorderColor     = Color.LightBlue.Blend(Color.Black, 0.4)
                    };

                    systemWindow.ShowPopup(anchor, popup, hitBounds);
                };

                bool firstPass = true;

                //testRunner.Delay(90);

                for (var i = 0; i < 16; i++)
                {
                    switch (i)
                    {
                    // Bottom-Top positions
                    case 0:
                        anchor.Mate.HorizontalEdge = MateEdge.Left;
                        popup.Mate.HorizontalEdge  = MateEdge.Right;

                        anchor.Mate.VerticalEdge = MateEdge.Top;
                        popup.Mate.VerticalEdge  = MateEdge.Bottom;

                        anchor.AltMate.VerticalEdge = MateEdge.Bottom;
                        popup.AltMate.VerticalEdge  = MateEdge.Top;

                        break;

                    case 1:
                        anchor.Mate.HorizontalEdge = MateEdge.Left;
                        popup.Mate.HorizontalEdge  = MateEdge.Left;

                        anchor.Mate.VerticalEdge = MateEdge.Top;
                        popup.Mate.VerticalEdge  = MateEdge.Bottom;

                        anchor.AltMate.VerticalEdge = MateEdge.Bottom;
                        popup.AltMate.VerticalEdge  = MateEdge.Top;
                        break;

                    case 2:
                        anchor.Mate.HorizontalEdge = MateEdge.Right;
                        popup.Mate.HorizontalEdge  = MateEdge.Right;

                        anchor.Mate.VerticalEdge = MateEdge.Top;
                        popup.Mate.VerticalEdge  = MateEdge.Bottom;

                        anchor.AltMate.VerticalEdge = MateEdge.Bottom;
                        popup.AltMate.VerticalEdge  = MateEdge.Top;
                        break;

                    case 3:
                        anchor.Mate.HorizontalEdge = MateEdge.Right;
                        popup.Mate.HorizontalEdge  = MateEdge.Left;

                        anchor.Mate.VerticalEdge = MateEdge.Top;
                        popup.Mate.VerticalEdge  = MateEdge.Bottom;

                        anchor.AltMate.VerticalEdge = MateEdge.Bottom;
                        popup.AltMate.VerticalEdge  = MateEdge.Top;
                        break;

                    // Top-Top positions
                    case 4:
                        anchor.Mate.HorizontalEdge = MateEdge.Left;
                        popup.Mate.HorizontalEdge  = MateEdge.Right;

                        anchor.Mate.VerticalEdge = MateEdge.Top;
                        popup.Mate.VerticalEdge  = MateEdge.Top;

                        anchor.AltMate.VerticalEdge = MateEdge.Bottom;
                        popup.AltMate.VerticalEdge  = MateEdge.Bottom;
                        break;

                    case 5:
                        anchor.Mate.HorizontalEdge = MateEdge.Left;
                        popup.Mate.HorizontalEdge  = MateEdge.Left;

                        anchor.Mate.VerticalEdge = MateEdge.Top;
                        popup.Mate.VerticalEdge  = MateEdge.Top;

                        anchor.AltMate.VerticalEdge = MateEdge.Bottom;
                        popup.AltMate.VerticalEdge  = MateEdge.Bottom;
                        break;

                    case 6:
                        anchor.Mate.HorizontalEdge = MateEdge.Right;
                        popup.Mate.HorizontalEdge  = MateEdge.Right;

                        anchor.Mate.VerticalEdge = MateEdge.Top;
                        popup.Mate.VerticalEdge  = MateEdge.Top;

                        anchor.AltMate.VerticalEdge = MateEdge.Bottom;
                        popup.AltMate.VerticalEdge  = MateEdge.Bottom;
                        break;

                    case 7:
                        anchor.Mate.HorizontalEdge = MateEdge.Right;
                        popup.Mate.HorizontalEdge  = MateEdge.Left;

                        anchor.Mate.VerticalEdge = MateEdge.Top;
                        popup.Mate.VerticalEdge  = MateEdge.Top;

                        anchor.AltMate.VerticalEdge = MateEdge.Bottom;
                        popup.AltMate.VerticalEdge  = MateEdge.Bottom;
                        break;

                    // Bottom-Bottom positions
                    case 8:
                        anchor.Mate.HorizontalEdge = MateEdge.Left;
                        popup.Mate.HorizontalEdge  = MateEdge.Right;

                        anchor.Mate.VerticalEdge = MateEdge.Bottom;
                        popup.Mate.VerticalEdge  = MateEdge.Bottom;

                        anchor.AltMate.VerticalEdge = MateEdge.Top;
                        popup.AltMate.VerticalEdge  = MateEdge.Bottom;
                        break;

                    case 9:
                        anchor.Mate.HorizontalEdge = MateEdge.Left;
                        popup.Mate.HorizontalEdge  = MateEdge.Left;

                        anchor.Mate.VerticalEdge = MateEdge.Bottom;
                        popup.Mate.VerticalEdge  = MateEdge.Bottom;

                        anchor.AltMate.VerticalEdge = MateEdge.Top;
                        popup.AltMate.VerticalEdge  = MateEdge.Bottom;
                        break;

                    case 10:
                        anchor.Mate.HorizontalEdge = MateEdge.Right;
                        popup.Mate.HorizontalEdge  = MateEdge.Right;

                        anchor.Mate.VerticalEdge = MateEdge.Bottom;
                        popup.Mate.VerticalEdge  = MateEdge.Bottom;

                        anchor.AltMate.VerticalEdge = MateEdge.Top;
                        popup.AltMate.VerticalEdge  = MateEdge.Bottom;
                        break;

                    case 11:
                        anchor.Mate.HorizontalEdge = MateEdge.Right;
                        popup.Mate.HorizontalEdge  = MateEdge.Left;

                        anchor.Mate.VerticalEdge = MateEdge.Bottom;
                        popup.Mate.VerticalEdge  = MateEdge.Bottom;

                        anchor.AltMate.VerticalEdge = MateEdge.Top;
                        popup.AltMate.VerticalEdge  = MateEdge.Bottom;
                        break;

                    // Bottom-Top positions
                    case 12:
                        anchor.Mate.HorizontalEdge = MateEdge.Left;
                        popup.Mate.HorizontalEdge  = MateEdge.Right;

                        anchor.Mate.VerticalEdge = MateEdge.Bottom;
                        popup.Mate.VerticalEdge  = MateEdge.Top;

                        anchor.AltMate.VerticalEdge = MateEdge.Top;
                        popup.AltMate.VerticalEdge  = MateEdge.Bottom;
                        break;

                    case 13:
                        anchor.Mate.HorizontalEdge = MateEdge.Left;
                        popup.Mate.HorizontalEdge  = MateEdge.Left;

                        anchor.Mate.VerticalEdge = MateEdge.Bottom;
                        popup.Mate.VerticalEdge  = MateEdge.Top;

                        anchor.AltMate.VerticalEdge = MateEdge.Top;
                        popup.AltMate.VerticalEdge  = MateEdge.Bottom;
                        break;

                    case 14:
                        anchor.Mate.HorizontalEdge = MateEdge.Right;
                        popup.Mate.HorizontalEdge  = MateEdge.Right;

                        anchor.Mate.VerticalEdge = MateEdge.Bottom;
                        popup.Mate.VerticalEdge  = MateEdge.Top;

                        anchor.AltMate.VerticalEdge = MateEdge.Top;
                        popup.AltMate.VerticalEdge  = MateEdge.Bottom;
                        break;

                    case 15:
                        anchor.Mate.HorizontalEdge = MateEdge.Right;
                        popup.Mate.HorizontalEdge  = MateEdge.Left;

                        anchor.Mate.VerticalEdge = MateEdge.Bottom;
                        popup.Mate.VerticalEdge  = MateEdge.Top;

                        anchor.AltMate.VerticalEdge = MateEdge.Top;
                        popup.AltMate.VerticalEdge  = MateEdge.Bottom;
                        break;
                    }

                    testRunner.ClickByName(targetWidget);
                    testRunner.Delay(1);

                    if (i == 15 && firstPass)
                    {
                        firstPass     = false;
                        i             = -1;
                        targetWidget  = "targetB";
                        anchor.Widget = button2;
                    }

                    popup.Widget.Unfocus();
                }

                testRunner.Delay();

                return(Task.CompletedTask);
            }, 120);
        }
        private static async Task AnchorTests(PopupsTestWindow systemWindow, MatePoint anchor, MatePoint popup, TextButton button, Action <GuiWidget, GuiWidget> validator, Action <GuiWidget> rowAdjuster = null)
        {
            await systemWindow.RunTest(testRunner =>
            {
                var row = new FlowLayoutWidget()
                {
                    VAnchor = VAnchor.Center | VAnchor.Fit,
                    HAnchor = HAnchor.Left | HAnchor.Fit,
                    Margin  = new BorderDouble(left: 120)
                };
                systemWindow.AddChild(row);

                row.AddChild(button);

                rowAdjuster?.Invoke(row);

                button.Click += (s, e) =>
                {
                    popup.Widget = new GuiWidget(180d, 100d)
                    {
                        BackgroundColor = Color.LightBlue,
                        Border          = 2,
                        BorderColor     = Color.LightBlue.Blend(Color.Black, 0.4)
                    };

                    systemWindow.ShowPopup(anchor, popup);
                };

                anchor.Widget = button;

                for (var i = 0; i < 4; i++)
                {
                    switch (i)
                    {
                    case 0:
                        anchor.Mate.HorizontalEdge = MateEdge.Left;
                        popup.Mate.HorizontalEdge  = MateEdge.Right;
                        break;

                    case 1:
                        anchor.Mate.HorizontalEdge = MateEdge.Left;
                        popup.Mate.HorizontalEdge  = MateEdge.Left;
                        break;

                    case 2:
                        anchor.Mate.HorizontalEdge = MateEdge.Right;
                        popup.Mate.HorizontalEdge  = MateEdge.Right;
                        break;

                    case 3:
                        anchor.Mate.HorizontalEdge = MateEdge.Right;
                        popup.Mate.HorizontalEdge  = MateEdge.Left;
                        break;
                    }

                    testRunner.ClickByName("buttonA");

                    validator.Invoke(button, popup.Widget);

                    popup.Widget.Unfocus();
                }

                testRunner.Delay();

                return(Task.CompletedTask);
            }, 120);
        }