1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-15 16:27:43 +08:00
osu-lazer/osu.Game.Tests/Visual/Gameplay/TestSceneGameplayMenuOverlay.cs

302 lines
11 KiB
C#
Raw Normal View History

// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
2018-04-13 17:19:50 +08:00
2022-06-17 15:37:17 +08:00
#nullable disable
2018-04-13 17:19:50 +08:00
using System;
using System.Linq;
2019-09-04 09:34:56 +08:00
using NUnit.Framework;
2018-04-13 17:19:50 +08:00
using osu.Framework.Allocation;
2019-03-24 11:09:18 +08:00
using osu.Framework.Graphics;
2018-04-13 17:19:50 +08:00
using osu.Framework.Graphics.Containers;
using osu.Framework.Logging;
2019-09-04 10:36:09 +08:00
using osu.Game.Graphics.UserInterface;
2019-03-24 11:09:18 +08:00
using osu.Game.Input.Bindings;
2018-04-13 17:19:50 +08:00
using osu.Game.Screens.Play;
2018-11-20 15:51:59 +08:00
using osuTK;
2019-03-25 00:02:36 +08:00
using osuTK.Input;
2018-04-13 17:19:50 +08:00
2019-03-25 00:02:36 +08:00
namespace osu.Game.Tests.Visual.Gameplay
2018-04-13 17:19:50 +08:00
{
[Description("player pause/fail screens")]
public class TestSceneGameplayMenuOverlay : OsuManualInputManagerTestScene
2018-04-13 17:19:50 +08:00
{
private FailOverlay failOverlay;
2019-03-18 10:48:11 +08:00
private PauseOverlay pauseOverlay;
2018-04-13 17:19:50 +08:00
2019-03-24 11:09:18 +08:00
private GlobalActionContainer globalActionContainer;
2018-04-13 17:19:50 +08:00
[BackgroundDependencyLoader]
2019-03-24 11:09:18 +08:00
private void load(OsuGameBase game)
2018-04-13 17:19:50 +08:00
{
Child = globalActionContainer = new GlobalActionContainer(game);
2019-09-04 10:36:09 +08:00
}
[SetUp]
public void SetUp() => Schedule(() =>
{
globalActionContainer.Children = new Drawable[]
2018-04-13 17:19:50 +08:00
{
2019-09-04 10:36:09 +08:00
pauseOverlay = new PauseOverlay
{
OnResume = () => Logger.Log(@"Resume"),
OnRetry = () => Logger.Log(@"Retry"),
OnQuit = () => Logger.Log(@"Quit"),
},
failOverlay = new FailOverlay
2019-03-24 11:09:18 +08:00
{
2019-09-04 10:36:09 +08:00
OnRetry = () => Logger.Log(@"Retry"),
OnQuit = () => Logger.Log(@"Quit"),
2019-03-24 11:09:18 +08:00
}
};
2018-04-13 17:19:50 +08:00
2019-09-04 10:36:09 +08:00
InputManager.MoveMouseTo(Vector2.Zero);
});
[Test]
public void TestAdjustRetryCount()
{
showOverlay();
int retryCount = 0;
2018-04-13 17:19:50 +08:00
2019-09-04 10:36:09 +08:00
AddRepeatStep("Add retry", () =>
2018-04-13 17:19:50 +08:00
{
retryCount++;
pauseOverlay.Retries = failOverlay.Retries = retryCount;
2019-09-04 10:36:09 +08:00
}, 10);
2018-04-13 17:19:50 +08:00
}
/// <summary>
/// Tests that pressing enter after an overlay shows doesn't trigger an event because a selection hasn't occurred.
/// </summary>
2019-09-04 09:34:56 +08:00
[Test]
public void TestEnterWithoutSelection()
2018-04-13 17:19:50 +08:00
{
2019-09-04 10:36:09 +08:00
showOverlay();
2018-04-13 17:19:50 +08:00
2019-03-24 11:09:18 +08:00
AddStep("Press select", () => press(GlobalAction.Select));
AddAssert("Overlay still open", () => pauseOverlay.State.Value == Visibility.Visible);
2018-04-13 17:19:50 +08:00
}
/// <summary>
/// Tests that pressing the up arrow from the initial state selects the last button.
/// </summary>
2019-09-04 09:34:56 +08:00
[Test]
public void TestKeyUpFromInitial()
2018-04-13 17:19:50 +08:00
{
2019-09-04 10:36:09 +08:00
showOverlay();
2018-04-13 17:19:50 +08:00
2020-11-05 22:41:56 +08:00
AddStep("Up arrow", () => InputManager.Key(Key.Up));
2021-07-06 20:11:46 +08:00
AddAssert("Last button selected", () => pauseOverlay.Buttons.Last().State == SelectionState.Selected);
2018-04-13 17:19:50 +08:00
}
/// <summary>
/// Tests that pressing the down arrow from the initial state selects the first button.
/// </summary>
2019-09-04 09:34:56 +08:00
[Test]
public void TestKeyDownFromInitial()
2018-04-13 17:19:50 +08:00
{
2019-09-04 10:36:09 +08:00
showOverlay();
2018-04-13 17:19:50 +08:00
2020-11-05 22:41:56 +08:00
AddStep("Down arrow", () => InputManager.Key(Key.Down));
2021-07-06 20:11:46 +08:00
AddAssert("First button selected", () => getButton(0).State == SelectionState.Selected);
2018-04-13 17:19:50 +08:00
}
/// <summary>
/// Tests that pressing the up arrow repeatedly causes the selected button to wrap correctly.
/// </summary>
2019-09-04 09:34:56 +08:00
[Test]
public void TestKeyUpWrapping()
2018-04-13 17:19:50 +08:00
{
AddStep("Show overlay", () => failOverlay.Show());
2020-11-05 22:41:56 +08:00
AddStep("Up arrow", () => InputManager.Key(Key.Up));
2021-07-06 20:11:46 +08:00
AddAssert("Last button selected", () => failOverlay.Buttons.Last().State == SelectionState.Selected);
2020-11-05 22:41:56 +08:00
AddStep("Up arrow", () => InputManager.Key(Key.Up));
2021-07-06 20:11:46 +08:00
AddAssert("First button selected", () => failOverlay.Buttons.First().State == SelectionState.Selected);
2020-11-05 22:41:56 +08:00
AddStep("Up arrow", () => InputManager.Key(Key.Up));
2021-07-06 20:11:46 +08:00
AddAssert("Last button selected", () => failOverlay.Buttons.Last().State == SelectionState.Selected);
2018-04-13 17:19:50 +08:00
}
/// <summary>
/// Tests that pressing the down arrow repeatedly causes the selected button to wrap correctly.
/// </summary>
2019-09-04 09:34:56 +08:00
[Test]
public void TestKeyDownWrapping()
2018-04-13 17:19:50 +08:00
{
AddStep("Show overlay", () => failOverlay.Show());
2020-11-05 22:41:56 +08:00
AddStep("Down arrow", () => InputManager.Key(Key.Down));
2021-07-06 20:11:46 +08:00
AddAssert("First button selected", () => failOverlay.Buttons.First().State == SelectionState.Selected);
2020-11-05 22:41:56 +08:00
AddStep("Down arrow", () => InputManager.Key(Key.Down));
2021-07-06 20:11:46 +08:00
AddAssert("Last button selected", () => failOverlay.Buttons.Last().State == SelectionState.Selected);
2020-11-05 22:41:56 +08:00
AddStep("Down arrow", () => InputManager.Key(Key.Down));
2021-07-06 20:11:46 +08:00
AddAssert("First button selected", () => failOverlay.Buttons.First().State == SelectionState.Selected);
2018-04-13 17:19:50 +08:00
}
2019-09-03 02:13:34 +08:00
/// <summary>
/// Test that hiding the overlay after hovering a button will reset the overlay to the initial state with no buttons selected.
/// </summary>
2019-09-04 09:34:56 +08:00
[Test]
public void TestHideResets()
2019-09-03 02:13:34 +08:00
{
AddStep("Show overlay", () => failOverlay.Show());
AddStep("Hover first button", () => InputManager.MoveMouseTo(failOverlay.Buttons.First()));
AddStep("Hide overlay", () => failOverlay.Hide());
2021-07-06 21:17:19 +08:00
AddAssert("Overlay state is reset", () => failOverlay.Buttons.All(b => b.State == SelectionState.NotSelected));
2019-09-03 02:13:34 +08:00
}
2019-09-04 07:56:45 +08:00
/// <summary>
/// Tests that entering menu with cursor initially on button doesn't selects it immediately.
/// This is to allow for stable keyboard navigation.
2019-09-04 07:56:45 +08:00
/// </summary>
2019-09-04 09:34:56 +08:00
[Test]
public void TestInitialButtonHover()
2019-09-04 07:56:45 +08:00
{
2019-09-04 10:36:09 +08:00
showOverlay();
2019-09-04 07:56:45 +08:00
2019-09-04 10:36:09 +08:00
AddStep("Hover first button", () => InputManager.MoveMouseTo(getButton(0)));
2019-09-04 07:56:45 +08:00
AddStep("Hide overlay", () => pauseOverlay.Hide());
2019-09-04 10:36:09 +08:00
showOverlay();
2019-09-04 07:56:45 +08:00
2021-07-06 20:11:46 +08:00
AddAssert("First button not selected", () => getButton(0).State == SelectionState.NotSelected);
AddStep("Move slightly", () => InputManager.MoveMouseTo(InputManager.CurrentState.Mouse.Position + new Vector2(1)));
2021-07-06 20:11:46 +08:00
AddAssert("First button selected", () => getButton(0).State == SelectionState.Selected);
2019-09-04 07:56:45 +08:00
}
2018-04-13 17:19:50 +08:00
/// <summary>
/// Tests that hovering a button that was previously selected with the keyboard correctly selects the new button and deselects the previous button.
/// </summary>
2019-09-04 09:34:56 +08:00
[Test]
public void TestMouseSelectionAfterKeySelection()
2018-04-13 17:19:50 +08:00
{
2019-09-04 10:36:09 +08:00
showOverlay();
2018-04-13 17:19:50 +08:00
2020-11-05 22:41:56 +08:00
AddStep("Down arrow", () => InputManager.Key(Key.Down));
2019-09-04 10:36:09 +08:00
AddStep("Hover second button", () => InputManager.MoveMouseTo(getButton(1)));
2021-07-06 20:11:46 +08:00
AddAssert("First button not selected", () => getButton(0).State == SelectionState.NotSelected);
AddAssert("Second button selected", () => getButton(1).State == SelectionState.Selected);
2018-04-13 17:19:50 +08:00
}
/// <summary>
/// Tests that pressing a key after selecting a button with a hover event correctly selects a new button and deselects the previous button.
/// </summary>
2019-09-04 09:34:56 +08:00
[Test]
public void TestKeySelectionAfterMouseSelection()
2018-04-13 17:19:50 +08:00
{
AddStep("Show overlay", () =>
{
pauseOverlay.Show();
});
2018-04-13 17:19:50 +08:00
2019-09-04 10:36:09 +08:00
AddStep("Hover second button", () => InputManager.MoveMouseTo(getButton(1)));
2020-11-05 22:41:56 +08:00
AddStep("Up arrow", () => InputManager.Key(Key.Up));
2021-07-06 20:11:46 +08:00
AddAssert("Second button not selected", () => getButton(1).State == SelectionState.NotSelected);
AddAssert("First button selected", () => getButton(0).State == SelectionState.Selected);
2018-04-13 17:19:50 +08:00
}
/// <summary>
/// Tests that deselecting with the mouse by losing hover will reset the overlay to the initial state.
/// </summary>
2019-09-04 09:34:56 +08:00
[Test]
public void TestMouseDeselectionResets()
2018-04-13 17:19:50 +08:00
{
2019-09-04 10:36:09 +08:00
showOverlay();
2018-04-13 17:19:50 +08:00
2019-09-04 10:36:09 +08:00
AddStep("Hover second button", () => InputManager.MoveMouseTo(getButton(1)));
AddStep("Unhover second button", () => InputManager.MoveMouseTo(Vector2.Zero));
2020-11-05 22:41:56 +08:00
AddStep("Down arrow", () => InputManager.Key(Key.Down));
2021-07-06 20:11:46 +08:00
AddAssert("First button selected", () => getButton(0).State == SelectionState.Selected); // Initial state condition
2018-04-13 17:19:50 +08:00
}
/// <summary>
/// Tests that clicking on a button correctly causes a click event for that button.
/// </summary>
2019-09-04 09:34:56 +08:00
[Test]
public void TestClickSelection()
2018-04-13 17:19:50 +08:00
{
2019-09-04 10:36:09 +08:00
showOverlay();
2018-04-13 17:19:50 +08:00
bool triggered = false;
AddStep("Click retry button", () =>
{
var lastAction = pauseOverlay.OnRetry;
pauseOverlay.OnRetry = () => triggered = true;
2021-08-04 16:27:44 +08:00
getButton(1).TriggerClick();
2018-04-13 17:19:50 +08:00
pauseOverlay.OnRetry = lastAction;
});
AddAssert("Action was triggered", () => triggered);
AddAssert("Overlay is closed", () => pauseOverlay.State.Value == Visibility.Hidden);
2018-04-13 17:19:50 +08:00
}
/// <summary>
/// Tests that pressing the enter key with a button selected correctly causes a click event for that button.
/// </summary>
2019-09-04 09:34:56 +08:00
[Test]
public void TestEnterKeySelection()
2018-04-13 17:19:50 +08:00
{
2019-09-04 10:36:09 +08:00
showOverlay();
2018-04-13 17:19:50 +08:00
AddStep("Select second button", () =>
{
2020-11-05 22:41:56 +08:00
InputManager.Key(Key.Down);
InputManager.Key(Key.Down);
2018-04-13 17:19:50 +08:00
});
bool triggered = false;
Action lastAction = null;
2018-04-13 17:19:50 +08:00
AddStep("Press enter", () =>
{
lastAction = pauseOverlay.OnRetry;
2018-04-13 17:19:50 +08:00
pauseOverlay.OnRetry = () => triggered = true;
2020-11-05 22:41:56 +08:00
InputManager.Key(Key.Enter);
2018-04-13 17:19:50 +08:00
});
AddAssert("Action was triggered", () =>
{
if (lastAction != null)
{
pauseOverlay.OnRetry = lastAction;
lastAction = null;
}
2019-02-28 12:31:40 +08:00
return triggered;
});
AddAssert("Overlay is closed", () => pauseOverlay.State.Value == Visibility.Hidden);
2018-04-13 17:19:50 +08:00
}
2019-03-24 11:09:18 +08:00
2020-08-15 19:06:53 +08:00
[Test]
public void TestSelectionResetOnVisibilityChange()
{
showOverlay();
AddStep("Select last button", () => InputManager.Key(Key.Up));
hideOverlay();
showOverlay();
AddAssert("No button selected",
2021-07-06 20:11:46 +08:00
() => pauseOverlay.Buttons.All(button => button.State == SelectionState.NotSelected));
2020-08-15 19:06:53 +08:00
}
2019-09-04 10:36:09 +08:00
private void showOverlay() => AddStep("Show overlay", () => pauseOverlay.Show());
2020-08-15 19:06:53 +08:00
private void hideOverlay() => AddStep("Hide overlay", () => pauseOverlay.Hide());
2019-09-04 10:36:09 +08:00
private DialogButton getButton(int index) => pauseOverlay.Buttons.Skip(index).First();
2019-03-24 11:09:18 +08:00
private void press(GlobalAction action)
{
globalActionContainer.TriggerPressed(action);
globalActionContainer.TriggerReleased(action);
}
2018-04-13 17:19:50 +08:00
}
}