Пример #1
0
        public void TestExitBeforePush()
        {
            TestScreen screen1 = null;
            TestScreen screen2 = null;

            AddStep("push slow", () => baseScreen.Push(screen1 = new TestScreenSlow()));
            AddStep("exit slow", () => screen1.Exit());
            AddUntilStep(() => screen1.LoadState >= LoadState.Ready, "wait for screen to load");
            AddAssert("ensure not current", () => !screen1.IsCurrentScreen());
            AddAssert("ensure base still current", () => baseScreen.IsCurrentScreen());
            AddStep("push fast", () => baseScreen.Push(screen2 = new TestScreen()));
            AddUntilStep(() => screen2.IsCurrentScreen(), "ensure new current");
        }
Пример #2
0
        public void TestAsyncPreloadPush()
        {
            TestScreenSlow screen1 = null;

            AddStep("preload slow", () =>
            {
                screen1 = new TestScreenSlow();
                screen1.AllowLoad.Set();

                LoadComponentAsync(screen1);
            });
            pushAndEnsureCurrent(() => screen1);
        }
Пример #3
0
        public void TestCaseExitBeforePush()
        {
            TestScreen screen1 = null;
            TestScreen screen2 = null;

            AddStep("push slow", () => baseScreen.Push(screen1 = new TestScreenSlow()));
            AddStep("exit slow", () => screen1.Exit());
            AddAssert("ensure not current", () => !screen1.IsCurrentScreen);
            AddWaitStep(5);
            AddAssert("ensure not current", () => !screen1.IsCurrentScreen);
            AddAssert("ensure base still current", () => baseScreen.IsCurrentScreen);
            AddStep("push fast", () => baseScreen.Push(screen2 = new TestScreen()));
            AddAssert("ensure new current", () => screen2.IsCurrentScreen);
        }
        public void TestMakeCurrentDuringLoad()
        {
            TestScreen     screen1 = null;
            TestScreenSlow screen2 = null;

            pushAndEnsureCurrent(() => screen1 = new TestScreen());
            AddStep("push slow", () => screen1.Push(screen2 = new TestScreenSlow()));

            AddStep("make screen1 current", () => screen1.MakeCurrent());
            AddStep("allow load of screen2", () => screen2.AllowLoad.Set());
            AddUntilStep("wait for screen2 to load", () => screen2.LoadState == LoadState.Ready);

            AddAssert("screen1 is current screen", () => screen1.IsCurrentScreen());
            AddAssert("screen2 did not receive OnEntering", () => screen2.EnteredFrom == null);
            AddAssert("screen2 did not receive OnExiting", () => screen2.ExitedTo == null);
        }
        public void TestAsyncDoublePush()
        {
            TestScreenSlow screen1 = null;
            TestScreenSlow screen2 = null;

            AddStep("push slow", () => stack.Push(screen1 = new TestScreenSlow()));
            // important to note we are pushing to the stack here, unlike the failing case above.
            AddStep("push second slow", () => stack.Push(screen2 = new TestScreenSlow()));

            AddAssert("base screen registered suspend", () => baseScreen.SuspendedTo == screen1);

            AddAssert("screen1 is not current", () => !screen1.IsCurrentScreen());
            AddAssert("screen2 is not current", () => !screen2.IsCurrentScreen());

            AddAssert("screen2 is current to stack", () => stack.CurrentScreen == screen2);

            AddAssert("screen1 not registered suspend", () => screen1.SuspendedTo == null);
            AddAssert("screen2 not registered entered", () => screen2.EnteredFrom == null);

            AddStep("allow load 2", () => screen2.AllowLoad.Set());

            // screen 2 won't actually be loading since the load is only triggered after screen1 is loaded.
            AddWaitStep("wait for load", 10);

            // furthermore, even though screen 2 is able to load, screen 1 has not yet so we shouldn't has received any events.
            AddAssert("screen1 is not current", () => !screen1.IsCurrentScreen());
            AddAssert("screen2 is not current", () => !screen2.IsCurrentScreen());
            AddAssert("screen1 not registered suspend", () => screen1.SuspendedTo == null);
            AddAssert("screen2 not registered entered", () => screen2.EnteredFrom == null);

            AddStep("allow load 1", () => screen1.AllowLoad.Set());
            AddUntilStep("screen1 is loaded", () => screen1.LoadState == LoadState.Loaded);
            AddUntilStep("screen2 is loaded", () => screen2.LoadState == LoadState.Loaded);

            AddUntilStep("screen1 is expired", () => !screen1.IsAlive);

            AddUntilStep("screen1 is not current", () => !screen1.IsCurrentScreen());
            AddUntilStep("screen2 is current", () => screen2.IsCurrentScreen());

            AddAssert("screen1 registered suspend", () => screen1.SuspendedTo == screen2);
            AddAssert("screen2 registered entered", () => screen2.EnteredFrom == screen1);
        }
        public void TestAsyncPushWithNonImmediateSuspend()
        {
            AddStep("override stack", () =>
            {
                // we can't use the [SetUp] screen stack as we need to change the ctor parameters.
                Clear();
                Add(stack = new ScreenStack(baseScreen = new TestScreen(), suspendImmediately: false)
                {
                    RelativeSizeAxes = Axes.Both
                });
            });

            TestScreenSlow screen1 = null;

            AddStep("push slow", () => baseScreen.Push(screen1 = new TestScreenSlow()));
            AddAssert("base screen not yet registered suspend", () => baseScreen.SuspendedTo == null);
            AddAssert("ensure notcurrent", () => !screen1.IsCurrentScreen());
            AddStep("allow load", () => screen1.AllowLoad.Set());
            AddUntilStep("ensure current", () => screen1.IsCurrentScreen());
            AddAssert("base screen registered suspend", () => baseScreen.SuspendedTo == screen1);
        }
        public void TestInvalidPushDoesNotBlockImmediateSuspend()
        {
            TestScreen     screen1 = null;
            TestScreenSlow screen2 = null;

            AddStep("override stack", () =>
            {
                // we can't use the [SetUp] screen stack as we need to change the ctor parameters.
                Clear();
                Add(stack = new ScreenStack(baseScreen = new TestScreen(), true)
                {
                    RelativeSizeAxes = Axes.Both
                });
            });

            pushAndEnsureCurrent(() => screen1 = new TestScreen());
            AddStep("push slow", () => screen1.Push(screen2 = new TestScreenSlow()));
            AddStep("exit slow", () => screen2.Exit());
            AddStep("allow load", () => screen2.AllowLoad.Set());
            AddUntilStep("wait for screen 2 to load", () => screen2.LoadState >= LoadState.Ready);
            AddAssert("screen 1 did receive suspending", () => screen1.SuspendedTo == screen2);
            AddAssert("screen 1 did receive resumed", () => screen1.ResumedFrom == screen2);
        }
        public void TestMakeCurrentDuringLoadOfMany()
        {
            TestScreen     screen1 = null;
            TestScreenSlow screen2 = null;
            TestScreenSlow screen3 = null;

            pushAndEnsureCurrent(() => screen1 = new TestScreen(id: 1));
            AddStep("push slow screen 2", () => stack.Push(screen2 = new TestScreenSlow(id: 2)));
            AddStep("push slow screen 3", () => stack.Push(screen3 = new TestScreenSlow(id: 3)));

            AddAssert("Screen 1 is not current", () => !screen1.IsCurrentScreen());
            AddStep("Make current screen 1", () => screen1.MakeCurrent());
            AddAssert("Screen 1 is current", () => screen1.IsCurrentScreen());

            // Allow the screens to load out of order to test whether or not screen 3 tried to load.
            // The load should be blocked since screen 2 is already exited by MakeCurrent.
            AddStep("allow screen 3 to load", () => screen3.AllowLoad.Set());
            AddStep("allow screen 2 to load", () => screen2.AllowLoad.Set());

            AddAssert("Screen 1 is current", () => screen1.IsCurrentScreen());
            AddAssert("Screen 2 did not load", () => !screen2.IsLoaded);
            AddAssert("Screen 3 did not load", () => !screen3.IsLoaded);
        }
        public void TestNonCurrentScreenDoesNotAcceptInput()
        {
            ManualInputManager inputManager = null;

            AddStep("override stack", () =>
            {
                // we can't use the [SetUp] screen stack as we need to change the ctor parameters.
                Clear();

                Add(inputManager = new ManualInputManager
                {
                    Child = stack = new ScreenStack(baseScreen = new TestScreen())
                    {
                        RelativeSizeAxes = Axes.Both
                    }
                });
            });

            TestScreen     screen1 = null;
            TestScreenSlow screen2 = null;

            pushAndEnsureCurrent(() => screen1 = new TestScreen());
            AddStep("Click center of screen", () => clickScreen(inputManager, screen1));
            AddAssert("screen 1 clicked", () => screen1.ClickCount == 1);

            AddStep("push slow", () => screen1.Push(screen2 = new TestScreenSlow()));
            AddStep("Click center of screen", () => inputManager.Click(MouseButton.Left));
            AddAssert("screen 1 not clicked", () => screen1.ClickCount == 1);
            AddAssert("Screen 2 not clicked", () => screen2.ClickCount == 0 && !screen2.IsLoaded);

            AddStep("Allow screen to load", () => screen2.AllowLoad.Set());
            AddUntilStep("ensure current", () => screen2.IsCurrentScreen());
            AddStep("Click center of screen", () => clickScreen(inputManager, screen2));
            AddAssert("screen 1 not clicked", () => screen1.ClickCount == 1);
            AddAssert("Screen 2 clicked", () => screen2.ClickCount == 1 && screen2.IsLoaded);
        }
