1from PyObjCTools.TestSupport import *
2from CoreFoundation import *
3
4def byte2bits(val):
5    result = []
6    for i in range(7, -1, -1):
7        if val & (1 << i):
8            result.append(1)
9        else:
10            result.append(0)
11    return result
12
13class TestBitVector (TestCase):
14    def testGetTypeID(self):
15        v = CFBitVectorGetTypeID()
16        self.assertIsInstance(v, (int, long))
17    def testCreation(self):
18        bitset = CFBitVectorCreate(None, [0x11, 0x22, 0x33, 0x44], 30)
19        self.assertIsInstance(bitset, CFBitVectorRef)
20        self.assertEqual(CFBitVectorGetCount(bitset) , 30)
21        set2 = CFBitVectorCreateCopy(None, bitset)
22        self.assertIsInstance(set2, CFBitVectorRef)
23        self.assertEqual(CFBitVectorGetCount(set2) , 30)
24        set3 = CFBitVectorCreateMutableCopy(None, 0, bitset)
25        self.assertIsInstance(set3, CFBitVectorRef)
26        self.assertEqual(CFBitVectorGetCount(set3) , 30)
27        self.assertIsNot(set3, set)
28        bitset = CFBitVectorCreateMutable(None, 0)
29        self.assertIsInstance(bitset, CFBitVectorRef)
30        self.assertEqual(CFBitVectorGetCount(bitset) , 0)
31        set2 = CFBitVectorCreateCopy(None, bitset)
32        self.assertIsInstance(set2, CFBitVectorRef)
33        self.assertEqual(CFBitVectorGetCount(set2) , 0)
34        set3 = CFBitVectorCreateMutableCopy(None, 0, bitset)
35        self.assertIsInstance(set3, CFBitVectorRef)
36        self.assertEqual(CFBitVectorGetCount(set3) , 0)
37        self.assertIsNot(set3, set)
38    def testInspection(self):
39        bitset = CFBitVectorCreate(None, [0x11, 0x22, 0x33, 0x44], 32)
40
41        self.assertEqual( CFBitVectorGetCount(bitset), 32 )
42        self.assertEqual( CFBitVectorGetCountOfBit(bitset, (0, 30), 1), 10 )
43        self.assertEqual( CFBitVectorGetCountOfBit(bitset, (0, 30), 0), 20 )
44
45        self.assertTrue(  CFBitVectorContainsBit(bitset, (0, 30), 1) )
46        self.assertFalse(  CFBitVectorContainsBit(bitset, (0, 3), 1) )
47
48        bits = byte2bits(0x11)
49        for i in range(8):
50            b = CFBitVectorGetBitAtIndex(bitset, i)
51            self.assertEqual(b , bits[i] )
52        bits = CFBitVectorGetBits(bitset, (0, 8), None)
53        self.assertEqual(bits, b'\x11')
54
55        idx = CFBitVectorGetFirstIndexOfBit(bitset, (0,8), 1)
56        self.assertEqual(idx, 3)
57        idx = CFBitVectorGetLastIndexOfBit(bitset, (0,8), 1)
58        self.assertEqual(idx, 7)
59
60        idx = CFBitVectorGetFirstIndexOfBit(bitset, (0,8), 0)
61        self.assertEqual(idx, 0)
62        idx = CFBitVectorGetLastIndexOfBit(bitset, (0,8), 0)
63        self.assertEqual(idx, 6)
64
65    def testMutation(self):
66        bitset = CFBitVectorCreate(None, [0x11, 0x22, 0x33, 0x44], 30)
67        bitset = CFBitVectorCreateMutableCopy(None, 0, bitset)
68
69        CFBitVectorSetCount(bitset, 20)
70        self.assertEqual(CFBitVectorGetCount(bitset) , 20 )
71        bit = CFBitVectorGetBitAtIndex(bitset, 4)
72        CFBitVectorFlipBitAtIndex(bitset, 4)
73        bit2 = CFBitVectorGetBitAtIndex(bitset, 4)
74        self.assertNotEqual(bit , bit2)
75        bits = ord(CFBitVectorGetBits(bitset, (0, 8), None))
76        CFBitVectorFlipBits(bitset, (0, 8))
77        bits2 = ord(CFBitVectorGetBits(bitset, (0, 8), None))
78
79        self.assertEqual(bits2, ~bits & 0xff)
80
81        CFBitVectorSetBitAtIndex(bitset, 4, 0)
82        self.assertEqual( CFBitVectorGetBitAtIndex(bitset, 4), 0)
83        CFBitVectorSetBitAtIndex(bitset, 4, 1)
84        self.assertEqual( CFBitVectorGetBitAtIndex(bitset, 4), 1)
85
86        CFBitVectorSetBits(bitset, (0, 5), 0)
87        for i in range(5):
88            self.assertEqual( CFBitVectorGetBitAtIndex(bitset, i), 0)
89        CFBitVectorSetBits(bitset, (0, 5), 1)
90        for i in range(5):
91            self.assertEqual( CFBitVectorGetBitAtIndex(bitset, i), 1)
92
93        CFBitVectorSetAllBits(bitset, 1)
94        bits = CFBitVectorGetBits(bitset, (0, 20), None)
95        self.assertEqual(bits, b'\xff\xff\xf0')
96        CFBitVectorSetAllBits(bitset, 0)
97        bits = CFBitVectorGetBits(bitset, (0, 20), None)
98        self.assertEqual(bits, b'\x00\x00\x00')
99
100
101
102
103
104
105
106
107
108
109
110if __name__ == "__main__":
111    main()
112