Add commands SETBIT/GETBIT

This commit is contained in:
Pieter Noordhuis
2010-12-09 16:39:33 +01:00
parent a5be65f71c
commit 3c1bf4957e
6 changed files with 197 additions and 0 deletions

View File

@ -374,4 +374,88 @@ start_server {tags {"basic"}} {
r set mystring "foozzz0123456789 baz"
r strlen mystring
}
test "SETBIT against non-existing key" {
r del mykey
# Setting 2nd bit to on is integer 64, ascii "@"
assert_equal 1 [r setbit mykey 1 1]
assert_equal "@" [r get mykey]
}
test "SETBIT against string-encoded key" {
# Single byte with 2nd bit set
r set mykey "@"
# 64 + 32 = 96 => ascii "`" (backtick)
assert_equal 1 [r setbit mykey 2 1]
assert_equal "`" [r get mykey]
}
test "SETBIT against integer-encoded key" {
r set mykey 1
assert_encoding int mykey
# Ascii "1" is integer 49 = 00 11 00 01
# Setting 7th bit = 51 => ascii "3"
assert_equal 1 [r setbit mykey 6 1]
assert_equal "3" [r get mykey]
}
test "SETBIT against key with wrong type" {
r del mykey
r lpush mykey "foo"
assert_error "*wrong kind*" {r setbit mykey 0 1}
}
test "SETBIT with out of range bit offset" {
r del mykey
assert_error "*out of range*" {r setbit mykey [expr 8*1024*1024*1024] 1}
assert_error "*out of range*" {r setbit mykey -1 1}
}
test "SETBIT with non-bit argument" {
r del mykey
assert_error "*0 or 1*" {r setbit mykey 0 -1}
assert_error "*0 or 1*" {r setbit mykey 0 2}
assert_error "*0 or 1*" {r setbit mykey 0 10}
assert_error "*0 or 1*" {r setbit mykey 0 01}
}
test "GETBIT against non-existing key" {
r del mykey
assert_equal 0 [r getbit mykey 0]
}
test "GETBIT against string-encoded key" {
# Single byte with 2nd and 3rd bit set
r set mykey "`"
# In-range
assert_equal 0 [r getbit mykey 0]
assert_equal 1 [r getbit mykey 1]
assert_equal 1 [r getbit mykey 2]
assert_equal 0 [r getbit mykey 3]
# Out-range
assert_equal 0 [r getbit mykey 8]
assert_equal 0 [r getbit mykey 100]
assert_equal 0 [r getbit mykey 10000]
}
test "GETBIT against integer-encoded key" {
r set mykey 1
assert_encoding int mykey
# Ascii "1" is integer 49 = 00 11 00 01
assert_equal 0 [r getbit mykey 0]
assert_equal 0 [r getbit mykey 1]
assert_equal 1 [r getbit mykey 2]
assert_equal 1 [r getbit mykey 3]
# Out-range
assert_equal 0 [r getbit mykey 8]
assert_equal 0 [r getbit mykey 100]
assert_equal 0 [r getbit mykey 10000]
}
}