def testWriteBits(self): writer = BitStreamWriter() writer.writeBits(0, 8) writer.writeBits(255, 8) writer.writeBits(1, 1) writer.writeBits(0x3f, 6) writer.writeBits(1, 1) self.assertEqual(b'\x00\xff\xff', writer.getByteArray()) self.assertEqual(3 * 8, writer.getBitPosition()) writer.writeBits(0xff, 8) self.assertEqual(b'\x00\xff\xff\xff', writer.getByteArray()) self.assertEqual(4 * 8, writer.getBitPosition()) writer.writeBits(0, 4) self.assertEqual(b'\x00\xff\xff\xff\x00', writer.getByteArray()) self.assertEqual(4 * 8 + 4, writer.getBitPosition()) writer.writeBits(0x0f, 4) self.assertEqual(b'\x00\xff\xff\xff\x0f', writer.getByteArray()) self.assertEqual(5 * 8, writer.getBitPosition()) writer.writeBits(0x80, 8) self.assertEqual(b'\x00\xff\xff\xff\x0f\x80', writer.getByteArray()) self.assertEqual(6 * 8, writer.getBitPosition()) with self.assertRaises(PythonRuntimeException): writer.writeBits(1, 0) # zero bits! with self.assertRaises(PythonRuntimeException): writer.writeBits(1, -1) # negative number of bits! with self.assertRaises(PythonRuntimeException): writer.writeBits(256, 8) # above the upper bound with self.assertRaises(PythonRuntimeException): writer.writeBits(-1, 8) # below the lower bound
def testAlignTo(self): writer = BitStreamWriter() writer.writeBits(5, 3) writer.alignTo(8) self.assertEqual(8, writer.getBitPosition()) writer.writeBits(0, 1) writer.alignTo(16) self.assertEqual(16, writer.getBitPosition()) writer.writeBits(0xaa, 9) writer.alignTo(32) self.assertEqual(32, writer.getBitPosition()) writer.writeBits(0xaca, 13) writer.alignTo(64) self.assertEqual(64, writer.getBitPosition()) writer.writeBits(0xcafe, 16) reader = BitStreamReader(buffer=writer.getByteArray()) self.assertEqual(5, reader.readBits(3)) reader.alignTo(8) self.assertEqual(8, reader.getBitPosition()) self.assertEqual(0, reader.readBits(1)) reader.alignTo(16) self.assertEqual(16, reader.getBitPosition()) self.assertEqual(0xaa, reader.readBits(9)) reader.alignTo(32) self.assertEqual(32, reader.getBitPosition()) self.assertEqual(0xaca, reader.readBits(13)) reader.alignTo(64) self.assertEqual(64, reader.getBitPosition()) self.assertEqual(0xcafe, reader.readBits(16))
def testWriteVarInt(self): writer = BitStreamWriter() writer.writeVarInt(0) self.assertEqual(b'\x00', writer.getByteArray()) self.assertEqual(8, writer.getBitPosition()) writer.writeVarInt(-1 << sum(VARINT_NUM_BITS)) self.assertEqual(16, writer.getBitPosition()) self.assertEqual(b'\x00\x80', writer.getByteArray()) # INT64_MIN is encoded as -0 with self.assertRaises(PythonRuntimeException): writer.writeVarInt((-1 << sum(VARINT_NUM_BITS)) - 1) with self.assertRaises(PythonRuntimeException): writer.writeVarInt(1 << sum(VARINT_NUM_BITS))
def testAlignTo(self): writer = BitStreamWriter() writer.alignTo(8) self.assertEqual(0, writer.getBitPosition()) writer.alignTo(2) self.assertEqual(0, writer.getBitPosition()) writer.writeBool(True) writer.alignTo(8) self.assertEqual(8, writer.getBitPosition()) writer.writeBool(True) writer.alignTo(2) self.assertEqual(10, writer.getBitPosition())
def testWriteVarInt64(self): writer = BitStreamWriter() writer.writeVarInt64(0) self.assertEqual(8, writer.getBitPosition()) self.assertEqual(b'\x00', writer.getByteArray()) with self.assertRaises(PythonRuntimeException): writer.writeVarInt64(-1 << sum(VARINT64_NUM_BITS)) with self.assertRaises(PythonRuntimeException): writer.writeVarInt64(1 << sum(VARINT64_NUM_BITS))
def testWriteVarInt32(self): writer = BitStreamWriter() writer.writeVarInt32(0) self.assertEqual(8, writer.getBitPosition()) self.assertEqual(b'\x00', writer.getByteArray()) with self.assertRaises(PythonRuntimeException): writer.writeVarInt32(VARINT32_MIN - 1) with self.assertRaises(PythonRuntimeException): writer.writeVarInt32(VARINT32_MAX + 1)
def testWriteBool(self): writer = BitStreamWriter() writer.writeBool(True) writer.writeBool(False) writer.writeBool(True) writer.writeBool(False) writer.writeBool(True) writer.writeBool(False) self.assertEqual(6, writer.getBitPosition()) self.assertEqual(b'\xA8', writer.getByteArray())
def testBitPosition(self): writer = BitStreamWriter() writer.writeBits(0xaaaa, 16) self.assertEqual(16, writer.getBitPosition()) writer.writeBits(0xff, 8) self.assertEqual(24, writer.getBitPosition()) reader = BitStreamReader(buffer=writer.getByteArray()) self.assertEqual(0xaaaa, reader.readBits(16)) self.assertEqual(16, reader.getBitPosition()) reader.setBitPosition(8) self.assertEqual(8, reader.getBitPosition()) self.assertEqual(0xaaff, reader.readBits(16)) reader.setBitPosition(13) self.assertEqual(13, reader.getBitPosition()) self.assertEqual(0x02, reader.readBits(3)) self.assertEqual(16, reader.getBitPosition()) self.assertEqual(0xff, reader.readBits(8)) self.assertEqual(24, reader.getBitPosition()) reader.setBitPosition(0) self.assertEqual(0, reader.getBitPosition()) self.assertEqual(0xaaaaff, reader.readBits(24))
def _testWrite(self, arrayTraits, arrayValues, expectedBitSize, expectedAlignedBitSize): def _checkOffsetMethod(_index, _bitOffset): pass array = Array(arrayTraits, arrayValues) writer = BitStreamWriter() array.write(writer) self.assertEqual(expectedBitSize, writer.getBitPosition()) autoArray = Array(arrayTraits, arrayValues, isAuto=True) writer = BitStreamWriter() autoArray.write(writer) self.assertEqual( getBitSizeOfVarUInt64(len(arrayValues)) + expectedBitSize, writer.getBitPosition()) alignedArray = Array(arrayTraits, arrayValues, checkOffsetMethod=_checkOffsetMethod) writer = BitStreamWriter() alignedArray.write(writer) self.assertEqual(expectedAlignedBitSize, writer.getBitPosition())
def testWriteSignedBits(self): writer = BitStreamWriter() writer.writeSignedBits(0, 1) writer.writeSignedBits(-1, 2) writer.writeSignedBits(-1, 5) self.assertEqual(b'\x7f', writer.getByteArray()) self.assertEqual(8, writer.getBitPosition()) writer.writeSignedBits(-1, 1) writer.writeSignedBits(-1, 7) self.assertEqual(b'\x7f\xff', writer.getByteArray()) self.assertEqual(16, writer.getBitPosition()) with self.assertRaises(PythonRuntimeException): writer.writeSignedBits(1, 0) # zero bits! with self.assertRaises(PythonRuntimeException): writer.writeSignedBits(1, 1) # above the upper bound with self.assertRaises(PythonRuntimeException): writer.writeSignedBits(128, 8) # above the upper bound with self.assertRaises(PythonRuntimeException): writer.writeSignedBits(-129, 8) # below the lower bound
def write(self, writer: BitStreamWriter) -> None: """ Writes array to the bit stream. :param writer: Bit stream where to write. """ size = len(self._rawArray) if self._isAuto: writer.writeVarSize(size) for index in range(size): if self._checkOffsetMethod is not None: writer.alignTo(8) self._checkOffsetMethod(index, writer.getBitPosition()) self._arrayTraits.write(writer, self._rawArray[index])
def testGetBitPosition(self): writer = BitStreamWriter() self.assertEqual(0, writer.getBitPosition())
def testWriteString(self): writer = BitStreamWriter() writer.writeString("") self.assertEqual(8, writer.getBitPosition()) # length 0 self.assertEqual(b'\x00', writer.getByteArray())
def testWriteFloat64(self): writer = BitStreamWriter() writer.writeFloat64(0) self.assertEqual(64, writer.getBitPosition()) self.assertEqual(b'\x00\x00\x00\x00\x00\x00\x00\x00', writer.getByteArray())
def testWriteBitBuffer(self): writer = BitStreamWriter() writer.writeBitBuffer(BitBuffer(bytes([0xAB, 0xE0]), 11)) writer.writeBitBuffer(BitBuffer(bytes([0x00, 0xFE]), 15)) self.assertEqual(8 + 11 + 8 + 15, writer.getBitPosition()) self.assertEqual(b'\x0B\xAB\xE1\xE0\x1F\xC0', writer.getByteArray())