Пример #10
0
        public void TestAsyncEventOrder(bool earlyExit, bool suspendImmediately)
        {
            if (!suspendImmediately)
            {
                AddStep("override stack", () =>
                {
                    // we can't use the [SetUp] screen stack as we need to change the ctor parameters.
                    Clear();
                    Add(stack = new ScreenStack(baseScreen = new TestScreen(), suspendImmediately: false)
                    {
                        RelativeSizeAxes = Axes.Both
                    });
                });
            }

            List <int> order = new List <int>();

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

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

            AddStep("push slow", () => stack.Push(screen1));
            AddStep("push second slow", () => stack.Push(screen2));

            AddStep("allow load 1", () => screen1.AllowLoad.Set());

            AddUntilStep("ensure screen1 not current", () => !screen1.IsCurrentScreen());
            AddUntilStep("ensure screen2 not current", () => !screen2.IsCurrentScreen());

            // but the stack has a different idea of "current"
            AddAssert("ensure screen2 is current at the stack", () => stack.CurrentScreen == screen2);

            if (suspendImmediately)
            {
                AddUntilStep("screen1's suspending fired", () => screen1.SuspendedTo == screen2);
            }
            else
            {
                AddUntilStep("screen1's entered and suspending fired", () => screen1.EnteredFrom != null);
            }

            if (earlyExit)
            {
                AddStep("early exit 2", () => screen2.Exit());
            }

            AddStep("allow load 2", () => screen2.AllowLoad.Set());

            if (earlyExit)
            {
                AddAssert("screen2's entered did not fire", () => screen2.EnteredFrom == null);
                AddAssert("screen2's exited did not fire", () => screen2.ExitedTo == null);
            }
            else
            {
                AddUntilStep("ensure screen2 is current", () => screen2.IsCurrentScreen());
                AddAssert("screen2's entered fired", () => screen2.EnteredFrom == screen1);
                AddStep("exit 2", () => screen2.Exit());
                AddUntilStep("ensure screen1 is current", () => screen1.IsCurrentScreen());
                AddAssert("screen2's exited fired", () => screen2.ExitedTo == screen1);
            }

            AddAssert("order is correct", () => order.SequenceEqual(order.OrderBy(i => i)));
        }