leaderboard 3.6.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rspec +1 -1
- data/.ruby-version +1 -3
- data/.travis.yml +1 -2
- data/CHANGELOG.markdown +4 -0
- data/README.markdown +33 -1
- data/Rakefile +0 -5
- data/leaderboard.gemspec +0 -3
- data/lib/competition_ranking_leaderboard.rb +98 -0
- data/lib/leaderboard.rb +1 -1
- data/lib/leaderboard/version.rb +1 -1
- data/lib/tie_ranking_leaderboard.rb +253 -0
- data/spec/competition_ranking_leaderboard_spec.rb +110 -0
- data/spec/leaderboard_spec.rb +250 -250
- data/spec/reverse_competition_ranking_leaderboard_spec.rb +116 -0
- data/spec/reverse_leaderboard_spec.rb +127 -127
- data/spec/reverse_tie_ranking_leaderboard_spec.rb +141 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/tie_ranking_leaderboard_spec.rb +207 -0
- data/spec/version_spec.rb +1 -1
- metadata +26 -16
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'competition_ranking_leaderboard'
|
3
|
+
|
4
|
+
describe 'CompetitionRankingLeaderboard (reverse option)' do
|
5
|
+
before(:each) do
|
6
|
+
@redis_connection = Redis.new(:host => "127.0.0.1", :db => 15)
|
7
|
+
end
|
8
|
+
|
9
|
+
after(:each) do
|
10
|
+
@redis_connection.flushdb
|
11
|
+
@redis_connection.client.disconnect
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'ties' do
|
15
|
+
it 'should retrieve the correct rankings for #leaders' do
|
16
|
+
leaderboard = CompetitionRankingLeaderboard.new('ties', {:reverse => true}, {:host => "127.0.0.1", :db => 15})
|
17
|
+
leaderboard.rank_member('member_1', 50)
|
18
|
+
leaderboard.rank_member('member_2', 50)
|
19
|
+
leaderboard.rank_member('member_3', 30)
|
20
|
+
leaderboard.rank_member('member_4', 30)
|
21
|
+
leaderboard.rank_member('member_5', 10)
|
22
|
+
|
23
|
+
leaderboard.leaders(1).tap do |leaders|
|
24
|
+
expect(leaders[0][:rank]).to eq(1)
|
25
|
+
expect(leaders[1][:rank]).to eq(2)
|
26
|
+
expect(leaders[2][:rank]).to eq(2)
|
27
|
+
expect(leaders[3][:rank]).to eq(4)
|
28
|
+
expect(leaders[4][:rank]).to eq(4)
|
29
|
+
end
|
30
|
+
|
31
|
+
leaderboard.disconnect
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should retrieve the correct rankings for #leaders with different page sizes' do
|
35
|
+
leaderboard = CompetitionRankingLeaderboard.new('ties', {:reverse => true}, {:host => "127.0.0.1", :db => 15})
|
36
|
+
leaderboard.rank_member('member_1', 50)
|
37
|
+
leaderboard.rank_member('member_2', 50)
|
38
|
+
leaderboard.rank_member('member_6', 50)
|
39
|
+
leaderboard.rank_member('member_7', 50)
|
40
|
+
leaderboard.rank_member('member_3', 30)
|
41
|
+
leaderboard.rank_member('member_4', 30)
|
42
|
+
leaderboard.rank_member('member_8', 30)
|
43
|
+
leaderboard.rank_member('member_9', 30)
|
44
|
+
leaderboard.rank_member('member_5', 10)
|
45
|
+
leaderboard.rank_member('member_10', 10)
|
46
|
+
|
47
|
+
leaderboard.leaders(1, :page_size => 3).tap do |leaders|
|
48
|
+
expect(leaders[0][:rank]).to eq(1)
|
49
|
+
expect(leaders[1][:rank]).to eq(1)
|
50
|
+
expect(leaders[2][:rank]).to eq(3)
|
51
|
+
end
|
52
|
+
|
53
|
+
leaderboard.leaders(2, :page_size => 3).tap do |leaders|
|
54
|
+
expect(leaders[0][:rank]).to eq(3)
|
55
|
+
expect(leaders[1][:rank]).to eq(3)
|
56
|
+
expect(leaders[2][:rank]).to eq(3)
|
57
|
+
end
|
58
|
+
|
59
|
+
leaderboard.leaders(3, :page_size => 3).tap do |leaders|
|
60
|
+
expect(leaders[0][:rank]).to eq(7)
|
61
|
+
expect(leaders[1][:rank]).to eq(7)
|
62
|
+
expect(leaders[2][:rank]).to eq(7)
|
63
|
+
end
|
64
|
+
|
65
|
+
leaderboard.disconnect
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should retrieve the correct rankings for #around_me' do
|
69
|
+
leaderboard = CompetitionRankingLeaderboard.new('ties', {:reverse => true}, {:host => "127.0.0.1", :db => 15})
|
70
|
+
leaderboard.rank_member('member_1', 50)
|
71
|
+
leaderboard.rank_member('member_2', 50)
|
72
|
+
leaderboard.rank_member('member_6', 50)
|
73
|
+
leaderboard.rank_member('member_7', 50)
|
74
|
+
leaderboard.rank_member('member_3', 30)
|
75
|
+
leaderboard.rank_member('member_4', 30)
|
76
|
+
leaderboard.rank_member('member_8', 30)
|
77
|
+
leaderboard.rank_member('member_9', 30)
|
78
|
+
leaderboard.rank_member('member_5', 10)
|
79
|
+
leaderboard.rank_member('member_10', 10)
|
80
|
+
|
81
|
+
leaderboard.around_me('member_4').tap do |leaders|
|
82
|
+
expect(leaders[0][:rank]).to eq(1)
|
83
|
+
expect(leaders[4][:rank]).to eq(3)
|
84
|
+
expect(leaders[9][:rank]).to eq(7)
|
85
|
+
end
|
86
|
+
|
87
|
+
leaderboard.disconnect
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'should allow you to retrieve the rank of a single member using #rank_for' do
|
91
|
+
leaderboard = CompetitionRankingLeaderboard.new('ties', {:reverse => true}, {:host => "127.0.0.1", :db => 15})
|
92
|
+
leaderboard.rank_member('member_1', 50)
|
93
|
+
leaderboard.rank_member('member_2', 50)
|
94
|
+
leaderboard.rank_member('member_3', 30)
|
95
|
+
|
96
|
+
expect(leaderboard.rank_for('member_3')).to eq(1)
|
97
|
+
expect(leaderboard.rank_for('member_1')).to eq(2)
|
98
|
+
expect(leaderboard.rank_for('member_2')).to eq(2)
|
99
|
+
|
100
|
+
leaderboard.disconnect
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'should allow you to retrieve the score and rank of a single member using #score_and_rank_for' do
|
104
|
+
leaderboard = CompetitionRankingLeaderboard.new('ties', {:reverse => true}, {:host => "127.0.0.1", :db => 15})
|
105
|
+
leaderboard.rank_member('member_1', 50)
|
106
|
+
leaderboard.rank_member('member_2', 50)
|
107
|
+
leaderboard.rank_member('member_3', 30)
|
108
|
+
|
109
|
+
expect(leaderboard.score_and_rank_for('member_3')[:rank]).to eq(1)
|
110
|
+
expect(leaderboard.score_and_rank_for('member_1')[:rank]).to eq(2)
|
111
|
+
expect(leaderboard.score_and_rank_for('member_2')[:rank]).to eq(2)
|
112
|
+
|
113
|
+
leaderboard.disconnect
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -15,35 +15,35 @@ describe 'Leaderboard (reverse option)' do
|
|
15
15
|
it 'should return the correct rank when calling rank_for' do
|
16
16
|
rank_members_in_leaderboard(5)
|
17
17
|
|
18
|
-
@leaderboard.rank_for('member_4').
|
18
|
+
expect(@leaderboard.rank_for('member_4')).to be(4)
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'should return the correct list when calling leaders' do
|
22
22
|
rank_members_in_leaderboard(25)
|
23
23
|
|
24
|
-
@leaderboard.total_members.
|
24
|
+
expect(@leaderboard.total_members).to be(25)
|
25
25
|
|
26
26
|
leaders = @leaderboard.leaders(1)
|
27
27
|
|
28
|
-
leaders.size.
|
29
|
-
leaders[0][:member].
|
30
|
-
leaders[-2][:member].
|
31
|
-
leaders[-1][:member].
|
32
|
-
leaders[-1][:score].to_i.
|
28
|
+
expect(leaders.size).to be(25)
|
29
|
+
expect(leaders[0][:member]).to eql('member_1')
|
30
|
+
expect(leaders[-2][:member]).to eql('member_24')
|
31
|
+
expect(leaders[-1][:member]).to eql('member_25')
|
32
|
+
expect(leaders[-1][:score].to_i).to be(25)
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'should return the correct list when calling members' do
|
36
36
|
rank_members_in_leaderboard(25)
|
37
37
|
|
38
|
-
@leaderboard.total_members.
|
38
|
+
expect(@leaderboard.total_members).to be(25)
|
39
39
|
|
40
40
|
members = @leaderboard.members(1)
|
41
41
|
|
42
|
-
members.size.
|
43
|
-
members[0][:member].
|
44
|
-
members[-2][:member].
|
45
|
-
members[-1][:member].
|
46
|
-
members[-1][:score].to_i.
|
42
|
+
expect(members.size).to be(25)
|
43
|
+
expect(members[0][:member]).to eql('member_1')
|
44
|
+
expect(members[-2][:member]).to eql('member_24')
|
45
|
+
expect(members[-1][:member]).to eql('member_25')
|
46
|
+
expect(members[-1][:score].to_i).to be(25)
|
47
47
|
end
|
48
48
|
|
49
49
|
it 'should allow you to retrieve members in a given score range' do
|
@@ -52,137 +52,137 @@ describe 'Leaderboard (reverse option)' do
|
|
52
52
|
members = @leaderboard.members_from_score_range(10, 15, {:with_scores => false, :with_rank => false})
|
53
53
|
|
54
54
|
member_10 = {:member => 'member_10', :score => 10.0, :rank => 10}
|
55
|
-
members[0].
|
55
|
+
expect(members[0]).to eql(member_10)
|
56
56
|
|
57
57
|
member_15 = {:member => 'member_15', :score => 15.0, :rank => 15}
|
58
|
-
members[5].
|
58
|
+
expect(members[5]).to eql(member_15)
|
59
59
|
|
60
60
|
members = @leaderboard.members_from_score_range(10, 15, {:with_member_data => true})
|
61
61
|
|
62
62
|
member_10 = {:member => 'member_10', :rank => 10, :score => 10.0, :member_data => {:member_name => 'Leaderboard member 10'}.to_s}
|
63
|
-
members[0].
|
63
|
+
expect(members[0]).to eq(member_10)
|
64
64
|
|
65
65
|
member_15 = {:member => 'member_15', :rank => 15, :score => 15.0, :member_data => {:member_name => 'Leaderboard member 15'}.to_s}
|
66
|
-
members[5].
|
66
|
+
expect(members[5]).to eq(member_15)
|
67
67
|
end
|
68
68
|
|
69
69
|
it 'should allow you to call leaders with various options that respect the defaults for the options not passed in' do
|
70
70
|
rank_members_in_leaderboard(Leaderboard::DEFAULT_PAGE_SIZE + 1)
|
71
71
|
|
72
72
|
leaders = @leaderboard.leaders(1, :page_size => 1)
|
73
|
-
leaders.size.
|
73
|
+
expect(leaders.size).to be(1)
|
74
74
|
|
75
75
|
leaders = @leaderboard.leaders(1)
|
76
|
-
leaders.size.
|
76
|
+
expect(leaders.size).to be(Leaderboard::DEFAULT_PAGE_SIZE)
|
77
77
|
member_1 = {:member => 'member_1', :score => 1.0, :rank => 1}
|
78
78
|
member_2 = {:member => 'member_2', :score => 2.0, :rank => 2}
|
79
79
|
member_3 = {:member => 'member_3', :score => 3.0, :rank => 3}
|
80
|
-
leaders[0].
|
81
|
-
leaders[1].
|
82
|
-
leaders[2].
|
80
|
+
expect(leaders[0]).to eql(member_1)
|
81
|
+
expect(leaders[1]).to eql(member_2)
|
82
|
+
expect(leaders[2]).to eql(member_3)
|
83
83
|
end
|
84
84
|
|
85
85
|
it 'should return a single member when calling member_at' do
|
86
86
|
rank_members_in_leaderboard(50)
|
87
|
-
@leaderboard.member_at(1)[:rank].
|
88
|
-
@leaderboard.member_at(1)[:score].
|
89
|
-
@leaderboard.member_at(26)[:rank].
|
90
|
-
@leaderboard.member_at(50)[:rank].
|
91
|
-
@leaderboard.member_at(51).
|
92
|
-
@leaderboard.member_at(1, :with_member_data => true)[:member_data].
|
87
|
+
expect(@leaderboard.member_at(1)[:rank]).to eql(1)
|
88
|
+
expect(@leaderboard.member_at(1)[:score]).to eql(1.0)
|
89
|
+
expect(@leaderboard.member_at(26)[:rank]).to eql(26)
|
90
|
+
expect(@leaderboard.member_at(50)[:rank]).to eql(50)
|
91
|
+
expect(@leaderboard.member_at(51)).to be_nil
|
92
|
+
expect(@leaderboard.member_at(1, :with_member_data => true)[:member_data]).to eq({:member_name => 'Leaderboard member 1'}.to_s)
|
93
93
|
end
|
94
94
|
|
95
95
|
it 'should return the correct information when calling around_me' do
|
96
96
|
rank_members_in_leaderboard(Leaderboard::DEFAULT_PAGE_SIZE * 3 + 1)
|
97
97
|
|
98
|
-
@leaderboard.total_members.
|
98
|
+
expect(@leaderboard.total_members).to be(Leaderboard::DEFAULT_PAGE_SIZE * 3 + 1)
|
99
99
|
|
100
100
|
leaders_around_me = @leaderboard.around_me('member_30')
|
101
|
-
(leaders_around_me.size / 2).
|
101
|
+
expect(leaders_around_me.size / 2).to be(@leaderboard.page_size / 2)
|
102
102
|
|
103
103
|
leaders_around_me = @leaderboard.around_me('member_76')
|
104
|
-
leaders_around_me.size.
|
104
|
+
expect(leaders_around_me.size).to be(@leaderboard.page_size / 2 + 1)
|
105
105
|
|
106
106
|
leaders_around_me = @leaderboard.around_me('member_1')
|
107
|
-
(leaders_around_me.size / 2).
|
107
|
+
expect(leaders_around_me.size / 2).to be(@leaderboard.page_size / 2)
|
108
108
|
end
|
109
109
|
|
110
110
|
it 'should return the correct information when calling ranked_in_list' do
|
111
111
|
rank_members_in_leaderboard(Leaderboard::DEFAULT_PAGE_SIZE)
|
112
112
|
|
113
|
-
@leaderboard.total_members.
|
113
|
+
expect(@leaderboard.total_members).to be(Leaderboard::DEFAULT_PAGE_SIZE)
|
114
114
|
|
115
115
|
members = ['member_1', 'member_5', 'member_10']
|
116
116
|
ranked_members = @leaderboard.ranked_in_list(members, Leaderboard::DEFAULT_LEADERBOARD_REQUEST_OPTIONS)
|
117
117
|
|
118
|
-
ranked_members.size.
|
118
|
+
expect(ranked_members.size).to be(3)
|
119
119
|
|
120
|
-
ranked_members[0][:rank].
|
121
|
-
ranked_members[0][:score].
|
120
|
+
expect(ranked_members[0][:rank]).to eql(1)
|
121
|
+
expect(ranked_members[0][:score]).to eql(1.0)
|
122
122
|
|
123
|
-
ranked_members[1][:rank].
|
124
|
-
ranked_members[1][:score].
|
123
|
+
expect(ranked_members[1][:rank]).to eql(5)
|
124
|
+
expect(ranked_members[1][:score]).to eql(5.0)
|
125
125
|
|
126
|
-
ranked_members[2][:rank].
|
127
|
-
ranked_members[2][:score].
|
126
|
+
expect(ranked_members[2][:rank]).to eql(10)
|
127
|
+
expect(ranked_members[2][:score]).to eql(10.0)
|
128
128
|
end
|
129
129
|
|
130
130
|
it 'should return the correct information when calling ranked_in_list without scores' do
|
131
131
|
rank_members_in_leaderboard(Leaderboard::DEFAULT_PAGE_SIZE)
|
132
132
|
|
133
|
-
@leaderboard.total_members.
|
133
|
+
expect(@leaderboard.total_members).to be(Leaderboard::DEFAULT_PAGE_SIZE)
|
134
134
|
|
135
135
|
members = ['member_1', 'member_5', 'member_10']
|
136
136
|
ranked_members = @leaderboard.ranked_in_list(members, {:with_scores => false, :with_rank => true})
|
137
|
-
ranked_members.size.
|
137
|
+
expect(ranked_members.size).to be(3)
|
138
138
|
|
139
|
-
ranked_members[0][:rank].
|
139
|
+
expect(ranked_members[0][:rank]).to be(1)
|
140
140
|
|
141
|
-
ranked_members[1][:rank].
|
141
|
+
expect(ranked_members[1][:rank]).to be(5)
|
142
142
|
|
143
|
-
ranked_members[2][:rank].
|
143
|
+
expect(ranked_members[2][:rank]).to be(10)
|
144
144
|
end
|
145
145
|
|
146
146
|
it 'should return the correct information when calling score_and_rank_for' do
|
147
147
|
rank_members_in_leaderboard
|
148
148
|
|
149
149
|
data = @leaderboard.score_and_rank_for('member_1')
|
150
|
-
data[:member].
|
151
|
-
data[:score].
|
152
|
-
data[:rank].
|
150
|
+
expect(data[:member]).to eql('member_1')
|
151
|
+
expect(data[:score]).to eql(1.0)
|
152
|
+
expect(data[:rank]).to be(1)
|
153
153
|
end
|
154
154
|
|
155
155
|
it 'should allow you to remove members in a given score range' do
|
156
156
|
rank_members_in_leaderboard
|
157
157
|
|
158
|
-
@leaderboard.total_members.
|
158
|
+
expect(@leaderboard.total_members).to be(5)
|
159
159
|
|
160
160
|
@leaderboard.rank_member('cheater_1', 100)
|
161
161
|
@leaderboard.rank_member('cheater_2', 101)
|
162
162
|
@leaderboard.rank_member('cheater_3', 102)
|
163
163
|
|
164
|
-
@leaderboard.total_members.
|
164
|
+
expect(@leaderboard.total_members).to be(8)
|
165
165
|
|
166
166
|
@leaderboard.remove_members_in_score_range(100, 102)
|
167
167
|
|
168
|
-
@leaderboard.total_members.
|
168
|
+
expect(@leaderboard.total_members).to be(5)
|
169
169
|
|
170
170
|
leaders = @leaderboard.leaders(1)
|
171
171
|
leaders.each do |leader|
|
172
|
-
leader[:score].
|
172
|
+
expect(leader[:score]).to be < 100
|
173
173
|
end
|
174
174
|
end
|
175
175
|
|
176
176
|
it 'should allow you to remove members outside a given rank' do
|
177
177
|
rank_members_in_leaderboard
|
178
178
|
|
179
|
-
@leaderboard.total_members.
|
180
|
-
@leaderboard.remove_members_outside_rank(3).
|
179
|
+
expect(@leaderboard.total_members).to be(5)
|
180
|
+
expect(@leaderboard.remove_members_outside_rank(3)).to be(2)
|
181
181
|
|
182
182
|
leaders = @leaderboard.leaders(1)
|
183
|
-
leaders.size.
|
184
|
-
leaders[0][:member].
|
185
|
-
leaders[2][:member].
|
183
|
+
expect(leaders.size).to be(3)
|
184
|
+
expect(leaders[0][:member]).to eq('member_1')
|
185
|
+
expect(leaders[2][:member]).to eq('member_3')
|
186
186
|
end
|
187
187
|
|
188
188
|
it 'should allow you to merge leaderboards' do
|
@@ -196,15 +196,15 @@ describe 'Leaderboard (reverse option)' do
|
|
196
196
|
bar.rank_member('bar_3', 5)
|
197
197
|
|
198
198
|
foobar_keys = foo.merge_leaderboards('foobar', ['bar'])
|
199
|
-
foobar_keys.
|
199
|
+
expect(foobar_keys).to be(5)
|
200
200
|
|
201
201
|
foobar = Leaderboard.new('foobar', Leaderboard::DEFAULT_OPTIONS, {:host => "127.0.0.1", :db => 15})
|
202
|
-
foobar.total_members.
|
202
|
+
expect(foobar.total_members).to be(5)
|
203
203
|
|
204
204
|
first_leader_in_foobar = foobar.leaders(1).first
|
205
|
-
first_leader_in_foobar[:rank].
|
206
|
-
first_leader_in_foobar[:member].
|
207
|
-
first_leader_in_foobar[:score].
|
205
|
+
expect(first_leader_in_foobar[:rank]).to be(1)
|
206
|
+
expect(first_leader_in_foobar[:member]).to eql('bar_3')
|
207
|
+
expect(first_leader_in_foobar[:score]).to eql(5.0)
|
208
208
|
|
209
209
|
foo.disconnect
|
210
210
|
bar.disconnect
|
@@ -223,15 +223,15 @@ describe 'Leaderboard (reverse option)' do
|
|
223
223
|
bar.rank_member('bar_3', 5)
|
224
224
|
|
225
225
|
foobar_keys = foo.intersect_leaderboards('foobar', ['bar'], {:aggregate => :max})
|
226
|
-
foobar_keys.
|
226
|
+
expect(foobar_keys).to be(2)
|
227
227
|
|
228
228
|
foobar = Leaderboard.new('foobar', Leaderboard::DEFAULT_OPTIONS, {:host => "127.0.0.1", :db => 15})
|
229
|
-
foobar.total_members.
|
229
|
+
expect(foobar.total_members).to be(2)
|
230
230
|
|
231
231
|
first_leader_in_foobar = foobar.leaders(1).first
|
232
|
-
first_leader_in_foobar[:rank].
|
233
|
-
first_leader_in_foobar[:member].
|
234
|
-
first_leader_in_foobar[:score].
|
232
|
+
expect(first_leader_in_foobar[:rank]).to be(1)
|
233
|
+
expect(first_leader_in_foobar[:member]).to eql('bar_3')
|
234
|
+
expect(first_leader_in_foobar[:score]).to eql(6.0)
|
235
235
|
|
236
236
|
foo.disconnect
|
237
237
|
bar.disconnect
|
@@ -241,98 +241,98 @@ describe 'Leaderboard (reverse option)' do
|
|
241
241
|
it 'should respect options in the massage_leader_data method' do
|
242
242
|
rank_members_in_leaderboard(25)
|
243
243
|
|
244
|
-
@leaderboard.total_members.
|
244
|
+
expect(@leaderboard.total_members).to be(25)
|
245
245
|
|
246
246
|
leaders = @leaderboard.leaders(1)
|
247
|
-
leaders[0][:member].
|
248
|
-
leaders[0][:score].
|
249
|
-
leaders[0][:rank].
|
247
|
+
expect(leaders[0][:member]).not_to be_nil
|
248
|
+
expect(leaders[0][:score]).not_to be_nil
|
249
|
+
expect(leaders[0][:rank]).not_to be_nil
|
250
250
|
|
251
251
|
@leaderboard.page_size = Leaderboard::DEFAULT_PAGE_SIZE
|
252
252
|
leaders = @leaderboard.leaders(1, Leaderboard::DEFAULT_LEADERBOARD_REQUEST_OPTIONS)
|
253
|
-
leaders.size.
|
254
|
-
leaders[0][:member].
|
255
|
-
leaders[0][:score].
|
256
|
-
leaders[0][:rank].
|
253
|
+
expect(leaders.size).to be(25)
|
254
|
+
expect(leaders[0][:member]).not_to be_nil
|
255
|
+
expect(leaders[0][:score]).not_to be_nil
|
256
|
+
expect(leaders[0][:rank]).not_to be_nil
|
257
257
|
end
|
258
258
|
|
259
259
|
it 'should return the correct number of members when calling around_me with a page_size options' do
|
260
260
|
rank_members_in_leaderboard(Leaderboard::DEFAULT_PAGE_SIZE * 3 + 1)
|
261
261
|
|
262
262
|
leaders_around_me = @leaderboard.around_me('member_30', Leaderboard::DEFAULT_LEADERBOARD_REQUEST_OPTIONS.merge({:page_size => 3}))
|
263
|
-
leaders_around_me.size.
|
264
|
-
leaders_around_me[2][:member].
|
265
|
-
leaders_around_me[0][:member].
|
263
|
+
expect(leaders_around_me.size).to be(3)
|
264
|
+
expect(leaders_around_me[2][:member]).to eql('member_31')
|
265
|
+
expect(leaders_around_me[0][:member]).to eql('member_29')
|
266
266
|
end
|
267
267
|
|
268
268
|
it 'should return the correct information when calling percentile_for' do
|
269
269
|
rank_members_in_leaderboard(12)
|
270
270
|
|
271
|
-
@leaderboard.percentile_for('member_1').
|
272
|
-
@leaderboard.percentile_for('member_2').
|
273
|
-
@leaderboard.percentile_for('member_3').
|
274
|
-
@leaderboard.percentile_for('member_4').
|
275
|
-
@leaderboard.percentile_for('member_12').
|
271
|
+
expect(@leaderboard.percentile_for('member_1')).to eql(100)
|
272
|
+
expect(@leaderboard.percentile_for('member_2')).to eql(91)
|
273
|
+
expect(@leaderboard.percentile_for('member_3')).to eql(83)
|
274
|
+
expect(@leaderboard.percentile_for('member_4')).to eql(75)
|
275
|
+
expect(@leaderboard.percentile_for('member_12')).to eql(8)
|
276
276
|
end
|
277
277
|
|
278
278
|
it 'should return the correct information when calling score_for_percentile' do
|
279
279
|
rank_members_in_leaderboard(5)
|
280
280
|
|
281
|
-
@leaderboard.score_for_percentile(0).
|
282
|
-
@leaderboard.score_for_percentile(75).
|
283
|
-
@leaderboard.score_for_percentile(87.5).
|
284
|
-
@leaderboard.score_for_percentile(93.75).
|
285
|
-
@leaderboard.score_for_percentile(100).
|
281
|
+
expect(@leaderboard.score_for_percentile(0)).to eql(5.0)
|
282
|
+
expect(@leaderboard.score_for_percentile(75)).to eql(2.0)
|
283
|
+
expect(@leaderboard.score_for_percentile(87.5)).to eql(1.5)
|
284
|
+
expect(@leaderboard.score_for_percentile(93.75)).to eql(1.25)
|
285
|
+
expect(@leaderboard.score_for_percentile(100)).to eql(1.0)
|
286
286
|
end
|
287
287
|
|
288
288
|
it 'should return the correct page when calling page_for a given member in the leaderboard' do
|
289
|
-
@leaderboard.page_for('jones').
|
289
|
+
expect(@leaderboard.page_for('jones')).to be(0)
|
290
290
|
|
291
291
|
rank_members_in_leaderboard(20)
|
292
292
|
|
293
|
-
@leaderboard.page_for('member_17').
|
294
|
-
@leaderboard.page_for('member_11').
|
295
|
-
@leaderboard.page_for('member_10').
|
296
|
-
@leaderboard.page_for('member_1').
|
293
|
+
expect(@leaderboard.page_for('member_17')).to be(1)
|
294
|
+
expect(@leaderboard.page_for('member_11')).to be(1)
|
295
|
+
expect(@leaderboard.page_for('member_10')).to be(1)
|
296
|
+
expect(@leaderboard.page_for('member_1')).to be(1)
|
297
297
|
|
298
|
-
@leaderboard.page_for('member_10', 10).
|
299
|
-
@leaderboard.page_for('member_1', 10).
|
300
|
-
@leaderboard.page_for('member_17', 10).
|
301
|
-
@leaderboard.page_for('member_11', 10).
|
298
|
+
expect(@leaderboard.page_for('member_10', 10)).to be(1)
|
299
|
+
expect(@leaderboard.page_for('member_1', 10)).to be(1)
|
300
|
+
expect(@leaderboard.page_for('member_17', 10)).to be(2)
|
301
|
+
expect(@leaderboard.page_for('member_11', 10)).to be(2)
|
302
302
|
end
|
303
303
|
|
304
304
|
it 'should allow you to rank multiple members with a variable number of arguments' do
|
305
|
-
@leaderboard.total_members.
|
305
|
+
expect(@leaderboard.total_members).to be(0)
|
306
306
|
@leaderboard.rank_members('member_1', 1, 'member_10', 10)
|
307
|
-
@leaderboard.total_members.
|
308
|
-
@leaderboard.leaders(1).first[:member].
|
307
|
+
expect(@leaderboard.total_members).to be(2)
|
308
|
+
expect(@leaderboard.leaders(1).first[:member]).to eql('member_1')
|
309
309
|
end
|
310
310
|
|
311
311
|
it 'should allow you to rank multiple members with an array' do
|
312
|
-
@leaderboard.total_members.
|
312
|
+
expect(@leaderboard.total_members).to be(0)
|
313
313
|
@leaderboard.rank_members(['member_1', 1, 'member_10', 10])
|
314
|
-
@leaderboard.total_members.
|
315
|
-
@leaderboard.leaders(1).first[:member].
|
314
|
+
expect(@leaderboard.total_members).to be(2)
|
315
|
+
expect(@leaderboard.leaders(1).first[:member]).to eql('member_1')
|
316
316
|
end
|
317
317
|
|
318
318
|
it 'should allow you to retrieve a given set of members from the leaderboard in a rank range' do
|
319
319
|
rank_members_in_leaderboard(25)
|
320
320
|
|
321
321
|
members = @leaderboard.members_from_rank_range(5, 9)
|
322
|
-
members.size.
|
323
|
-
members[0][:member].
|
324
|
-
members[0][:score].to_i.
|
325
|
-
members[4][:member].
|
322
|
+
expect(members.size).to be(5)
|
323
|
+
expect(members[0][:member]).to eql('member_5')
|
324
|
+
expect(members[0][:score].to_i).to be(5)
|
325
|
+
expect(members[4][:member]).to eql('member_9')
|
326
326
|
|
327
327
|
members = @leaderboard.members_from_rank_range(1, 1)
|
328
|
-
members.size.
|
329
|
-
members[0][:member].
|
328
|
+
expect(members.size).to be(1)
|
329
|
+
expect(members[0][:member]).to eql('member_1')
|
330
330
|
|
331
331
|
members = @leaderboard.members_from_rank_range(-1, 26)
|
332
|
-
members.size.
|
333
|
-
members[0][:member].
|
334
|
-
members[0][:score].to_i.
|
335
|
-
members[24][:member].
|
332
|
+
expect(members.size).to be(25)
|
333
|
+
expect(members[0][:member]).to eql('member_1')
|
334
|
+
expect(members[0][:score].to_i).to be(1)
|
335
|
+
expect(members[24][:member]).to eql('member_25')
|
336
336
|
end
|
337
337
|
|
338
338
|
it 'should sort by rank if the :sort_by option is set to :rank' do
|
@@ -341,16 +341,16 @@ describe 'Leaderboard (reverse option)' do
|
|
341
341
|
members = ['member_5', 'member_1', 'member_10']
|
342
342
|
ranked_members = @leaderboard.ranked_in_list(members, :sort_by => :rank)
|
343
343
|
|
344
|
-
ranked_members.size.
|
344
|
+
expect(ranked_members.size).to be(3)
|
345
345
|
|
346
|
-
ranked_members[0][:rank].
|
347
|
-
ranked_members[0][:score].
|
346
|
+
expect(ranked_members[0][:rank]).to be(1)
|
347
|
+
expect(ranked_members[0][:score]).to eql(1.0)
|
348
348
|
|
349
|
-
ranked_members[1][:rank].
|
350
|
-
ranked_members[1][:score].
|
349
|
+
expect(ranked_members[1][:rank]).to be(5)
|
350
|
+
expect(ranked_members[1][:score]).to eql(5.0)
|
351
351
|
|
352
|
-
ranked_members[2][:rank].
|
353
|
-
ranked_members[2][:score].
|
352
|
+
expect(ranked_members[2][:rank]).to be(10)
|
353
|
+
expect(ranked_members[2][:score]).to eql(10.0)
|
354
354
|
end
|
355
355
|
|
356
356
|
it 'should sort by score if the :sort_by option is set to :score' do
|
@@ -359,15 +359,15 @@ describe 'Leaderboard (reverse option)' do
|
|
359
359
|
members = ['member_5', 'member_1', 'member_10']
|
360
360
|
ranked_members = @leaderboard.ranked_in_list(members, :sort_by => :score)
|
361
361
|
|
362
|
-
ranked_members.size.
|
362
|
+
expect(ranked_members.size).to be(3)
|
363
363
|
|
364
|
-
ranked_members[0][:rank].
|
365
|
-
ranked_members[0][:score].
|
364
|
+
expect(ranked_members[0][:rank]).to be(1)
|
365
|
+
expect(ranked_members[0][:score]).to eql(1.0)
|
366
366
|
|
367
|
-
ranked_members[1][:rank].
|
368
|
-
ranked_members[1][:score].
|
367
|
+
expect(ranked_members[1][:rank]).to be(5)
|
368
|
+
expect(ranked_members[1][:score]).to eql(5.0)
|
369
369
|
|
370
|
-
ranked_members[2][:rank].
|
371
|
-
ranked_members[2][:score].
|
370
|
+
expect(ranked_members[2][:rank]).to be(10)
|
371
|
+
expect(ranked_members[2][:score]).to eql(10.0)
|
372
372
|
end
|
373
373
|
end
|