def test_case_one(self): x = 0b111000111 bitfield_low = BitField(0, 3) bitfield_mid = BitField(4, 5) bitfield_low.insert(x, 1) self.assertEqual(bitfield_low.extract(x), 0b111) # 7 self.assertEqual(bitfield_mid.extract(x), 0) # middle should still == 0 after insertion
def test_middle_bits(self): mid_4 = BitField(4, 7) # A value that fits snugly in4 bits self.assertEqual(mid_4.insert(13, 0), 13 << 4) # A value that doesn't fit; some high bits lost self.assertEqual(mid_4.insert(21, 0), 5 << 4) # Extract unsigned self.assertEqual(mid_4.extract(15 << 4), 15) # Or convert negative numbers self.assertEqual(mid_4.extract_signed(15 << 4), -1)
def test_invert(self): lowpart = BitField(0, 3) midpart = BitField(4, 6) highpart = BitField(7, 9) for v in range(8): packed = 0 packed = lowpart.insert(v, packed) packed = midpart.insert(v, packed) packed = highpart.insert(v, packed) self.assertEqual(lowpart.extract(packed), v) self.assertEqual(midpart.extract(packed), v) self.assertEqual(highpart.extract(packed), v)
def test_replace(self): """Test replacing an existing field of bits.""" packed = 0x0f0 # 11110000 --- we want to clobber those ones newval = 0x005 # 00000101 --- and replaced them with 0101 field = BitField(4, 7) # ____xxxx --- in positions 4..7 packed = field.insert(newval, packed) self.assertEqual(packed, 0x50) # 01010000 --- some zeros replaced 1s
def test_low_order(self): low_4 = BitField(0, 3) # A value that fits snugly in the first 4 bits self.assertEqual(low_4.insert(13, 0), 13) # A value that doesn't fit; some high bits lost self.assertEqual(low_4.insert(21, 0), 5) # Extract unsigned self.assertEqual(low_4.extract(15), 15) # Or convert negative numbers self.assertEqual(low_4.extract_signed(15), -1) # Doesn't clobber other bits higher = 15 << 4 self.assertEqual(low_4.insert(13, higher), 13 + higher) # Extraction is masked packed = low_4.insert(13, higher) self.assertEqual(low_4.extract(packed), 13)
def test_width(self): """Make sure we are masking out any bits that don't fit in the field. """ second_nibble = BitField(4, 7) value = 0xff # A full byte; two nibbles packed = second_nibble.insert(value, 0) self.assertEqual(packed, 0xf0)
def test_insert_neg(self): bitfield = BitField(3, 5) packed = bitfield.insert(-1, 0) self.assertEqual(packed, 0b000_111_000) unpacked = bitfield.extract_signed(packed) self.assertEqual(unpacked, -1)
def test_insert_low(self): """Inserting a few bits in the lowest part of the word. """ low_bits = BitField(0, 4) self.assertEqual(low_bits.insert(15, 0), 15) # All the bits to 1 # Slip it in without disturbing higher bits self.assertEqual(low_bits.insert(0b1010, 0b1111_0000), 0b1111_1010)
def test_insert_case(self): insert_bits = BitField(0,5) self.assertEqual(insert_bits.insert(0b00000, 31), 0b11111)