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 TestPushOnExiting()
        {
            TestScreen screen1 = null;

            pushAndEnsureCurrent(() =>
            {
                screen1         = new TestScreen(id: 1);
                screen1.Exiting = () =>
                {
                    screen1.Push(new TestScreen(id: 2));
                    return(true);
                };
                return(screen1);
            });

            AddStep("Exit screen 1", () => screen1.Exit());
            AddAssert("Screen 1 is not current", () => !screen1.IsCurrentScreen());
            AddAssert("Stack is not empty", () => stack.CurrentScreen != null);
        }