def test_zeros_and_ones(self): for endian in 'little', 'big': for n in range(100): a = zeros(n, endian) s = serialize(a) self.assertEqual(s[1:], b'\0' * bits2bytes(n)) self.assertEQUAL(a, deserialize(s)) a.setall(1) self.assertEQUAL(a, deserialize(serialize(a)))
def test_invalid_bytes(self): self.assertRaises(ValueError, deserialize, b'') for i in range(256): b = bytes(bytearray([i])) if i == 0 or i == 16: self.assertEqual(deserialize(b), bitarray()) else: self.assertRaises(ValueError, deserialize, b) b += b'\0' if i < 32 and i % 16 < 8: self.assertEqual(deserialize(b), zeros(8 - i % 8)) else: self.assertRaises(ValueError, deserialize, b)
def object_hook(self, obj): if isinstance(obj, dict) and len(obj) == 1: if 'bitarray_b64' in obj: return deserialize(b64decode(obj['bitarray_b64'])) if 'bitarray' in obj: return bitarray(obj['bitarray']) return obj
def test_bits_ignored(self): # the unused bits (with the last bytes) are ignored for b, a in [ (b'\x07\x01', bitarray('1', 'little')), (b'\x07\x03', bitarray('1', 'little')), (b'\x07\xff', bitarray('1', 'little')), (b'\x17\x80', bitarray('1', 'big')), (b'\x17\xc0', bitarray('1', 'big')), (b'\x17\xff', bitarray('1', 'big')), ]: self.assertEQUAL(deserialize(b), a)
def test_explicit(self): for a, b in [ (bitarray(0, 'little'), b'\x00'), (bitarray(0, 'big'), b'\x10'), (bitarray('1', 'little'), b'\x07\x01'), (bitarray('1', 'big'), b'\x17\x80'), (bitarray('11110000', 'little'), b'\x00\x0f'), (bitarray('11110000', 'big'), b'\x10\xf0'), ]: self.assertEqual(serialize(a), b) self.assertEQUAL(deserialize(b), a)
def test_random(self): for a in self.randombitarrays(): b = deserialize(serialize(a)) self.assertEQUAL(a, b) self.check_obj(b)
def object_hook(self, obj): if isinstance(obj, dict) and len(obj) == 1 and 'bitarray' in obj: return deserialize(standard_b64decode(obj['bitarray'])) return obj