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 r bitcount foo
0 4294967296
82 test
{BITOP NOT
(empty
string)} {
88 test
{BITOP NOT
(known
string)} {
89 r
set s
"\xaa\x00\xff\x55"
94 test
{BITOP where dest and target are the same key
} {
95 r
set s
"\xaa\x00\xff\x55"
100 test
{BITOP AND|OR|XOR don't change the
string with single input key
} {
101 r
set a
"\x01\x02\xff"
105 list [r get res1
] [r get res2
] [r get res3
]
106 } [list "\x01\x02\xff" "\x01\x02\xff" "\x01\x02\xff"]
108 test
{BITOP missing key is considered a stream of zero
} {
109 r
set a
"\x01\x02\xff"
110 r bitop and res1 no-suck-key a
111 r bitop or res2 no-suck-key a no-such-key
112 r bitop xor res3 no-such-key a
113 list [r get res1
] [r get res2
] [r get res3
]
114 } [list "\x00\x00\x00" "\x01\x02\xff" "\x01\x02\xff"]
116 test
{BITOP shorter keys are zero-padded to the key with max length
} {
117 r
set a
"\x01\x02\xff\xff"
118 r
set b
"\x01\x02\xff"
122 list [r get res1
] [r get res2
] [r get res3
]
123 } [list "\x01\x02\xff\x00" "\x01\x02\xff\xff" "\x00\x00\x00\xff"]
125 foreach op
{and or xor
} {
126 test
"BITOP $op fuzzing" {
127 for {set i
0} {$i < 10} {incr i
} {
131 set numvec
[expr {[randomInt
10]+1}]
132 for {set j
0} {$j < $numvec} {incr j
} {
133 set str
[randstring
0 1000]
135 lappend veckeys vector_
$j
138 r bitop
$op target
{*}$veckeys
139 assert_equal
[r get target
] [simulate_bit_op
$op {*}$vec]
144 test
{BITOP NOT fuzzing
} {
145 for {set i
0} {$i < 10} {incr i
} {
147 set str
[randstring
0 1000]
149 r bitop not target str
150 assert_equal
[r get target
] [simulate_bit_op not
$str]
154 test
{BITOP with integer encoded
source objects
} {
157 r bitop xor dest a b a
161 test
{BITOP with non
string source key
} {
166 catch {r bitop xor dest a b c d
} e
170 test
{BITOP with empty
string after non empty
string (issue
#529)} {
172 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"