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:
@@ -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);
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user