4 "set-max-intset-entries" 512
7 proc create_set
{key entries
} {
9 foreach entry $entries { r sadd
$key $entry }
12 test
{SADD
, SCARD
, SISMEMBER
, SMEMBERS basics
- regular
set} {
13 create_set myset
{foo
}
14 assert_encoding hashtable myset
15 assert_equal
1 [r sadd myset bar
]
16 assert_equal
0 [r sadd myset bar
]
17 assert_equal
2 [r scard myset
]
18 assert_equal
1 [r sismember myset foo
]
19 assert_equal
1 [r sismember myset bar
]
20 assert_equal
0 [r sismember myset bla
]
21 assert_equal
{bar foo
} [lsort [r smembers myset
]]
24 test
{SADD
, SCARD
, SISMEMBER
, SMEMBERS basics
- intset
} {
26 assert_encoding intset myset
27 assert_equal
1 [r sadd myset
16]
28 assert_equal
0 [r sadd myset
16]
29 assert_equal
2 [r scard myset
]
30 assert_equal
1 [r sismember myset
16]
31 assert_equal
1 [r sismember myset
17]
32 assert_equal
0 [r sismember myset
18]
33 assert_equal
{16 17} [lsort [r smembers myset
]]
36 test
{SADD against non
set} {
38 assert_error ERR
*kind
* {r sadd mylist bar
}
41 test
"SADD a non-integer against an intset" {
42 create_set myset
{1 2 3}
43 assert_encoding intset myset
44 assert_equal
1 [r sadd myset a
]
45 assert_encoding hashtable myset
48 test
"SADD an integer larger than 64 bits" {
49 create_set myset
{213244124402402314402033402}
50 assert_encoding hashtable myset
51 assert_equal
1 [r sismember myset
213244124402402314402033402]
54 test
"SADD overflows the maximum allowed integers in an intset" {
56 for {set i
0} {$i < 512} {incr i
} { r sadd myset
$i }
57 assert_encoding intset myset
58 assert_equal
1 [r sadd myset
512]
59 assert_encoding hashtable myset
62 test
{Variadic SADD
} {
64 assert_equal
3 [r sadd myset a b c
]
65 assert_equal
2 [r sadd myset A a b c B
]
66 assert_equal
[lsort {A a b c B
}] [lsort [r smembers myset
]]
69 test
"Set encoding after DEBUG RELOAD" {
70 r del myintset myhashset mylargeintset
71 for {set i
0} {$i < 100} {incr i
} { r sadd myintset
$i }
72 for {set i
0} {$i < 1280} {incr i
} { r sadd mylargeintset
$i }
73 for {set i
0} {$i < 256} {incr i
} { r sadd myhashset
[format "i%03d" $i] }
74 assert_encoding intset myintset
75 assert_encoding hashtable mylargeintset
76 assert_encoding hashtable myhashset
79 assert_encoding intset myintset
80 assert_encoding hashtable mylargeintset
81 assert_encoding hashtable myhashset
84 test
{SREM basics
- regular
set} {
85 create_set myset
{foo bar ciao
}
86 assert_encoding hashtable myset
87 assert_equal
0 [r srem myset qux
]
88 assert_equal
1 [r srem myset foo
]
89 assert_equal
{bar ciao
} [lsort [r smembers myset
]]
92 test
{SREM basics
- intset
} {
93 create_set myset
{3 4 5}
94 assert_encoding intset myset
95 assert_equal
0 [r srem myset
6]
96 assert_equal
1 [r srem myset
4]
97 assert_equal
{3 5} [lsort [r smembers myset
]]
100 foreach {type
} {hashtable intset
} {
101 for {set i
1} {$i <= 5} {incr i
} {
102 r del
[format "set%d" $i]
104 for {set i
0} {$i < 200} {incr i
} {
106 r sadd set2
[expr $i+195]
108 foreach i
{199 195 1000 2000} {
111 for {set i
5} {$i < 200} {incr i
} {
116 # To make sure the sets are encoded as the type we are testing -- also
117 # when the VM is enabled and the values may be swapped in and out
118 # while the tests are running -- an extra element is added to every
119 # set that determines its encoding.
121 if {$type eq
"hashtable"} {
125 for {set i
1} {$i <= 5} {incr i
} {
126 r sadd
[format "set%d" $i] $large
129 test
"Generated sets must be encoded as $type" {
130 for {set i
1} {$i <= 5} {incr i
} {
131 assert_encoding
$type [format "set%d" $i]
135 test
"SINTER with two sets - $type" {
136 assert_equal
[list 195 196 197 198 199 $large] [lsort [r sinter set1 set2
]]
139 test
"SINTERSTORE with two sets - $type" {
140 r sinterstore setres set1 set2
141 assert_encoding
$type setres
142 assert_equal
[list 195 196 197 198 199 $large] [lsort [r smembers setres
]]
145 test
"SINTERSTORE with two sets, after a DEBUG RELOAD - $type" {
147 r sinterstore setres set1 set2
148 assert_encoding
$type setres
149 assert_equal
[list 195 196 197 198 199 $large] [lsort [r smembers setres
]]
152 test
"SUNION with two sets - $type" {
153 set expected
[lsort -uniq "[r smembers set1] [r smembers set2]"]
154 assert_equal
$expected [lsort [r sunion set1 set2
]]
157 test
"SUNIONSTORE with two sets - $type" {
158 r sunionstore setres set1 set2
159 assert_encoding
$type setres
160 set expected
[lsort -uniq "[r smembers set1] [r smembers set2]"]
161 assert_equal
$expected [lsort [r smembers setres
]]
164 test
"SINTER against three sets - $type" {
165 assert_equal
[list 195 199 $large] [lsort [r sinter set1 set2 set3
]]
168 test
"SINTERSTORE with three sets - $type" {
169 r sinterstore setres set1 set2 set3
170 assert_equal
[list 195 199 $large] [lsort [r smembers setres
]]
173 test
"SUNION with non existing keys - $type" {
174 set expected
[lsort -uniq "[r smembers set1] [r smembers set2]"]
175 assert_equal
$expected [lsort [r sunion nokey1 set1 set2 nokey2
]]
178 test
"SDIFF with two sets - $type" {
179 assert_equal
{0 1 2 3 4} [lsort [r sdiff set1 set4
]]
182 test
"SDIFF with three sets - $type" {
183 assert_equal
{1 2 3 4} [lsort [r sdiff set1 set4 set5
]]
186 test
"SDIFFSTORE with three sets - $type" {
187 r sdiffstore setres set1 set4 set5
188 # The type is determined by type of the first key to diff against.
189 # See the implementation for more information.
190 assert_encoding
$type setres
191 assert_equal
{1 2 3 4} [lsort [r smembers setres
]]
195 test
"SINTER against non-set should throw error" {
197 assert_error
"ERR*wrong kind*" {r sinter key1 noset
}
200 test
"SUNION against non-set should throw error" {
202 assert_error
"ERR*wrong kind*" {r sunion key1 noset
}
205 test
"SINTERSTORE against non existing keys should delete dstkey" {
207 assert_equal
0 [r sinterstore setres foo111 bar222
]
208 assert_equal
0 [r exists setres
]
211 test
"SUNIONSTORE against non existing keys should delete dstkey" {
213 assert_equal
0 [r sunionstore setres foo111 bar222
]
214 assert_equal
0 [r exists setres
]
217 foreach {type contents
} {hashtable
{a b c
} intset
{1 2 3}} {
218 test
"SPOP basics - $type" {
219 create_set myset
$contents
220 assert_encoding
$type myset
221 assert_equal
$contents [lsort [list [r spop myset
] [r spop myset
] [r spop myset
]]]
222 assert_equal
0 [r scard myset
]
225 test
"SRANDMEMBER - $type" {
226 create_set myset
$contents
227 unset -nocomplain myset
229 for {set i
0} {$i < 100} {incr i
} {
230 set myset
([r srandmember myset
]) 1
232 assert_equal
$contents [lsort [array names myset
]]
238 create_set myset1
{1 a b
}
239 create_set myset2
{2 3 4}
240 assert_encoding hashtable myset1
241 assert_encoding intset myset2
244 test
"SMOVE basics - from regular set to intset" {
245 # move a non-integer element to an intset should convert encoding
247 assert_equal
1 [r smove myset1 myset2 a
]
248 assert_equal
{1 b
} [lsort [r smembers myset1
]]
249 assert_equal
{2 3 4 a
} [lsort [r smembers myset2
]]
250 assert_encoding hashtable myset2
252 # move an integer element should not convert the encoding
254 assert_equal
1 [r smove myset1 myset2
1]
255 assert_equal
{a b
} [lsort [r smembers myset1
]]
256 assert_equal
{1 2 3 4} [lsort [r smembers myset2
]]
257 assert_encoding intset myset2
260 test
"SMOVE basics - from intset to regular set" {
262 assert_equal
1 [r smove myset2 myset1
2]
263 assert_equal
{1 2 a b
} [lsort [r smembers myset1
]]
264 assert_equal
{3 4} [lsort [r smembers myset2
]]
267 test
"SMOVE non existing key" {
269 assert_equal
0 [r smove myset1 myset2 foo
]
270 assert_equal
{1 a b
} [lsort [r smembers myset1
]]
271 assert_equal
{2 3 4} [lsort [r smembers myset2
]]
274 test
"SMOVE non existing src set" {
276 assert_equal
0 [r smove noset myset2 foo
]
277 assert_equal
{2 3 4} [lsort [r smembers myset2
]]
280 test
"SMOVE from regular set to non existing destination set" {
282 assert_equal
1 [r smove myset1 myset3 a
]
283 assert_equal
{1 b
} [lsort [r smembers myset1
]]
284 assert_equal
{a
} [lsort [r smembers myset3
]]
285 assert_encoding hashtable myset3
288 test
"SMOVE from intset to non existing destination set" {
290 assert_equal
1 [r smove myset2 myset3
2]
291 assert_equal
{3 4} [lsort [r smembers myset2
]]
292 assert_equal
{2} [lsort [r smembers myset3
]]
293 assert_encoding intset myset3
296 test
"SMOVE wrong src key type" {
298 assert_error
"ERR*wrong kind*" {r smove x myset2 foo
}
301 test
"SMOVE wrong dst key type" {
303 assert_error
"ERR*wrong kind*" {r smove myset2 x foo
}
307 test
{intsets implementation stress testing
} {
308 for {set j
0} {$j < 20} {incr j
} {
312 set len
[randomInt
1024]
313 for {set i
0} {$i < $len} {incr i
} {
315 set data
[randomInt
65536]
317 set data
[randomInt
4294967296]
319 set data
[randomInt
18446744073709551616]
324 assert_equal
[lsort [r smembers s
]] [lsort [array names s
]]
325 set len
[array size s
]
326 for {set i
0} {$i < $len} {incr i
} {
328 if {![info exists s
($e)]} {
329 puts "Can't find '$e' on local array"
330 puts "Local array: [lsort [r smembers s]]"
331 puts "Remote array: [lsort [array names s]]"
336 assert_equal
[r scard s
] 0
337 assert_equal
[array size s
] 0