]>
Commit | Line | Data |
---|---|---|
7f7499ee | 1 | start_server {tags {"zset"}} { |
4774a53b PN |
2 | proc create_zset {key items} { |
3 | r del $key | |
4 | foreach {score entry} $items { | |
5 | r zadd $key $score $entry | |
6 | } | |
7 | } | |
8 | ||
98578b57 PN |
9 | test {ZSET basic ZADD and score update} { |
10 | r zadd ztmp 10 x | |
11 | r zadd ztmp 20 y | |
12 | r zadd ztmp 30 z | |
13 | set aux1 [r zrange ztmp 0 -1] | |
14 | r zadd ztmp 1 y | |
15 | set aux2 [r zrange ztmp 0 -1] | |
16 | list $aux1 $aux2 | |
17 | } {{x y z} {y x z}} | |
18 | ||
19 | test {ZCARD basics} { | |
20 | r zcard ztmp | |
21 | } {3} | |
22 | ||
23 | test {ZCARD non existing key} { | |
24 | r zcard ztmp-blabla | |
25 | } {0} | |
26 | ||
184d74ab PN |
27 | test "ZRANGE basics" { |
28 | r del ztmp | |
29 | r zadd ztmp 1 a | |
30 | r zadd ztmp 2 b | |
31 | r zadd ztmp 3 c | |
32 | r zadd ztmp 4 d | |
33 | ||
34 | assert_equal {a b c d} [r zrange ztmp 0 -1] | |
35 | assert_equal {a b c} [r zrange ztmp 0 -2] | |
36 | assert_equal {b c d} [r zrange ztmp 1 -1] | |
37 | assert_equal {b c} [r zrange ztmp 1 -2] | |
38 | assert_equal {c d} [r zrange ztmp -2 -1] | |
39 | assert_equal {c} [r zrange ztmp -2 -2] | |
40 | ||
41 | # out of range start index | |
42 | assert_equal {a b c} [r zrange ztmp -5 2] | |
43 | assert_equal {a b} [r zrange ztmp -5 1] | |
44 | assert_equal {} [r zrange ztmp 5 -1] | |
45 | assert_equal {} [r zrange ztmp 5 -2] | |
46 | ||
47 | # out of range end index | |
48 | assert_equal {a b c d} [r zrange ztmp 0 5] | |
49 | assert_equal {b c d} [r zrange ztmp 1 5] | |
50 | assert_equal {} [r zrange ztmp 0 -5] | |
51 | assert_equal {} [r zrange ztmp 1 -5] | |
52 | ||
53 | # withscores | |
54 | assert_equal {a 1 b 2 c 3 d 4} [r zrange ztmp 0 -1 withscores] | |
55 | } | |
56 | ||
57 | test "ZREVRANGE basics" { | |
58 | r del ztmp | |
59 | r zadd ztmp 1 a | |
60 | r zadd ztmp 2 b | |
61 | r zadd ztmp 3 c | |
62 | r zadd ztmp 4 d | |
63 | ||
64 | assert_equal {d c b a} [r zrevrange ztmp 0 -1] | |
65 | assert_equal {d c b} [r zrevrange ztmp 0 -2] | |
66 | assert_equal {c b a} [r zrevrange ztmp 1 -1] | |
67 | assert_equal {c b} [r zrevrange ztmp 1 -2] | |
68 | assert_equal {b a} [r zrevrange ztmp -2 -1] | |
69 | assert_equal {b} [r zrevrange ztmp -2 -2] | |
70 | ||
71 | # out of range start index | |
72 | assert_equal {d c b} [r zrevrange ztmp -5 2] | |
73 | assert_equal {d c} [r zrevrange ztmp -5 1] | |
74 | assert_equal {} [r zrevrange ztmp 5 -1] | |
75 | assert_equal {} [r zrevrange ztmp 5 -2] | |
76 | ||
77 | # out of range end index | |
78 | assert_equal {d c b a} [r zrevrange ztmp 0 5] | |
79 | assert_equal {c b a} [r zrevrange ztmp 1 5] | |
80 | assert_equal {} [r zrevrange ztmp 0 -5] | |
81 | assert_equal {} [r zrevrange ztmp 1 -5] | |
82 | ||
83 | # withscores | |
84 | assert_equal {d 4 c 3 b 2 a 1} [r zrevrange ztmp 0 -1 withscores] | |
85 | } | |
86 | ||
98578b57 PN |
87 | test {ZRANK basics} { |
88 | r zadd zranktmp 10 x | |
89 | r zadd zranktmp 20 y | |
90 | r zadd zranktmp 30 z | |
91 | list [r zrank zranktmp x] [r zrank zranktmp y] [r zrank zranktmp z] | |
92 | } {0 1 2} | |
93 | ||
94 | test {ZREVRANK basics} { | |
95 | list [r zrevrank zranktmp x] [r zrevrank zranktmp y] [r zrevrank zranktmp z] | |
96 | } {2 1 0} | |
97 | ||
98 | test {ZRANK - after deletion} { | |
99 | r zrem zranktmp y | |
100 | list [r zrank zranktmp x] [r zrank zranktmp z] | |
101 | } {0 1} | |
102 | ||
103 | test {ZSCORE} { | |
104 | set aux {} | |
105 | set err {} | |
106 | for {set i 0} {$i < 1000} {incr i} { | |
107 | set score [expr rand()] | |
108 | lappend aux $score | |
109 | r zadd zscoretest $score $i | |
110 | } | |
111 | for {set i 0} {$i < 1000} {incr i} { | |
112 | if {[r zscore zscoretest $i] != [lindex $aux $i]} { | |
113 | set err "Expected score was [lindex $aux $i] but got [r zscore zscoretest $i] for element $i" | |
114 | break | |
115 | } | |
116 | } | |
117 | set _ $err | |
118 | } {} | |
119 | ||
120 | test {ZSCORE after a DEBUG RELOAD} { | |
121 | set aux {} | |
122 | set err {} | |
123 | r del zscoretest | |
124 | for {set i 0} {$i < 1000} {incr i} { | |
125 | set score [expr rand()] | |
126 | lappend aux $score | |
127 | r zadd zscoretest $score $i | |
128 | } | |
129 | r debug reload | |
130 | for {set i 0} {$i < 1000} {incr i} { | |
131 | if {[r zscore zscoretest $i] != [lindex $aux $i]} { | |
132 | set err "Expected score was [lindex $aux $i] but got [r zscore zscoretest $i] for element $i" | |
133 | break | |
134 | } | |
135 | } | |
136 | set _ $err | |
137 | } {} | |
138 | ||
98578b57 PN |
139 | test {ZSETs stress tester - sorting is working well?} { |
140 | set delta 0 | |
141 | for {set test 0} {$test < 2} {incr test} { | |
142 | unset -nocomplain auxarray | |
143 | array set auxarray {} | |
144 | set auxlist {} | |
145 | r del myzset | |
146 | for {set i 0} {$i < 1000} {incr i} { | |
147 | if {$test == 0} { | |
148 | set score [expr rand()] | |
149 | } else { | |
150 | set score [expr int(rand()*10)] | |
151 | } | |
152 | set auxarray($i) $score | |
153 | r zadd myzset $score $i | |
154 | # Random update | |
155 | if {[expr rand()] < .2} { | |
156 | set j [expr int(rand()*1000)] | |
157 | if {$test == 0} { | |
158 | set score [expr rand()] | |
159 | } else { | |
160 | set score [expr int(rand()*10)] | |
161 | } | |
162 | set auxarray($j) $score | |
163 | r zadd myzset $score $j | |
164 | } | |
165 | } | |
166 | foreach {item score} [array get auxarray] { | |
167 | lappend auxlist [list $score $item] | |
168 | } | |
169 | set sorted [lsort -command zlistAlikeSort $auxlist] | |
170 | set auxlist {} | |
171 | foreach x $sorted { | |
172 | lappend auxlist [lindex $x 1] | |
173 | } | |
174 | set fromredis [r zrange myzset 0 -1] | |
175 | set delta 0 | |
176 | for {set i 0} {$i < [llength $fromredis]} {incr i} { | |
177 | if {[lindex $fromredis $i] != [lindex $auxlist $i]} { | |
178 | incr delta | |
179 | } | |
180 | } | |
181 | } | |
182 | format $delta | |
183 | } {0} | |
184 | ||
185 | test {ZINCRBY - can create a new sorted set} { | |
186 | r del zset | |
187 | r zincrby zset 1 foo | |
188 | list [r zrange zset 0 -1] [r zscore zset foo] | |
189 | } {foo 1} | |
190 | ||
191 | test {ZINCRBY - increment and decrement} { | |
192 | r zincrby zset 2 foo | |
193 | r zincrby zset 1 bar | |
194 | set v1 [r zrange zset 0 -1] | |
195 | r zincrby zset 10 bar | |
196 | r zincrby zset -5 foo | |
197 | r zincrby zset -5 bar | |
198 | set v2 [r zrange zset 0 -1] | |
199 | list $v1 $v2 [r zscore zset foo] [r zscore zset bar] | |
200 | } {{bar foo} {foo bar} -2 6} | |
201 | ||
25bb8a44 PN |
202 | proc create_default_zset {} { |
203 | create_zset zset {-inf a 1 b 2 c 3 d 4 e 5 f +inf g} | |
204 | } | |
98578b57 | 205 | |
25bb8a44 PN |
206 | test "ZRANGEBYSCORE/ZREVRANGEBYSCORE/ZCOUNT basics" { |
207 | create_default_zset | |
208 | ||
209 | # inclusive range | |
210 | assert_equal {a b c} [r zrangebyscore zset -inf 2] | |
211 | assert_equal {b c d} [r zrangebyscore zset 0 3] | |
212 | assert_equal {d e f} [r zrangebyscore zset 3 6] | |
213 | assert_equal {e f g} [r zrangebyscore zset 4 +inf] | |
214 | assert_equal {c b a} [r zrevrangebyscore zset 2 -inf] | |
215 | assert_equal {d c b} [r zrevrangebyscore zset 3 0] | |
216 | assert_equal {f e d} [r zrevrangebyscore zset 6 3] | |
217 | assert_equal {g f e} [r zrevrangebyscore zset +inf 4] | |
218 | assert_equal 3 [r zcount zset 0 3] | |
219 | ||
220 | # exclusive range | |
221 | assert_equal {b} [r zrangebyscore zset (-inf (2] | |
222 | assert_equal {b c} [r zrangebyscore zset (0 (3] | |
223 | assert_equal {e f} [r zrangebyscore zset (3 (6] | |
224 | assert_equal {f} [r zrangebyscore zset (4 (+inf] | |
225 | assert_equal {b} [r zrevrangebyscore zset (2 (-inf] | |
226 | assert_equal {c b} [r zrevrangebyscore zset (3 (0] | |
227 | assert_equal {f e} [r zrevrangebyscore zset (6 (3] | |
228 | assert_equal {f} [r zrevrangebyscore zset (+inf (4] | |
229 | assert_equal 2 [r zcount zset (0 (3] | |
22b9bf15 PN |
230 | |
231 | # test empty ranges | |
232 | r zrem zset a | |
233 | r zrem zset g | |
234 | ||
235 | # inclusive | |
8e1b3277 | 236 | assert_equal {} [r zrangebyscore zset 4 2] |
22b9bf15 PN |
237 | assert_equal {} [r zrangebyscore zset 6 +inf] |
238 | assert_equal {} [r zrangebyscore zset -inf -6] | |
239 | assert_equal {} [r zrevrangebyscore zset +inf 6] | |
240 | assert_equal {} [r zrevrangebyscore zset -6 -inf] | |
241 | ||
242 | # exclusive | |
8e1b3277 PN |
243 | assert_equal {} [r zrangebyscore zset (4 (2] |
244 | assert_equal {} [r zrangebyscore zset 2 (2] | |
245 | assert_equal {} [r zrangebyscore zset (2 2] | |
22b9bf15 PN |
246 | assert_equal {} [r zrangebyscore zset (6 (+inf] |
247 | assert_equal {} [r zrangebyscore zset (-inf (-6] | |
248 | assert_equal {} [r zrevrangebyscore zset (+inf (6] | |
249 | assert_equal {} [r zrevrangebyscore zset (-6 (-inf] | |
e53ca04b PN |
250 | |
251 | # empty inner range | |
252 | assert_equal {} [r zrangebyscore zset 2.4 2.6] | |
253 | assert_equal {} [r zrangebyscore zset (2.4 2.6] | |
254 | assert_equal {} [r zrangebyscore zset 2.4 (2.6] | |
255 | assert_equal {} [r zrangebyscore zset (2.4 (2.6] | |
25bb8a44 PN |
256 | } |
257 | ||
258 | test "ZRANGEBYSCORE with WITHSCORES" { | |
259 | create_default_zset | |
260 | assert_equal {b 1 c 2 d 3} [r zrangebyscore zset 0 3 withscores] | |
261 | assert_equal {d 3 c 2 b 1} [r zrevrangebyscore zset 3 0 withscores] | |
262 | } | |
263 | ||
264 | test "ZRANGEBYSCORE with LIMIT" { | |
265 | create_default_zset | |
266 | assert_equal {b c} [r zrangebyscore zset 0 10 LIMIT 0 2] | |
267 | assert_equal {d e f} [r zrangebyscore zset 0 10 LIMIT 2 3] | |
268 | assert_equal {d e f} [r zrangebyscore zset 0 10 LIMIT 2 10] | |
269 | assert_equal {} [r zrangebyscore zset 0 10 LIMIT 20 10] | |
270 | assert_equal {f e} [r zrevrangebyscore zset 10 0 LIMIT 0 2] | |
271 | assert_equal {d c b} [r zrevrangebyscore zset 10 0 LIMIT 2 3] | |
272 | assert_equal {d c b} [r zrevrangebyscore zset 10 0 LIMIT 2 10] | |
273 | assert_equal {} [r zrevrangebyscore zset 10 0 LIMIT 20 10] | |
274 | } | |
275 | ||
276 | test "ZRANGEBYSCORE with LIMIT and WITHSCORES" { | |
277 | create_default_zset | |
278 | assert_equal {e 4 f 5} [r zrangebyscore zset 2 5 LIMIT 2 3 WITHSCORES] | |
279 | assert_equal {d 3 c 2} [r zrevrangebyscore zset 5 2 LIMIT 2 3 WITHSCORES] | |
280 | } | |
98578b57 | 281 | |
7236fdb2 PN |
282 | test "ZRANGEBYSCORE with non-value min or max" { |
283 | assert_error "*not a double*" {r zrangebyscore fooz str 1} | |
284 | assert_error "*not a double*" {r zrangebyscore fooz 1 str} | |
285 | assert_error "*not a double*" {r zrangebyscore fooz 1 NaN} | |
286 | } | |
287 | ||
7f7499ee PN |
288 | tags {"slow"} { |
289 | test {ZRANGEBYSCORE fuzzy test, 100 ranges in 1000 elements sorted set} { | |
290 | set err {} | |
291 | r del zset | |
292 | for {set i 0} {$i < 1000} {incr i} { | |
293 | r zadd zset [expr rand()] $i | |
98578b57 | 294 | } |
7f7499ee PN |
295 | for {set i 0} {$i < 100} {incr i} { |
296 | set min [expr rand()] | |
297 | set max [expr rand()] | |
298 | if {$min > $max} { | |
299 | set aux $min | |
300 | set min $max | |
301 | set max $aux | |
302 | } | |
303 | set low [r zrangebyscore zset -inf $min] | |
304 | set ok [r zrangebyscore zset $min $max] | |
305 | set high [r zrangebyscore zset $max +inf] | |
306 | set lowx [r zrangebyscore zset -inf ($min] | |
307 | set okx [r zrangebyscore zset ($min ($max] | |
308 | set highx [r zrangebyscore zset ($max +inf] | |
309 | ||
310 | if {[r zcount zset -inf $min] != [llength $low]} { | |
311 | append err "Error, len does not match zcount\n" | |
312 | } | |
313 | if {[r zcount zset $min $max] != [llength $ok]} { | |
314 | append err "Error, len does not match zcount\n" | |
315 | } | |
316 | if {[r zcount zset $max +inf] != [llength $high]} { | |
317 | append err "Error, len does not match zcount\n" | |
318 | } | |
319 | if {[r zcount zset -inf ($min] != [llength $lowx]} { | |
320 | append err "Error, len does not match zcount\n" | |
321 | } | |
322 | if {[r zcount zset ($min ($max] != [llength $okx]} { | |
323 | append err "Error, len does not match zcount\n" | |
324 | } | |
325 | if {[r zcount zset ($max +inf] != [llength $highx]} { | |
326 | append err "Error, len does not match zcount\n" | |
327 | } | |
98578b57 | 328 | |
7f7499ee PN |
329 | foreach x $low { |
330 | set score [r zscore zset $x] | |
331 | if {$score > $min} { | |
332 | append err "Error, score for $x is $score > $min\n" | |
333 | } | |
98578b57 | 334 | } |
7f7499ee PN |
335 | foreach x $lowx { |
336 | set score [r zscore zset $x] | |
337 | if {$score >= $min} { | |
338 | append err "Error, score for $x is $score >= $min\n" | |
339 | } | |
98578b57 | 340 | } |
7f7499ee PN |
341 | foreach x $ok { |
342 | set score [r zscore zset $x] | |
343 | if {$score < $min || $score > $max} { | |
344 | append err "Error, score for $x is $score outside $min-$max range\n" | |
345 | } | |
98578b57 | 346 | } |
7f7499ee PN |
347 | foreach x $okx { |
348 | set score [r zscore zset $x] | |
349 | if {$score <= $min || $score >= $max} { | |
350 | append err "Error, score for $x is $score outside $min-$max open range\n" | |
351 | } | |
98578b57 | 352 | } |
7f7499ee PN |
353 | foreach x $high { |
354 | set score [r zscore zset $x] | |
355 | if {$score < $max} { | |
356 | append err "Error, score for $x is $score < $max\n" | |
357 | } | |
98578b57 | 358 | } |
7f7499ee PN |
359 | foreach x $highx { |
360 | set score [r zscore zset $x] | |
361 | if {$score <= $max} { | |
362 | append err "Error, score for $x is $score <= $max\n" | |
363 | } | |
98578b57 PN |
364 | } |
365 | } | |
7f7499ee PN |
366 | set _ $err |
367 | } {} | |
368 | } | |
98578b57 | 369 | |
91504b6c PN |
370 | test "ZREMRANGEBYSCORE basics" { |
371 | proc remrangebyscore {min max} { | |
372 | create_zset zset {1 a 2 b 3 c 4 d 5 e} | |
373 | r zremrangebyscore zset $min $max | |
374 | } | |
375 | ||
376 | # inner range | |
377 | assert_equal 3 [remrangebyscore 2 4] | |
378 | assert_equal {a e} [r zrange zset 0 -1] | |
379 | ||
380 | # start underflow | |
381 | assert_equal 1 [remrangebyscore -10 1] | |
382 | assert_equal {b c d e} [r zrange zset 0 -1] | |
383 | ||
384 | # end overflow | |
385 | assert_equal 1 [remrangebyscore 5 10] | |
386 | assert_equal {a b c d} [r zrange zset 0 -1] | |
387 | ||
388 | # switch min and max | |
389 | assert_equal 0 [remrangebyscore 4 2] | |
390 | assert_equal {a b c d e} [r zrange zset 0 -1] | |
391 | ||
392 | # -inf to mid | |
393 | assert_equal 3 [remrangebyscore -inf 3] | |
394 | assert_equal {d e} [r zrange zset 0 -1] | |
395 | ||
396 | # mid to +inf | |
397 | assert_equal 3 [remrangebyscore 3 +inf] | |
398 | assert_equal {a b} [r zrange zset 0 -1] | |
399 | ||
400 | # -inf to +inf | |
401 | assert_equal 5 [remrangebyscore -inf +inf] | |
402 | assert_equal {} [r zrange zset 0 -1] | |
403 | ||
404 | # exclusive min | |
405 | assert_equal 4 [remrangebyscore (1 5] | |
406 | assert_equal {a} [r zrange zset 0 -1] | |
407 | assert_equal 3 [remrangebyscore (2 5] | |
408 | assert_equal {a b} [r zrange zset 0 -1] | |
409 | ||
410 | # exclusive max | |
411 | assert_equal 4 [remrangebyscore 1 (5] | |
412 | assert_equal {e} [r zrange zset 0 -1] | |
413 | assert_equal 3 [remrangebyscore 1 (4] | |
414 | assert_equal {d e} [r zrange zset 0 -1] | |
415 | ||
416 | # exclusive min and max | |
417 | assert_equal 3 [remrangebyscore (1 (5] | |
418 | assert_equal {a e} [r zrange zset 0 -1] | |
419 | } | |
98578b57 | 420 | |
7236fdb2 PN |
421 | test "ZREMRANGEBYSCORE with non-value min or max" { |
422 | assert_error "*not a double*" {r zremrangebyscore fooz str 1} | |
423 | assert_error "*not a double*" {r zremrangebyscore fooz 1 str} | |
424 | assert_error "*not a double*" {r zremrangebyscore fooz 1 NaN} | |
425 | } | |
426 | ||
4774a53b PN |
427 | test "ZREMRANGEBYRANK basics" { |
428 | proc remrangebyrank {min max} { | |
429 | create_zset zset {1 a 2 b 3 c 4 d 5 e} | |
430 | r zremrangebyrank zset $min $max | |
431 | } | |
432 | ||
433 | # inner range | |
434 | assert_equal 3 [remrangebyrank 1 3] | |
435 | assert_equal {a e} [r zrange zset 0 -1] | |
436 | ||
437 | # start underflow | |
438 | assert_equal 1 [remrangebyrank -10 0] | |
439 | assert_equal {b c d e} [r zrange zset 0 -1] | |
440 | ||
441 | # start overflow | |
442 | assert_equal 0 [remrangebyrank 10 -1] | |
443 | assert_equal {a b c d e} [r zrange zset 0 -1] | |
444 | ||
445 | # end underflow | |
446 | assert_equal 0 [remrangebyrank 0 -10] | |
447 | assert_equal {a b c d e} [r zrange zset 0 -1] | |
448 | ||
449 | # end overflow | |
450 | assert_equal 5 [remrangebyrank 0 10] | |
451 | assert_equal {} [r zrange zset 0 -1] | |
452 | } | |
98578b57 | 453 | |
5d373da9 | 454 | test {ZUNIONSTORE against non-existing key doesn't set destination} { |
98578b57 | 455 | r del zseta |
5d373da9 | 456 | list [r zunionstore dst_key 1 zseta] [r exists dst_key] |
98578b57 PN |
457 | } {0 0} |
458 | ||
5d373da9 | 459 | test {ZUNIONSTORE basics} { |
98578b57 PN |
460 | r del zseta zsetb zsetc |
461 | r zadd zseta 1 a | |
462 | r zadd zseta 2 b | |
463 | r zadd zseta 3 c | |
464 | r zadd zsetb 1 b | |
465 | r zadd zsetb 2 c | |
466 | r zadd zsetb 3 d | |
5d373da9 | 467 | list [r zunionstore zsetc 2 zseta zsetb] [r zrange zsetc 0 -1 withscores] |
98578b57 PN |
468 | } {4 {a 1 b 3 d 3 c 5}} |
469 | ||
5d373da9 | 470 | test {ZUNIONSTORE with weights} { |
471 | list [r zunionstore zsetc 2 zseta zsetb weights 2 3] [r zrange zsetc 0 -1 withscores] | |
98578b57 PN |
472 | } {4 {a 2 b 7 d 9 c 12}} |
473 | ||
bc000c1d JC |
474 | test {ZUNIONSTORE with a regular set and weights} { |
475 | r del seta | |
476 | r sadd seta a | |
477 | r sadd seta b | |
478 | r sadd seta c | |
479 | list [r zunionstore zsetc 2 seta zsetb weights 2 3] [r zrange zsetc 0 -1 withscores] | |
480 | } {4 {a 2 b 5 c 8 d 9}} | |
481 | ||
5d373da9 | 482 | test {ZUNIONSTORE with AGGREGATE MIN} { |
483 | list [r zunionstore zsetc 2 zseta zsetb aggregate min] [r zrange zsetc 0 -1 withscores] | |
98578b57 PN |
484 | } {4 {a 1 b 1 c 2 d 3}} |
485 | ||
5d373da9 | 486 | test {ZUNIONSTORE with AGGREGATE MAX} { |
487 | list [r zunionstore zsetc 2 zseta zsetb aggregate max] [r zrange zsetc 0 -1 withscores] | |
98578b57 PN |
488 | } {4 {a 1 b 2 c 3 d 3}} |
489 | ||
5d373da9 | 490 | test {ZINTERSTORE basics} { |
491 | list [r zinterstore zsetc 2 zseta zsetb] [r zrange zsetc 0 -1 withscores] | |
98578b57 PN |
492 | } {2 {b 3 c 5}} |
493 | ||
5d373da9 | 494 | test {ZINTERSTORE with weights} { |
495 | list [r zinterstore zsetc 2 zseta zsetb weights 2 3] [r zrange zsetc 0 -1 withscores] | |
98578b57 PN |
496 | } {2 {b 7 c 12}} |
497 | ||
bc000c1d JC |
498 | test {ZINTERSTORE with a regular set and weights} { |
499 | r del seta | |
500 | r sadd seta a | |
501 | r sadd seta b | |
502 | r sadd seta c | |
503 | list [r zinterstore zsetc 2 seta zsetb weights 2 3] [r zrange zsetc 0 -1 withscores] | |
504 | } {2 {b 5 c 8}} | |
505 | ||
5d373da9 | 506 | test {ZINTERSTORE with AGGREGATE MIN} { |
507 | list [r zinterstore zsetc 2 zseta zsetb aggregate min] [r zrange zsetc 0 -1 withscores] | |
98578b57 PN |
508 | } {2 {b 1 c 2}} |
509 | ||
5d373da9 | 510 | test {ZINTERSTORE with AGGREGATE MAX} { |
511 | list [r zinterstore zsetc 2 zseta zsetb aggregate max] [r zrange zsetc 0 -1 withscores] | |
98578b57 PN |
512 | } {2 {b 2 c 3}} |
513 | ||
d9e28bcf PN |
514 | foreach cmd {ZUNIONSTORE ZINTERSTORE} { |
515 | test "$cmd with +inf/-inf scores" { | |
673e1fb7 PN |
516 | r del zsetinf1 zsetinf2 |
517 | ||
d9e28bcf PN |
518 | r zadd zsetinf1 +inf key |
519 | r zadd zsetinf2 +inf key | |
520 | r $cmd zsetinf3 2 zsetinf1 zsetinf2 | |
521 | assert_equal inf [r zscore zsetinf3 key] | |
522 | ||
523 | r zadd zsetinf1 -inf key | |
524 | r zadd zsetinf2 +inf key | |
525 | r $cmd zsetinf3 2 zsetinf1 zsetinf2 | |
526 | assert_equal 0 [r zscore zsetinf3 key] | |
527 | ||
528 | r zadd zsetinf1 +inf key | |
529 | r zadd zsetinf2 -inf key | |
530 | r $cmd zsetinf3 2 zsetinf1 zsetinf2 | |
531 | assert_equal 0 [r zscore zsetinf3 key] | |
532 | ||
533 | r zadd zsetinf1 -inf key | |
534 | r zadd zsetinf2 -inf key | |
535 | r $cmd zsetinf3 2 zsetinf1 zsetinf2 | |
536 | assert_equal -inf [r zscore zsetinf3 key] | |
537 | } | |
673e1fb7 PN |
538 | |
539 | test "$cmd with NaN weights" { | |
540 | r del zsetinf1 zsetinf2 | |
541 | ||
542 | r zadd zsetinf1 1.0 key | |
543 | r zadd zsetinf2 1.0 key | |
544 | assert_error "*weight value is not a double*" { | |
545 | r $cmd zsetinf3 2 zsetinf1 zsetinf2 weights nan nan | |
546 | } | |
547 | } | |
d9e28bcf PN |
548 | } |
549 | ||
7f7499ee PN |
550 | tags {"slow"} { |
551 | test {ZSETs skiplist implementation backlink consistency test} { | |
552 | set diff 0 | |
553 | set elements 10000 | |
554 | for {set j 0} {$j < $elements} {incr j} { | |
555 | r zadd myzset [expr rand()] "Element-$j" | |
556 | r zrem myzset "Element-[expr int(rand()*$elements)]" | |
98578b57 | 557 | } |
7f7499ee PN |
558 | set l1 [r zrange myzset 0 -1] |
559 | set l2 [r zrevrange myzset 0 -1] | |
560 | for {set j 0} {$j < [llength $l1]} {incr j} { | |
561 | if {[lindex $l1 $j] ne [lindex $l2 end-$j]} { | |
562 | incr diff | |
563 | } | |
98578b57 | 564 | } |
7f7499ee PN |
565 | format $diff |
566 | } {0} | |
567 | ||
568 | test {ZSETs ZRANK augmented skip list stress testing} { | |
569 | set err {} | |
570 | r del myzset | |
571 | for {set k 0} {$k < 10000} {incr k} { | |
572 | set i [expr {$k%1000}] | |
573 | if {[expr rand()] < .2} { | |
574 | r zrem myzset $i | |
575 | } else { | |
576 | set score [expr rand()] | |
577 | r zadd myzset $score $i | |
578 | } | |
579 | set card [r zcard myzset] | |
580 | if {$card > 0} { | |
581 | set index [randomInt $card] | |
582 | set ele [lindex [r zrange myzset $index $index] 0] | |
583 | set rank [r zrank myzset $ele] | |
584 | if {$rank != $index} { | |
585 | set err "$ele RANK is wrong! ($rank != $index)" | |
586 | break | |
587 | } | |
98578b57 PN |
588 | } |
589 | } | |
7f7499ee PN |
590 | set _ $err |
591 | } {} | |
592 | } | |
5fc9229c | 593 | |
673e1fb7 PN |
594 | test {ZSET element can't be set to NaN with ZADD} { |
595 | assert_error "*not a double*" {r zadd myzset nan abc} | |
596 | } | |
5fc9229c | 597 | |
673e1fb7 PN |
598 | test {ZSET element can't be set to NaN with ZINCRBY} { |
599 | assert_error "*not a double*" {r zadd myzset nan abc} | |
600 | } | |
5fc9229c | 601 | |
673e1fb7 | 602 | test {ZINCRBY calls leading to NaN result in error} { |
5fc9229c | 603 | r zincrby myzset +inf abc |
673e1fb7 PN |
604 | assert_error "*NaN*" {r zincrby myzset -inf abc} |
605 | } | |
98578b57 | 606 | } |