Skip to content

Commit

Permalink
Merge pull request #169 from cosven/fix-setbit
Browse files Browse the repository at this point in the history
fix setbit
  • Loading branch information
jamesls committed Mar 9, 2018
2 parents 0e0cf4c + 582b432 commit 2589290
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 2 deletions.
7 changes: 5 additions & 2 deletions fakeredis.py
Original file line number Diff line number Diff line change
Expand Up @@ -475,13 +475,16 @@ def setbit(self, name, offset, value):
# bit.
needed = byte - (len(val) - 1)
val += b'\x00' * needed
old_byte = byte_to_int(val[byte])
if value == 1:
new_byte = byte_to_int(val[byte]) | (1 << actual_bitoffset)
new_byte = old_byte | (1 << actual_bitoffset)
else:
new_byte = byte_to_int(val[byte]) ^ (1 << actual_bitoffset)
new_byte = old_byte & ~(1 << actual_bitoffset)
old_value = value if old_byte == new_byte else not value
reconstructed = bytearray(val)
reconstructed[byte] = new_byte
self._db[name] = bytes(reconstructed)
return bool(old_value)

def setex(self, name, time, value):
if isinstance(time, timedelta):
Expand Down
14 changes: 14 additions & 0 deletions test_fakeredis.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,20 @@ def test_unset_bits(self):
self.redis.setbit('foo', 3, 0)
self.assertEqual(self.redis.getbit('foo', 3), 0)

def test_get_set_bits(self):
# set bit 5
self.assertFalse(self.redis.setbit('a', 5, True))
self.assertTrue(self.redis.getbit('a', 5))
# unset bit 4
self.assertFalse(self.redis.setbit('a', 4, False))
self.assertFalse(self.redis.getbit('a', 4))
# set bit 4
self.assertFalse(self.redis.setbit('a', 4, True))
self.assertTrue(self.redis.getbit('a', 4))
# set bit 5 again
self.assertTrue(self.redis.setbit('a', 5, True))
self.assertTrue(self.redis.getbit('a', 5))

def test_setbits_and_getkeys(self):
# The bit operations and the get commands
# should play nicely with each other.
Expand Down

0 comments on commit 2589290

Please sign in to comment.