Exemplo n.º 1
0
    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
Exemplo n.º 2
0
 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))
Exemplo n.º 3
0
 def _testFromReader(self, arrayTraits, arrayValues):
     array = Array(arrayTraits, arrayValues)
     writer = BitStreamWriter()
     array.write(writer)
     reader = BitStreamReader(writer.getByteArray())
     readArray = Array.fromReader(arrayTraits, reader, len(arrayValues))
     self.assertEqual(array, readArray)
Exemplo n.º 4
0
    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))
Exemplo n.º 5
0
 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)
Exemplo n.º 6
0
 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))
Exemplo n.º 7
0
    def _testRead(self, arrayTraits, arrayValues):
        def _checkOffsetMethod(_index, _bitOffset):
            pass

        array = Array(arrayTraits, arrayValues)
        writer = BitStreamWriter()
        array.write(writer)
        reader = BitStreamReader(writer.getByteArray())
        emptyArray = Array(arrayTraits)
        emptyArray.read(reader, len(array.getRawArray()))
        self.assertEqual(array, emptyArray)

        autoArray = Array(arrayTraits, arrayValues, isAuto=True)
        writer = BitStreamWriter()
        autoArray.write(writer)
        reader = BitStreamReader(writer.getByteArray())
        emptyAutoArray = Array(arrayTraits, isAuto=True)
        emptyAutoArray.read(reader, len(autoArray.getRawArray()))
        self.assertEqual(autoArray, emptyAutoArray)

        alignedArray = Array(arrayTraits,
                             arrayValues,
                             checkOffsetMethod=_checkOffsetMethod)
        writer = BitStreamWriter()
        alignedArray.write(writer)
        reader = BitStreamReader(writer.getByteArray())
        emptyAlignedArray = Array(arrayTraits,
                                  checkOffsetMethod=_checkOffsetMethod)
        emptyAlignedArray.read(reader, len(alignedArray.getRawArray()))
        self.assertEqual(alignedArray, emptyAlignedArray)

        implicitArray = Array(arrayTraits, arrayValues, isImplicit=True)
        writer = BitStreamWriter()
        implicitArray.write(writer)
        reader = BitStreamReader(writer.getByteArray())
        emptyImplicitArray = Array(arrayTraits, isImplicit=True)
        emptyImplicitArray.read(reader)

        # read implicit array can be bigger (for example, BoolArray)
        implicitRawArray = implicitArray.getRawArray()
        emptyImplicitRawArray = emptyImplicitArray.getRawArray()
        for index, implicitRawArrayElement in enumerate(implicitRawArray):
            self.assertEqual(implicitRawArrayElement,
                             emptyImplicitRawArray[index])
Exemplo n.º 8
0
 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())
Exemplo n.º 9
0
    def _testRead(self, arrayTraits, arrayValues):
        def _checkOffsetMethod(_index, _bitOffset):
            pass

        array = Array(arrayTraits, arrayValues)
        writer = BitStreamWriter()
        array.write(writer)
        reader = BitStreamReader(writer.getByteArray())
        readArray = Array(arrayTraits)
        readArray.read(reader, len(array.getRawArray()))
        self.assertEqual(array, readArray)

        autoArray = Array(arrayTraits, arrayValues, isAuto=True)
        writer = BitStreamWriter()
        autoArray.write(writer)
        reader = BitStreamReader(writer.getByteArray())
        readAutoArray = Array(arrayTraits, isAuto=True)
        readAutoArray.read(reader, len(autoArray.getRawArray()))
        self.assertEqual(autoArray, readAutoArray)

        alignedArray = Array(arrayTraits,
                             arrayValues,
                             checkOffsetMethod=_checkOffsetMethod)
        writer = BitStreamWriter()
        alignedArray.write(writer)
        reader = BitStreamReader(writer.getByteArray())
        readAlignedArray = Array(arrayTraits,
                                 checkOffsetMethod=_checkOffsetMethod)
        readAlignedArray.read(reader, len(alignedArray.getRawArray()))
        self.assertEqual(alignedArray, readAlignedArray)

        if arrayTraits.HAS_BITSIZEOF_CONSTANT and arrayTraits.bitSizeOf(
        ) % 8 == 0:
            implicitArray = Array(arrayTraits, arrayValues, isImplicit=True)
            writer = BitStreamWriter()
            implicitArray.write(writer)
            reader = BitStreamReader(writer.getByteArray())
            readImplicitArray = Array(arrayTraits, isImplicit=True)
            readImplicitArray.read(reader)
            self.assertEqual(implicitArray, readImplicitArray)
        elif not arrayTraits.HAS_BITSIZEOF_CONSTANT:
            with self.assertRaises(PythonRuntimeException):
                Array(arrayTraits, isImplicit=True).read(reader)
Exemplo n.º 10
0
    def _testImpl(self, writeMethod, readMethod, values, maxStartBitPos):
        for bitPos in range(maxStartBitPos):
            writer = BitStreamWriter()
            if bitPos > 0:
                writer.writeBits(0, bitPos)
            for value in values:
                writeMethod(writer, value)

            reader = BitStreamReader(buffer=writer.getByteArray())
            if bitPos > 0:
                reader.readBits(bitPos)
            for value in values:
                self.assertEqual(value, readMethod(reader), "[bitPos=%d]" % bitPos)
Exemplo n.º 11
0
    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
Exemplo n.º 12
0
    def _testBitsImpl(self, writeMethod, readMethod, values, numBits):
        for bitPos in range(numBits):
            writer = BitStreamWriter()
            if bitPos > 0:
                writer.writeBits(0, bitPos)
            for value in values:
                writeMethod(writer, value, numBits)

            reader = BitStreamReader(buffer=writer.getByteArray())
            if bitPos > 0:
                reader.readBits(bitPos)
            for value in values:
                self.assertEqual(value, readMethod(reader, numBits),
                                 "[numBits=%d, bitPos=%d]" % (numBits, bitPos))
Exemplo n.º 13
0
    def testWriteUnalignedData(self):
        # number expected to be written at offset
        testValue = 123

        for offset in range(65):
            writer = BitStreamWriter()

            if offset != 0:
                writer.writeBits(0, offset)
            writer.writeBits(testValue, 8)

            # check written value
            buffer = writer.getByteArray()
            writtenTestValue = buffer[offset // 8] << (offset % 8)
            if offset % 8 != 0:
                writtenTestValue |= buffer[offset // 8 + 1] >> (8 - (offset % 8))
            self.assertEqual(testValue, writtenTestValue, msg=("Offset: " + str(offset)))
Exemplo n.º 14
0
    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))
Exemplo n.º 15
0
 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())
Exemplo n.º 16
0
 def testWriteString(self):
     writer = BitStreamWriter()
     writer.writeString("")
     self.assertEqual(8, writer.getBitPosition()) # length 0
     self.assertEqual(b'\x00', writer.getByteArray())
Exemplo n.º 17
0
 def testGetByteArray(self):
     writer = BitStreamWriter()
     self.assertEqual(b'', writer.getByteArray())
Exemplo n.º 18
0
 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())