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 for {set j
1} {$j < $count} {incr j
} {
28 set bit2
[string range
$b($j) $x $x]
30 and
{set bit
[expr {$bit & $bit2}]}
31 or
{set bit
[expr {$bit |
$bit2}]}
32 xor
{set bit
[expr {$bit ^
$bit2}]}
33 not
{set bit
[expr {!$bit}]}
41 start_server
{tags
{"bitops"}} {
42 test
{BITCOUNT returns
0 against non existing key
} {
48 "" "\xaa" "\x00\x00\xff" "foobar" \
49 [randstring
2000 3000] [randstring
2000 3000] \
50 [randstring
2000 3000] \
53 test
"BITCOUNT against test vector #$num" {
55 assert
{[r bitcount str
] == [count_bits
$vec]}
59 test
{BITCOUNT with start
, end
} {
61 assert_equal
[r bitcount s
0 -1] [count_bits
"foobar"]
62 assert_equal
[r bitcount s
1 -2] [count_bits
"ooba"]
63 assert_equal
[r bitcount s
-2 1] [count_bits
""]
64 assert_equal
[r bitcount s
0 1000] [count_bits
"foobar"]
67 test
{BITCOUNT syntax
error #1} {
68 catch {r bitcount s
0} e
72 test
{BITOP NOT
(empty
string)} {
78 test
{BITOP NOT
(known
string)} {
79 r
set s
"\xaa\x00\xff\x55"
84 test
{BITOP where dest and target are the same key
} {
85 r
set s
"\xaa\x00\xff\x55"
90 test
{BITOP AND|OR|XOR don't change the
string with single input key
} {
91 r
set a
"\x01\x02\xff"
95 list [r get res1
] [r get res2
] [r get res3
]
96 } [list "\x01\x02\xff" "\x01\x02\xff" "\x01\x02\xff"]
98 test
{BITOP missing key is considered a stream of zero
} {
99 r
set a
"\x01\x02\xff"
100 r bitop and res1 no-suck-key a
101 r bitop or res2 no-suck-key a no-such-key
102 r bitop xor res3 no-such-key a
103 list [r get res1
] [r get res2
] [r get res3
]
104 } [list "\x00\x00\x00" "\x01\x02\xff" "\x01\x02\xff"]
106 test
{BITOP shorter keys are zero-padded to the key with max length
} {
107 r
set a
"\x01\x02\xff\xff"
108 r
set b
"\x01\x02\xff"
112 list [r get res1
] [r get res2
] [r get res3
]
113 } [list "\x01\x02\xff\x00" "\x01\x02\xff\xff" "\x00\x00\x00\xff"]
115 foreach op
{and or xor
} {
116 test
"BITOP $op fuzzing" {
119 set numvec
[expr {[randomInt
10]+1}]
120 for {set j
0} {$j < $numvec} {incr j
} {
121 set str
[randstring
0 1000]
123 lappend veckeys vector_
$j
126 r bitop
$op target
{*}$veckeys
127 assert_equal
[r get target
] [simulate_bit_op
$op {*}$vec]