Skip to content

Commit 2efdf30

Browse files
committed
Test score ranking
1 parent 696292b commit 2efdf30

1 file changed

Lines changed: 156 additions & 0 deletions

File tree

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
using Refresh.Database.Models.Authentication;
2+
using Refresh.Database.Models.Users;
3+
using Refresh.Database.Models.Levels.Scores;
4+
using Refresh.Database.Models.Levels;
5+
6+
namespace RefreshTests.GameServer.Tests.Levels;
7+
8+
public class ScoreRankingTests : GameServerTest
9+
{
10+
[Test]
11+
public void ScoreRanksRecalculatedOnScoreSubmission()
12+
{
13+
using TestContext context = this.GetServer();
14+
GameUser user = context.CreateUser();
15+
GameLevel level = context.CreateLevel(user);
16+
context.FillLeaderboard(level, 10, 1); // scores from 0 - 9
17+
18+
DatabaseScoreList scoreList = context.Database.GetTopScoresForLevel(level, 100, 0, 1);
19+
Assert.That(scoreList.Items.Count(), Is.EqualTo(10));
20+
21+
int index = 1;
22+
foreach (ScoreWithRank score in scoreList.Items)
23+
{
24+
Assert.That(score.rank, Is.EqualTo(index));
25+
Assert.That(score.score.Rank, Is.EqualTo(index));
26+
index++;
27+
}
28+
29+
// Now submit our mediocre score (shares a rank with one of the previous scores)
30+
GameScore ownScore1 = context.SubmitScore(6, 1, level, user, TokenGame.LittleBigPlanet2, TokenPlatform.PS3);
31+
Assert.That(ownScore1.Rank, Is.EqualTo(4));
32+
context.Database.Refresh();
33+
34+
scoreList = context.Database.GetTopScoresForLevel(level, 100, 0, 1, user: user);
35+
Assert.That(scoreList.Items.Count(), Is.EqualTo(11));
36+
37+
// User has exactly 1 score which is rank 4. Also assert the separate OwnScore attribute.
38+
Assert.That(scoreList.Items.Count(s => s.score.PublisherId == user.UserId && s.rank == 4 && s.score.Rank == 4), Is.EqualTo(1));
39+
Assert.That(scoreList.OwnScore, Is.Not.Null);
40+
Assert.That(scoreList.OwnScore!.rank, Is.EqualTo(4));
41+
Assert.That(scoreList.OwnScore.score.Rank, Is.EqualTo(4));
42+
43+
// Don't iterate the list again as that would require somehow special-casing the 2 scores which share a rank.
44+
// Instead just do some other checks.
45+
Assert.That(scoreList.Items.First().rank, Is.EqualTo(1));
46+
Assert.That(scoreList.Items.First().score.Rank, Is.EqualTo(1));
47+
Assert.That(scoreList.Items.First().score.Score, Is.EqualTo(9));
48+
49+
Assert.That(scoreList.Items.Last().rank, Is.EqualTo(10)); // not 11
50+
Assert.That(scoreList.Items.Last().score.Rank, Is.EqualTo(10));
51+
Assert.That(scoreList.Items.Last().score.Score, Is.EqualTo(0));
52+
53+
Assert.That(scoreList.Items.Count(s => s.rank == 4), Is.EqualTo(2)); // our and another's score
54+
Assert.That(scoreList.Items.Count(s => s.score.Rank == 4), Is.EqualTo(2));
55+
Assert.That(scoreList.Items.Count(s => s.score.Score == 6), Is.EqualTo(2));
56+
}
57+
58+
[Test]
59+
public void OwnOvertakenScoresRankGetsReset()
60+
{
61+
using TestContext context = this.GetServer();
62+
GameUser user = context.CreateUser();
63+
GameLevel level = context.CreateLevel(user);
64+
65+
GameScore ownScore1 = context.SubmitScore(6, 1, level, user, TokenGame.LittleBigPlanet2, TokenPlatform.PS3);
66+
Assert.That(ownScore1.Rank, Is.EqualTo(1));
67+
68+
GameScore ownScore2 = context.SubmitScore(7, 1, level, user, TokenGame.LittleBigPlanet2, TokenPlatform.PS3);
69+
Assert.That(ownScore2.Rank, Is.EqualTo(1));
70+
71+
GameScore? ownScore1Overtaken = context.Database.GetScoreByObjectId(ownScore1.ScoreId);
72+
Assert.That(ownScore1Overtaken, Is.Not.Null);
73+
Assert.That(ownScore1Overtaken!.Rank, Is.EqualTo(0));
74+
}
75+
76+
[Test]
77+
public void ScoreRanksRecalculatedOnSingleScoreDeletion()
78+
{
79+
using TestContext context = this.GetServer();
80+
GameLevel level = context.CreateLevel(context.CreateUser());
81+
GameUser user1 = context.CreateUser();
82+
GameUser user2 = context.CreateUser();
83+
GameUser user3 = context.CreateUser();
84+
85+
// Create a few scores ourselves
86+
GameScore score1 = context.SubmitScore(300, 1, level, user1, TokenGame.LittleBigPlanet2, TokenPlatform.PS3);
87+
GameScore score2 = context.SubmitScore(200, 1, level, user2, TokenGame.LittleBigPlanet2, TokenPlatform.PS3);
88+
GameScore score3 = context.SubmitScore(100, 1, level, user3, TokenGame.LittleBigPlanet2, TokenPlatform.PS3);
89+
Assert.That(score1.Rank, Is.EqualTo(1));
90+
Assert.That(score2.Rank, Is.EqualTo(2));
91+
Assert.That(score3.Rank, Is.EqualTo(3));
92+
93+
// Delete a score
94+
context.Database.DeleteScore(score2);
95+
context.Database.Refresh();
96+
GameScore? score1Reranked = context.Database.GetScoreByObjectId(score1.ScoreId);
97+
GameScore? score2Reranked = context.Database.GetScoreByObjectId(score2.ScoreId);
98+
GameScore? score3Reranked = context.Database.GetScoreByObjectId(score3.ScoreId);
99+
100+
Assert.That(score1Reranked, Is.Not.Null);
101+
Assert.That(score1Reranked!.Rank, Is.EqualTo(1));
102+
103+
Assert.That(score2Reranked, Is.Null);
104+
105+
Assert.That(score3Reranked, Is.Not.Null);
106+
Assert.That(score3Reranked!.Rank, Is.EqualTo(2));
107+
}
108+
109+
[Test]
110+
public void ScoreRanksRecalculatedOnScoresByUserDeletion()
111+
{
112+
using TestContext context = this.GetServer();
113+
GameLevel level1 = context.CreateLevel(context.CreateUser());
114+
GameLevel level2 = context.CreateLevel(context.CreateUser());
115+
GameUser user1 = context.CreateUser();
116+
GameUser user2 = context.CreateUser();
117+
GameUser user3 = context.CreateUser();
118+
119+
// Create a few scores ourselves
120+
GameScore score1 = context.SubmitScore(300, 1, level1, user1, TokenGame.LittleBigPlanet2, TokenPlatform.PS3);
121+
GameScore score2 = context.SubmitScore(200, 1, level1, user2, TokenGame.LittleBigPlanet2, TokenPlatform.PS3);
122+
GameScore score3 = context.SubmitScore(100, 1, level1, user3, TokenGame.LittleBigPlanet2, TokenPlatform.PS3);
123+
Assert.That(score1.Rank, Is.EqualTo(1));
124+
Assert.That(score2.Rank, Is.EqualTo(2));
125+
Assert.That(score3.Rank, Is.EqualTo(3));
126+
GameScore score4 = context.SubmitScore(600, 1, level2, user1, TokenGame.LittleBigPlanet2, TokenPlatform.PS3);
127+
GameScore score5 = context.SubmitScore(700, 1, level2, user2, TokenGame.LittleBigPlanet2, TokenPlatform.PS3);
128+
GameScore score6 = context.SubmitScore(20, 1, level2, user3, TokenGame.LittleBigPlanet2, TokenPlatform.PS3);
129+
Assert.That(score4.Rank, Is.EqualTo(2));
130+
Assert.That(score5.Rank, Is.EqualTo(1));
131+
Assert.That(score6.Rank, Is.EqualTo(3));
132+
133+
// Delete all scores by user
134+
context.Database.DeleteScoresSetByUser(user2);
135+
context.Database.Refresh();
136+
GameScore? score1Reranked = context.Database.GetScoreByObjectId(score1.ScoreId);
137+
GameScore? score2Reranked = context.Database.GetScoreByObjectId(score2.ScoreId);
138+
GameScore? score3Reranked = context.Database.GetScoreByObjectId(score3.ScoreId);
139+
140+
Assert.That(score1Reranked, Is.Not.Null);
141+
Assert.That(score1Reranked!.Rank, Is.EqualTo(1));
142+
Assert.That(score2Reranked, Is.Null);
143+
Assert.That(score3Reranked, Is.Not.Null);
144+
Assert.That(score3Reranked!.Rank, Is.EqualTo(2));
145+
146+
GameScore? score4Reranked = context.Database.GetScoreByObjectId(score4.ScoreId);
147+
GameScore? score5Reranked = context.Database.GetScoreByObjectId(score5.ScoreId);
148+
GameScore? score6Reranked = context.Database.GetScoreByObjectId(score6.ScoreId);
149+
150+
Assert.That(score4Reranked, Is.Not.Null);
151+
Assert.That(score4Reranked!.Rank, Is.EqualTo(1));
152+
Assert.That(score5Reranked, Is.Null);
153+
Assert.That(score6Reranked, Is.Not.Null);
154+
Assert.That(score6Reranked!.Rank, Is.EqualTo(2));
155+
}
156+
}

0 commit comments

Comments
 (0)