1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
"""
Tests for `bx.bitset`.
"""
import unittest
import bx.bitset
class AbstractTests:
def assert_bits(self, bits, list):
assert bits.size == len(list), "Bitset size and verification list size do not match"
for i in range(bits.size):
self.assertEqual(bits[i], list[i])
def test_overflow_create(self):
self.assertRaises(ValueError, self.new_bits, 4000000000)
def test_overflow_access(self):
bits = self.new_bits(100)
self.assertRaises(IndexError, bits.set, -5)
self.assertRaises(IndexError, bits.set, 110)
def test_access(self):
# Create and assert empty
bits = self.new_bits(100)
l = [0] * 100
self.assert_bits(bits, l)
# Set some positions
for pos in (11, 14, 70, 16):
bits.set(pos)
l[pos] = 1
# Clear some positions
for pos in (14, 80, 16):
bits.clear(pos)
l[pos] = 0
self.assert_bits(bits, l)
def test_range_access(self):
# Create and assert empty
bits = self.new_bits(100)
l = [0] * 100
self.assert_bits(bits, l)
# Set some positions
for b, e in ((11, 14), (20, 75), (90, 99)):
bits.set_range(b, e - b)
for pos in range(b, e):
l[pos] = 1
self.assert_bits(bits, l)
def test_count(self):
# Create and assert empty
bits = self.new_bits(100)
# Set some positions
for b, e in ((11, 14), (20, 75), (90, 100)):
bits.set_range(b, e - b)
self.assertEqual(bits.count_range(0, 0), 0)
self.assertEqual(bits.count_range(0, 20), 3)
self.assertEqual(bits.count_range(25, 25), 25)
self.assertEqual(bits.count_range(80, 20), 10)
self.assertEqual(bits.count_range(0, 100), 68)
def test_find(self):
# Create and assert empty
bits = self.new_bits(100)
# Set some positions
for b, e in ((11, 14), (20, 75), (90, 100)):
bits.set_range(b, e - b)
# Next set
self.assertEqual(bits.next_set(0), 11)
self.assertEqual(bits.next_set(13), 13)
self.assertEqual(bits.next_set(15), 20)
# Next clear
self.assertEqual(bits.next_clear(0), 0)
self.assertEqual(bits.next_clear(11), 14)
self.assertEqual(bits.next_clear(20), 75)
self.assertEqual(bits.next_clear(92), 100)
def test_and(self):
bits1 = self.new_bits(100)
bits2 = self.new_bits(100)
bits1.set_range(20, 40)
bits2.set_range(50, 25)
bits1.iand(bits2)
l = [0] * 100
for i in range(50, 60):
l[i] = 1
self.assert_bits(bits1, l)
def test_or(self):
bits1 = self.new_bits(100)
bits2 = self.new_bits(100)
bits1.set_range(20, 40)
bits2.set_range(50, 25)
bits1.ior(bits2)
l = [0] * 100
for i in range(20, 75):
l[i] = 1
self.assert_bits(bits1, l)
def test_not(self):
bits = self.new_bits(100)
bits.set_range(20, 40)
bits.invert()
l = [1] * 100
for i in range(20, 60):
l[i] = 0
self.assert_bits(bits, l)
class BitSetTests(AbstractTests, unittest.TestCase):
def new_bits(self, size):
return bx.bitset.BitSet(size)
class BinnedBitSetTests(AbstractTests, unittest.TestCase):
def new_bits(self, size):
granularity = size % 11
return bx.bitset.BinnedBitSet(size, granularity)
|