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