mirror of
https://github.com/fluencelabs/redis
synced 2025-03-18 16:40:50 +00:00
Test for SRANDMEMBER with <count>.
This commit is contained in:
parent
578c94597f
commit
0ee3f05518
@ -271,6 +271,118 @@ start_server {
|
||||
}
|
||||
}
|
||||
|
||||
test "SRANDMEMBER with <count> against non existing key" {
|
||||
r srandmember nonexisting_key 100
|
||||
} {}
|
||||
|
||||
foreach {type contents} {
|
||||
hashtable {
|
||||
1 5 10 50 125 50000 33959417 4775547 65434162
|
||||
12098459 427716 483706 2726473884 72615637475
|
||||
MARY PATRICIA LINDA BARBARA ELIZABETH JENNIFER MARIA
|
||||
SUSAN MARGARET DOROTHY LISA NANCY KAREN BETTY HELEN
|
||||
SANDRA DONNA CAROL RUTH SHARON MICHELLE LAURA SARAH
|
||||
KIMBERLY DEBORAH JESSICA SHIRLEY CYNTHIA ANGELA MELISSA
|
||||
BRENDA AMY ANNA REBECCA VIRGINIA KATHLEEN
|
||||
}
|
||||
intset {
|
||||
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
||||
20 21 22 23 24 25 26 27 28 29
|
||||
30 31 32 33 34 35 36 37 38 39
|
||||
40 41 42 43 44 45 46 47 48 49
|
||||
}
|
||||
} {
|
||||
test "SRANDMEMBER with <count> - $type" {
|
||||
create_set myset $contents
|
||||
unset -nocomplain myset
|
||||
array set myset {}
|
||||
foreach ele [r smembers myset] {
|
||||
set myset($ele) 1
|
||||
}
|
||||
assert_equal [lsort $contents] [lsort [array names myset]]
|
||||
|
||||
# Make sure that a count of 0 is handled correctly.
|
||||
assert_equal [r srandmember myset 0] {}
|
||||
|
||||
# We'll stress different parts of the code, see the implementation
|
||||
# of SRANDMEMBER for more information, but basically there are
|
||||
# four different code paths.
|
||||
#
|
||||
# PATH 1: Use negative count.
|
||||
#
|
||||
# 1) Check that it returns repeated elements.
|
||||
set res [r srandmember myset -100]
|
||||
assert_equal [llength $res] 100
|
||||
|
||||
# 2) Check that all the elements actually belong to the
|
||||
# original set.
|
||||
foreach ele $res {
|
||||
assert {[info exists myset($ele)]}
|
||||
}
|
||||
|
||||
# 3) Check that eventually all the elements are returned.
|
||||
unset -nocomplain auxset
|
||||
set iterations 1000
|
||||
while {$iterations != 0} {
|
||||
incr iterations -1
|
||||
set res [r srandmember myset -10]
|
||||
foreach ele $res {
|
||||
set auxset($ele) 1
|
||||
}
|
||||
if {[lsort [array names myset]] eq
|
||||
[lsort [array names auxset]]} {
|
||||
break;
|
||||
}
|
||||
}
|
||||
assert {$iterations != 0}
|
||||
|
||||
# PATH 2: positive count (unique behavior) with requested size
|
||||
# equal or greater than set size.
|
||||
foreach size {50 100} {
|
||||
set res [r srandmember myset $size]
|
||||
assert_equal [llength $res] 50
|
||||
assert_equal [lsort $res] [lsort [array names myset]]
|
||||
}
|
||||
|
||||
# PATH 3: Ask almost as elements as there are in the set.
|
||||
# In this case the implementation will duplicate the original
|
||||
# set and will remove random elements up to the requested size.
|
||||
#
|
||||
# PATH 4: Ask a number of elements definitely smaller than
|
||||
# the set size.
|
||||
#
|
||||
# We can test both the code paths just changing the size but
|
||||
# using the same code.
|
||||
|
||||
foreach size {45 5} {
|
||||
set res [r srandmember myset $size]
|
||||
assert_equal [llength $res] $size
|
||||
|
||||
# 1) Check that all the elements actually belong to the
|
||||
# original set.
|
||||
foreach ele $res {
|
||||
assert {[info exists myset($ele)]}
|
||||
}
|
||||
|
||||
# 2) Check that eventually all the elements are returned.
|
||||
unset -nocomplain auxset
|
||||
set iterations 1000
|
||||
while {$iterations != 0} {
|
||||
incr iterations -1
|
||||
set res [r srandmember myset -10]
|
||||
foreach ele $res {
|
||||
set auxset($ele) 1
|
||||
}
|
||||
if {[lsort [array names myset]] eq
|
||||
[lsort [array names auxset]]} {
|
||||
break;
|
||||
}
|
||||
}
|
||||
assert {$iterations != 0}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
proc setup_move {} {
|
||||
r del myset3 myset4
|
||||
create_set myset1 {1 a b}
|
||||
|
Loading…
x
Reference in New Issue
Block a user