• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1import os
2import shutil
3import unittest
4import tempfile
5from io import open
6from fontTools.ufoLib import UFOReader, UFOWriter, UFOLibError
7from fontTools.ufoLib import plistlib
8from .testSupport import fontInfoVersion1, fontInfoVersion2
9
10
11class TestInfoObject:
12    pass
13
14
15class ReadFontInfoVersion1TestCase(unittest.TestCase):
16    def setUp(self):
17        self.dstDir = tempfile.mktemp()
18        os.mkdir(self.dstDir)
19        metaInfo = {"creator": "test", "formatVersion": 1}
20        path = os.path.join(self.dstDir, "metainfo.plist")
21        with open(path, "wb") as f:
22            plistlib.dump(metaInfo, f)
23
24    def tearDown(self):
25        shutil.rmtree(self.dstDir)
26
27    def _writeInfoToPlist(self, info):
28        path = os.path.join(self.dstDir, "fontinfo.plist")
29        with open(path, "wb") as f:
30            plistlib.dump(info, f)
31
32    def testRead(self):
33        originalData = dict(fontInfoVersion1)
34        self._writeInfoToPlist(originalData)
35        infoObject = TestInfoObject()
36        reader = UFOReader(self.dstDir, validate=True)
37        reader.readInfo(infoObject)
38        for attr in dir(infoObject):
39            if attr not in fontInfoVersion2:
40                continue
41            originalValue = fontInfoVersion2[attr]
42            readValue = getattr(infoObject, attr)
43            self.assertEqual(originalValue, readValue)
44
45    def testFontStyleConversion(self):
46        fontStyle1To2 = {64: "regular", 1: "italic", 32: "bold", 33: "bold italic"}
47        for old, new in list(fontStyle1To2.items()):
48            info = dict(fontInfoVersion1)
49            info["fontStyle"] = old
50            self._writeInfoToPlist(info)
51            reader = UFOReader(self.dstDir, validate=True)
52            infoObject = TestInfoObject()
53            reader.readInfo(infoObject)
54            self.assertEqual(new, infoObject.styleMapStyleName)
55
56    def testWidthNameConversion(self):
57        widthName1To2 = {
58            "Ultra-condensed": 1,
59            "Extra-condensed": 2,
60            "Condensed": 3,
61            "Semi-condensed": 4,
62            "Medium (normal)": 5,
63            "Semi-expanded": 6,
64            "Expanded": 7,
65            "Extra-expanded": 8,
66            "Ultra-expanded": 9,
67        }
68        for old, new in list(widthName1To2.items()):
69            info = dict(fontInfoVersion1)
70            info["widthName"] = old
71            self._writeInfoToPlist(info)
72            reader = UFOReader(self.dstDir, validate=True)
73            infoObject = TestInfoObject()
74            reader.readInfo(infoObject)
75            self.assertEqual(new, infoObject.openTypeOS2WidthClass)
76
77
78class WriteFontInfoVersion1TestCase(unittest.TestCase):
79    def setUp(self):
80        self.tempDir = tempfile.mktemp()
81        os.mkdir(self.tempDir)
82        self.dstDir = os.path.join(self.tempDir, "test.ufo")
83
84    def tearDown(self):
85        shutil.rmtree(self.tempDir)
86
87    def makeInfoObject(self):
88        infoObject = TestInfoObject()
89        for attr, value in list(fontInfoVersion2.items()):
90            setattr(infoObject, attr, value)
91        return infoObject
92
93    def readPlist(self):
94        path = os.path.join(self.dstDir, "fontinfo.plist")
95        with open(path, "rb") as f:
96            plist = plistlib.load(f)
97        return plist
98
99    def testWrite(self):
100        infoObject = self.makeInfoObject()
101        writer = UFOWriter(self.dstDir, formatVersion=1)
102        writer.writeInfo(infoObject)
103        writtenData = self.readPlist()
104        for attr, originalValue in list(fontInfoVersion1.items()):
105            newValue = writtenData[attr]
106            self.assertEqual(newValue, originalValue)
107
108    def testFontStyleConversion(self):
109        fontStyle1To2 = {64: "regular", 1: "italic", 32: "bold", 33: "bold italic"}
110        for old, new in list(fontStyle1To2.items()):
111            infoObject = self.makeInfoObject()
112            infoObject.styleMapStyleName = new
113            writer = UFOWriter(self.dstDir, formatVersion=1)
114            writer.writeInfo(infoObject)
115            writtenData = self.readPlist()
116            self.assertEqual(writtenData["fontStyle"], old)
117
118    def testWidthNameConversion(self):
119        widthName1To2 = {
120            "Ultra-condensed": 1,
121            "Extra-condensed": 2,
122            "Condensed": 3,
123            "Semi-condensed": 4,
124            "Medium (normal)": 5,
125            "Semi-expanded": 6,
126            "Expanded": 7,
127            "Extra-expanded": 8,
128            "Ultra-expanded": 9,
129        }
130        for old, new in list(widthName1To2.items()):
131            infoObject = self.makeInfoObject()
132            infoObject.openTypeOS2WidthClass = new
133            writer = UFOWriter(self.dstDir, formatVersion=1)
134            writer.writeInfo(infoObject)
135            writtenData = self.readPlist()
136            self.assertEqual(writtenData["widthName"], old)
137