Fix intermittent test failures on TestSceneResultsScreen due to long delay step

Using real time delays of 3 seconds doesn't play well with headless runs.
This commit is contained in:
Dean Herbert 2021-12-21 15:14:49 +09:00
parent a8cd96278d
commit c0a8758839

View File

@ -203,8 +203,12 @@ namespace osu.Game.Tests.Visual.Ranking
{ {
DelayedFetchResultsScreen screen = null; DelayedFetchResultsScreen screen = null;
AddStep("load results", () => Child = new TestResultsContainer(screen = new DelayedFetchResultsScreen(TestResources.CreateTestScoreInfo(), 3000))); var tcs = new TaskCompletionSource();
AddStep("load results", () => Child = new TestResultsContainer(screen = new DelayedFetchResultsScreen(TestResources.CreateTestScoreInfo(), tcs.Task)));
AddUntilStep("wait for loaded", () => screen.IsLoaded); AddUntilStep("wait for loaded", () => screen.IsLoaded);
AddStep("click expanded panel", () => AddStep("click expanded panel", () =>
{ {
var expandedPanel = this.ChildrenOfType<ScorePanel>().Single(p => p.State == PanelState.Expanded); var expandedPanel = this.ChildrenOfType<ScorePanel>().Single(p => p.State == PanelState.Expanded);
@ -212,6 +216,10 @@ namespace osu.Game.Tests.Visual.Ranking
InputManager.Click(MouseButton.Left); InputManager.Click(MouseButton.Left);
}); });
AddAssert("no fetch yet", () => !screen.FetchCompleted);
AddStep("allow fetch", () => tcs.SetResult());
AddUntilStep("wait for fetch", () => screen.FetchCompleted); AddUntilStep("wait for fetch", () => screen.FetchCompleted);
AddAssert("expanded panel still on screen", () => this.ChildrenOfType<ScorePanel>().Single(p => p.State == PanelState.Expanded).ScreenSpaceDrawQuad.TopLeft.X > 0); AddAssert("expanded panel still on screen", () => this.ChildrenOfType<ScorePanel>().Single(p => p.State == PanelState.Expanded).ScreenSpaceDrawQuad.TopLeft.X > 0);
} }
@ -295,21 +303,21 @@ namespace osu.Game.Tests.Visual.Ranking
private class DelayedFetchResultsScreen : TestResultsScreen private class DelayedFetchResultsScreen : TestResultsScreen
{ {
private readonly Task fetchWaitTask;
public bool FetchCompleted { get; private set; } public bool FetchCompleted { get; private set; }
private readonly double delay; public DelayedFetchResultsScreen(ScoreInfo score, Task fetchWaitTask = null)
public DelayedFetchResultsScreen(ScoreInfo score, double delay)
: base(score) : base(score)
{ {
this.delay = delay; this.fetchWaitTask = fetchWaitTask ?? Task.CompletedTask;
} }
protected override APIRequest FetchScores(Action<IEnumerable<ScoreInfo>> scoresCallback) protected override APIRequest FetchScores(Action<IEnumerable<ScoreInfo>> scoresCallback)
{ {
Task.Run(async () => Task.Run(async () =>
{ {
await Task.Delay(TimeSpan.FromMilliseconds(delay)); await fetchWaitTask;
var scores = new List<ScoreInfo>(); var scores = new List<ScoreInfo>();