Fix PlaylistResults tests performing delays in real-time when headless

This commit is contained in:
Dean Herbert 2021-02-22 15:43:58 +09:00
parent c99e152fe4
commit adf2dc36c9

View File

@ -76,7 +76,7 @@ namespace osu.Game.Tests.Visual.Playlists
AddStep("bind user score info handler", () => AddStep("bind user score info handler", () =>
{ {
userScore = new TestScoreInfo(new OsuRuleset().RulesetInfo) { OnlineScoreID = currentScoreId++ }; userScore = new TestScoreInfo(new OsuRuleset().RulesetInfo) { OnlineScoreID = currentScoreId++ };
bindHandler(3000, userScore); bindHandler(true, userScore);
}); });
createResults(() => userScore); createResults(() => userScore);
@ -89,7 +89,7 @@ namespace osu.Game.Tests.Visual.Playlists
[Test] [Test]
public void TestShowNullUserScoreWithDelay() public void TestShowNullUserScoreWithDelay()
{ {
AddStep("bind delayed handler", () => bindHandler(3000)); AddStep("bind delayed handler", () => bindHandler(true));
createResults(); createResults();
waitForDisplay(); waitForDisplay();
@ -103,7 +103,7 @@ namespace osu.Game.Tests.Visual.Playlists
createResults(); createResults();
waitForDisplay(); waitForDisplay();
AddStep("bind delayed handler", () => bindHandler(3000)); AddStep("bind delayed handler", () => bindHandler(true));
for (int i = 0; i < 2; i++) for (int i = 0; i < 2; i++)
{ {
@ -134,7 +134,7 @@ namespace osu.Game.Tests.Visual.Playlists
createResults(() => userScore); createResults(() => userScore);
waitForDisplay(); waitForDisplay();
AddStep("bind delayed handler", () => bindHandler(3000)); AddStep("bind delayed handler", () => bindHandler(true));
for (int i = 0; i < 2; i++) for (int i = 0; i < 2; i++)
{ {
@ -169,70 +169,47 @@ namespace osu.Game.Tests.Visual.Playlists
AddWaitStep("wait for display", 5); AddWaitStep("wait for display", 5);
} }
private void bindHandler(double delay = 0, ScoreInfo userScore = null, bool failRequests = false) => ((DummyAPIAccess)API).HandleRequest = request => private void bindHandler(bool delayed = false, ScoreInfo userScore = null, bool failRequests = false) => ((DummyAPIAccess)API).HandleRequest = request =>
{ {
requestComplete = false; requestComplete = false;
if (failRequests) double delay = delayed ? 3000 : 0;
{
triggerFail(request, delay);
return;
}
switch (request) Scheduler.AddDelayed(() =>
{ {
case ShowPlaylistUserScoreRequest s: if (failRequests)
if (userScore == null) {
triggerFail(s, delay); triggerFail(request);
else return;
triggerSuccess(s, createUserResponse(userScore), delay); }
break;
case IndexPlaylistScoresRequest i: switch (request)
triggerSuccess(i, createIndexResponse(i), delay); {
break; case ShowPlaylistUserScoreRequest s:
} if (userScore == null)
triggerFail(s);
else
triggerSuccess(s, createUserResponse(userScore));
break;
case IndexPlaylistScoresRequest i:
triggerSuccess(i, createIndexResponse(i));
break;
}
}, delay);
}; };
private void triggerSuccess<T>(APIRequest<T> req, T result, double delay) private void triggerSuccess<T>(APIRequest<T> req, T result)
where T : class where T : class
{ {
if (delay == 0) requestComplete = true;
success(); req.TriggerSuccess(result);
else
{
Task.Run(async () =>
{
await Task.Delay(TimeSpan.FromMilliseconds(delay));
Schedule(success);
});
}
void success()
{
requestComplete = true;
req.TriggerSuccess(result);
}
} }
private void triggerFail(APIRequest req, double delay) private void triggerFail(APIRequest req)
{ {
if (delay == 0) requestComplete = true;
fail(); req.TriggerFailure(new WebException("Failed."));
else
{
Task.Run(async () =>
{
await Task.Delay(TimeSpan.FromMilliseconds(delay));
Schedule(fail);
});
}
void fail()
{
requestComplete = true;
req.TriggerFailure(new WebException("Failed."));
}
} }
private MultiplayerScore createUserResponse([NotNull] ScoreInfo userScore) private MultiplayerScore createUserResponse([NotNull] ScoreInfo userScore)