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