Skip to content

Commit

Permalink
Test for SRANDMEMBER with <count>.
Browse files Browse the repository at this point in the history
  • Loading branch information
antirez committed Sep 21, 2012
1 parent 578c945 commit 0ee3f05
Showing 1 changed file with 112 additions and 0 deletions.
112 changes: 112 additions & 0 deletions tests/unit/type/set.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -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}
Expand Down

0 comments on commit 0ee3f05

Please sign in to comment.