| #!/usr/bin/env python |
| """ |
| Unit tests for the bitarray module. |
| """ |
| |
| import unittest |
| import sys |
| |
| sys.path.insert(0, '..') |
| import bitstring |
| from bitstring import BitArray |
| |
| class All(unittest.TestCase): |
| def testCreationFromUint(self): |
| s = BitArray(uint=15, length=6) |
| self.assertEqual(s.bin, '001111') |
| s = BitArray(uint=0, length=1) |
| self.assertEqual(s.bin, '0') |
| s.uint = 1 |
| self.assertEqual(s.uint, 1) |
| s = BitArray(length=8) |
| s.uint = 0 |
| self.assertEqual(s.uint, 0) |
| s.uint = 255 |
| self.assertEqual(s.uint, 255) |
| self.assertEqual(s.len, 8) |
| self.assertRaises(bitstring.CreationError, s._setuint, 256) |
| |
| def testCreationFromOct(self): |
| s = BitArray(oct='7') |
| self.assertEqual(s.oct, '7') |
| self.assertEqual(s.bin, '111') |
| s.append('0o1') |
| self.assertEqual(s.bin, '111001') |
| s.oct = '12345670' |
| self.assertEqual(s.length, 24) |
| self.assertEqual(s.bin, '001010011100101110111000') |
| s = BitArray('0o123') |
| self.assertEqual(s.oct, '123') |
| |
| |
| class NoPosAttribute(unittest.TestCase): |
| def testReplace(self): |
| s = BitArray('0b01') |
| s.replace('0b1', '0b11') |
| self.assertEqual(s, '0b011') |
| |
| def testDelete(self): |
| s = BitArray('0b000000001') |
| del s[-1:] |
| self.assertEqual(s, '0b00000000') |
| |
| def testInsert(self): |
| s = BitArray('0b00') |
| s.insert('0xf', 1) |
| self.assertEqual(s, '0b011110') |
| |
| def testInsertParameters(self): |
| s = BitArray('0b111') |
| self.assertRaises(TypeError, s.insert, '0x4') |
| |
| def testOverwrite(self): |
| s = BitArray('0b01110') |
| s.overwrite('0b000', 1) |
| self.assertEqual(s, '0b00000') |
| |
| def testOverwriteParameters(self): |
| s = BitArray('0b0000') |
| self.assertRaises(TypeError, s.overwrite, '0b111') |
| |
| def testPrepend(self): |
| s = BitArray('0b0') |
| s.prepend([1]) |
| self.assertEqual(s, [1, 0]) |
| |
| def testRol(self): |
| s = BitArray('0b0001') |
| s.rol(1) |
| self.assertEqual(s, '0b0010') |
| |
| def testRor(self): |
| s = BitArray('0b1000') |
| s.ror(1) |
| self.assertEqual(s, '0b0100') |
| |
| def testSetItem(self): |
| s = BitArray('0b000100') |
| s[4:5] = '0xf' |
| self.assertEqual(s, '0b000111110') |
| s[0:1] = [1] |
| self.assertEqual(s, '0b100111110') |
| |
| |
| class Bugs(unittest.TestCase): |
| def testAddingNonsense(self): |
| a = BitArray([0]) |
| a += '0' # a uint of length 0 - so nothing gets added. |
| self.assertEqual(a, [0]) |
| self.assertRaises(ValueError, a.__iadd__, '3') |
| self.assertRaises(ValueError, a.__iadd__, 'se') |
| self.assertRaises(ValueError, a.__iadd__, 'float:32') |
| |
| def testPrependAfterCreationFromDataWithOffset(self): |
| s1 = BitArray(bytes=b'\x00\x00\x07\xff\xf0\x00', offset=21, length=15) |
| self.assertFalse(s1.any(0)) |
| s1.prepend('0b0') |
| self.assertEqual(s1.bin, '0111111111111111') |
| s1.prepend('0b0') |
| self.assertEqual(s1.bin, '00111111111111111') |
| |
| |
| class ByteAligned(unittest.TestCase): |
| def testDefault(self, defaultbytealigned=bitstring.bytealigned): |
| self.assertFalse(defaultbytealigned) |
| |
| def testChangingIt(self): |
| bitstring.bytealigned = True |
| self.assertTrue(bitstring.bytealigned) |
| bitstring.bytealigned = False |
| |
| def testNotByteAligned(self): |
| bitstring.bytealigned = False |
| a = BitArray('0x00 ff 0f f') |
| l = list(a.findall('0xff')) |
| self.assertEqual(l, [8, 20]) |
| p = a.find('0x0f')[0] |
| self.assertEqual(p, 4) |
| p = a.rfind('0xff')[0] |
| self.assertEqual(p, 20) |
| s = list(a.split('0xff')) |
| self.assertEqual(s, ['0x00', '0xff0', '0xff']) |
| a.replace('0xff', '') |
| self.assertEqual(a, '0x000') |
| |
| def testByteAligned(self): |
| bitstring.bytealigned = True |
| a = BitArray('0x00 ff 0f f') |
| l = list(a.findall('0xff')) |
| self.assertEqual(l, [8]) |
| p = a.find('0x0f')[0] |
| self.assertEqual(p, 16) |
| p = a.rfind('0xff')[0] |
| self.assertEqual(p, 8) |
| s = list(a.split('0xff')) |
| self.assertEqual(s, ['0x00', '0xff0ff']) |
| a.replace('0xff', '') |
| self.assertEqual(a, '0x000ff') |
| |
| |
| class SliceAssignment(unittest.TestCase): |
| |
| def testSliceAssignmentSingleBit(self): |
| a = BitArray('0b000') |
| a[2] = '0b1' |
| self.assertEqual(a.bin, '001') |
| a[0] = BitArray(bin='1') |
| self.assertEqual(a.bin, '101') |
| a[-1] = '0b0' |
| self.assertEqual(a.bin, '100') |
| a[-3] = '0b0' |
| self.assertEqual(a.bin, '000') |
| |
| def testSliceAssignmentSingleBitErrors(self): |
| a = BitArray('0b000') |
| self.assertRaises(IndexError, a.__setitem__, -4, '0b1') |
| self.assertRaises(IndexError, a.__setitem__, 3, '0b1') |
| self.assertRaises(TypeError, a.__setitem__, 1, 1.3) |
| |
| def testSliceAssignmentMulipleBits(self): |
| a = BitArray('0b0') |
| a[0] = '0b110' |
| self.assertEqual(a.bin, '110') |
| a[0] = '0b000' |
| self.assertEqual(a.bin, '00010') |
| a[0:3] = '0b111' |
| self.assertEqual(a.bin, '11110') |
| a[-2:] = '0b011' |
| self.assertEqual(a.bin, '111011') |
| a[:] = '0x12345' |
| self.assertEqual(a.hex, '12345') |
| a[:] = '' |
| self.assertFalse(a) |
| |
| def testSliceAssignmentMultipleBitsErrors(self): |
| a = BitArray() |
| self.assertRaises(IndexError, a.__setitem__, 0, '0b00') |
| a += '0b1' |
| a[0:2] = '0b11' |
| self.assertEqual(a, '0b11') |
| |
| def testDelSliceStep(self): |
| a = BitArray(bin='100111101001001110110100101') |
| del a[::2] |
| self.assertEqual(a.bin, '0110010101100') |
| del a[3:9:3] |
| self.assertEqual(a.bin, '01101101100') |
| del a[2:7:1] |
| self.assertEqual(a.bin, '011100') |
| del a[::99] |
| self.assertEqual(a.bin, '11100') |
| del a[::1] |
| self.assertEqual(a.bin, '') |
| |
| def testDelSliceNegativeStep(self): |
| a = BitArray('0b0001011101101100100110000001') |
| del a[5:23:-3] |
| self.assertEqual(a.bin, '0001011101101100100110000001') |
| del a[25:3:-3] |
| self.assertEqual(a.bin, '00011101010000100001') |
| del a[:6:-7] |
| self.assertEqual(a.bin, '000111010100010000') |
| del a[15::-2] |
| self.assertEqual(a.bin, '0010000000') |
| del a[::-1] |
| self.assertEqual(a.bin, '') |
| |
| def testDelSliceErrors(self): |
| a = BitArray(10) |
| del a[5:3] |
| self.assertEqual(a, 10) |
| del a[3:5:-1] |
| self.assertEqual(a, 10) |
| |
| def testDelSingleElement(self): |
| a = BitArray('0b0010011') |
| del a[-1] |
| self.assertEqual(a.bin, '001001') |
| del a[2] |
| self.assertEqual(a.bin, '00001') |
| try: |
| del a[5] |
| self.assertTrue(False) |
| except IndexError: |
| pass |
| |
| def testSetSliceStep(self): |
| a = BitArray(bin='0000000000') |
| a[::2] = '0b11111' |
| self.assertEqual(a.bin, '1010101010') |
| a[4:9:3] = [0, 0] |
| self.assertEqual(a.bin, '1010001010') |
| a[7:3:-1] = [1, 1, 1, 0] |
| self.assertEqual(a.bin, '1010011110') |
| a[7:1:-2] = [0, 0, 1] |
| self.assertEqual(a.bin, '1011001010') |
| a[::-5] = [1, 1] |
| self.assertEqual(a.bin, '1011101011') |
| a[::-1] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 1] |
| self.assertEqual(a.bin, '1000000000') |
| |
| def testSetSliceErrors(self): |
| a = BitArray(8) |
| try: |
| a[::3] = [1] |
| self.assertTrue(False) |
| except ValueError: |
| pass |
| class A(object): pass |
| try: |
| a[1:2] = A() |
| self.assertTrue(False) |
| except TypeError: |
| pass |
| try: |
| a[1:4:-1] = [1, 2] |
| self.assertTrue(False) |
| except ValueError: |
| pass |
| |
| |
| class Subclassing(unittest.TestCase): |
| |
| def testIsInstance(self): |
| class SubBits(BitArray): pass |
| a = SubBits() |
| self.assertTrue(isinstance(a, SubBits)) |
| |
| def testClassType(self): |
| class SubBits(BitArray): pass |
| self.assertEqual(SubBits().__class__, SubBits) |
| |
| |
| class Clear(unittest.TestCase): |
| |
| def testClear(self): |
| s = BitArray('0xfff') |
| s.clear() |
| self.assertEqual(s.len, 0) |
| |
| |
| class Copy(unittest.TestCase): |
| |
| def testCopyMethod(self): |
| s = BitArray(9) |
| t = s.copy() |
| self.assertEqual(s, t) |
| t[0] = True |
| self.assertEqual(t.bin, '100000000') |
| self.assertEqual(s.bin, '000000000') |
| |
| |
| class ModifiedByAddingBug(unittest.TestCase): |
| |
| def testAdding(self): |
| a = BitArray('0b0') |
| b = BitArray('0b11') |
| c = a + b |
| self.assertEqual(c, '0b011') |
| self.assertEqual(a, '0b0') |
| self.assertEqual(b, '0b11') |