1 # Compare Redis commadns against Tcl implementations of the same commands.
4 string length
[regsub -all {0} $bits {}]
7 proc simulate_bit_op
{op args
} {
10 set count
[llength $args]
12 binary scan $a b
* bits
14 if {[string length
$bits] > $maxlen} {
15 set maxlen
[string length
$bits]
19 for {set j
0} {$j < $count} {incr j
} {
20 if {[string length
$b($j)] < $maxlen} {
21 append b
($j) [string repeat
0 [expr $maxlen-[string length
$b($j)]]]
25 for {set x
0} {$x < $maxlen} {incr x
} {
26 set bit
[string range
$b(0) $x $x]
27 if {$op eq
{not
}} {set bit
[expr {!$bit}]}
28 for {set j
1} {$j < $count} {incr j
} {
29 set bit2
[string range
$b($j) $x $x]
31 and
{set bit
[expr {$bit & $bit2}]}
32 or
{set bit
[expr {$bit |
$bit2}]}
33 xor
{set bit
[expr {$bit ^
$bit2}]}
41 start_server
{tags
{"bitops"}} {
42 test
{BITCOUNT returns
0 against non existing key
} {
47 foreach vec
[list "" "\xaa" "\x00\x00\xff" "foobar" "123"] {
49 test
"BITCOUNT against test vector #$num" {
51 assert
{[r bitcount str
] == [count_bits
$vec]}
55 test
{BITCOUNT fuzzing
} {
56 for {set j
0} {$j < 100} {incr j
} {
57 set str
[randstring
0 3000]
59 assert
{[r bitcount str
] == [count_bits
$str]}
63 test
{BITCOUNT with start
, end
} {
65 assert_equal
[r bitcount s
0 -1] [count_bits
"foobar"]
66 assert_equal
[r bitcount s
1 -2] [count_bits
"ooba"]
67 assert_equal
[r bitcount s
-2 1] [count_bits
""]
68 assert_equal
[r bitcount s
0 1000] [count_bits
"foobar"]
71 test
{BITCOUNT syntax
error #1} {
72 catch {r bitcount s
0} e
76 test
{BITCOUNT regression test
for github issue
#582} {
79 if {[catch {r bitcount foo
0 4294967296} e
]} {
80 assert_match
{*ERR
*out of range
*} $e
87 test
{BITOP NOT
(empty
string)} {
93 test
{BITOP NOT
(known
string)} {
94 r
set s
"\xaa\x00\xff\x55"
99 test
{BITOP where dest and target are the same key
} {
100 r
set s
"\xaa\x00\xff\x55"
105 test
{BITOP AND|OR|XOR don't change the
string with single input key
} {
106 r
set a
"\x01\x02\xff"
110 list [r get res1
] [r get res2
] [r get res3
]
111 } [list "\x01\x02\xff" "\x01\x02\xff" "\x01\x02\xff"]
113 test
{BITOP missing key is considered a stream of zero
} {
114 r
set a
"\x01\x02\xff"
115 r bitop and res1 no-suck-key a
116 r bitop or res2 no-suck-key a no-such-key
117 r bitop xor res3 no-such-key a
118 list [r get res1
] [r get res2
] [r get res3
]
119 } [list "\x00\x00\x00" "\x01\x02\xff" "\x01\x02\xff"]
121 test
{BITOP shorter keys are zero-padded to the key with max length
} {
122 r
set a
"\x01\x02\xff\xff"
123 r
set b
"\x01\x02\xff"
127 list [r get res1
] [r get res2
] [r get res3
]
128 } [list "\x01\x02\xff\x00" "\x01\x02\xff\xff" "\x00\x00\x00\xff"]
130 foreach op
{and or xor
} {
131 test
"BITOP $op fuzzing" {
132 for {set i
0} {$i < 10} {incr i
} {
136 set numvec
[expr {[randomInt
10]+1}]
137 for {set j
0} {$j < $numvec} {incr j
} {
138 set str
[randstring
0 1000]
140 lappend veckeys vector_
$j
143 r bitop
$op target
{*}$veckeys
144 assert_equal
[r get target
] [simulate_bit_op
$op {*}$vec]
149 test
{BITOP NOT fuzzing
} {
150 for {set i
0} {$i < 10} {incr i
} {
152 set str
[randstring
0 1000]
154 r bitop not target str
155 assert_equal
[r get target
] [simulate_bit_op not
$str]
159 test
{BITOP with integer encoded
source objects
} {
162 r bitop xor dest a b a
166 test
{BITOP with non
string source key
} {
171 catch {r bitop xor dest a b c d
} e
175 test
{BITOP with empty
string after non empty
string (issue
#529)} {
177 r
set a
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"