File: bitset_tests.py

package info (click to toggle)
python-bx 0.13.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 5,000 kB
  • sloc: python: 17,136; ansic: 2,326; makefile: 24; sh: 8
file content (119 lines) | stat: -rw-r--r-- 3,561 bytes parent folder | download | duplicates (2)
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)