public void TestEventOrder()
        {
            List <int> order = new List <int>();

            var screen1 = new TestScreen
            {
                Entered   = () => order.Add(1),
                Suspended = () => order.Add(2),
                Resumed   = () => order.Add(5),
            };

            var screen2 = new TestScreen
            {
                Entered = () => order.Add(3),
                Exited  = () => order.Add(4),
            };

            AddStep("push screen1", () => stack.Push(screen1));
            AddUntilStep("ensure current", () => screen1.IsCurrentScreen());

            AddStep("preload screen2", () => LoadComponentAsync(screen2));
            AddUntilStep("wait for load", () => screen2.LoadState == LoadState.Ready);

            AddStep("push screen2", () => screen1.Push(screen2));
            AddUntilStep("ensure current", () => screen2.IsCurrentScreen());

            AddStep("exit screen2", () => screen2.Exit());
            AddUntilStep("ensure exited", () => !screen2.IsCurrentScreen());

            AddStep("push screen2", () => screen1.Exit());
            AddUntilStep("ensure exited", () => !screen1.IsCurrentScreen());

            AddAssert("order is correct", () => order.SequenceEqual(order.OrderBy(i => i)));
        }
        public void TestCallingExitFromBlockingExit()
        {
            TestScreen screen1             = null;
            TestScreen screen2             = null;
            int        screen1ResumedCount = 0;

            bool blocking = true;

            pushAndEnsureCurrent(() => screen1 = new TestScreen(id: 1)
            {
                Resumed = () => screen1ResumedCount++
            });

            pushAndEnsureCurrent(() => screen2 = new TestScreen(id: 2)
            {
                Exiting = () =>
                {
                    if (blocking)
                    {
                        blocking = false;

                        // ReSharper disable once AccessToModifiedClosure
                        screen2.Exit();
                        return(true);
                    }

                    // this call should fail in a way the user can understand.
                    return(false);
                }
            }, () => screen1);

            AddStep("make screen 1 current", () => screen1.MakeCurrent());
            AddAssert("screen 1 resumed only once", () => screen1ResumedCount == 1);
        }