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