1
2from PyObjCTools.TestSupport import *
3from CoreText import *
4from Quartz import *
5
6class TestCTFont (TestCase):
7    def testTypes(self):
8        self.assertIsInstance(CTFontRef, objc.objc_class)
9
10    @min_os_level('10.6')
11    def testConstants10_6(self):
12        self.assertEqual(kCTFontOptionsDefault, 0)
13        self.assertEqual(kCTFontOptionsPreventAutoActivation, 1 << 0)
14        self.assertEqual(kCTFontOptionsPreferSystemFont, 1 << 2)
15
16
17    def testConstants(self):
18        self.assertIsInstance(kCTFontCopyrightNameKey, unicode)
19        self.assertIsInstance(kCTFontFamilyNameKey, unicode)
20        self.assertIsInstance(kCTFontSubFamilyNameKey, unicode)
21        self.assertIsInstance(kCTFontStyleNameKey, unicode)
22        self.assertIsInstance(kCTFontUniqueNameKey, unicode)
23        self.assertIsInstance(kCTFontFullNameKey, unicode)
24        self.assertIsInstance(kCTFontVersionNameKey, unicode)
25        self.assertIsInstance(kCTFontPostScriptNameKey, unicode)
26        self.assertIsInstance(kCTFontTrademarkNameKey, unicode)
27        self.assertIsInstance(kCTFontManufacturerNameKey, unicode)
28        self.assertIsInstance(kCTFontDesignerNameKey, unicode)
29        self.assertIsInstance(kCTFontDescriptionNameKey, unicode)
30        self.assertIsInstance(kCTFontVendorURLNameKey, unicode)
31        self.assertIsInstance(kCTFontDesignerURLNameKey, unicode)
32        self.assertIsInstance(kCTFontLicenseNameKey, unicode)
33        self.assertIsInstance(kCTFontLicenseURLNameKey, unicode)
34        self.assertIsInstance(kCTFontSampleTextNameKey, unicode)
35        self.assertIsInstance(kCTFontPostScriptCIDNameKey, unicode)
36
37        self.assertEqual(kCTFontNoFontType,  -1)
38        self.assertEqual(kCTFontUserFontType,  0)
39        self.assertEqual(kCTFontUserFixedPitchFontType,  1)
40        self.assertEqual(kCTFontSystemFontType,  2)
41        self.assertEqual(kCTFontEmphasizedSystemFontType,  3)
42        self.assertEqual(kCTFontSmallSystemFontType,  4)
43        self.assertEqual(kCTFontSmallEmphasizedSystemFontType,  5)
44        self.assertEqual(kCTFontMiniSystemFontType,  6)
45        self.assertEqual(kCTFontMiniEmphasizedSystemFontType,  7)
46        self.assertEqual(kCTFontViewsFontType,  8)
47        self.assertEqual(kCTFontApplicationFontType,  9)
48        self.assertEqual(kCTFontLabelFontType, 10)
49        self.assertEqual(kCTFontMenuTitleFontType, 11)
50        self.assertEqual(kCTFontMenuItemFontType, 12)
51        self.assertEqual(kCTFontMenuItemMarkFontType, 13)
52        self.assertEqual(kCTFontMenuItemCmdKeyFontType, 14)
53        self.assertEqual(kCTFontWindowTitleFontType, 15)
54        self.assertEqual(kCTFontPushButtonFontType, 16)
55        self.assertEqual(kCTFontUtilityWindowTitleFontType, 17)
56        self.assertEqual(kCTFontAlertHeaderFontType, 18)
57        self.assertEqual(kCTFontSystemDetailFontType, 19)
58        self.assertEqual(kCTFontEmphasizedSystemDetailFontType, 20)
59        self.assertEqual(kCTFontToolbarFontType, 21)
60        self.assertEqual(kCTFontSmallToolbarFontType, 22)
61        self.assertEqual(kCTFontMessageFontType, 23)
62        self.assertEqual(kCTFontPaletteFontType, 24)
63        self.assertEqual(kCTFontToolTipFontType, 25)
64        self.assertEqual(kCTFontControlContentFontType, 26)
65
66        self.assertIsInstance(kCTFontVariationAxisIdentifierKey, unicode)
67        self.assertIsInstance(kCTFontVariationAxisMinimumValueKey, unicode)
68        self.assertIsInstance(kCTFontVariationAxisMaximumValueKey, unicode)
69        self.assertIsInstance(kCTFontVariationAxisDefaultValueKey, unicode)
70        self.assertIsInstance(kCTFontVariationAxisNameKey, unicode)
71
72        self.assertIsInstance(kCTFontFeatureTypeIdentifierKey, unicode)
73        self.assertIsInstance(kCTFontFeatureTypeNameKey, unicode)
74        self.assertIsInstance(kCTFontFeatureTypeExclusiveKey, unicode)
75        self.assertIsInstance(kCTFontFeatureTypeSelectorsKey, unicode)
76        self.assertIsInstance(kCTFontFeatureSelectorIdentifierKey, unicode)
77        self.assertIsInstance(kCTFontFeatureSelectorNameKey, unicode)
78        self.assertIsInstance(kCTFontFeatureSelectorDefaultKey, unicode)
79        self.assertIsInstance(kCTFontFeatureSelectorSettingKey, unicode)
80
81
82        self.assertEqual(kCTFontTableBASE, fourcc(b'BASE'))
83        self.assertEqual(kCTFontTableCFF, fourcc(b'CFF '))
84        self.assertEqual(kCTFontTableDSIG, fourcc(b'DSIG'))
85        self.assertEqual(kCTFontTableEBDT, fourcc(b'EBDT'))
86        self.assertEqual(kCTFontTableEBLC, fourcc(b'EBLC'))
87        self.assertEqual(kCTFontTableEBSC, fourcc(b'EBSC'))
88        self.assertEqual(kCTFontTableGDEF, fourcc(b'GDEF'))
89        self.assertEqual(kCTFontTableGPOS, fourcc(b'GPOS'))
90        self.assertEqual(kCTFontTableGSUB, fourcc(b'GSUB'))
91        self.assertEqual(kCTFontTableJSTF, fourcc(b'JSTF'))
92        self.assertEqual(kCTFontTableLTSH, fourcc(b'LTSH'))
93        self.assertEqual(kCTFontTableOS2, fourcc(b'OS/2'))
94        self.assertEqual(kCTFontTablePCLT, fourcc(b'PCLT'))
95        self.assertEqual(kCTFontTableVDMX, fourcc(b'VDMX'))
96        self.assertEqual(kCTFontTableVORG, fourcc(b'VORG'))
97        self.assertEqual(kCTFontTableZapf, fourcc(b'Zapf'))
98        self.assertEqual(kCTFontTableAcnt, fourcc(b'acnt'))
99        self.assertEqual(kCTFontTableAvar, fourcc(b'avar'))
100        self.assertEqual(kCTFontTableBdat, fourcc(b'bdat'))
101        self.assertEqual(kCTFontTableBhed, fourcc(b'bhed'))
102        self.assertEqual(kCTFontTableBloc, fourcc(b'bloc'))
103        self.assertEqual(kCTFontTableBsln, fourcc(b'bsln'))
104        self.assertEqual(kCTFontTableCmap, fourcc(b'cmap'))
105        self.assertEqual(kCTFontTableCvar, fourcc(b'cvar'))
106        self.assertEqual(kCTFontTableCvt, fourcc(b'cvt '))
107        self.assertEqual(kCTFontTableFdsc, fourcc(b'fdsc'))
108        self.assertEqual(kCTFontTableFeat, fourcc(b'feat'))
109        self.assertEqual(kCTFontTableFmtx, fourcc(b'fmtx'))
110        self.assertEqual(kCTFontTableFpgm, fourcc(b'fpgm'))
111        self.assertEqual(kCTFontTableFvar, fourcc(b'fvar'))
112        self.assertEqual(kCTFontTableGasp, fourcc(b'gasp'))
113        self.assertEqual(kCTFontTableGlyf, fourcc(b'glyf'))
114        self.assertEqual(kCTFontTableGvar, fourcc(b'gvar'))
115        self.assertEqual(kCTFontTableHdmx, fourcc(b'hdmx'))
116        self.assertEqual(kCTFontTableHead, fourcc(b'head'))
117        self.assertEqual(kCTFontTableHhea, fourcc(b'hhea'))
118        self.assertEqual(kCTFontTableHmtx, fourcc(b'hmtx'))
119        self.assertEqual(kCTFontTableHsty, fourcc(b'hsty'))
120        self.assertEqual(kCTFontTableJust, fourcc(b'just'))
121        self.assertEqual(kCTFontTableKern, fourcc(b'kern'))
122        self.assertEqual(kCTFontTableLcar, fourcc(b'lcar'))
123        self.assertEqual(kCTFontTableLoca, fourcc(b'loca'))
124        self.assertEqual(kCTFontTableMaxp, fourcc(b'maxp'))
125        self.assertEqual(kCTFontTableMort, fourcc(b'mort'))
126        self.assertEqual(kCTFontTableMorx, fourcc(b'morx'))
127        self.assertEqual(kCTFontTableName, fourcc(b'name'))
128        self.assertEqual(kCTFontTableOpbd, fourcc(b'opbd'))
129        self.assertEqual(kCTFontTablePost, fourcc(b'post'))
130        self.assertEqual(kCTFontTablePrep, fourcc(b'prep'))
131        self.assertEqual(kCTFontTableProp, fourcc(b'prop'))
132        self.assertEqual(kCTFontTableTrak, fourcc(b'trak'))
133        self.assertEqual(kCTFontTableVhea, fourcc(b'vhea'))
134        self.assertEqual(kCTFontTableVmtx, fourcc(b'vmtx'))
135
136        self.assertEqual(kCTFontTableOptionNoOptions, 0)
137        self.assertEqual(kCTFontTableOptionExcludeSynthetic, (1 << 0))
138
139    def testFunctions(self):
140        font = CTFontCreateWithName(u"Optima Bold",
141                14,
142                None)
143        self.assertIsInstance(font, CTFontRef)
144        self.assertResultIsCFRetained(CTFontCreateWithName)
145
146        descriptor = CTFontDescriptorCreateWithNameAndSize(
147                "Optima Bold", 14.0)
148        self.assertIsInstance(descriptor, CTFontDescriptorRef)
149
150        font = CTFontCreateWithFontDescriptor(
151                descriptor, 5.0, None)
152        self.assertIsInstance(font, CTFontRef)
153        self.assertResultIsCFRetained(CTFontCreateWithFontDescriptor)
154
155        font = CTFontCreateUIFontForLanguage(
156                kCTFontMiniSystemFontType,
157                10.0, "nl_NL")
158        self.assertIsInstance(font, CTFontRef)
159        self.assertResultIsCFRetained(CTFontCreateUIFontForLanguage)
160
161        font2 = CTFontCreateCopyWithAttributes(
162                font,
163                9.0,
164                None,
165                None)
166
167        self.assertIsInstance(font2, CTFontRef)
168        self.assertResultIsCFRetained(CTFontCreateCopyWithAttributes)
169
170        font2 = CTFontCreateCopyWithSymbolicTraits(
171                font, 14.0, None,
172                kCTFontBoldTrait, kCTFontBoldTrait)
173        self.assertIsInstance(font2, CTFontRef)
174        self.assertResultIsCFRetained(CTFontCreateCopyWithAttributes)
175
176
177        font2 = CTFontCreateCopyWithFamily(
178                font, 14.0, None, "Lucida Grande")
179        self.assertIsInstance(font2, CTFontRef)
180        self.assertResultIsCFRetained(CTFontCreateCopyWithFamily)
181
182        font2 = CTFontCreateForString(
183                font, u"hello world", CFRange(1, 4))
184        self.assertIsInstance(font2, CTFontRef)
185        self.assertResultIsCFRetained(CTFontCreateForString)
186
187        descriptor = CTFontCopyFontDescriptor(font)
188        self.assertIsInstance(descriptor, CTFontDescriptorRef)
189
190        v = CTFontCopyAttribute(font, "size")
191        self.assertIsNone(v)
192        self.assertResultIsCFRetained(CTFontCopyAttribute)
193
194        v = CTFontGetSize(font)
195        self.assertIsInstance(v, float)
196
197        v = CTFontGetMatrix(font)
198        self.assertIsInstance(v, CGAffineTransform)
199
200        v = CTFontGetSymbolicTraits(font)
201        self.assertIsInstance(v, (int, long))
202
203        v = CTFontCopyTraits(font)
204        self.assertIsInstance(v, CFDictionaryRef)
205
206        v = CTFontCopyPostScriptName(font)
207        self.assertIsInstance(v, unicode)
208
209        v = CTFontCopyFamilyName(font)
210        self.assertIsInstance(v, unicode)
211
212        v = CTFontCopyFullName(font)
213        self.assertIsInstance(v, unicode)
214
215        v = CTFontCopyDisplayName(font)
216        self.assertIsInstance(v, unicode)
217
218        v = CTFontCopyName(font, kCTFontCopyrightNameKey)
219        self.assertIsInstance(v, unicode)
220
221        v, l = CTFontCopyLocalizedName(font, kCTFontCopyrightNameKey, None)
222        self.assertIsInstance(v, unicode)
223        self.assertIsInstance(l, (unicode, type(None)))
224        self.assertArgIsOut(CTFontCopyLocalizedName, 2)
225
226        v = CTFontCopyCharacterSet(font)
227        self.assertIsInstance(v, CFCharacterSetRef)
228
229        v = CTFontGetStringEncoding(font)
230        self.assertIsInstance(v, (int, long))
231
232        v = CTFontCopySupportedLanguages(font)
233        self.assertIsInstance(v, CFArrayRef)
234
235        self.assertArgIsOut(CTFontGetGlyphsForCharacters, 2)
236        v, gl = CTFontGetGlyphsForCharacters(font,
237                u"hello", None, 5)
238
239        self.assertTrue(v is True)
240        self.assertIsInstance(gl, tuple)
241        self.assertEqual(len(gl), 5)
242        self.assertIsInstance(gl[0], (int, long))
243
244        v = CTFontGetAscent(font)
245        self.assertIsInstance(v, float)
246
247        v = CTFontGetDescent(font)
248        self.assertIsInstance(v, float)
249
250        v = CTFontGetLeading(font)
251        self.assertIsInstance(v, float)
252
253        v = CTFontGetUnitsPerEm(font)
254        self.assertIsInstance(v, (int, long))
255
256        v = CTFontGetGlyphCount(font)
257        self.assertIsInstance(v, (int, long))
258
259        v = CTFontGetBoundingBox(font)
260        self.assertIsInstance(v, CGRect)
261
262        v = CTFontGetUnderlinePosition(font)
263        self.assertIsInstance(v, float)
264
265        v = CTFontGetUnderlineThickness(font)
266        self.assertIsInstance(v, float)
267
268        v = CTFontGetSlantAngle(font)
269        self.assertIsInstance(v, float)
270
271        v = CTFontGetCapHeight(font)
272        self.assertIsInstance(v, float)
273
274        v = CTFontGetXHeight(font)
275        self.assertIsInstance(v, float)
276
277        v = CTFontGetGlyphWithName(font, "A")
278        self.assertIsInstance(v, (int, long))
279
280
281        v, r = CTFontGetBoundingRectsForGlyphs(font,
282                kCTFontDefaultOrientation, gl, None, 5)
283        self.assertIsInstance(v, CGRect)
284        self.assertIsInstance(r, tuple)
285        self.assertEqual(len(r), 5)
286        self.assertIsInstance(r[0], CGRect)
287
288
289        v, r = CTFontGetAdvancesForGlyphs(font,
290                kCTFontDefaultOrientation, gl, None, 5)
291        self.assertIsInstance(v, float)
292        self.assertIsInstance(r, tuple)
293        self.assertEqual(len(r), 5)
294        self.assertIsInstance(r[0], CGSize)
295
296        r = CTFontGetVerticalTranslationsForGlyphs(font, gl, None, 5)
297        self.assertIsInstance(r, tuple)
298        self.assertEqual(len(r), 5)
299        self.assertIsInstance(r[0], CGSize)
300
301        v = CTFontCreatePathForGlyph(font, gl[0], None)
302        self.assertIsInstance(v, CGPathRef)
303
304        self.assertResultIsCFRetained(CTFontCopyVariationAxes)
305        v = CTFontCopyVariationAxes(font)
306        if v is not None:
307            self.assertIsInstance(v, CFArrayRef)
308
309        self.assertResultIsCFRetained(CTFontCopyVariation)
310        v = CTFontCopyVariation(font)
311        if v is not None:
312            self.assertIsInstance(v, CFDictionaryRef)
313
314        v = CTFontCopyFeatures(font)
315        self.assertIsInstance(v, CFArrayRef)
316        self.assertResultIsCFRetained(CTFontCopyFeatures)
317
318        self.assertResultIsCFRetained(CTFontCopyFeatureSettings)
319        v = CTFontCopyFeatureSettings(font)
320        if v is not None:
321            self.assertIsInstance(v, CFArrayRef)
322
323        v, o = CTFontCopyGraphicsFont(font, None)
324        self.assertIsInstance(v, CGFontRef)
325        if o is not None:
326            self.assertIsInstance(o, CTFontDescriptorRef)
327        self.assertResultIsCFRetained(CTFontCopyGraphicsFont)
328        self.assertArgIsCFRetained(CTFontCopyGraphicsFont, 1)
329        self.assertArgIsOut(CTFontCopyGraphicsFont, 1)
330
331        v = CTFontCreateWithGraphicsFont(v, 20.5, None, None)
332        self.assertIsInstance(v, CTFontRef)
333        self.assertResultIsCFRetained(CTFontCreateWithGraphicsFont)
334
335        if 0:
336            # Cannot tests these because the ATS framework is not
337            # wrapped.
338            v, o = CTFontGetPlatformFont(font, None)
339            self.assertIsInstance(v, ATSFontRef)
340            self.assertIsInstance(o, CTFontDescriptorRef)
341
342            v = CTFontCreateWithPlatformFont(v, 22.5, None, None)
343            self.assertIsInstance(v, CGFontRef)
344
345        self.assertArgIsCFRetained(CTFontGetPlatformFont, 1)
346        self.assertResultIsCFRetained(CTFontCreateWithPlatformFont)
347
348        v = CTFontCopyAvailableTables(font, kCTFontTableOptionNoOptions)
349        self.assertIsInstance(v, tuple)
350
351        v = CTFontCopyTable(font, v[0], 0)
352        self.assertIsInstance(v, CFDataRef)
353
354        v = CTFontGetTypeID()
355        self.assertIsInstance(v, (int, long))
356
357    @min_os_level('10.6')
358    def testFunctions10_6(self):
359        self.assertResultIsCFRetained(CTFontCreateWithNameAndOptions)
360        v = CTFontCreateWithNameAndOptions(u"Times", 15, None, 0)
361        self.assertIsInstance(v, CTFontRef)
362
363
364        descr = CTFontDescriptorCreateWithNameAndSize(
365                u"Courier", 14.0)
366        self.assertNotEqual(descr, None)
367
368        # FIXME: this crashes the interpreter, without a clear reason
369        return
370
371        self.assertResultIsCFRetained(CTFontCreateWithFontDescriptorAndOptions)
372        v = CTFontCreateWithFontDescriptorAndOptions(descr, 14.0, None, 0)
373        self.assertIsInstance(v, CTFontRef)
374
375
376if __name__ == "__main__":
377    main()
378