1
0
mirror of https://github.com/ppy/osu.git synced 2026-05-22 18:20:47 +08:00

Merge pull request #33578 from bdach/solo-results-bad-conditional

Fix presenting another user's score hiding local user's score on results screen
This commit is contained in:
Dan Balasescu
2025-06-09 22:00:47 +09:00
committed by GitHub
Unverified
2 changed files with 76 additions and 1 deletions
@@ -90,6 +90,7 @@ namespace osu.Game.Tests.Visual.Ranking
localScore = TestResources.CreateTestScoreInfo(importedBeatmap);
localScore.TotalScore = 151_000;
localScore.Position = null;
localScore.User = API.LocalUser.Value;
scoreManager.Import(localScore);
localScore = localScore.Detach();
});
@@ -119,6 +120,7 @@ namespace osu.Game.Tests.Visual.Ranking
localScore.TotalScore = 151_000;
localScore.OnlineID = 30;
localScore.Position = null;
localScore.User = API.LocalUser.Value;
scoreManager.Import(localScore);
localScore = localScore.Detach();
});
@@ -161,6 +163,7 @@ namespace osu.Game.Tests.Visual.Ranking
localScore = TestResources.CreateTestScoreInfo(importedBeatmap);
localScore.TotalScore = 151_000;
localScore.Position = null;
localScore.User = API.LocalUser.Value;
LoadScreen(new SoloResultsScreen(localScore));
});
AddUntilStep("wait for loaded", () => ((Drawable)Stack.CurrentScreen).IsLoaded);
@@ -211,6 +214,7 @@ namespace osu.Game.Tests.Visual.Ranking
localScore = TestResources.CreateTestScoreInfo(importedBeatmap);
localScore.TotalScore = 151_000;
localScore.Position = null;
localScore.User = API.LocalUser.Value;
LoadScreen(new SoloResultsScreen(localScore));
});
AddUntilStep("wait for loaded", () => ((Drawable)Stack.CurrentScreen).IsLoaded);
@@ -218,6 +222,63 @@ namespace osu.Game.Tests.Visual.Ranking
AddAssert("previous user best not shown", () => this.ChildrenOfType<ScorePanel>().All(p => p.Score.OnlineID != 123456));
}
[Test]
public void TestOnlineLeaderboardWithLessThan50Scores_ShowingAnotherUserScore()
{
var scores = new List<ScoreInfo>();
var soloScores = new List<SoloScoreInfo>();
AddStep("set leaderboard to global", () => leaderboardManager.FetchWithCriteria(new LeaderboardCriteria(importedBeatmap, importedBeatmap.Ruleset, BeatmapLeaderboardScope.Global, null)));
AddStep("set up request handling", () =>
{
for (int i = 0; i < 30; ++i)
{
var score = TestResources.CreateTestScoreInfo(importedBeatmap);
score.TotalScore = 10_000 * (30 - i);
score.Position = i + 1;
score.User = new APIUser { Id = i };
score.BeatmapInfo = new BeatmapInfo
{
OnlineID = 123123,
Status = BeatmapOnlineStatus.Ranked,
};
score.OnlineID = i;
scores.Add(score);
var soloScore = SoloScoreInfo.ForSubmission(score);
soloScore.ID = (ulong)i;
soloScores.Add(soloScore);
}
scores[^1].User = API.LocalUser.Value;
soloScores[^1].UserID = API.LocalUser.Value.OnlineID;
dummyAPI.HandleRequest = req =>
{
switch (req)
{
case GetScoresRequest getScoresRequest:
getScoresRequest.TriggerSuccess(new APIScoresCollection
{
Scores = soloScores,
UserScore = new APIScoreWithPosition
{
Score = soloScores[^1],
Position = 30
}
});
return true;
}
return false;
};
});
AddStep("show results", () => LoadScreen(new SoloResultsScreen(scores[0])));
AddUntilStep("wait for loaded", () => ((Drawable)Stack.CurrentScreen).IsLoaded);
AddAssert("local user best shown", () => this.ChildrenOfType<ScorePanel>().Any(p => p.Score.UserID == API.LocalUser.Value.Id));
}
[Test]
public void TestOnlineLeaderboardWithLessThan50Scores_UserIsLast()
{
@@ -251,6 +312,7 @@ namespace osu.Game.Tests.Visual.Ranking
localScore = TestResources.CreateTestScoreInfo(importedBeatmap);
localScore.TotalScore = 151_000;
localScore.Position = null;
localScore.User = API.LocalUser.Value;
LoadScreen(new SoloResultsScreen(localScore));
});
AddUntilStep("wait for loaded", () => ((Drawable)Stack.CurrentScreen).IsLoaded);
@@ -302,6 +364,7 @@ namespace osu.Game.Tests.Visual.Ranking
localScore = TestResources.CreateTestScoreInfo(importedBeatmap);
localScore.TotalScore = 31_000;
localScore.Position = null;
localScore.User = API.LocalUser.Value;
LoadScreen(new SoloResultsScreen(localScore));
});
AddUntilStep("wait for loaded", () => ((Drawable)Stack.CurrentScreen).IsLoaded);
@@ -355,6 +418,7 @@ namespace osu.Game.Tests.Visual.Ranking
localScore = TestResources.CreateTestScoreInfo(importedBeatmap);
localScore.TotalScore = 151_000;
localScore.Position = null;
localScore.User = API.LocalUser.Value;
LoadScreen(new SoloResultsScreen(localScore));
});
AddUntilStep("wait for loaded", () => ((Drawable)Stack.CurrentScreen).IsLoaded);
@@ -408,6 +472,7 @@ namespace osu.Game.Tests.Visual.Ranking
localScore = TestResources.CreateTestScoreInfo(importedBeatmap);
localScore.TotalScore = 651_000;
localScore.Position = null;
localScore.User = API.LocalUser.Value;
LoadScreen(new SoloResultsScreen(localScore));
});
AddUntilStep("wait for loaded", () => ((Drawable)Stack.CurrentScreen).IsLoaded);
@@ -459,6 +524,7 @@ namespace osu.Game.Tests.Visual.Ranking
localScore.TotalScore = 151_000;
localScore.OnlineID = 12345;
localScore.Position = null;
localScore.User = API.LocalUser.Value;
LoadScreen(new SoloResultsScreen(localScore));
});
AddUntilStep("wait for loaded", () => ((Drawable)Stack.CurrentScreen).IsLoaded);
+10 -1
View File
@@ -81,8 +81,17 @@ namespace osu.Game.Screens.Ranking
Score.Position = clonedScore.Position;
sortedScores.Add(Score);
}
else if (criteria.Scope == BeatmapLeaderboardScope.Local || clonedScore.UserID != api.LocalUser.Value.OnlineID || clonedScore.TotalScore > Score.TotalScore)
else
{
bool isOnlineLeaderboard = criteria.Scope != BeatmapLeaderboardScope.Local;
bool presentingLocalUserScore = Score.UserID == api.LocalUser.Value.OnlineID;
bool presentedLocalUserScoreIsBetter = presentingLocalUserScore && clonedScore.UserID == api.LocalUser.Value.OnlineID && clonedScore.TotalScore < Score.TotalScore;
if (isOnlineLeaderboard && presentedLocalUserScoreIsBetter)
continue;
sortedScores.Add(clonedScore);
}
}
// if we haven't encountered a match for the presented score, we still need to attach it.