1from PyObjCTools.TestSupport import *
2from CoreFoundation import *
3import sys
4
5try:
6    long
7except NameError:
8    long = int
9
10try:
11    unichr
12except NameError:
13    unichr = chr
14
15
16class TestCharacterSet (TestCase):
17    def testTypes(self):
18        self.assertIsCFType(CFCharacterSetRef)
19        self.assertIsCFType(CFMutableCharacterSetRef)
20
21    def testTypeId(self):
22        v = CFCharacterSetGetTypeID()
23        self.assertIsInstance(v, (int, long))
24
25    def testCreation(self):
26        set = CFCharacterSetGetPredefined(kCFCharacterSetLetter)
27        self.assertIsInstance(set, CFCharacterSetRef)
28        set = CFCharacterSetCreateWithCharactersInRange(None, (ord('A'), ord('Z')-ord('A')))
29        self.assertIsInstance(set, CFCharacterSetRef)
30        set = CFCharacterSetCreateWithCharactersInString(None, b"abcdefABCDEF0123456789".decode('latin1'))
31        self.assertIsInstance(set, CFCharacterSetRef)
32        bytes = b"0123" * (8192//4)
33        if sys.version_info[0] == 2:
34            bytes = buffer(bytes)
35        set = CFCharacterSetCreateWithBitmapRepresentation(None, bytes)
36        self.assertIsInstance(set, CFCharacterSetRef)
37        set = CFCharacterSetCreateInvertedSet(None, set)
38        self.assertIsInstance(set, CFCharacterSetRef)
39        set = CFCharacterSetCreateMutable(None)
40        self.assertIsInstance(set, CFCharacterSetRef)
41        set = CFCharacterSetCreateCopy(None, set)
42        self.assertIsInstance(set, CFCharacterSetRef)
43        set = CFCharacterSetCreateMutableCopy(None, set)
44        self.assertIsInstance(set, CFCharacterSetRef)
45
46    def testInspection(self):
47        letters = CFCharacterSetGetPredefined(kCFCharacterSetLetter)
48        digits = CFCharacterSetGetPredefined(kCFCharacterSetDecimalDigit)
49        set = CFCharacterSetCreateWithCharactersInString(None, b"abcdef".decode('latin1'))
50
51        self.assertTrue(CFCharacterSetIsSupersetOfSet(letters, set))
52        self.assertFalse(CFCharacterSetIsSupersetOfSet(digits, set))
53
54        self.assertTrue(CFCharacterSetHasMemberInPlane(digits, 0))
55        self.assertFalse(CFCharacterSetHasMemberInPlane(digits, 4))
56
57        self.assertTrue(CFCharacterSetIsCharacterMember(letters, b'A'.decode('latin1')))
58        self.assertFalse(CFCharacterSetIsCharacterMember(letters, b'9'.decode('latin1')))
59
60        data = CFCharacterSetCreateBitmapRepresentation(None, set)
61        self.assertIsInstance(data, CFDataRef)
62
63    def testInspectLongUnicode(self):
64        letters = CFCharacterSetGetPredefined(kCFCharacterSetLetter)
65        digits = CFCharacterSetGetPredefined(kCFCharacterSetDecimalDigit)
66        self.assertTrue(CFCharacterSetIsLongCharacterMember(letters, ord(b'A'.decode('latin1'))))
67        self.assertFalse(CFCharacterSetIsLongCharacterMember(letters, ord(b'9'.decode('latin1'))))
68
69    def testMutation(self):
70        set = CFCharacterSetCreateWithCharactersInString(None, b"abcdef".decode('latin1'))
71        set = CFCharacterSetCreateMutableCopy(None, set)
72
73        self.assertFalse(CFCharacterSetIsCharacterMember(set, unichr(4)))
74        CFCharacterSetAddCharactersInRange(set, (1, 10))
75        self.assertTrue(CFCharacterSetIsCharacterMember(set, unichr(4)))
76
77        CFCharacterSetRemoveCharactersInRange(set, (4, 2))
78        self.assertFalse(CFCharacterSetIsCharacterMember(set, unichr(4)))
79
80        self.assertFalse(CFCharacterSetIsCharacterMember(set, b"5".decode('latin1')))
81        CFCharacterSetAddCharactersInString(set, b"012345".decode('latin1'))
82        self.assertTrue(CFCharacterSetIsCharacterMember(set, b"5".decode('latin1')))
83
84        self.assertTrue(CFCharacterSetIsCharacterMember(set, b"a".decode('latin1')))
85        CFCharacterSetRemoveCharactersInString(set, b"ab".decode('latin1'))
86        self.assertFalse(CFCharacterSetIsCharacterMember(set, b"a".decode('latin1')))
87
88        self.assertFalse(CFCharacterSetIsCharacterMember(set, b"9".decode('latin1')))
89        CFCharacterSetUnion(set, CFCharacterSetGetPredefined(kCFCharacterSetDecimalDigit))
90        self.assertTrue(CFCharacterSetIsCharacterMember(set, b"9".decode('latin1')))
91
92        CFCharacterSetIntersect(set, CFCharacterSetGetPredefined(kCFCharacterSetLetter))
93        self.assertFalse(CFCharacterSetIsCharacterMember(set, b"9".decode('latin1')))
94
95        CFCharacterSetInvert(set)
96        self.assertTrue(CFCharacterSetIsCharacterMember(set, b"9".decode('latin1')))
97        self.assertFalse(CFCharacterSetIsCharacterMember(set, b"e".decode('latin1')))
98
99    def testConstants(self):
100        self.assertEqual(kCFCharacterSetControl, 1)
101        self.assertEqual(kCFCharacterSetWhitespace, 2)
102        self.assertEqual(kCFCharacterSetWhitespaceAndNewline, 3)
103        self.assertEqual(kCFCharacterSetDecimalDigit, 4)
104        self.assertEqual(kCFCharacterSetLetter, 5)
105        self.assertEqual(kCFCharacterSetLowercaseLetter, 6)
106        self.assertEqual(kCFCharacterSetUppercaseLetter, 7)
107        self.assertEqual(kCFCharacterSetNonBase, 8)
108        self.assertEqual(kCFCharacterSetDecomposable, 9)
109        self.assertEqual(kCFCharacterSetAlphaNumeric, 10)
110        self.assertEqual(kCFCharacterSetPunctuation, 11)
111        self.assertEqual(kCFCharacterSetCapitalizedLetter, 13)
112        self.assertEqual(kCFCharacterSetSymbol, 14)
113        self.assertEqual(kCFCharacterSetIllegal, 12)
114
115    @min_os_level('10.5')
116    def testConstants10_5(self):
117        self.assertEqual(kCFCharacterSetNewline, 15)
118
119
120if __name__ == "__main__":
121    main()
122