def test_UB_read(): bits = BitStream("101010") assert bits.read(UB[6]) == 42 assert bits.bits_available == 0 bits = BitStream("010 0111011001 101010 10001 10111") assert bits.read(UB[3]) == 2 assert bits.bits_available == 26 assert bits.read(UB[10]) == 0b0111011001 assert bits.bits_available == 16 assert bits.read(UB[6]) == 0b101010 assert bits.bits_available == 10 assert bits.read(UB[5]) == 0b10001 assert bits.bits_available == 5 assert bits.read(UB[5]) == 0b10111 assert bits.bits_available == 0 bits = BitStream() bits.write("\xDD\xEE\xFF", ByteString) bits.seek(0) result = bits.read(UB[24]) assert result == 0xDDEEFF assert bits.bits_available == 0 bits.seek(0) result = bits.read(UB[24:"<"]) assert result == 0xFFEEDD assert bits.bits_available == 0
def test_cursor(): bits = BitStream("01001101") assert bits.tell() == 0 bits.seek(1, os.SEEK_END) assert bits.bits_available == 1 assert bits.read_bit() == 1 py.test.raises(IndexError, bits.read_bit) bits.seek(0) assert bits.bits_available == 8 result = bits.read_bit() assert result == 0 result = bits.read_bits(2) assert result == [True, False] bits.seek(1, os.SEEK_CUR) assert bits.bits_available == 4 assert bits.read_bits(2) == [True, True] bits.seek(1, os.SEEK_END) assert bits.bits_available == 0 bits.seek(0) result = bits.read_bits(8) assert str(result) == str(bits)
def test_BitStream_specialized_format_write(): L = [1, 0, True, False] bits = BitStream() bits.write(L) assert str(bits) == "1010" bits = BitStream("11") bits.write(L) assert str(bits) == "1010" bits = BitStream() bits.write(L[3:], BitStream[1]) bits.write(L[2:], BitStream[1]) assert str(bits) == "01" test = BitStream() test.write("SWF", ByteString) test.seek(0) bits = BitStream() bits.write(test, BitStream["<"]) bits.seek(0) result = bits.read(ByteString[3]) assert result == "FWS" assert bits.bits_available == 0
def test_flush(): # Test when bits has no data. bits = BitStream("") bits.flush() assert str(bits) == "" assert bits.bits_available == 0 # Test when cursor == 0 bits = BitStream("1111") bits.seek(0) bits.flush() assert str(bits) == "11110000" assert bits.bits_available == 0 # Test when cursor != 0. bits = BitStream("11100") bits.seek(0, os.SEEK_END) bits.flush() assert str(bits) == "11100000" assert bits.bits_available == 0 # Test when already flush. bits = BitStream("11111111") bits.seek(0) bits.flush() assert str(bits) == "11111111" assert bits.bits_available == 0 bits = BitStream("11111111 11111") bits.seek(0, os.SEEK_END) bits.flush() assert str(bits) == "1111111111111000" assert bits.bits_available == 0
def test_BitStream_specialized_format_read(): bits = BitStream("1011001") result = bits.read(BitStream[4]) assert result == [True, False, True, True] assert bits.bits_available == 3 py.test.raises(IndexError, bits.read, BitStream[4]) bits = BitStream() bits.write("SWF", ByteString) bits.seek(0) result = bits.read(BitStream[24:"<"]) result = result.read(ByteString[3]) assert result == "FWS" assert bits.bits_available == 0
def test_CString_read(): # Testing basics. bits = BitStream() test_data = "test 123\x01\xFF" bits.write(test_data, ByteString) bits.write(Zero[8]) bits.seek(0) result = bits.read(CString) assert result == test_data # Testing error-handling. bits = BitStream() bits.write("adsfasfdgjklhrgokrjygaosaf", ByteString) bits.seek(0) py.test.raises(ValueError, bits.read, CString)
def as_bitstream(self): bitstream = BitStream() bitstream.byte_aligned = getattr(self.create_fields, "byte_aligned", False) self.TEMP_FIELDS = {} statements = {} for statement in self.create_fields(): statement = IStructStatement(statement) statement._pre_write(self) statements[statement] = statement self.writing = True for statement in self.create_fields(): statement = IStructStatement(statements.get(statement, statement)) statement._struct_write(self, bitstream) del self.TEMP_FIELDS self.writing = False bitstream.seek(0) return bitstream
def test_skip_flush(): bits = BitStream("111") bits.seek(0) bits.skip_flush() assert str(bits) == "111" assert bits.bits_available == 3 bits.seek(0, os.SEEK_END) bits.skip_flush() assert str(bits) == "111" assert bits.bits_available == 0 bits = BitStream("11110000 111") bits.skip_flush() assert bits.tell() == 0 assert bits.bits_available == 11 bits.seek(1, os.SEEK_CUR) bits.skip_flush() assert bits.tell() == 8 assert bits.bits_available == 3 bits.skip_flush() assert bits.tell() == 8 assert bits.bits_available == 3 bits = BitStream("11110000 11100011 101") bits.skip_flush() assert bits.tell() == 0 assert bits.bits_available == 19 bits.seek(1, os.SEEK_CUR) bits.cursor += 1 bits.skip_flush() assert bits.tell() == 8 assert bits.bits_available == 11 bits.skip_flush() assert bits.tell() == 8 assert bits.bits_available == 11 bits.seek(1, os.SEEK_CUR) bits.skip_flush() assert bits.tell() == 16 assert bits.bits_available == 3
def test_CString_write(): # Testing basics. bits = BitStream() bits.write("FWS", CString) assert bits.bits_available == 0 assert len(bits) == 32 bits.seek(0) result = bits.read(Byte) assert result == ord("F") assert bits.bits_available == 24 result = bits.read(Byte) assert result == ord("W") assert bits.bits_available == 16 result = bits.read(Byte) assert result == ord("S") assert bits.bits_available == 8 result = bits.read(Byte) assert result == 0 assert bits.bits_available == 0
def test_Byte_read(): # Testing basics. bits = BitStream("10101010 11001100") result = bits.read(Byte[1]) assert result == 0b10101010 assert bits.bits_available == 8 result = bits.read(Byte[1]) assert result == 0b11001100 assert bits.bits_available == 0 # Testing out-of-bounds checking. py.test.raises(ValueError, bits.read, Byte) # Testing length. bits.seek(0) result = bits.read(Byte[2]) assert result == 0b1010101011001100 assert bits.bits_available == 0 # Testing endianness. bits.seek(0) result = bits.read(Byte[2:"<"]) assert result == 0b1100110010101010 assert bits.bits_available == 0 # Testing length behavior. bits.seek(0) result = bits.read(Byte) # This should read one byte. assert result == 0b10101010 assert bits.bits_available == 8 # Make length not divisible by 8. bits.seek(0, os.SEEK_END) bits.write(Zero) bits.seek(0) result = bits.read(Byte) # But this should still work. assert result == 0b10101010 assert bits.bits_available == 9
def test_UB_write(): bits = BitStream() bits.write(0b1111, UB[4]) assert len(bits) == 4 and str(bits) == "1111" bits = BitStream() bits.write(0b1111, UB[8]) assert len(bits) == 8 and str(bits) == "00001111" bits = BitStream() bits.write(0xDDEEFF, UB) bits.seek(0) result = bits.read(ByteString[3]) assert result == "\xDD\xEE\xFF" assert bits.bits_available == 0 bits = BitStream() bits.write(0xDDEEFF, UB["<"]) bits.seek(0) result = bits.read(ByteString[3]) assert result == "\xFF\xEE\xDD" assert bits.bits_available == 0
def test_ByteString_read(): # Testing basics. bits = BitStream("00101010 00101111") result = bits.read(ByteString[1]) assert result == chr(0b00101010) assert bits.bits_available == 8 # Testing length. bits.seek(0) result = bits.read(ByteString[2]) assert result == chr(0b00101010) + chr(0b00101111) assert bits.bits_available == 0 # Testing endianness. bits.seek(0) result = bits.read(ByteString[2:"<"]) assert result == chr(0b00101111) + chr(0b00101010) assert bits.bits_available == 0 # Testing with no length provided. bits.seek(0) result = bits.read(ByteString) assert result == chr(0b00101010) + chr(0b00101111) # Testing non-flush length. # Make length not divisible by 8. bits.seek(0, os.SEEK_END) bits.write(Zero) bits.seek(0) result = bits.read(ByteString[2]) # This should still work. assert result == chr(0b00101010) + chr(0b00101111) assert bits.bits_available == 1 bits.seek(0) py.test.raises(ValueError, bits.read, ByteString) # But this should fail.
def test_ByteString_write(): # Testing basics. bits = BitStream() bits.write("SWF", ByteString) assert bits.bits_available == 0 assert len(bits) == 24 bits.seek(0) for i, char in enumerate("SWF"): result = bits.read(Byte) assert result == ord(char) assert bits.bits_available + i * 8 == 16 # Testing explicit length. bits = BitStream() bits.write("SWF", ByteString[3]) assert bits.bits_available == 0 assert len(bits) == 24 bits.seek(0) for i, char in enumerate("SWF"): result = bits.read(Byte) assert result == ord(char) assert bits.bits_available + i * 8 == 16 # Testing leftover > 0. bits = BitStream() bits.write("SWF", ByteString[4]) assert bits.bits_available == 0 assert len(bits) == 32 bits.seek(0) for i, char in enumerate("\0SWF"): result = bits.read(Byte) assert result == ord(char) assert bits.bits_available + i * 8 == 24 # Testing leftover < 0. bits = BitStream() py.test.raises(ValueError, bits.write, "SWF", ByteString[1]) # Testing endianness. bits = BitStream() bits.write("SWF", ByteString["<"]) assert bits.bits_available == 0 assert len(bits) == 24 bits.seek(0) for i, char in enumerate("FWS"): result = bits.read(Byte) assert result == ord(char) assert bits.bits_available + i * 8 == 16 # Testing leftover > 0 and endianness. bits = BitStream() bits.write("SWF", ByteString[5:"<"]) assert bits.bits_available == 0 assert len(bits) == 40 bits.seek(0) for i, char in enumerate("FWS\0\0"): result = bits.read(Byte) assert result == ord(char) assert bits.bits_available + i * 8 == 32
def test_ByteString_write(): # Testing basics. bits = BitStream() bits.write("SWF", ByteString) assert bits.bits_available == 0 assert len(bits) == 24 bits.seek(0) for i, char in enumerate("SWF"): result = bits.read(Byte) assert result == ord(char) assert bits.bits_available + i*8 == 16 # Testing explicit length. bits = BitStream() bits.write("SWF", ByteString[3]) assert bits.bits_available == 0 assert len(bits) == 24 bits.seek(0) for i, char in enumerate("SWF"): result = bits.read(Byte) assert result == ord(char) assert bits.bits_available + i*8 == 16 # Testing leftover > 0. bits = BitStream() bits.write("SWF", ByteString[4]) assert bits.bits_available == 0 assert len(bits) == 32 bits.seek(0) for i, char in enumerate("\0SWF"): result = bits.read(Byte) assert result == ord(char) assert bits.bits_available + i*8 == 24 # Testing leftover < 0. bits = BitStream() py.test.raises(ValueError, bits.write, "SWF", ByteString[1]) # Testing endianness. bits = BitStream() bits.write("SWF", ByteString["<"]) assert bits.bits_available == 0 assert len(bits) == 24 bits.seek(0) for i, char in enumerate("FWS"): result = bits.read(Byte) assert result == ord(char) assert bits.bits_available + i*8 == 16 # Testing leftover > 0 and endianness. bits = BitStream() bits.write("SWF", ByteString[5:"<"]) assert bits.bits_available == 0 assert len(bits) == 40 bits.seek(0) for i, char in enumerate("FWS\0\0"): result = bits.read(Byte) assert result == ord(char) assert bits.bits_available + i*8 == 32