diff options
Diffstat (limited to 'Tests/ufoLib/UFO3_test.py')
-rw-r--r-- | Tests/ufoLib/UFO3_test.py | 9680 |
1 files changed, 5022 insertions, 4658 deletions
diff --git a/Tests/ufoLib/UFO3_test.py b/Tests/ufoLib/UFO3_test.py index c4218023..95a51c4d 100644 --- a/Tests/ufoLib/UFO3_test.py +++ b/Tests/ufoLib/UFO3_test.py @@ -9,4165 +9,4519 @@ from fontTools.misc import plistlib from .testSupport import fontInfoVersion3 -class TestInfoObject: pass +class TestInfoObject: + pass # -------------- # fontinfo.plist # -------------- -class ReadFontInfoVersion3TestCase(unittest.TestCase): - def setUp(self): - self.dstDir = tempfile.mktemp() - os.mkdir(self.dstDir) - metaInfo = { - "creator": "test", - "formatVersion": 3 - } - path = os.path.join(self.dstDir, "metainfo.plist") - with open(path, "wb") as f: - plistlib.dump(metaInfo, f) - - def tearDown(self): - shutil.rmtree(self.dstDir) - - def _writeInfoToPlist(self, info): - path = os.path.join(self.dstDir, "fontinfo.plist") - with open(path, "wb") as f: - plistlib.dump(info, f) - - def testRead(self): - originalData = dict(fontInfoVersion3) - self._writeInfoToPlist(originalData) - infoObject = TestInfoObject() - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(infoObject) - readData = {} - for attr in list(fontInfoVersion3.keys()): - readData[attr] = getattr(infoObject, attr) - self.assertEqual(originalData, readData) - - def testGenericRead(self): - # familyName - info = dict(fontInfoVersion3) - info["familyName"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # styleName - info = dict(fontInfoVersion3) - info["styleName"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # styleMapFamilyName - info = dict(fontInfoVersion3) - info["styleMapFamilyName"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # styleMapStyleName - ## not a string - info = dict(fontInfoVersion3) - info["styleMapStyleName"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - ## out of range - info = dict(fontInfoVersion3) - info["styleMapStyleName"] = "REGULAR" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # versionMajor - info = dict(fontInfoVersion3) - info["versionMajor"] = "1" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # versionMinor - info = dict(fontInfoVersion3) - info["versionMinor"] = "0" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - info = dict(fontInfoVersion3) - info["versionMinor"] = -1 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # copyright - info = dict(fontInfoVersion3) - info["copyright"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # trademark - info = dict(fontInfoVersion3) - info["trademark"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # unitsPerEm - info = dict(fontInfoVersion3) - info["unitsPerEm"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - info = dict(fontInfoVersion3) - info["unitsPerEm"] = -1 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - info = dict(fontInfoVersion3) - info["unitsPerEm"] = -1.0 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # descender - info = dict(fontInfoVersion3) - info["descender"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # xHeight - info = dict(fontInfoVersion3) - info["xHeight"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # capHeight - info = dict(fontInfoVersion3) - info["capHeight"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # ascender - info = dict(fontInfoVersion3) - info["ascender"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # italicAngle - info = dict(fontInfoVersion3) - info["italicAngle"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - - def testGaspRead(self): - # not a list - info = dict(fontInfoVersion3) - info["openTypeGaspRangeRecords"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # empty list - info = dict(fontInfoVersion3) - info["openTypeGaspRangeRecords"] = [] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(TestInfoObject()) - # not a dict - info = dict(fontInfoVersion3) - info["openTypeGaspRangeRecords"] = ["abc"] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # dict not properly formatted - info = dict(fontInfoVersion3) - info["openTypeGaspRangeRecords"] = [dict(rangeMaxPPEM=0xFFFF, notTheRightKey=1)] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - info = dict(fontInfoVersion3) - info["openTypeGaspRangeRecords"] = [dict(notTheRightKey=1, rangeGaspBehavior=[0])] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # not an int for ppem - info = dict(fontInfoVersion3) - info["openTypeGaspRangeRecords"] = [dict(rangeMaxPPEM="abc", rangeGaspBehavior=[0]), dict(rangeMaxPPEM=0xFFFF, rangeGaspBehavior=[0])] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # not a list for behavior - info = dict(fontInfoVersion3) - info["openTypeGaspRangeRecords"] = [dict(rangeMaxPPEM=10, rangeGaspBehavior="abc"), dict(rangeMaxPPEM=0xFFFF, rangeGaspBehavior=[0])] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # invalid behavior value - info = dict(fontInfoVersion3) - info["openTypeGaspRangeRecords"] = [dict(rangeMaxPPEM=10, rangeGaspBehavior=[-1]), dict(rangeMaxPPEM=0xFFFF, rangeGaspBehavior=[0])] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # not sorted - info = dict(fontInfoVersion3) - info["openTypeGaspRangeRecords"] = [dict(rangeMaxPPEM=0xFFFF, rangeGaspBehavior=[0]), dict(rangeMaxPPEM=10, rangeGaspBehavior=[0])] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # no 0xFFFF - info = dict(fontInfoVersion3) - info["openTypeGaspRangeRecords"] = [dict(rangeMaxPPEM=10, rangeGaspBehavior=[0]), dict(rangeMaxPPEM=20, rangeGaspBehavior=[0])] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(TestInfoObject()) - - def testHeadRead(self): - # openTypeHeadCreated - ## not a string - info = dict(fontInfoVersion3) - info["openTypeHeadCreated"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - ## invalid format - info = dict(fontInfoVersion3) - info["openTypeHeadCreated"] = "2000-Jan-01 00:00:00" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeHeadLowestRecPPEM - info = dict(fontInfoVersion3) - info["openTypeHeadLowestRecPPEM"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - info = dict(fontInfoVersion3) - info["openTypeHeadLowestRecPPEM"] = -1 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeHeadFlags - info = dict(fontInfoVersion3) - info["openTypeHeadFlags"] = [-1] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - - def testHheaRead(self): - # openTypeHheaAscender - info = dict(fontInfoVersion3) - info["openTypeHheaAscender"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeHheaDescender - info = dict(fontInfoVersion3) - info["openTypeHheaDescender"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeHheaLineGap - info = dict(fontInfoVersion3) - info["openTypeHheaLineGap"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeHheaCaretSlopeRise - info = dict(fontInfoVersion3) - info["openTypeHheaCaretSlopeRise"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeHheaCaretSlopeRun - info = dict(fontInfoVersion3) - info["openTypeHheaCaretSlopeRun"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeHheaCaretOffset - info = dict(fontInfoVersion3) - info["openTypeHheaCaretOffset"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - - def testNameRead(self): - # openTypeNameDesigner - info = dict(fontInfoVersion3) - info["openTypeNameDesigner"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeNameDesignerURL - info = dict(fontInfoVersion3) - info["openTypeNameDesignerURL"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeNameManufacturer - info = dict(fontInfoVersion3) - info["openTypeNameManufacturer"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeNameManufacturerURL - info = dict(fontInfoVersion3) - info["openTypeNameManufacturerURL"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeNameLicense - info = dict(fontInfoVersion3) - info["openTypeNameLicense"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeNameLicenseURL - info = dict(fontInfoVersion3) - info["openTypeNameLicenseURL"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeNameVersion - info = dict(fontInfoVersion3) - info["openTypeNameVersion"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeNameUniqueID - info = dict(fontInfoVersion3) - info["openTypeNameUniqueID"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeNameDescription - info = dict(fontInfoVersion3) - info["openTypeNameDescription"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeNamePreferredFamilyName - info = dict(fontInfoVersion3) - info["openTypeNamePreferredFamilyName"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeNamePreferredSubfamilyName - info = dict(fontInfoVersion3) - info["openTypeNamePreferredSubfamilyName"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeNameCompatibleFullName - info = dict(fontInfoVersion3) - info["openTypeNameCompatibleFullName"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeNameSampleText - info = dict(fontInfoVersion3) - info["openTypeNameSampleText"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeNameWWSFamilyName - info = dict(fontInfoVersion3) - info["openTypeNameWWSFamilyName"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeNameWWSSubfamilyName - info = dict(fontInfoVersion3) - info["openTypeNameWWSSubfamilyName"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeNameRecords - ## not a list - info = dict(fontInfoVersion3) - info["openTypeNameRecords"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - ## not a dict - info = dict(fontInfoVersion3) - info["openTypeNameRecords"] = ["abc"] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - ## invalid dict structure - info = dict(fontInfoVersion3) - info["openTypeNameRecords"] = [dict(foo="bar")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - ## incorrect keys - info = dict(fontInfoVersion3) - info["openTypeNameRecords"] = [ - dict(nameID=1, platformID=1, encodingID=1, languageID=1, string="Name Record.", foo="bar") - ] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - info = dict(fontInfoVersion3) - info["openTypeNameRecords"] = [ - dict(platformID=1, encodingID=1, languageID=1, string="Name Record.") - ] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - info = dict(fontInfoVersion3) - info["openTypeNameRecords"] = [ - dict(nameID=1, encodingID=1, languageID=1, string="Name Record.") - ] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - info = dict(fontInfoVersion3) - info["openTypeNameRecords"] = [ - dict(nameID=1, platformID=1, languageID=1, string="Name Record.") - ] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - info = dict(fontInfoVersion3) - info["openTypeNameRecords"] = [ - dict(nameID=1, platformID=1, encodingID=1, string="Name Record.") - ] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - info = dict(fontInfoVersion3) - info["openTypeNameRecords"] = [ - dict(nameID=1, platformID=1, encodingID=1, languageID=1) - ] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - ## invalid values - info = dict(fontInfoVersion3) - info["openTypeNameRecords"] = [ - dict(nameID="1", platformID=1, encodingID=1, languageID=1, string="Name Record.") - ] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - info = dict(fontInfoVersion3) - info["openTypeNameRecords"] = [ - dict(nameID=1, platformID="1", encodingID=1, languageID=1, string="Name Record.") - ] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - info = dict(fontInfoVersion3) - info["openTypeNameRecords"] = [ - dict(nameID=1, platformID=1, encodingID="1", languageID=1, string="Name Record.") - ] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - info = dict(fontInfoVersion3) - info["openTypeNameRecords"] = [ - dict(nameID=1, platformID=1, encodingID=1, languageID="1", string="Name Record.") - ] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - info = dict(fontInfoVersion3) - info["openTypeNameRecords"] = [ - dict(nameID=1, platformID=1, encodingID=1, languageID=1, string=1) - ] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - ## duplicate - info = dict(fontInfoVersion3) - info["openTypeNameRecords"] = [ - dict(nameID=1, platformID=1, encodingID=1, languageID=1, string="Name Record."), - dict(nameID=1, platformID=1, encodingID=1, languageID=1, string="Name Record.") - ] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(TestInfoObject()) - - def testOS2Read(self): - # openTypeOS2WidthClass - ## not an int - info = dict(fontInfoVersion3) - info["openTypeOS2WidthClass"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - ## out or range - info = dict(fontInfoVersion3) - info["openTypeOS2WidthClass"] = 15 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2WeightClass - info = dict(fontInfoVersion3) - ## not an int - info["openTypeOS2WeightClass"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - ## out of range - info["openTypeOS2WeightClass"] = -50 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2Selection - info = dict(fontInfoVersion3) - info["openTypeOS2Selection"] = [-1] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2VendorID - info = dict(fontInfoVersion3) - info["openTypeOS2VendorID"] = 1234 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2Panose - ## not an int - info = dict(fontInfoVersion3) - info["openTypeOS2Panose"] = [0, 1, 2, 3, 4, 5, 6, 7, 8, str(9)] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - ## negative - info = dict(fontInfoVersion3) - info["openTypeOS2Panose"] = [0, 1, 2, 3, 4, 5, 6, 7, 8, -9] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - ## too few values - info = dict(fontInfoVersion3) - info["openTypeOS2Panose"] = [0, 1, 2, 3] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - ## too many values - info = dict(fontInfoVersion3) - info["openTypeOS2Panose"] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2FamilyClass - ## not an int - info = dict(fontInfoVersion3) - info["openTypeOS2FamilyClass"] = [1, str(1)] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - ## too few values - info = dict(fontInfoVersion3) - info["openTypeOS2FamilyClass"] = [1] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - ## too many values - info = dict(fontInfoVersion3) - info["openTypeOS2FamilyClass"] = [1, 1, 1] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - ## out of range - info = dict(fontInfoVersion3) - info["openTypeOS2FamilyClass"] = [1, 201] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2UnicodeRanges - ## not an int - info = dict(fontInfoVersion3) - info["openTypeOS2UnicodeRanges"] = ["0"] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - ## out of range - info = dict(fontInfoVersion3) - info["openTypeOS2UnicodeRanges"] = [-1] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2CodePageRanges - ## not an int - info = dict(fontInfoVersion3) - info["openTypeOS2CodePageRanges"] = ["0"] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - ## out of range - info = dict(fontInfoVersion3) - info["openTypeOS2CodePageRanges"] = [-1] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2TypoAscender - info = dict(fontInfoVersion3) - info["openTypeOS2TypoAscender"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2TypoDescender - info = dict(fontInfoVersion3) - info["openTypeOS2TypoDescender"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2TypoLineGap - info = dict(fontInfoVersion3) - info["openTypeOS2TypoLineGap"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2WinAscent - info = dict(fontInfoVersion3) - info["openTypeOS2WinAscent"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - info = dict(fontInfoVersion3) - info["openTypeOS2WinAscent"] = -1 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2WinDescent - info = dict(fontInfoVersion3) - info["openTypeOS2WinDescent"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - info = dict(fontInfoVersion3) - info["openTypeOS2WinDescent"] = -1 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2Type - ## not an int - info = dict(fontInfoVersion3) - info["openTypeOS2Type"] = ["1"] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - ## out of range - info = dict(fontInfoVersion3) - info["openTypeOS2Type"] = [-1] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2SubscriptXSize - info = dict(fontInfoVersion3) - info["openTypeOS2SubscriptXSize"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2SubscriptYSize - info = dict(fontInfoVersion3) - info["openTypeOS2SubscriptYSize"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2SubscriptXOffset - info = dict(fontInfoVersion3) - info["openTypeOS2SubscriptXOffset"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2SubscriptYOffset - info = dict(fontInfoVersion3) - info["openTypeOS2SubscriptYOffset"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2SuperscriptXSize - info = dict(fontInfoVersion3) - info["openTypeOS2SuperscriptXSize"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2SuperscriptYSize - info = dict(fontInfoVersion3) - info["openTypeOS2SuperscriptYSize"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2SuperscriptXOffset - info = dict(fontInfoVersion3) - info["openTypeOS2SuperscriptXOffset"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2SuperscriptYOffset - info = dict(fontInfoVersion3) - info["openTypeOS2SuperscriptYOffset"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2StrikeoutSize - info = dict(fontInfoVersion3) - info["openTypeOS2StrikeoutSize"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeOS2StrikeoutPosition - info = dict(fontInfoVersion3) - info["openTypeOS2StrikeoutPosition"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - - def testVheaRead(self): - # openTypeVheaVertTypoAscender - info = dict(fontInfoVersion3) - info["openTypeVheaVertTypoAscender"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeVheaVertTypoDescender - info = dict(fontInfoVersion3) - info["openTypeVheaVertTypoDescender"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeVheaVertTypoLineGap - info = dict(fontInfoVersion3) - info["openTypeVheaVertTypoLineGap"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeVheaCaretSlopeRise - info = dict(fontInfoVersion3) - info["openTypeVheaCaretSlopeRise"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeVheaCaretSlopeRun - info = dict(fontInfoVersion3) - info["openTypeVheaCaretSlopeRun"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # openTypeVheaCaretOffset - info = dict(fontInfoVersion3) - info["openTypeVheaCaretOffset"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - - def testFONDRead(self): - # macintoshFONDFamilyID - info = dict(fontInfoVersion3) - info["macintoshFONDFamilyID"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # macintoshFONDName - info = dict(fontInfoVersion3) - info["macintoshFONDName"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - - def testPostscriptRead(self): - # postscriptFontName - info = dict(fontInfoVersion3) - info["postscriptFontName"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # postscriptFullName - info = dict(fontInfoVersion3) - info["postscriptFullName"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # postscriptSlantAngle - info = dict(fontInfoVersion3) - info["postscriptSlantAngle"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) - # postscriptUniqueID - info = dict(fontInfoVersion3) - info["postscriptUniqueID"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # postscriptUnderlineThickness - info = dict(fontInfoVersion3) - info["postscriptUnderlineThickness"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # postscriptUnderlinePosition - info = dict(fontInfoVersion3) - info["postscriptUnderlinePosition"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # postscriptIsFixedPitch - info = dict(fontInfoVersion3) - info["postscriptIsFixedPitch"] = 2 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # postscriptBlueValues - ## not a list - info = dict(fontInfoVersion3) - info["postscriptBlueValues"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## uneven value count - info = dict(fontInfoVersion3) - info["postscriptBlueValues"] = [500] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## too many values - info = dict(fontInfoVersion3) - info["postscriptBlueValues"] = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # postscriptOtherBlues - ## not a list - info = dict(fontInfoVersion3) - info["postscriptOtherBlues"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## uneven value count - info = dict(fontInfoVersion3) - info["postscriptOtherBlues"] = [500] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## too many values - info = dict(fontInfoVersion3) - info["postscriptOtherBlues"] = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # postscriptFamilyBlues - ## not a list - info = dict(fontInfoVersion3) - info["postscriptFamilyBlues"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## uneven value count - info = dict(fontInfoVersion3) - info["postscriptFamilyBlues"] = [500] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## too many values - info = dict(fontInfoVersion3) - info["postscriptFamilyBlues"] = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # postscriptFamilyOtherBlues - ## not a list - info = dict(fontInfoVersion3) - info["postscriptFamilyOtherBlues"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## uneven value count - info = dict(fontInfoVersion3) - info["postscriptFamilyOtherBlues"] = [500] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## too many values - info = dict(fontInfoVersion3) - info["postscriptFamilyOtherBlues"] = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # postscriptStemSnapH - ## not list - info = dict(fontInfoVersion3) - info["postscriptStemSnapH"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## too many values - info = dict(fontInfoVersion3) - info["postscriptStemSnapH"] = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # postscriptStemSnapV - ## not list - info = dict(fontInfoVersion3) - info["postscriptStemSnapV"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## too many values - info = dict(fontInfoVersion3) - info["postscriptStemSnapV"] = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # postscriptBlueFuzz - info = dict(fontInfoVersion3) - info["postscriptBlueFuzz"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # postscriptBlueShift - info = dict(fontInfoVersion3) - info["postscriptBlueShift"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # postscriptBlueScale - info = dict(fontInfoVersion3) - info["postscriptBlueScale"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # postscriptForceBold - info = dict(fontInfoVersion3) - info["postscriptForceBold"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # postscriptDefaultWidthX - info = dict(fontInfoVersion3) - info["postscriptDefaultWidthX"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # postscriptNominalWidthX - info = dict(fontInfoVersion3) - info["postscriptNominalWidthX"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # postscriptWeightName - info = dict(fontInfoVersion3) - info["postscriptWeightName"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # postscriptDefaultCharacter - info = dict(fontInfoVersion3) - info["postscriptDefaultCharacter"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # postscriptWindowsCharacterSet - info = dict(fontInfoVersion3) - info["postscriptWindowsCharacterSet"] = -1 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # macintoshFONDFamilyID - info = dict(fontInfoVersion3) - info["macintoshFONDFamilyID"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # macintoshFONDName - info = dict(fontInfoVersion3) - info["macintoshFONDName"] = 123 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - - def testWOFFRead(self): - # woffMajorVersion - info = dict(fontInfoVersion3) - info["woffMajorVersion"] = 1.0 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - info = dict(fontInfoVersion3) - info["woffMajorVersion"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # woffMinorVersion - info = dict(fontInfoVersion3) - info["woffMinorVersion"] = 1.0 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - info = dict(fontInfoVersion3) - info["woffMinorVersion"] = "abc" - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # woffMetadataUniqueID - ## none - info = dict(fontInfoVersion3) - del info["woffMetadataUniqueID"] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(TestInfoObject()) - ## not a dict - info = dict(fontInfoVersion3) - info["woffMetadataUniqueID"] = 1 - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## unknown key - info = dict(fontInfoVersion3) - info["woffMetadataUniqueID"] = dict(id="foo", notTheRightKey=1) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## no id - info = dict(fontInfoVersion3) - info["woffMetadataUniqueID"] = dict() - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## not a string for id - info = dict(fontInfoVersion3) - info["woffMetadataUniqueID"] = dict(id=1) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## empty string - info = dict(fontInfoVersion3) - info["woffMetadataUniqueID"] = dict(id="") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(TestInfoObject()) - # woffMetadataVendor - ## no name - info = dict(fontInfoVersion3) - info["woffMetadataVendor"] = dict(url="foo") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## name not a string - info = dict(fontInfoVersion3) - info["woffMetadataVendor"] = dict(name=1, url="foo") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## name an empty string - info = dict(fontInfoVersion3) - info["woffMetadataVendor"] = dict(name="", url="foo") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(TestInfoObject()) - ## no URL - info = dict(fontInfoVersion3) - info["woffMetadataVendor"] = dict(name="foo") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(TestInfoObject()) - ## url not a string - info = dict(fontInfoVersion3) - info["woffMetadataVendor"] = dict(name="foo", url=1) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## url empty string - info = dict(fontInfoVersion3) - info["woffMetadataVendor"] = dict(name="foo", url="") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(TestInfoObject()) - ## have dir - info = dict(fontInfoVersion3) - info["woffMetadataVendor"] = dict(name="foo", url="bar", dir="ltr") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(TestInfoObject()) - info = dict(fontInfoVersion3) - info["woffMetadataVendor"] = dict(name="foo", url="bar", dir="rtl") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(TestInfoObject()) - ## dir not a string - info = dict(fontInfoVersion3) - info["woffMetadataVendor"] = dict(name="foo", url="bar", dir=1) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## dir not ltr or rtl - info = dict(fontInfoVersion3) - info["woffMetadataVendor"] = dict(name="foo", url="bar", dir="utd") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## have class - info = dict(fontInfoVersion3) - info["woffMetadataVendor"] = {"name" : "foo", "url" : "bar", "class" : "hello"} - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(TestInfoObject()) - ## class not a string - info = dict(fontInfoVersion3) - info["woffMetadataVendor"] = {"name" : "foo", "url" : "bar", "class" : 1} - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## class empty string - info = dict(fontInfoVersion3) - info["woffMetadataVendor"] = {"name" : "foo", "url" : "bar", "class" : ""} - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(TestInfoObject()) - # woffMetadataCredits - ## no credits attribute - info = dict(fontInfoVersion3) - info["woffMetadataCredits"] = {} - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## unknown attribute - info = dict(fontInfoVersion3) - info["woffMetadataCredits"] = dict(credits=[dict(name="foo")], notTheRightKey=1) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## not a list - info = dict(fontInfoVersion3) - info["woffMetadataCredits"] = dict(credits="abc") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## no elements in credits - info = dict(fontInfoVersion3) - info["woffMetadataCredits"] = dict(credits=[]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## credit not a dict - info = dict(fontInfoVersion3) - info["woffMetadataCredits"] = dict(credits=["abc"]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## unknown key - info = dict(fontInfoVersion3) - info["woffMetadataCredits"] = dict(credits=[dict(name="foo", notTheRightKey=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## no name - info = dict(fontInfoVersion3) - info["woffMetadataCredits"] = dict(credits=[dict(url="foo")]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## name not a string - info = dict(fontInfoVersion3) - info["woffMetadataCredits"] = dict(credits=[dict(name=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## url not a string - info = dict(fontInfoVersion3) - info["woffMetadataCredits"] = dict(credits=[dict(name="foo", url=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## role not a string - info = dict(fontInfoVersion3) - info["woffMetadataCredits"] = dict(credits=[dict(name="foo", role=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## dir not a string - info = dict(fontInfoVersion3) - info["woffMetadataCredits"] = dict(credits=[dict(name="foo", dir=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## dir not ltr or rtl - info = dict(fontInfoVersion3) - info["woffMetadataCredits"] = dict(credits=[dict(name="foo", dir="utd")]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## class not a string - info = dict(fontInfoVersion3) - info["woffMetadataCredits"] = dict(credits=[{"name" : "foo", "class" : 1}]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # woffMetadataDescription - ## no url - info = dict(fontInfoVersion3) - info["woffMetadataDescription"] = dict(text=[dict(text="foo")]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(TestInfoObject()) - ## url not a string - info = dict(fontInfoVersion3) - info["woffMetadataDescription"] = dict(text=[dict(text="foo")], url=1) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## no text - info = dict(fontInfoVersion3) - info["woffMetadataDescription"] = dict(url="foo") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text not a list - info = dict(fontInfoVersion3) - info["woffMetadataDescription"] = dict(text="abc") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text item not a dict - info = dict(fontInfoVersion3) - info["woffMetadataDescription"] = dict(text=["abc"]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text item unknown key - info = dict(fontInfoVersion3) - info["woffMetadataDescription"] = dict(text=[dict(text="foo", notTheRightKey=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text item missing text - info = dict(fontInfoVersion3) - info["woffMetadataDescription"] = dict(text=[dict(language="foo")]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text not a string - info = dict(fontInfoVersion3) - info["woffMetadataDescription"] = dict(text=[dict(text=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## url not a string - info = dict(fontInfoVersion3) - info["woffMetadataDescription"] = dict(text=[dict(text="foo", url=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## language not a string - info = dict(fontInfoVersion3) - info["woffMetadataDescription"] = dict(text=[dict(text="foo", language=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## dir not ltr or rtl - info = dict(fontInfoVersion3) - info["woffMetadataDescription"] = dict(text=[dict(text="foo", dir="utd")]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## class not a string - info = dict(fontInfoVersion3) - info["woffMetadataDescription"] = dict(text=[{"text" : "foo", "class" : 1}]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # woffMetadataLicense - ## no url - info = dict(fontInfoVersion3) - info["woffMetadataLicense"] = dict(text=[dict(text="foo")]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(TestInfoObject()) - ## url not a string - info = dict(fontInfoVersion3) - info["woffMetadataLicense"] = dict(text=[dict(text="foo")], url=1) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## id not a string - info = dict(fontInfoVersion3) - info["woffMetadataLicense"] = dict(text=[dict(text="foo")], id=1) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## no text - info = dict(fontInfoVersion3) - info["woffMetadataLicense"] = dict(url="foo") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(TestInfoObject()) - ## text not a list - info = dict(fontInfoVersion3) - info["woffMetadataLicense"] = dict(text="abc") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text item not a dict - info = dict(fontInfoVersion3) - info["woffMetadataLicense"] = dict(text=["abc"]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text item unknown key - info = dict(fontInfoVersion3) - info["woffMetadataLicense"] = dict(text=[dict(text="foo", notTheRightKey=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text item missing text - info = dict(fontInfoVersion3) - info["woffMetadataLicense"] = dict(text=[dict(language="foo")]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text not a string - info = dict(fontInfoVersion3) - info["woffMetadataLicense"] = dict(text=[dict(text=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## url not a string - info = dict(fontInfoVersion3) - info["woffMetadataLicense"] = dict(text=[dict(text="foo", url=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## language not a string - info = dict(fontInfoVersion3) - info["woffMetadataLicense"] = dict(text=[dict(text="foo", language=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## dir not ltr or rtl - info = dict(fontInfoVersion3) - info["woffMetadataLicense"] = dict(text=[dict(text="foo", dir="utd")]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## class not a string - info = dict(fontInfoVersion3) - info["woffMetadataLicense"] = dict(text=[{"text" : "foo", "class" : 1}]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # woffMetadataCopyright - ## unknown attribute - info = dict(fontInfoVersion3) - info["woffMetadataCopyright"] = dict(text=[dict(text="foo")], notTheRightKey=1) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## no text - info = dict(fontInfoVersion3) - info["woffMetadataCopyright"] = dict() - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text not a list - info = dict(fontInfoVersion3) - info["woffMetadataCopyright"] = dict(text="abc") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text item not a dict - info = dict(fontInfoVersion3) - info["woffMetadataCopyright"] = dict(text=["abc"]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text item unknown key - info = dict(fontInfoVersion3) - info["woffMetadataCopyright"] = dict(text=[dict(text="foo", notTheRightKey=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text item missing text - info = dict(fontInfoVersion3) - info["woffMetadataCopyright"] = dict(text=[dict(language="foo")]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text not a string - info = dict(fontInfoVersion3) - info["woffMetadataCopyright"] = dict(text=[dict(text=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## url not a string - info = dict(fontInfoVersion3) - info["woffMetadataCopyright"] = dict(text=[dict(text="foo", url=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## language not a string - info = dict(fontInfoVersion3) - info["woffMetadataCopyright"] = dict(text=[dict(text="foo", language=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## dir not ltr or rtl - info = dict(fontInfoVersion3) - info["woffMetadataCopyright"] = dict(text=[dict(text="foo", dir="utd")]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## class not a string - info = dict(fontInfoVersion3) - info["woffMetadataCopyright"] = dict(text=[{"text" : "foo", "class" : 1}]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # woffMetadataTrademark - ## unknown attribute - info = dict(fontInfoVersion3) - info["woffMetadataTrademark"] = dict(text=[dict(text="foo")], notTheRightKey=1) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## no text - info = dict(fontInfoVersion3) - info["woffMetadataTrademark"] = dict() - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text not a list - info = dict(fontInfoVersion3) - info["woffMetadataTrademark"] = dict(text="abc") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text item not a dict - info = dict(fontInfoVersion3) - info["woffMetadataTrademark"] = dict(text=["abc"]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text item unknown key - info = dict(fontInfoVersion3) - info["woffMetadataTrademark"] = dict(text=[dict(text="foo", notTheRightKey=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text item missing text - info = dict(fontInfoVersion3) - info["woffMetadataTrademark"] = dict(text=[dict(language="foo")]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## text not a string - info = dict(fontInfoVersion3) - info["woffMetadataTrademark"] = dict(text=[dict(text=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## url not a string - info = dict(fontInfoVersion3) - info["woffMetadataTrademark"] = dict(text=[dict(text="foo", url=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## language not a string - info = dict(fontInfoVersion3) - info["woffMetadataTrademark"] = dict(text=[dict(text="foo", language=1)]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## dir not ltr or rtl - info = dict(fontInfoVersion3) - info["woffMetadataTrademark"] = dict(text=[dict(text="foo", dir="utd")]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## class not a string - info = dict(fontInfoVersion3) - info["woffMetadataTrademark"] = dict(text=[{"text" : "foo", "class" : 1}]) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # woffMetadataLicensee - ## no name - info = dict(fontInfoVersion3) - info["woffMetadataLicensee"] = dict() - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## unknown attribute - info = dict(fontInfoVersion3) - info["woffMetadataLicensee"] = dict(name="foo", notTheRightKey=1) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## name not a string - info = dict(fontInfoVersion3) - info["woffMetadataLicensee"] = dict(name=1) - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## dir options - info = dict(fontInfoVersion3) - info["woffMetadataLicensee"] = dict(name="foo", dir="ltr") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(TestInfoObject()) - info = dict(fontInfoVersion3) - info["woffMetadataLicensee"] = dict(name="foo", dir="rtl") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(TestInfoObject()) - ## dir not ltr or rtl - info = dict(fontInfoVersion3) - info["woffMetadataLicensee"] = dict(name="foo", dir="utd") - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## have class - info = dict(fontInfoVersion3) - info["woffMetadataLicensee"] = {"name" : "foo", "class" : "hello"} - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - reader.readInfo(TestInfoObject()) - ## class not a string - info = dict(fontInfoVersion3) - info["woffMetadataLicensee"] = {"name" : "foo", "class" : 1} - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - - def testGuidelinesRead(self): - # x - ## not an int or float - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x="1")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # y - ## not an int or float - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(y="1")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # angle - ## < 0 - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, y=0, angle=-1)] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## > 360 - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, y=0, angle=361)] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # name - ## not a string - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, name=1)] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # color - ## not a string - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color=1)] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## not enough commas - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="1 0, 0, 0")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="1 0 0, 0")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="1 0 0 0")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## not enough parts - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color=", 0, 0, 0")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="1, , 0, 0")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="1, 0, , 0")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="1, 0, 0, ")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color=", , , ")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## not a number in all positions - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="r, 1, 1, 1")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="1, g, 1, 1")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="1, 1, b, 1")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="1, 1, 1, a")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## too many parts - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="1, 0, 0, 0, 0")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## < 0 in each position - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="-1, 0, 0, 0")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="0, -1, 0, 0")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="0, 0, -1, 0")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="0, 0, 0, -1")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - ## > 1 in each position - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="2, 0, 0, 0")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="0, 2, 0, 0")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="0, 0, 2, 0")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, color="0, 0, 0, 2")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) - # identifier - ## duplicate - info = dict(fontInfoVersion3) - info["guidelines"] = [dict(x=0, identifier="guide1"), dict(y=0, identifier="guide1")] - self._writeInfoToPlist(info) - reader = UFOReader(self.dstDir, validate=True) - self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) +class ReadFontInfoVersion3TestCase(unittest.TestCase): + def setUp(self): + self.dstDir = tempfile.mktemp() + os.mkdir(self.dstDir) + metaInfo = {"creator": "test", "formatVersion": 3} + path = os.path.join(self.dstDir, "metainfo.plist") + with open(path, "wb") as f: + plistlib.dump(metaInfo, f) + + def tearDown(self): + shutil.rmtree(self.dstDir) + + def _writeInfoToPlist(self, info): + path = os.path.join(self.dstDir, "fontinfo.plist") + with open(path, "wb") as f: + plistlib.dump(info, f) + + def testRead(self): + originalData = dict(fontInfoVersion3) + self._writeInfoToPlist(originalData) + infoObject = TestInfoObject() + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(infoObject) + readData = {} + for attr in list(fontInfoVersion3.keys()): + readData[attr] = getattr(infoObject, attr) + self.assertEqual(originalData, readData) + + def testGenericRead(self): + # familyName + info = dict(fontInfoVersion3) + info["familyName"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # styleName + info = dict(fontInfoVersion3) + info["styleName"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # styleMapFamilyName + info = dict(fontInfoVersion3) + info["styleMapFamilyName"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # styleMapStyleName + ## not a string + info = dict(fontInfoVersion3) + info["styleMapStyleName"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + ## out of range + info = dict(fontInfoVersion3) + info["styleMapStyleName"] = "REGULAR" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # versionMajor + info = dict(fontInfoVersion3) + info["versionMajor"] = "1" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # versionMinor + info = dict(fontInfoVersion3) + info["versionMinor"] = "0" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + info = dict(fontInfoVersion3) + info["versionMinor"] = -1 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # copyright + info = dict(fontInfoVersion3) + info["copyright"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # trademark + info = dict(fontInfoVersion3) + info["trademark"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # unitsPerEm + info = dict(fontInfoVersion3) + info["unitsPerEm"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + info = dict(fontInfoVersion3) + info["unitsPerEm"] = -1 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + info = dict(fontInfoVersion3) + info["unitsPerEm"] = -1.0 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # descender + info = dict(fontInfoVersion3) + info["descender"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # xHeight + info = dict(fontInfoVersion3) + info["xHeight"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # capHeight + info = dict(fontInfoVersion3) + info["capHeight"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # ascender + info = dict(fontInfoVersion3) + info["ascender"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # italicAngle + info = dict(fontInfoVersion3) + info["italicAngle"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + + def testGaspRead(self): + # not a list + info = dict(fontInfoVersion3) + info["openTypeGaspRangeRecords"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # empty list + info = dict(fontInfoVersion3) + info["openTypeGaspRangeRecords"] = [] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(TestInfoObject()) + # not a dict + info = dict(fontInfoVersion3) + info["openTypeGaspRangeRecords"] = ["abc"] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # dict not properly formatted + info = dict(fontInfoVersion3) + info["openTypeGaspRangeRecords"] = [dict(rangeMaxPPEM=0xFFFF, notTheRightKey=1)] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + info = dict(fontInfoVersion3) + info["openTypeGaspRangeRecords"] = [ + dict(notTheRightKey=1, rangeGaspBehavior=[0]) + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # not an int for ppem + info = dict(fontInfoVersion3) + info["openTypeGaspRangeRecords"] = [ + dict(rangeMaxPPEM="abc", rangeGaspBehavior=[0]), + dict(rangeMaxPPEM=0xFFFF, rangeGaspBehavior=[0]), + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # not a list for behavior + info = dict(fontInfoVersion3) + info["openTypeGaspRangeRecords"] = [ + dict(rangeMaxPPEM=10, rangeGaspBehavior="abc"), + dict(rangeMaxPPEM=0xFFFF, rangeGaspBehavior=[0]), + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # invalid behavior value + info = dict(fontInfoVersion3) + info["openTypeGaspRangeRecords"] = [ + dict(rangeMaxPPEM=10, rangeGaspBehavior=[-1]), + dict(rangeMaxPPEM=0xFFFF, rangeGaspBehavior=[0]), + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # not sorted + info = dict(fontInfoVersion3) + info["openTypeGaspRangeRecords"] = [ + dict(rangeMaxPPEM=0xFFFF, rangeGaspBehavior=[0]), + dict(rangeMaxPPEM=10, rangeGaspBehavior=[0]), + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # no 0xFFFF + info = dict(fontInfoVersion3) + info["openTypeGaspRangeRecords"] = [ + dict(rangeMaxPPEM=10, rangeGaspBehavior=[0]), + dict(rangeMaxPPEM=20, rangeGaspBehavior=[0]), + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(TestInfoObject()) + + def testHeadRead(self): + # openTypeHeadCreated + ## not a string + info = dict(fontInfoVersion3) + info["openTypeHeadCreated"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + ## invalid format + info = dict(fontInfoVersion3) + info["openTypeHeadCreated"] = "2000-Jan-01 00:00:00" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeHeadLowestRecPPEM + info = dict(fontInfoVersion3) + info["openTypeHeadLowestRecPPEM"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + info = dict(fontInfoVersion3) + info["openTypeHeadLowestRecPPEM"] = -1 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeHeadFlags + info = dict(fontInfoVersion3) + info["openTypeHeadFlags"] = [-1] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + + def testHheaRead(self): + # openTypeHheaAscender + info = dict(fontInfoVersion3) + info["openTypeHheaAscender"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeHheaDescender + info = dict(fontInfoVersion3) + info["openTypeHheaDescender"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeHheaLineGap + info = dict(fontInfoVersion3) + info["openTypeHheaLineGap"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeHheaCaretSlopeRise + info = dict(fontInfoVersion3) + info["openTypeHheaCaretSlopeRise"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeHheaCaretSlopeRun + info = dict(fontInfoVersion3) + info["openTypeHheaCaretSlopeRun"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeHheaCaretOffset + info = dict(fontInfoVersion3) + info["openTypeHheaCaretOffset"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + + def testNameRead(self): + # openTypeNameDesigner + info = dict(fontInfoVersion3) + info["openTypeNameDesigner"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeNameDesignerURL + info = dict(fontInfoVersion3) + info["openTypeNameDesignerURL"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeNameManufacturer + info = dict(fontInfoVersion3) + info["openTypeNameManufacturer"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeNameManufacturerURL + info = dict(fontInfoVersion3) + info["openTypeNameManufacturerURL"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeNameLicense + info = dict(fontInfoVersion3) + info["openTypeNameLicense"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeNameLicenseURL + info = dict(fontInfoVersion3) + info["openTypeNameLicenseURL"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeNameVersion + info = dict(fontInfoVersion3) + info["openTypeNameVersion"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeNameUniqueID + info = dict(fontInfoVersion3) + info["openTypeNameUniqueID"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeNameDescription + info = dict(fontInfoVersion3) + info["openTypeNameDescription"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeNamePreferredFamilyName + info = dict(fontInfoVersion3) + info["openTypeNamePreferredFamilyName"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeNamePreferredSubfamilyName + info = dict(fontInfoVersion3) + info["openTypeNamePreferredSubfamilyName"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeNameCompatibleFullName + info = dict(fontInfoVersion3) + info["openTypeNameCompatibleFullName"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeNameSampleText + info = dict(fontInfoVersion3) + info["openTypeNameSampleText"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeNameWWSFamilyName + info = dict(fontInfoVersion3) + info["openTypeNameWWSFamilyName"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeNameWWSSubfamilyName + info = dict(fontInfoVersion3) + info["openTypeNameWWSSubfamilyName"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeNameRecords + ## not a list + info = dict(fontInfoVersion3) + info["openTypeNameRecords"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + ## not a dict + info = dict(fontInfoVersion3) + info["openTypeNameRecords"] = ["abc"] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + ## invalid dict structure + info = dict(fontInfoVersion3) + info["openTypeNameRecords"] = [dict(foo="bar")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + ## incorrect keys + info = dict(fontInfoVersion3) + info["openTypeNameRecords"] = [ + dict( + nameID=1, + platformID=1, + encodingID=1, + languageID=1, + string="Name Record.", + foo="bar", + ) + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + info = dict(fontInfoVersion3) + info["openTypeNameRecords"] = [ + dict(platformID=1, encodingID=1, languageID=1, string="Name Record.") + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + info = dict(fontInfoVersion3) + info["openTypeNameRecords"] = [ + dict(nameID=1, encodingID=1, languageID=1, string="Name Record.") + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + info = dict(fontInfoVersion3) + info["openTypeNameRecords"] = [ + dict(nameID=1, platformID=1, languageID=1, string="Name Record.") + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + info = dict(fontInfoVersion3) + info["openTypeNameRecords"] = [ + dict(nameID=1, platformID=1, encodingID=1, string="Name Record.") + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + info = dict(fontInfoVersion3) + info["openTypeNameRecords"] = [ + dict(nameID=1, platformID=1, encodingID=1, languageID=1) + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + ## invalid values + info = dict(fontInfoVersion3) + info["openTypeNameRecords"] = [ + dict( + nameID="1", + platformID=1, + encodingID=1, + languageID=1, + string="Name Record.", + ) + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + info = dict(fontInfoVersion3) + info["openTypeNameRecords"] = [ + dict( + nameID=1, + platformID="1", + encodingID=1, + languageID=1, + string="Name Record.", + ) + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + info = dict(fontInfoVersion3) + info["openTypeNameRecords"] = [ + dict( + nameID=1, + platformID=1, + encodingID="1", + languageID=1, + string="Name Record.", + ) + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + info = dict(fontInfoVersion3) + info["openTypeNameRecords"] = [ + dict( + nameID=1, + platformID=1, + encodingID=1, + languageID="1", + string="Name Record.", + ) + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + info = dict(fontInfoVersion3) + info["openTypeNameRecords"] = [ + dict(nameID=1, platformID=1, encodingID=1, languageID=1, string=1) + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + ## duplicate + info = dict(fontInfoVersion3) + info["openTypeNameRecords"] = [ + dict( + nameID=1, + platformID=1, + encodingID=1, + languageID=1, + string="Name Record.", + ), + dict( + nameID=1, + platformID=1, + encodingID=1, + languageID=1, + string="Name Record.", + ), + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(TestInfoObject()) + + def testOS2Read(self): + # openTypeOS2WidthClass + ## not an int + info = dict(fontInfoVersion3) + info["openTypeOS2WidthClass"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + ## out or range + info = dict(fontInfoVersion3) + info["openTypeOS2WidthClass"] = 15 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2WeightClass + info = dict(fontInfoVersion3) + ## not an int + info["openTypeOS2WeightClass"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + ## out of range + info["openTypeOS2WeightClass"] = -50 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2Selection + info = dict(fontInfoVersion3) + info["openTypeOS2Selection"] = [-1] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2VendorID + info = dict(fontInfoVersion3) + info["openTypeOS2VendorID"] = 1234 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2Panose + ## not an int + info = dict(fontInfoVersion3) + info["openTypeOS2Panose"] = [0, 1, 2, 3, 4, 5, 6, 7, 8, str(9)] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + ## negative + info = dict(fontInfoVersion3) + info["openTypeOS2Panose"] = [0, 1, 2, 3, 4, 5, 6, 7, 8, -9] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + ## too few values + info = dict(fontInfoVersion3) + info["openTypeOS2Panose"] = [0, 1, 2, 3] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + ## too many values + info = dict(fontInfoVersion3) + info["openTypeOS2Panose"] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2FamilyClass + ## not an int + info = dict(fontInfoVersion3) + info["openTypeOS2FamilyClass"] = [1, str(1)] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + ## too few values + info = dict(fontInfoVersion3) + info["openTypeOS2FamilyClass"] = [1] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + ## too many values + info = dict(fontInfoVersion3) + info["openTypeOS2FamilyClass"] = [1, 1, 1] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + ## out of range + info = dict(fontInfoVersion3) + info["openTypeOS2FamilyClass"] = [1, 201] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2UnicodeRanges + ## not an int + info = dict(fontInfoVersion3) + info["openTypeOS2UnicodeRanges"] = ["0"] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + ## out of range + info = dict(fontInfoVersion3) + info["openTypeOS2UnicodeRanges"] = [-1] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2CodePageRanges + ## not an int + info = dict(fontInfoVersion3) + info["openTypeOS2CodePageRanges"] = ["0"] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + ## out of range + info = dict(fontInfoVersion3) + info["openTypeOS2CodePageRanges"] = [-1] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2TypoAscender + info = dict(fontInfoVersion3) + info["openTypeOS2TypoAscender"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2TypoDescender + info = dict(fontInfoVersion3) + info["openTypeOS2TypoDescender"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2TypoLineGap + info = dict(fontInfoVersion3) + info["openTypeOS2TypoLineGap"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2WinAscent + info = dict(fontInfoVersion3) + info["openTypeOS2WinAscent"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + info = dict(fontInfoVersion3) + info["openTypeOS2WinAscent"] = -1 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2WinDescent + info = dict(fontInfoVersion3) + info["openTypeOS2WinDescent"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + info = dict(fontInfoVersion3) + info["openTypeOS2WinDescent"] = -1 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2Type + ## not an int + info = dict(fontInfoVersion3) + info["openTypeOS2Type"] = ["1"] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + ## out of range + info = dict(fontInfoVersion3) + info["openTypeOS2Type"] = [-1] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2SubscriptXSize + info = dict(fontInfoVersion3) + info["openTypeOS2SubscriptXSize"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2SubscriptYSize + info = dict(fontInfoVersion3) + info["openTypeOS2SubscriptYSize"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2SubscriptXOffset + info = dict(fontInfoVersion3) + info["openTypeOS2SubscriptXOffset"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2SubscriptYOffset + info = dict(fontInfoVersion3) + info["openTypeOS2SubscriptYOffset"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2SuperscriptXSize + info = dict(fontInfoVersion3) + info["openTypeOS2SuperscriptXSize"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2SuperscriptYSize + info = dict(fontInfoVersion3) + info["openTypeOS2SuperscriptYSize"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2SuperscriptXOffset + info = dict(fontInfoVersion3) + info["openTypeOS2SuperscriptXOffset"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2SuperscriptYOffset + info = dict(fontInfoVersion3) + info["openTypeOS2SuperscriptYOffset"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2StrikeoutSize + info = dict(fontInfoVersion3) + info["openTypeOS2StrikeoutSize"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeOS2StrikeoutPosition + info = dict(fontInfoVersion3) + info["openTypeOS2StrikeoutPosition"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + + def testVheaRead(self): + # openTypeVheaVertTypoAscender + info = dict(fontInfoVersion3) + info["openTypeVheaVertTypoAscender"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeVheaVertTypoDescender + info = dict(fontInfoVersion3) + info["openTypeVheaVertTypoDescender"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeVheaVertTypoLineGap + info = dict(fontInfoVersion3) + info["openTypeVheaVertTypoLineGap"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeVheaCaretSlopeRise + info = dict(fontInfoVersion3) + info["openTypeVheaCaretSlopeRise"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeVheaCaretSlopeRun + info = dict(fontInfoVersion3) + info["openTypeVheaCaretSlopeRun"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # openTypeVheaCaretOffset + info = dict(fontInfoVersion3) + info["openTypeVheaCaretOffset"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + + def testFONDRead(self): + # macintoshFONDFamilyID + info = dict(fontInfoVersion3) + info["macintoshFONDFamilyID"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # macintoshFONDName + info = dict(fontInfoVersion3) + info["macintoshFONDName"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + + def testPostscriptRead(self): + # postscriptFontName + info = dict(fontInfoVersion3) + info["postscriptFontName"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # postscriptFullName + info = dict(fontInfoVersion3) + info["postscriptFullName"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # postscriptSlantAngle + info = dict(fontInfoVersion3) + info["postscriptSlantAngle"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject()) + # postscriptUniqueID + info = dict(fontInfoVersion3) + info["postscriptUniqueID"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # postscriptUnderlineThickness + info = dict(fontInfoVersion3) + info["postscriptUnderlineThickness"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # postscriptUnderlinePosition + info = dict(fontInfoVersion3) + info["postscriptUnderlinePosition"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # postscriptIsFixedPitch + info = dict(fontInfoVersion3) + info["postscriptIsFixedPitch"] = 2 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # postscriptBlueValues + ## not a list + info = dict(fontInfoVersion3) + info["postscriptBlueValues"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## uneven value count + info = dict(fontInfoVersion3) + info["postscriptBlueValues"] = [500] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## too many values + info = dict(fontInfoVersion3) + info["postscriptBlueValues"] = [ + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + 110, + 120, + 130, + 140, + 150, + 160, + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # postscriptOtherBlues + ## not a list + info = dict(fontInfoVersion3) + info["postscriptOtherBlues"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## uneven value count + info = dict(fontInfoVersion3) + info["postscriptOtherBlues"] = [500] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## too many values + info = dict(fontInfoVersion3) + info["postscriptOtherBlues"] = [ + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + 110, + 120, + 130, + 140, + 150, + 160, + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # postscriptFamilyBlues + ## not a list + info = dict(fontInfoVersion3) + info["postscriptFamilyBlues"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## uneven value count + info = dict(fontInfoVersion3) + info["postscriptFamilyBlues"] = [500] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## too many values + info = dict(fontInfoVersion3) + info["postscriptFamilyBlues"] = [ + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + 110, + 120, + 130, + 140, + 150, + 160, + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # postscriptFamilyOtherBlues + ## not a list + info = dict(fontInfoVersion3) + info["postscriptFamilyOtherBlues"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## uneven value count + info = dict(fontInfoVersion3) + info["postscriptFamilyOtherBlues"] = [500] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## too many values + info = dict(fontInfoVersion3) + info["postscriptFamilyOtherBlues"] = [ + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + 110, + 120, + 130, + 140, + 150, + 160, + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # postscriptStemSnapH + ## not list + info = dict(fontInfoVersion3) + info["postscriptStemSnapH"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## too many values + info = dict(fontInfoVersion3) + info["postscriptStemSnapH"] = [ + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + 110, + 120, + 130, + 140, + 150, + 160, + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # postscriptStemSnapV + ## not list + info = dict(fontInfoVersion3) + info["postscriptStemSnapV"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## too many values + info = dict(fontInfoVersion3) + info["postscriptStemSnapV"] = [ + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + 110, + 120, + 130, + 140, + 150, + 160, + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # postscriptBlueFuzz + info = dict(fontInfoVersion3) + info["postscriptBlueFuzz"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # postscriptBlueShift + info = dict(fontInfoVersion3) + info["postscriptBlueShift"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # postscriptBlueScale + info = dict(fontInfoVersion3) + info["postscriptBlueScale"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # postscriptForceBold + info = dict(fontInfoVersion3) + info["postscriptForceBold"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # postscriptDefaultWidthX + info = dict(fontInfoVersion3) + info["postscriptDefaultWidthX"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # postscriptNominalWidthX + info = dict(fontInfoVersion3) + info["postscriptNominalWidthX"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # postscriptWeightName + info = dict(fontInfoVersion3) + info["postscriptWeightName"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # postscriptDefaultCharacter + info = dict(fontInfoVersion3) + info["postscriptDefaultCharacter"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # postscriptWindowsCharacterSet + info = dict(fontInfoVersion3) + info["postscriptWindowsCharacterSet"] = -1 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # macintoshFONDFamilyID + info = dict(fontInfoVersion3) + info["macintoshFONDFamilyID"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # macintoshFONDName + info = dict(fontInfoVersion3) + info["macintoshFONDName"] = 123 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + + def testWOFFRead(self): + # woffMajorVersion + info = dict(fontInfoVersion3) + info["woffMajorVersion"] = 1.0 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + info = dict(fontInfoVersion3) + info["woffMajorVersion"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # woffMinorVersion + info = dict(fontInfoVersion3) + info["woffMinorVersion"] = 1.0 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + info = dict(fontInfoVersion3) + info["woffMinorVersion"] = "abc" + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # woffMetadataUniqueID + ## none + info = dict(fontInfoVersion3) + del info["woffMetadataUniqueID"] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(TestInfoObject()) + ## not a dict + info = dict(fontInfoVersion3) + info["woffMetadataUniqueID"] = 1 + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## unknown key + info = dict(fontInfoVersion3) + info["woffMetadataUniqueID"] = dict(id="foo", notTheRightKey=1) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## no id + info = dict(fontInfoVersion3) + info["woffMetadataUniqueID"] = dict() + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## not a string for id + info = dict(fontInfoVersion3) + info["woffMetadataUniqueID"] = dict(id=1) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## empty string + info = dict(fontInfoVersion3) + info["woffMetadataUniqueID"] = dict(id="") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(TestInfoObject()) + # woffMetadataVendor + ## no name + info = dict(fontInfoVersion3) + info["woffMetadataVendor"] = dict(url="foo") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## name not a string + info = dict(fontInfoVersion3) + info["woffMetadataVendor"] = dict(name=1, url="foo") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## name an empty string + info = dict(fontInfoVersion3) + info["woffMetadataVendor"] = dict(name="", url="foo") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(TestInfoObject()) + ## no URL + info = dict(fontInfoVersion3) + info["woffMetadataVendor"] = dict(name="foo") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(TestInfoObject()) + ## url not a string + info = dict(fontInfoVersion3) + info["woffMetadataVendor"] = dict(name="foo", url=1) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## url empty string + info = dict(fontInfoVersion3) + info["woffMetadataVendor"] = dict(name="foo", url="") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(TestInfoObject()) + ## have dir + info = dict(fontInfoVersion3) + info["woffMetadataVendor"] = dict(name="foo", url="bar", dir="ltr") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(TestInfoObject()) + info = dict(fontInfoVersion3) + info["woffMetadataVendor"] = dict(name="foo", url="bar", dir="rtl") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(TestInfoObject()) + ## dir not a string + info = dict(fontInfoVersion3) + info["woffMetadataVendor"] = dict(name="foo", url="bar", dir=1) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## dir not ltr or rtl + info = dict(fontInfoVersion3) + info["woffMetadataVendor"] = dict(name="foo", url="bar", dir="utd") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## have class + info = dict(fontInfoVersion3) + info["woffMetadataVendor"] = {"name": "foo", "url": "bar", "class": "hello"} + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(TestInfoObject()) + ## class not a string + info = dict(fontInfoVersion3) + info["woffMetadataVendor"] = {"name": "foo", "url": "bar", "class": 1} + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## class empty string + info = dict(fontInfoVersion3) + info["woffMetadataVendor"] = {"name": "foo", "url": "bar", "class": ""} + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(TestInfoObject()) + # woffMetadataCredits + ## no credits attribute + info = dict(fontInfoVersion3) + info["woffMetadataCredits"] = {} + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## unknown attribute + info = dict(fontInfoVersion3) + info["woffMetadataCredits"] = dict(credits=[dict(name="foo")], notTheRightKey=1) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## not a list + info = dict(fontInfoVersion3) + info["woffMetadataCredits"] = dict(credits="abc") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## no elements in credits + info = dict(fontInfoVersion3) + info["woffMetadataCredits"] = dict(credits=[]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## credit not a dict + info = dict(fontInfoVersion3) + info["woffMetadataCredits"] = dict(credits=["abc"]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## unknown key + info = dict(fontInfoVersion3) + info["woffMetadataCredits"] = dict(credits=[dict(name="foo", notTheRightKey=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## no name + info = dict(fontInfoVersion3) + info["woffMetadataCredits"] = dict(credits=[dict(url="foo")]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## name not a string + info = dict(fontInfoVersion3) + info["woffMetadataCredits"] = dict(credits=[dict(name=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## url not a string + info = dict(fontInfoVersion3) + info["woffMetadataCredits"] = dict(credits=[dict(name="foo", url=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## role not a string + info = dict(fontInfoVersion3) + info["woffMetadataCredits"] = dict(credits=[dict(name="foo", role=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## dir not a string + info = dict(fontInfoVersion3) + info["woffMetadataCredits"] = dict(credits=[dict(name="foo", dir=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## dir not ltr or rtl + info = dict(fontInfoVersion3) + info["woffMetadataCredits"] = dict(credits=[dict(name="foo", dir="utd")]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## class not a string + info = dict(fontInfoVersion3) + info["woffMetadataCredits"] = dict(credits=[{"name": "foo", "class": 1}]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # woffMetadataDescription + ## no url + info = dict(fontInfoVersion3) + info["woffMetadataDescription"] = dict(text=[dict(text="foo")]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(TestInfoObject()) + ## url not a string + info = dict(fontInfoVersion3) + info["woffMetadataDescription"] = dict(text=[dict(text="foo")], url=1) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## no text + info = dict(fontInfoVersion3) + info["woffMetadataDescription"] = dict(url="foo") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text not a list + info = dict(fontInfoVersion3) + info["woffMetadataDescription"] = dict(text="abc") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text item not a dict + info = dict(fontInfoVersion3) + info["woffMetadataDescription"] = dict(text=["abc"]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text item unknown key + info = dict(fontInfoVersion3) + info["woffMetadataDescription"] = dict( + text=[dict(text="foo", notTheRightKey=1)] + ) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text item missing text + info = dict(fontInfoVersion3) + info["woffMetadataDescription"] = dict(text=[dict(language="foo")]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text not a string + info = dict(fontInfoVersion3) + info["woffMetadataDescription"] = dict(text=[dict(text=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## url not a string + info = dict(fontInfoVersion3) + info["woffMetadataDescription"] = dict(text=[dict(text="foo", url=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## language not a string + info = dict(fontInfoVersion3) + info["woffMetadataDescription"] = dict(text=[dict(text="foo", language=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## dir not ltr or rtl + info = dict(fontInfoVersion3) + info["woffMetadataDescription"] = dict(text=[dict(text="foo", dir="utd")]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## class not a string + info = dict(fontInfoVersion3) + info["woffMetadataDescription"] = dict(text=[{"text": "foo", "class": 1}]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # woffMetadataLicense + ## no url + info = dict(fontInfoVersion3) + info["woffMetadataLicense"] = dict(text=[dict(text="foo")]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(TestInfoObject()) + ## url not a string + info = dict(fontInfoVersion3) + info["woffMetadataLicense"] = dict(text=[dict(text="foo")], url=1) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## id not a string + info = dict(fontInfoVersion3) + info["woffMetadataLicense"] = dict(text=[dict(text="foo")], id=1) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## no text + info = dict(fontInfoVersion3) + info["woffMetadataLicense"] = dict(url="foo") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(TestInfoObject()) + ## text not a list + info = dict(fontInfoVersion3) + info["woffMetadataLicense"] = dict(text="abc") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text item not a dict + info = dict(fontInfoVersion3) + info["woffMetadataLicense"] = dict(text=["abc"]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text item unknown key + info = dict(fontInfoVersion3) + info["woffMetadataLicense"] = dict(text=[dict(text="foo", notTheRightKey=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text item missing text + info = dict(fontInfoVersion3) + info["woffMetadataLicense"] = dict(text=[dict(language="foo")]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text not a string + info = dict(fontInfoVersion3) + info["woffMetadataLicense"] = dict(text=[dict(text=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## url not a string + info = dict(fontInfoVersion3) + info["woffMetadataLicense"] = dict(text=[dict(text="foo", url=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## language not a string + info = dict(fontInfoVersion3) + info["woffMetadataLicense"] = dict(text=[dict(text="foo", language=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## dir not ltr or rtl + info = dict(fontInfoVersion3) + info["woffMetadataLicense"] = dict(text=[dict(text="foo", dir="utd")]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## class not a string + info = dict(fontInfoVersion3) + info["woffMetadataLicense"] = dict(text=[{"text": "foo", "class": 1}]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # woffMetadataCopyright + ## unknown attribute + info = dict(fontInfoVersion3) + info["woffMetadataCopyright"] = dict(text=[dict(text="foo")], notTheRightKey=1) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## no text + info = dict(fontInfoVersion3) + info["woffMetadataCopyright"] = dict() + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text not a list + info = dict(fontInfoVersion3) + info["woffMetadataCopyright"] = dict(text="abc") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text item not a dict + info = dict(fontInfoVersion3) + info["woffMetadataCopyright"] = dict(text=["abc"]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text item unknown key + info = dict(fontInfoVersion3) + info["woffMetadataCopyright"] = dict(text=[dict(text="foo", notTheRightKey=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text item missing text + info = dict(fontInfoVersion3) + info["woffMetadataCopyright"] = dict(text=[dict(language="foo")]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text not a string + info = dict(fontInfoVersion3) + info["woffMetadataCopyright"] = dict(text=[dict(text=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## url not a string + info = dict(fontInfoVersion3) + info["woffMetadataCopyright"] = dict(text=[dict(text="foo", url=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## language not a string + info = dict(fontInfoVersion3) + info["woffMetadataCopyright"] = dict(text=[dict(text="foo", language=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## dir not ltr or rtl + info = dict(fontInfoVersion3) + info["woffMetadataCopyright"] = dict(text=[dict(text="foo", dir="utd")]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## class not a string + info = dict(fontInfoVersion3) + info["woffMetadataCopyright"] = dict(text=[{"text": "foo", "class": 1}]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # woffMetadataTrademark + ## unknown attribute + info = dict(fontInfoVersion3) + info["woffMetadataTrademark"] = dict(text=[dict(text="foo")], notTheRightKey=1) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## no text + info = dict(fontInfoVersion3) + info["woffMetadataTrademark"] = dict() + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text not a list + info = dict(fontInfoVersion3) + info["woffMetadataTrademark"] = dict(text="abc") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text item not a dict + info = dict(fontInfoVersion3) + info["woffMetadataTrademark"] = dict(text=["abc"]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text item unknown key + info = dict(fontInfoVersion3) + info["woffMetadataTrademark"] = dict(text=[dict(text="foo", notTheRightKey=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text item missing text + info = dict(fontInfoVersion3) + info["woffMetadataTrademark"] = dict(text=[dict(language="foo")]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## text not a string + info = dict(fontInfoVersion3) + info["woffMetadataTrademark"] = dict(text=[dict(text=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## url not a string + info = dict(fontInfoVersion3) + info["woffMetadataTrademark"] = dict(text=[dict(text="foo", url=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## language not a string + info = dict(fontInfoVersion3) + info["woffMetadataTrademark"] = dict(text=[dict(text="foo", language=1)]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## dir not ltr or rtl + info = dict(fontInfoVersion3) + info["woffMetadataTrademark"] = dict(text=[dict(text="foo", dir="utd")]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## class not a string + info = dict(fontInfoVersion3) + info["woffMetadataTrademark"] = dict(text=[{"text": "foo", "class": 1}]) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # woffMetadataLicensee + ## no name + info = dict(fontInfoVersion3) + info["woffMetadataLicensee"] = dict() + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## unknown attribute + info = dict(fontInfoVersion3) + info["woffMetadataLicensee"] = dict(name="foo", notTheRightKey=1) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## name not a string + info = dict(fontInfoVersion3) + info["woffMetadataLicensee"] = dict(name=1) + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## dir options + info = dict(fontInfoVersion3) + info["woffMetadataLicensee"] = dict(name="foo", dir="ltr") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(TestInfoObject()) + info = dict(fontInfoVersion3) + info["woffMetadataLicensee"] = dict(name="foo", dir="rtl") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(TestInfoObject()) + ## dir not ltr or rtl + info = dict(fontInfoVersion3) + info["woffMetadataLicensee"] = dict(name="foo", dir="utd") + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## have class + info = dict(fontInfoVersion3) + info["woffMetadataLicensee"] = {"name": "foo", "class": "hello"} + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + reader.readInfo(TestInfoObject()) + ## class not a string + info = dict(fontInfoVersion3) + info["woffMetadataLicensee"] = {"name": "foo", "class": 1} + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + + def testGuidelinesRead(self): + # x + ## not an int or float + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x="1")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # y + ## not an int or float + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(y="1")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # angle + ## < 0 + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, y=0, angle=-1)] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## > 360 + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, y=0, angle=361)] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # name + ## not a string + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, name=1)] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # color + ## not a string + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color=1)] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## not enough commas + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="1 0, 0, 0")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="1 0 0, 0")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="1 0 0 0")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## not enough parts + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color=", 0, 0, 0")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="1, , 0, 0")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="1, 0, , 0")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="1, 0, 0, ")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color=", , , ")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## not a number in all positions + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="r, 1, 1, 1")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="1, g, 1, 1")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="1, 1, b, 1")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="1, 1, 1, a")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## too many parts + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="1, 0, 0, 0, 0")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## < 0 in each position + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="-1, 0, 0, 0")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="0, -1, 0, 0")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="0, 0, -1, 0")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="0, 0, 0, -1")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + ## > 1 in each position + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="2, 0, 0, 0")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="0, 2, 0, 0")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="0, 0, 2, 0")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + info = dict(fontInfoVersion3) + info["guidelines"] = [dict(x=0, color="0, 0, 0, 2")] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) + # identifier + ## duplicate + info = dict(fontInfoVersion3) + info["guidelines"] = [ + dict(x=0, identifier="guide1"), + dict(y=0, identifier="guide1"), + ] + self._writeInfoToPlist(info) + reader = UFOReader(self.dstDir, validate=True) + self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject()) class WriteFontInfoVersion3TestCase(unittest.TestCase): - - def setUp(self): - self.tempDir = tempfile.mktemp() - os.mkdir(self.tempDir) - self.dstDir = os.path.join(self.tempDir, "test.ufo") - - def tearDown(self): - shutil.rmtree(self.tempDir) - - def tearDownUFO(self): - if os.path.exists(self.dstDir): - shutil.rmtree(self.dstDir) - - def makeInfoObject(self): - infoObject = TestInfoObject() - for attr, value in list(fontInfoVersion3.items()): - setattr(infoObject, attr, value) - return infoObject - - def readPlist(self): - path = os.path.join(self.dstDir, "fontinfo.plist") - with open(path, "rb") as f: - plist = plistlib.load(f) - return plist - - def testWrite(self): - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - writtenData = self.readPlist() - for attr, originalValue in list(fontInfoVersion3.items()): - newValue = writtenData[attr] - self.assertEqual(newValue, originalValue) - self.tearDownUFO() - - def testGenericWrite(self): - # familyName - infoObject = self.makeInfoObject() - infoObject.familyName = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # styleName - infoObject = self.makeInfoObject() - infoObject.styleName = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # styleMapFamilyName - infoObject = self.makeInfoObject() - infoObject.styleMapFamilyName = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # styleMapStyleName - ## not a string - infoObject = self.makeInfoObject() - infoObject.styleMapStyleName = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## out of range - infoObject = self.makeInfoObject() - infoObject.styleMapStyleName = "REGULAR" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # versionMajor - infoObject = self.makeInfoObject() - infoObject.versionMajor = "1" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # versionMinor - infoObject = self.makeInfoObject() - infoObject.versionMinor = "0" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # copyright - infoObject = self.makeInfoObject() - infoObject.copyright = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # trademark - infoObject = self.makeInfoObject() - infoObject.trademark = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # unitsPerEm - infoObject = self.makeInfoObject() - infoObject.unitsPerEm = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # descender - infoObject = self.makeInfoObject() - infoObject.descender = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # xHeight - infoObject = self.makeInfoObject() - infoObject.xHeight = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # capHeight - infoObject = self.makeInfoObject() - infoObject.capHeight = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # ascender - infoObject = self.makeInfoObject() - infoObject.ascender = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # italicAngle - infoObject = self.makeInfoObject() - infoObject.italicAngle = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - - def testGaspWrite(self): - # not a list - infoObject = self.makeInfoObject() - infoObject.openTypeGaspRangeRecords = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # empty list - infoObject = self.makeInfoObject() - infoObject.openTypeGaspRangeRecords = [] - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - self.tearDownUFO() - # not a dict - infoObject = self.makeInfoObject() - infoObject.openTypeGaspRangeRecords = ["abc"] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # dict not properly formatted - infoObject = self.makeInfoObject() - infoObject.openTypeGaspRangeRecords = [dict(rangeMaxPPEM=0xFFFF, notTheRightKey=1)] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.openTypeGaspRangeRecords = [dict(notTheRightKey=1, rangeGaspBehavior=[0])] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # not an int for ppem - infoObject = self.makeInfoObject() - infoObject.openTypeGaspRangeRecords = [dict(rangeMaxPPEM="abc", rangeGaspBehavior=[0]), dict(rangeMaxPPEM=0xFFFF, rangeGaspBehavior=[0])] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # not a list for behavior - infoObject = self.makeInfoObject() - infoObject.openTypeGaspRangeRecords = [dict(rangeMaxPPEM=10, rangeGaspBehavior="abc"), dict(rangeMaxPPEM=0xFFFF, rangeGaspBehavior=[0])] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # invalid behavior value - infoObject = self.makeInfoObject() - infoObject.openTypeGaspRangeRecords = [dict(rangeMaxPPEM=10, rangeGaspBehavior=[-1]), dict(rangeMaxPPEM=0xFFFF, rangeGaspBehavior=[0])] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # not sorted - infoObject = self.makeInfoObject() - infoObject.openTypeGaspRangeRecords = [dict(rangeMaxPPEM=0xFFFF, rangeGaspBehavior=[0]), dict(rangeMaxPPEM=10, rangeGaspBehavior=[0])] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # no 0xFFFF - infoObject = self.makeInfoObject() - infoObject.openTypeGaspRangeRecords = [dict(rangeMaxPPEM=10, rangeGaspBehavior=[0]), dict(rangeMaxPPEM=20, rangeGaspBehavior=[0])] - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - self.tearDownUFO() - - def testHeadWrite(self): - # openTypeHeadCreated - ## not a string - infoObject = self.makeInfoObject() - infoObject.openTypeHeadCreated = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## invalid format - infoObject = self.makeInfoObject() - infoObject.openTypeHeadCreated = "2000-Jan-01 00:00:00" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeHeadLowestRecPPEM - infoObject = self.makeInfoObject() - infoObject.openTypeHeadLowestRecPPEM = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeHeadFlags - infoObject = self.makeInfoObject() - infoObject.openTypeHeadFlags = [-1] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - - def testHheaWrite(self): - # openTypeHheaAscender - infoObject = self.makeInfoObject() - infoObject.openTypeHheaAscender = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeHheaDescender - infoObject = self.makeInfoObject() - infoObject.openTypeHheaDescender = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeHheaLineGap - infoObject = self.makeInfoObject() - infoObject.openTypeHheaLineGap = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeHheaCaretSlopeRise - infoObject = self.makeInfoObject() - infoObject.openTypeHheaCaretSlopeRise = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeHheaCaretSlopeRun - infoObject = self.makeInfoObject() - infoObject.openTypeHheaCaretSlopeRun = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeHheaCaretOffset - infoObject = self.makeInfoObject() - infoObject.openTypeHheaCaretOffset = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - - def testNameWrite(self): - # openTypeNameDesigner - infoObject = self.makeInfoObject() - infoObject.openTypeNameDesigner = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeNameDesignerURL - infoObject = self.makeInfoObject() - infoObject.openTypeNameDesignerURL = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeNameManufacturer - infoObject = self.makeInfoObject() - infoObject.openTypeNameManufacturer = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeNameManufacturerURL - infoObject = self.makeInfoObject() - infoObject.openTypeNameManufacturerURL = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeNameLicense - infoObject = self.makeInfoObject() - infoObject.openTypeNameLicense = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeNameLicenseURL - infoObject = self.makeInfoObject() - infoObject.openTypeNameLicenseURL = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeNameVersion - infoObject = self.makeInfoObject() - infoObject.openTypeNameVersion = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeNameUniqueID - infoObject = self.makeInfoObject() - infoObject.openTypeNameUniqueID = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeNameDescription - infoObject = self.makeInfoObject() - infoObject.openTypeNameDescription = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeNamePreferredFamilyName - infoObject = self.makeInfoObject() - infoObject.openTypeNamePreferredFamilyName = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeNamePreferredSubfamilyName - infoObject = self.makeInfoObject() - infoObject.openTypeNamePreferredSubfamilyName = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeNameCompatibleFullName - infoObject = self.makeInfoObject() - infoObject.openTypeNameCompatibleFullName = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeNameSampleText - infoObject = self.makeInfoObject() - infoObject.openTypeNameSampleText = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeNameWWSFamilyName - infoObject = self.makeInfoObject() - infoObject.openTypeNameWWSFamilyName = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeNameWWSSubfamilyName - infoObject = self.makeInfoObject() - infoObject.openTypeNameWWSSubfamilyName = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeNameRecords - ## not a list - infoObject = self.makeInfoObject() - infoObject.openTypeNameRecords = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## not a dict - infoObject = self.makeInfoObject() - infoObject.openTypeNameRecords = ["abc"] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## invalid dict structure - infoObject = self.makeInfoObject() - infoObject.openTypeNameRecords = [dict(foo="bar")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## incorrect keys - infoObject = self.makeInfoObject() - infoObject.openTypeNameRecords = [ - dict(nameID=1, platformID=1, encodingID=1, languageID=1, string="Name Record.", foo="bar") - ] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.openTypeNameRecords = [ - dict(platformID=1, encodingID=1, languageID=1, string="Name Record.") - ] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.openTypeNameRecords = [ - dict(nameID=1, encodingID=1, languageID=1, string="Name Record.") - ] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.openTypeNameRecords = [ - dict(nameID=1, platformID=1, languageID=1, string="Name Record.") - ] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.openTypeNameRecords = [ - dict(nameID=1, platformID=1, encodingID=1, string="Name Record.") - ] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.openTypeNameRecords = [ - dict(nameID=1, platformID=1, encodingID=1, languageID=1) - ] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## invalid values - infoObject = self.makeInfoObject() - infoObject.openTypeNameRecords = [ - dict(nameID="1", platformID=1, encodingID=1, languageID=1, string="Name Record.") - ] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.openTypeNameRecords = [ - dict(nameID=1, platformID="1", encodingID=1, languageID=1, string="Name Record.") - ] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.openTypeNameRecords = [ - dict(nameID=1, platformID=1, encodingID="1", languageID=1, string="Name Record.") - ] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.openTypeNameRecords = [ - dict(nameID=1, platformID=1, encodingID=1, languageID="1", string="Name Record.") - ] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.openTypeNameRecords = [ - dict(nameID=1, platformID=1, encodingID=1, languageID=1, string=1) - ] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## duplicate - infoObject = self.makeInfoObject() - infoObject.openTypeNameRecords = [ - dict(nameID=1, platformID=1, encodingID=1, languageID=1, string="Name Record."), - dict(nameID=1, platformID=1, encodingID=1, languageID=1, string="Name Record.") - ] - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - - def testOS2Write(self): - # openTypeOS2WidthClass - ## not an int - infoObject = self.makeInfoObject() - infoObject.openTypeOS2WidthClass = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## out or range - infoObject = self.makeInfoObject() - infoObject.openTypeOS2WidthClass = 15 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2WeightClass - ## not an int - infoObject = self.makeInfoObject() - infoObject.openTypeOS2WeightClass = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## out of range - infoObject = self.makeInfoObject() - infoObject.openTypeOS2WeightClass = -50 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2Selection - infoObject = self.makeInfoObject() - infoObject.openTypeOS2Selection = [-1] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2VendorID - infoObject = self.makeInfoObject() - infoObject.openTypeOS2VendorID = 1234 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2Panose - ## not an int - infoObject = self.makeInfoObject() - infoObject.openTypeOS2Panose = [0, 1, 2, 3, 4, 5, 6, 7, 8, str(9)] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## too few values - infoObject = self.makeInfoObject() - infoObject.openTypeOS2Panose = [0, 1, 2, 3] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## too many values - infoObject = self.makeInfoObject() - infoObject.openTypeOS2Panose = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2FamilyClass - ## not an int - infoObject = self.makeInfoObject() - infoObject.openTypeOS2FamilyClass = [0, str(1)] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## too few values - infoObject = self.makeInfoObject() - infoObject.openTypeOS2FamilyClass = [1] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## too many values - infoObject = self.makeInfoObject() - infoObject.openTypeOS2FamilyClass = [1, 1, 1] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## out of range - infoObject = self.makeInfoObject() - infoObject.openTypeOS2FamilyClass = [1, 20] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2UnicodeRanges - ## not an int - infoObject = self.makeInfoObject() - infoObject.openTypeOS2UnicodeRanges = ["0"] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## out of range - infoObject = self.makeInfoObject() - infoObject.openTypeOS2UnicodeRanges = [-1] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2CodePageRanges - ## not an int - infoObject = self.makeInfoObject() - infoObject.openTypeOS2CodePageRanges = ["0"] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## out of range - infoObject = self.makeInfoObject() - infoObject.openTypeOS2CodePageRanges = [-1] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2TypoAscender - infoObject = self.makeInfoObject() - infoObject.openTypeOS2TypoAscender = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2TypoDescender - infoObject = self.makeInfoObject() - infoObject.openTypeOS2TypoDescender = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2TypoLineGap - infoObject = self.makeInfoObject() - infoObject.openTypeOS2TypoLineGap = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2WinAscent - infoObject = self.makeInfoObject() - infoObject.openTypeOS2WinAscent = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.openTypeOS2WinAscent = -1 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2WinDescent - infoObject = self.makeInfoObject() - infoObject.openTypeOS2WinDescent = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.openTypeOS2WinDescent = -1 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2Type - ## not an int - infoObject = self.makeInfoObject() - infoObject.openTypeOS2Type = ["1"] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## out of range - infoObject = self.makeInfoObject() - infoObject.openTypeOS2Type = [-1] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2SubscriptXSize - infoObject = self.makeInfoObject() - infoObject.openTypeOS2SubscriptXSize = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2SubscriptYSize - infoObject = self.makeInfoObject() - infoObject.openTypeOS2SubscriptYSize = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2SubscriptXOffset - infoObject = self.makeInfoObject() - infoObject.openTypeOS2SubscriptXOffset = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2SubscriptYOffset - infoObject = self.makeInfoObject() - infoObject.openTypeOS2SubscriptYOffset = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2SuperscriptXSize - infoObject = self.makeInfoObject() - infoObject.openTypeOS2SuperscriptXSize = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2SuperscriptYSize - infoObject = self.makeInfoObject() - infoObject.openTypeOS2SuperscriptYSize = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2SuperscriptXOffset - infoObject = self.makeInfoObject() - infoObject.openTypeOS2SuperscriptXOffset = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2SuperscriptYOffset - infoObject = self.makeInfoObject() - infoObject.openTypeOS2SuperscriptYOffset = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2StrikeoutSize - infoObject = self.makeInfoObject() - infoObject.openTypeOS2StrikeoutSize = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeOS2StrikeoutPosition - infoObject = self.makeInfoObject() - infoObject.openTypeOS2StrikeoutPosition = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - - def testVheaWrite(self): - # openTypeVheaVertTypoAscender - infoObject = self.makeInfoObject() - infoObject.openTypeVheaVertTypoAscender = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeVheaVertTypoDescender - infoObject = self.makeInfoObject() - infoObject.openTypeVheaVertTypoDescender = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeVheaVertTypoLineGap - infoObject = self.makeInfoObject() - infoObject.openTypeVheaVertTypoLineGap = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeVheaCaretSlopeRise - infoObject = self.makeInfoObject() - infoObject.openTypeVheaCaretSlopeRise = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeVheaCaretSlopeRun - infoObject = self.makeInfoObject() - infoObject.openTypeVheaCaretSlopeRun = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # openTypeVheaCaretOffset - infoObject = self.makeInfoObject() - infoObject.openTypeVheaCaretOffset = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - - def testFONDWrite(self): - # macintoshFONDFamilyID - infoObject = self.makeInfoObject() - infoObject.macintoshFONDFamilyID = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # macintoshFONDName - infoObject = self.makeInfoObject() - infoObject.macintoshFONDName = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - - def testPostscriptWrite(self): - # postscriptFontName - infoObject = self.makeInfoObject() - infoObject.postscriptFontName = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptFullName - infoObject = self.makeInfoObject() - infoObject.postscriptFullName = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptSlantAngle - infoObject = self.makeInfoObject() - infoObject.postscriptSlantAngle = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptUniqueID - infoObject = self.makeInfoObject() - infoObject.postscriptUniqueID = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptUnderlineThickness - infoObject = self.makeInfoObject() - infoObject.postscriptUnderlineThickness = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptUnderlinePosition - infoObject = self.makeInfoObject() - infoObject.postscriptUnderlinePosition = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptIsFixedPitch - infoObject = self.makeInfoObject() - infoObject.postscriptIsFixedPitch = 2 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptBlueValues - ## not a list - infoObject = self.makeInfoObject() - infoObject.postscriptBlueValues = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## uneven value count - infoObject = self.makeInfoObject() - infoObject.postscriptBlueValues = [500] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## too many values - infoObject = self.makeInfoObject() - infoObject.postscriptBlueValues = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptOtherBlues - ## not a list - infoObject = self.makeInfoObject() - infoObject.postscriptOtherBlues = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## uneven value count - infoObject = self.makeInfoObject() - infoObject.postscriptOtherBlues = [500] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## too many values - infoObject = self.makeInfoObject() - infoObject.postscriptOtherBlues = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptFamilyBlues - ## not a list - infoObject = self.makeInfoObject() - infoObject.postscriptFamilyBlues = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## uneven value count - infoObject = self.makeInfoObject() - infoObject.postscriptFamilyBlues = [500] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## too many values - infoObject = self.makeInfoObject() - infoObject.postscriptFamilyBlues = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptFamilyOtherBlues - ## not a list - infoObject = self.makeInfoObject() - infoObject.postscriptFamilyOtherBlues = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## uneven value count - infoObject = self.makeInfoObject() - infoObject.postscriptFamilyOtherBlues = [500] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## too many values - infoObject = self.makeInfoObject() - infoObject.postscriptFamilyOtherBlues = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptStemSnapH - ## not list - infoObject = self.makeInfoObject() - infoObject.postscriptStemSnapH = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## too many values - infoObject = self.makeInfoObject() - infoObject.postscriptStemSnapH = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptStemSnapV - ## not list - infoObject = self.makeInfoObject() - infoObject.postscriptStemSnapV = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## too many values - infoObject = self.makeInfoObject() - infoObject.postscriptStemSnapV = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptBlueFuzz - infoObject = self.makeInfoObject() - infoObject.postscriptBlueFuzz = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptBlueShift - infoObject = self.makeInfoObject() - infoObject.postscriptBlueShift = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptBlueScale - infoObject = self.makeInfoObject() - infoObject.postscriptBlueScale = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptForceBold - infoObject = self.makeInfoObject() - infoObject.postscriptForceBold = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptDefaultWidthX - infoObject = self.makeInfoObject() - infoObject.postscriptDefaultWidthX = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptNominalWidthX - infoObject = self.makeInfoObject() - infoObject.postscriptNominalWidthX = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptWeightName - infoObject = self.makeInfoObject() - infoObject.postscriptWeightName = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptDefaultCharacter - infoObject = self.makeInfoObject() - infoObject.postscriptDefaultCharacter = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # postscriptWindowsCharacterSet - infoObject = self.makeInfoObject() - infoObject.postscriptWindowsCharacterSet = -1 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # macintoshFONDFamilyID - infoObject = self.makeInfoObject() - infoObject.macintoshFONDFamilyID = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # macintoshFONDName - infoObject = self.makeInfoObject() - infoObject.macintoshFONDName = 123 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - - def testWOFFWrite(self): - # woffMajorVersion - infoObject = self.makeInfoObject() - infoObject.woffMajorVersion = 1.0 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.woffMajorVersion = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # woffMinorVersion - infoObject = self.makeInfoObject() - infoObject.woffMinorVersion = 1.0 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.woffMinorVersion = "abc" - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # woffMetadataUniqueID - ## none - infoObject = self.makeInfoObject() - infoObject.woffMetadataUniqueID = None - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - self.tearDownUFO() - ## not a dict - infoObject = self.makeInfoObject() - infoObject.woffMetadataUniqueID = 1 - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## unknown key - infoObject = self.makeInfoObject() - infoObject.woffMetadataUniqueID = dict(id="foo", notTheRightKey=1) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## no id - infoObject = self.makeInfoObject() - infoObject.woffMetadataUniqueID = dict() - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## not a string for id - infoObject = self.makeInfoObject() - infoObject.woffMetadataUniqueID = dict(id=1) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## empty string - infoObject = self.makeInfoObject() - infoObject.woffMetadataUniqueID = dict(id="") - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - self.tearDownUFO() - # woffMetadataVendor - ## no name - infoObject = self.makeInfoObject() - infoObject.woffMetadataVendor = dict(url="foo") - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## name not a string - infoObject = self.makeInfoObject() - infoObject.woffMetadataVendor = dict(name=1, url="foo") - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## name an empty string - infoObject = self.makeInfoObject() - infoObject.woffMetadataVendor = dict(name="", url="foo") - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - self.tearDownUFO() - ## no URL - infoObject = self.makeInfoObject() - infoObject.woffMetadataVendor = dict(name="foo") - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - self.tearDownUFO() - ## url not a string - infoObject = self.makeInfoObject() - infoObject.woffMetadataVendor = dict(name="foo", url=1) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## url empty string - infoObject = self.makeInfoObject() - infoObject.woffMetadataVendor = dict(name="foo", url="") - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - self.tearDownUFO() - ## have dir - infoObject = self.makeInfoObject() - infoObject.woffMetadataVendor = dict(name="foo", url="bar", dir="ltr") - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.woffMetadataVendor = dict(name="foo", url="bar", dir="rtl") - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - self.tearDownUFO() - ## dir not a string - infoObject = self.makeInfoObject() - infoObject.woffMetadataVendor = dict(name="foo", url="bar", dir=1) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## dir not ltr or rtl - infoObject = self.makeInfoObject() - infoObject.woffMetadataVendor = dict(name="foo", url="bar", dir="utd") - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## have class - infoObject = self.makeInfoObject() - infoObject.woffMetadataVendor = {"name" : "foo", "url" : "bar", "class" : "hello"} - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - self.tearDownUFO() - ## class not a string - infoObject = self.makeInfoObject() - infoObject.woffMetadataVendor = {"name" : "foo", "url" : "bar", "class" : 1} - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## class empty string - infoObject = self.makeInfoObject() - infoObject.woffMetadataVendor = {"name" : "foo", "url" : "bar", "class" : ""} - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - self.tearDownUFO() - # woffMetadataCredits - ## no credits attribute - infoObject = self.makeInfoObject() - infoObject.woffMetadataCredits = {} - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## unknown attribute - infoObject = self.makeInfoObject() - infoObject.woffMetadataCredits = dict(credits=[dict(name="foo")], notTheRightKey=1) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## not a list - infoObject = self.makeInfoObject() - infoObject.woffMetadataCredits = dict(credits="abc") - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## no elements in credits - infoObject = self.makeInfoObject() - infoObject.woffMetadataCredits = dict(credits=[]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## credit not a dict - infoObject = self.makeInfoObject() - infoObject.woffMetadataCredits = dict(credits=["abc"]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## unknown key - infoObject = self.makeInfoObject() - infoObject.woffMetadataCredits = dict(credits=[dict(name="foo", notTheRightKey=1)]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## no name - infoObject = self.makeInfoObject() - infoObject.woffMetadataCredits = dict(credits=[dict(url="foo")]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## name not a string - infoObject = self.makeInfoObject() - infoObject.woffMetadataCredits = dict(credits=[dict(name=1)]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## url not a string - infoObject = self.makeInfoObject() - infoObject.woffMetadataCredits = dict(credits=[dict(name="foo", url=1)]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## role not a string - infoObject = self.makeInfoObject() - infoObject.woffMetadataCredits = dict(credits=[dict(name="foo", role=1)]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## dir not a string - infoObject = self.makeInfoObject() - infoObject.woffMetadataCredits = dict(credits=[dict(name="foo", dir=1)]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## dir not ltr or rtl - infoObject = self.makeInfoObject() - infoObject.woffMetadataCredits = dict(credits=[dict(name="foo", dir="utd")]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## class not a string - infoObject = self.makeInfoObject() - infoObject.woffMetadataCredits = dict(credits=[{"name" : "foo", "class" : 1}]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # woffMetadataDescription - ## no url - infoObject = self.makeInfoObject() - infoObject.woffMetadataDescription = dict(text=[dict(text="foo")]) - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - self.tearDownUFO() - ## url not a string - infoObject = self.makeInfoObject() - infoObject.woffMetadataDescription = dict(text=[dict(text="foo")], url=1) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## no text - infoObject = self.makeInfoObject() - infoObject.woffMetadataDescription = dict(url="foo") - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text not a list - infoObject = self.makeInfoObject() - infoObject.woffMetadataDescription = dict(text="abc") - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text item not a dict - infoObject = self.makeInfoObject() - infoObject.woffMetadataDescription = dict(text=["abc"]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text item unknown key - infoObject = self.makeInfoObject() - infoObject.woffMetadataDescription = dict(text=[dict(text="foo", notTheRightKey=1)]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text item missing text - infoObject = self.makeInfoObject() - infoObject.woffMetadataDescription = dict(text=[dict(language="foo")]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text not a string - infoObject = self.makeInfoObject() - infoObject.woffMetadataDescription = dict(text=[dict(text=1)]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## url not a string - infoObject = self.makeInfoObject() - infoObject.woffMetadataDescription = dict(text=[dict(text="foo", url=1)]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## language not a string - infoObject = self.makeInfoObject() - infoObject.woffMetadataDescription = dict(text=[dict(text="foo", language=1)]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## dir not ltr or rtl - infoObject = self.makeInfoObject() - infoObject.woffMetadataDescription = dict(text=[dict(text="foo", dir="utd")]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## class not a string - infoObject = self.makeInfoObject() - infoObject.woffMetadataDescription = dict(text=[{"text" : "foo", "class" : 1}]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # woffMetadataLicense - ## no url - infoObject = self.makeInfoObject() - infoObject.woffMetadataLicense = dict(text=[dict(text="foo")]) - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - self.tearDownUFO() - ## url not a string - infoObject = self.makeInfoObject() - infoObject.woffMetadataLicense = dict(text=[dict(text="foo")], url=1) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## id not a string - infoObject = self.makeInfoObject() - infoObject.woffMetadataLicense = dict(text=[dict(text="foo")], id=1) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## no text - infoObject = self.makeInfoObject() - infoObject.woffMetadataLicense = dict(url="foo") - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - self.tearDownUFO() - ## text not a list - infoObject = self.makeInfoObject() - infoObject.woffMetadataLicense = dict(text="abc") - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text item not a dict - infoObject = self.makeInfoObject() - infoObject.woffMetadataLicense = dict(text=["abc"]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text item unknown key - infoObject = self.makeInfoObject() - infoObject.woffMetadataLicense = dict(text=[dict(text="foo", notTheRightKey=1)]) - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text item missing text - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataLicense = dict(text=[dict(language="foo")]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text not a string - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataLicense = dict(text=[dict(text=1)]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## url not a string - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataLicense = dict(text=[dict(text="foo", url=1)]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## language not a string - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataLicense = dict(text=[dict(text="foo", language=1)]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## dir not ltr or rtl - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataLicense = dict(text=[dict(text="foo", dir="utd")]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## class not a string - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataLicense = dict(text=[{"text" : "foo", "class" : 1}]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # woffMetadataCopyright - ## unknown attribute - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataCopyright = dict(text=[dict(text="foo")], notTheRightKey=1) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## no text - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataCopyright = dict() - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text not a list - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataCopyright = dict(text="abc") - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text item not a dict - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataCopyright = dict(text=["abc"]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text item unknown key - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataCopyright = dict(text=[dict(text="foo", notTheRightKey=1)]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text item missing text - infoObject = self.makeInfoObject() - infoObject.woffMetadataCopyright = dict(text=[dict(language="foo")]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text not a string - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataCopyright = dict(text=[dict(text=1)]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## url not a string - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataCopyright = dict(text=[dict(text="foo", url=1)]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## language not a string - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataCopyright = dict(text=[dict(text="foo", language=1)]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## dir not ltr or rtl - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataCopyright = dict(text=[dict(text="foo", dir="utd")]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## class not a string - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataCopyright = dict(text=[{"text" : "foo", "class" : 1}]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # woffMetadataTrademark - ## unknown attribute - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataTrademark = dict(text=[dict(text="foo")], notTheRightKey=1) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## no text - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataTrademark = dict() - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text not a list - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataTrademark = dict(text="abc") - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text item not a dict - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataTrademark = dict(text=["abc"]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text item unknown key - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataTrademark = dict(text=[dict(text="foo", notTheRightKey=1)]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text item missing text - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataTrademark = dict(text=[dict(language="foo")]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## text not a string - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataTrademark = dict(text=[dict(text=1)]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## url not a string - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataTrademark = dict(text=[dict(text="foo", url=1)]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## language not a string - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataTrademark = dict(text=[dict(text="foo", language=1)]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## dir not ltr or rtl - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataTrademark = dict(text=[dict(text="foo", dir="utd")]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## class not a string - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataTrademark = dict(text=[{"text" : "foo", "class" : 1}]) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # woffMetadataLicensee - ## no name - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataLicensee = dict() - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## unknown attribute - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataLicensee = dict(name="foo", notTheRightKey=1) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## name not a string - infoObject = self.makeInfoObject() - writer = UFOWriter(self.dstDir, formatVersion=3) - infoObject.woffMetadataLicensee = dict(name=1) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## dir options - infoObject = self.makeInfoObject() - infoObject.woffMetadataLicensee = dict(name="foo", dir="ltr") - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.woffMetadataLicensee = dict(name="foo", dir="rtl") - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - self.tearDownUFO() - ## dir not ltr or rtl - infoObject = self.makeInfoObject() - infoObject.woffMetadataLicensee = dict(name="foo", dir="utd") - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## have class - infoObject = self.makeInfoObject() - infoObject.woffMetadataLicensee = {"name" : "foo", "class" : "hello"} - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeInfo(infoObject) - self.tearDownUFO() - ## class not a string - infoObject = self.makeInfoObject() - infoObject.woffMetadataLicensee = {"name" : "foo", "class" : 1} - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - - def testGuidelinesWrite(self): - # x - ## not an int or float - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x="1")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # y - ## not an int or float - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(y="1")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # angle - ## < 0 - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, y=0, angle=-1)] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## > 360 - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, y=0, angle=361)] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # name - ## not a string - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, name=1)] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # color - ## not a string - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color=1)] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## not enough commas - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="1 0, 0, 0")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="1 0 0, 0")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="1 0 0 0")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## not enough parts - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color=", 0, 0, 0")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="1, , 0, 0")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="1, 0, , 0")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="1, 0, 0, ")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color=", , , ")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## not a number in all positions - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="r, 1, 1, 1")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="1, g, 1, 1")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="1, 1, b, 1")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="1, 1, 1, a")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## too many parts - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="1, 0, 0, 0, 0")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## < 0 in each position - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="-1, 0, 0, 0")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="0, -1, 0, 0")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="0, 0, -1, 0")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="0, 0, 0, -1")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## > 1 in each position - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="2, 0, 0, 0")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="0, 2, 0, 0")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="0, 0, 2, 0")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, color="0, 0, 0, 2")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - # identifier - ## duplicate - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, identifier="guide1"), dict(y=0, identifier="guide1")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## below min - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, identifier="\0x1F")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() - ## above max - infoObject = self.makeInfoObject() - infoObject.guidelines = [dict(x=0, identifier="\0x7F")] - writer = UFOWriter(self.dstDir, formatVersion=3) - self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) - self.tearDownUFO() + def setUp(self): + self.tempDir = tempfile.mktemp() + os.mkdir(self.tempDir) + self.dstDir = os.path.join(self.tempDir, "test.ufo") + + def tearDown(self): + shutil.rmtree(self.tempDir) + + def tearDownUFO(self): + if os.path.exists(self.dstDir): + shutil.rmtree(self.dstDir) + + def makeInfoObject(self): + infoObject = TestInfoObject() + for attr, value in list(fontInfoVersion3.items()): + setattr(infoObject, attr, value) + return infoObject + + def readPlist(self): + path = os.path.join(self.dstDir, "fontinfo.plist") + with open(path, "rb") as f: + plist = plistlib.load(f) + return plist + + def testWrite(self): + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + writtenData = self.readPlist() + for attr, originalValue in list(fontInfoVersion3.items()): + newValue = writtenData[attr] + self.assertEqual(newValue, originalValue) + self.tearDownUFO() + + def testGenericWrite(self): + # familyName + infoObject = self.makeInfoObject() + infoObject.familyName = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # styleName + infoObject = self.makeInfoObject() + infoObject.styleName = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # styleMapFamilyName + infoObject = self.makeInfoObject() + infoObject.styleMapFamilyName = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # styleMapStyleName + ## not a string + infoObject = self.makeInfoObject() + infoObject.styleMapStyleName = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## out of range + infoObject = self.makeInfoObject() + infoObject.styleMapStyleName = "REGULAR" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # versionMajor + infoObject = self.makeInfoObject() + infoObject.versionMajor = "1" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # versionMinor + infoObject = self.makeInfoObject() + infoObject.versionMinor = "0" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # copyright + infoObject = self.makeInfoObject() + infoObject.copyright = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # trademark + infoObject = self.makeInfoObject() + infoObject.trademark = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # unitsPerEm + infoObject = self.makeInfoObject() + infoObject.unitsPerEm = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # descender + infoObject = self.makeInfoObject() + infoObject.descender = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # xHeight + infoObject = self.makeInfoObject() + infoObject.xHeight = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # capHeight + infoObject = self.makeInfoObject() + infoObject.capHeight = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # ascender + infoObject = self.makeInfoObject() + infoObject.ascender = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # italicAngle + infoObject = self.makeInfoObject() + infoObject.italicAngle = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + + def testGaspWrite(self): + # not a list + infoObject = self.makeInfoObject() + infoObject.openTypeGaspRangeRecords = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # empty list + infoObject = self.makeInfoObject() + infoObject.openTypeGaspRangeRecords = [] + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + self.tearDownUFO() + # not a dict + infoObject = self.makeInfoObject() + infoObject.openTypeGaspRangeRecords = ["abc"] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # dict not properly formatted + infoObject = self.makeInfoObject() + infoObject.openTypeGaspRangeRecords = [ + dict(rangeMaxPPEM=0xFFFF, notTheRightKey=1) + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.openTypeGaspRangeRecords = [ + dict(notTheRightKey=1, rangeGaspBehavior=[0]) + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # not an int for ppem + infoObject = self.makeInfoObject() + infoObject.openTypeGaspRangeRecords = [ + dict(rangeMaxPPEM="abc", rangeGaspBehavior=[0]), + dict(rangeMaxPPEM=0xFFFF, rangeGaspBehavior=[0]), + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # not a list for behavior + infoObject = self.makeInfoObject() + infoObject.openTypeGaspRangeRecords = [ + dict(rangeMaxPPEM=10, rangeGaspBehavior="abc"), + dict(rangeMaxPPEM=0xFFFF, rangeGaspBehavior=[0]), + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # invalid behavior value + infoObject = self.makeInfoObject() + infoObject.openTypeGaspRangeRecords = [ + dict(rangeMaxPPEM=10, rangeGaspBehavior=[-1]), + dict(rangeMaxPPEM=0xFFFF, rangeGaspBehavior=[0]), + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # not sorted + infoObject = self.makeInfoObject() + infoObject.openTypeGaspRangeRecords = [ + dict(rangeMaxPPEM=0xFFFF, rangeGaspBehavior=[0]), + dict(rangeMaxPPEM=10, rangeGaspBehavior=[0]), + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # no 0xFFFF + infoObject = self.makeInfoObject() + infoObject.openTypeGaspRangeRecords = [ + dict(rangeMaxPPEM=10, rangeGaspBehavior=[0]), + dict(rangeMaxPPEM=20, rangeGaspBehavior=[0]), + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + self.tearDownUFO() + + def testHeadWrite(self): + # openTypeHeadCreated + ## not a string + infoObject = self.makeInfoObject() + infoObject.openTypeHeadCreated = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## invalid format + infoObject = self.makeInfoObject() + infoObject.openTypeHeadCreated = "2000-Jan-01 00:00:00" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeHeadLowestRecPPEM + infoObject = self.makeInfoObject() + infoObject.openTypeHeadLowestRecPPEM = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeHeadFlags + infoObject = self.makeInfoObject() + infoObject.openTypeHeadFlags = [-1] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + + def testHheaWrite(self): + # openTypeHheaAscender + infoObject = self.makeInfoObject() + infoObject.openTypeHheaAscender = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeHheaDescender + infoObject = self.makeInfoObject() + infoObject.openTypeHheaDescender = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeHheaLineGap + infoObject = self.makeInfoObject() + infoObject.openTypeHheaLineGap = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeHheaCaretSlopeRise + infoObject = self.makeInfoObject() + infoObject.openTypeHheaCaretSlopeRise = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeHheaCaretSlopeRun + infoObject = self.makeInfoObject() + infoObject.openTypeHheaCaretSlopeRun = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeHheaCaretOffset + infoObject = self.makeInfoObject() + infoObject.openTypeHheaCaretOffset = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + + def testNameWrite(self): + # openTypeNameDesigner + infoObject = self.makeInfoObject() + infoObject.openTypeNameDesigner = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeNameDesignerURL + infoObject = self.makeInfoObject() + infoObject.openTypeNameDesignerURL = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeNameManufacturer + infoObject = self.makeInfoObject() + infoObject.openTypeNameManufacturer = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeNameManufacturerURL + infoObject = self.makeInfoObject() + infoObject.openTypeNameManufacturerURL = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeNameLicense + infoObject = self.makeInfoObject() + infoObject.openTypeNameLicense = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeNameLicenseURL + infoObject = self.makeInfoObject() + infoObject.openTypeNameLicenseURL = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeNameVersion + infoObject = self.makeInfoObject() + infoObject.openTypeNameVersion = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeNameUniqueID + infoObject = self.makeInfoObject() + infoObject.openTypeNameUniqueID = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeNameDescription + infoObject = self.makeInfoObject() + infoObject.openTypeNameDescription = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeNamePreferredFamilyName + infoObject = self.makeInfoObject() + infoObject.openTypeNamePreferredFamilyName = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeNamePreferredSubfamilyName + infoObject = self.makeInfoObject() + infoObject.openTypeNamePreferredSubfamilyName = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeNameCompatibleFullName + infoObject = self.makeInfoObject() + infoObject.openTypeNameCompatibleFullName = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeNameSampleText + infoObject = self.makeInfoObject() + infoObject.openTypeNameSampleText = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeNameWWSFamilyName + infoObject = self.makeInfoObject() + infoObject.openTypeNameWWSFamilyName = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeNameWWSSubfamilyName + infoObject = self.makeInfoObject() + infoObject.openTypeNameWWSSubfamilyName = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeNameRecords + ## not a list + infoObject = self.makeInfoObject() + infoObject.openTypeNameRecords = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## not a dict + infoObject = self.makeInfoObject() + infoObject.openTypeNameRecords = ["abc"] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## invalid dict structure + infoObject = self.makeInfoObject() + infoObject.openTypeNameRecords = [dict(foo="bar")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## incorrect keys + infoObject = self.makeInfoObject() + infoObject.openTypeNameRecords = [ + dict( + nameID=1, + platformID=1, + encodingID=1, + languageID=1, + string="Name Record.", + foo="bar", + ) + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.openTypeNameRecords = [ + dict(platformID=1, encodingID=1, languageID=1, string="Name Record.") + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.openTypeNameRecords = [ + dict(nameID=1, encodingID=1, languageID=1, string="Name Record.") + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.openTypeNameRecords = [ + dict(nameID=1, platformID=1, languageID=1, string="Name Record.") + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.openTypeNameRecords = [ + dict(nameID=1, platformID=1, encodingID=1, string="Name Record.") + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.openTypeNameRecords = [ + dict(nameID=1, platformID=1, encodingID=1, languageID=1) + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## invalid values + infoObject = self.makeInfoObject() + infoObject.openTypeNameRecords = [ + dict( + nameID="1", + platformID=1, + encodingID=1, + languageID=1, + string="Name Record.", + ) + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.openTypeNameRecords = [ + dict( + nameID=1, + platformID="1", + encodingID=1, + languageID=1, + string="Name Record.", + ) + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.openTypeNameRecords = [ + dict( + nameID=1, + platformID=1, + encodingID="1", + languageID=1, + string="Name Record.", + ) + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.openTypeNameRecords = [ + dict( + nameID=1, + platformID=1, + encodingID=1, + languageID="1", + string="Name Record.", + ) + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.openTypeNameRecords = [ + dict(nameID=1, platformID=1, encodingID=1, languageID=1, string=1) + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## duplicate + infoObject = self.makeInfoObject() + infoObject.openTypeNameRecords = [ + dict( + nameID=1, + platformID=1, + encodingID=1, + languageID=1, + string="Name Record.", + ), + dict( + nameID=1, + platformID=1, + encodingID=1, + languageID=1, + string="Name Record.", + ), + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + + def testOS2Write(self): + # openTypeOS2WidthClass + ## not an int + infoObject = self.makeInfoObject() + infoObject.openTypeOS2WidthClass = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## out or range + infoObject = self.makeInfoObject() + infoObject.openTypeOS2WidthClass = 15 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2WeightClass + ## not an int + infoObject = self.makeInfoObject() + infoObject.openTypeOS2WeightClass = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## out of range + infoObject = self.makeInfoObject() + infoObject.openTypeOS2WeightClass = -50 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2Selection + infoObject = self.makeInfoObject() + infoObject.openTypeOS2Selection = [-1] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2VendorID + infoObject = self.makeInfoObject() + infoObject.openTypeOS2VendorID = 1234 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2Panose + ## not an int + infoObject = self.makeInfoObject() + infoObject.openTypeOS2Panose = [0, 1, 2, 3, 4, 5, 6, 7, 8, str(9)] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## too few values + infoObject = self.makeInfoObject() + infoObject.openTypeOS2Panose = [0, 1, 2, 3] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## too many values + infoObject = self.makeInfoObject() + infoObject.openTypeOS2Panose = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2FamilyClass + ## not an int + infoObject = self.makeInfoObject() + infoObject.openTypeOS2FamilyClass = [0, str(1)] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## too few values + infoObject = self.makeInfoObject() + infoObject.openTypeOS2FamilyClass = [1] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## too many values + infoObject = self.makeInfoObject() + infoObject.openTypeOS2FamilyClass = [1, 1, 1] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## out of range + infoObject = self.makeInfoObject() + infoObject.openTypeOS2FamilyClass = [1, 20] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2UnicodeRanges + ## not an int + infoObject = self.makeInfoObject() + infoObject.openTypeOS2UnicodeRanges = ["0"] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## out of range + infoObject = self.makeInfoObject() + infoObject.openTypeOS2UnicodeRanges = [-1] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2CodePageRanges + ## not an int + infoObject = self.makeInfoObject() + infoObject.openTypeOS2CodePageRanges = ["0"] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## out of range + infoObject = self.makeInfoObject() + infoObject.openTypeOS2CodePageRanges = [-1] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2TypoAscender + infoObject = self.makeInfoObject() + infoObject.openTypeOS2TypoAscender = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2TypoDescender + infoObject = self.makeInfoObject() + infoObject.openTypeOS2TypoDescender = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2TypoLineGap + infoObject = self.makeInfoObject() + infoObject.openTypeOS2TypoLineGap = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2WinAscent + infoObject = self.makeInfoObject() + infoObject.openTypeOS2WinAscent = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.openTypeOS2WinAscent = -1 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2WinDescent + infoObject = self.makeInfoObject() + infoObject.openTypeOS2WinDescent = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.openTypeOS2WinDescent = -1 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2Type + ## not an int + infoObject = self.makeInfoObject() + infoObject.openTypeOS2Type = ["1"] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## out of range + infoObject = self.makeInfoObject() + infoObject.openTypeOS2Type = [-1] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2SubscriptXSize + infoObject = self.makeInfoObject() + infoObject.openTypeOS2SubscriptXSize = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2SubscriptYSize + infoObject = self.makeInfoObject() + infoObject.openTypeOS2SubscriptYSize = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2SubscriptXOffset + infoObject = self.makeInfoObject() + infoObject.openTypeOS2SubscriptXOffset = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2SubscriptYOffset + infoObject = self.makeInfoObject() + infoObject.openTypeOS2SubscriptYOffset = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2SuperscriptXSize + infoObject = self.makeInfoObject() + infoObject.openTypeOS2SuperscriptXSize = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2SuperscriptYSize + infoObject = self.makeInfoObject() + infoObject.openTypeOS2SuperscriptYSize = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2SuperscriptXOffset + infoObject = self.makeInfoObject() + infoObject.openTypeOS2SuperscriptXOffset = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2SuperscriptYOffset + infoObject = self.makeInfoObject() + infoObject.openTypeOS2SuperscriptYOffset = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2StrikeoutSize + infoObject = self.makeInfoObject() + infoObject.openTypeOS2StrikeoutSize = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeOS2StrikeoutPosition + infoObject = self.makeInfoObject() + infoObject.openTypeOS2StrikeoutPosition = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + + def testVheaWrite(self): + # openTypeVheaVertTypoAscender + infoObject = self.makeInfoObject() + infoObject.openTypeVheaVertTypoAscender = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeVheaVertTypoDescender + infoObject = self.makeInfoObject() + infoObject.openTypeVheaVertTypoDescender = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeVheaVertTypoLineGap + infoObject = self.makeInfoObject() + infoObject.openTypeVheaVertTypoLineGap = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeVheaCaretSlopeRise + infoObject = self.makeInfoObject() + infoObject.openTypeVheaCaretSlopeRise = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeVheaCaretSlopeRun + infoObject = self.makeInfoObject() + infoObject.openTypeVheaCaretSlopeRun = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # openTypeVheaCaretOffset + infoObject = self.makeInfoObject() + infoObject.openTypeVheaCaretOffset = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + + def testFONDWrite(self): + # macintoshFONDFamilyID + infoObject = self.makeInfoObject() + infoObject.macintoshFONDFamilyID = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # macintoshFONDName + infoObject = self.makeInfoObject() + infoObject.macintoshFONDName = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + + def testPostscriptWrite(self): + # postscriptFontName + infoObject = self.makeInfoObject() + infoObject.postscriptFontName = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptFullName + infoObject = self.makeInfoObject() + infoObject.postscriptFullName = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptSlantAngle + infoObject = self.makeInfoObject() + infoObject.postscriptSlantAngle = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptUniqueID + infoObject = self.makeInfoObject() + infoObject.postscriptUniqueID = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptUnderlineThickness + infoObject = self.makeInfoObject() + infoObject.postscriptUnderlineThickness = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptUnderlinePosition + infoObject = self.makeInfoObject() + infoObject.postscriptUnderlinePosition = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptIsFixedPitch + infoObject = self.makeInfoObject() + infoObject.postscriptIsFixedPitch = 2 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptBlueValues + ## not a list + infoObject = self.makeInfoObject() + infoObject.postscriptBlueValues = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## uneven value count + infoObject = self.makeInfoObject() + infoObject.postscriptBlueValues = [500] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## too many values + infoObject = self.makeInfoObject() + infoObject.postscriptBlueValues = [ + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + 110, + 120, + 130, + 140, + 150, + 160, + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptOtherBlues + ## not a list + infoObject = self.makeInfoObject() + infoObject.postscriptOtherBlues = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## uneven value count + infoObject = self.makeInfoObject() + infoObject.postscriptOtherBlues = [500] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## too many values + infoObject = self.makeInfoObject() + infoObject.postscriptOtherBlues = [ + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + 110, + 120, + 130, + 140, + 150, + 160, + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptFamilyBlues + ## not a list + infoObject = self.makeInfoObject() + infoObject.postscriptFamilyBlues = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## uneven value count + infoObject = self.makeInfoObject() + infoObject.postscriptFamilyBlues = [500] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## too many values + infoObject = self.makeInfoObject() + infoObject.postscriptFamilyBlues = [ + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + 110, + 120, + 130, + 140, + 150, + 160, + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptFamilyOtherBlues + ## not a list + infoObject = self.makeInfoObject() + infoObject.postscriptFamilyOtherBlues = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## uneven value count + infoObject = self.makeInfoObject() + infoObject.postscriptFamilyOtherBlues = [500] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## too many values + infoObject = self.makeInfoObject() + infoObject.postscriptFamilyOtherBlues = [ + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + 110, + 120, + 130, + 140, + 150, + 160, + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptStemSnapH + ## not list + infoObject = self.makeInfoObject() + infoObject.postscriptStemSnapH = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## too many values + infoObject = self.makeInfoObject() + infoObject.postscriptStemSnapH = [ + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + 110, + 120, + 130, + 140, + 150, + 160, + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptStemSnapV + ## not list + infoObject = self.makeInfoObject() + infoObject.postscriptStemSnapV = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## too many values + infoObject = self.makeInfoObject() + infoObject.postscriptStemSnapV = [ + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + 110, + 120, + 130, + 140, + 150, + 160, + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptBlueFuzz + infoObject = self.makeInfoObject() + infoObject.postscriptBlueFuzz = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptBlueShift + infoObject = self.makeInfoObject() + infoObject.postscriptBlueShift = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptBlueScale + infoObject = self.makeInfoObject() + infoObject.postscriptBlueScale = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptForceBold + infoObject = self.makeInfoObject() + infoObject.postscriptForceBold = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptDefaultWidthX + infoObject = self.makeInfoObject() + infoObject.postscriptDefaultWidthX = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptNominalWidthX + infoObject = self.makeInfoObject() + infoObject.postscriptNominalWidthX = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptWeightName + infoObject = self.makeInfoObject() + infoObject.postscriptWeightName = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptDefaultCharacter + infoObject = self.makeInfoObject() + infoObject.postscriptDefaultCharacter = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # postscriptWindowsCharacterSet + infoObject = self.makeInfoObject() + infoObject.postscriptWindowsCharacterSet = -1 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # macintoshFONDFamilyID + infoObject = self.makeInfoObject() + infoObject.macintoshFONDFamilyID = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # macintoshFONDName + infoObject = self.makeInfoObject() + infoObject.macintoshFONDName = 123 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + + def testWOFFWrite(self): + # woffMajorVersion + infoObject = self.makeInfoObject() + infoObject.woffMajorVersion = 1.0 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.woffMajorVersion = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # woffMinorVersion + infoObject = self.makeInfoObject() + infoObject.woffMinorVersion = 1.0 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.woffMinorVersion = "abc" + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # woffMetadataUniqueID + ## none + infoObject = self.makeInfoObject() + infoObject.woffMetadataUniqueID = None + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + self.tearDownUFO() + ## not a dict + infoObject = self.makeInfoObject() + infoObject.woffMetadataUniqueID = 1 + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## unknown key + infoObject = self.makeInfoObject() + infoObject.woffMetadataUniqueID = dict(id="foo", notTheRightKey=1) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## no id + infoObject = self.makeInfoObject() + infoObject.woffMetadataUniqueID = dict() + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## not a string for id + infoObject = self.makeInfoObject() + infoObject.woffMetadataUniqueID = dict(id=1) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## empty string + infoObject = self.makeInfoObject() + infoObject.woffMetadataUniqueID = dict(id="") + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + self.tearDownUFO() + # woffMetadataVendor + ## no name + infoObject = self.makeInfoObject() + infoObject.woffMetadataVendor = dict(url="foo") + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## name not a string + infoObject = self.makeInfoObject() + infoObject.woffMetadataVendor = dict(name=1, url="foo") + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## name an empty string + infoObject = self.makeInfoObject() + infoObject.woffMetadataVendor = dict(name="", url="foo") + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + self.tearDownUFO() + ## no URL + infoObject = self.makeInfoObject() + infoObject.woffMetadataVendor = dict(name="foo") + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + self.tearDownUFO() + ## url not a string + infoObject = self.makeInfoObject() + infoObject.woffMetadataVendor = dict(name="foo", url=1) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## url empty string + infoObject = self.makeInfoObject() + infoObject.woffMetadataVendor = dict(name="foo", url="") + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + self.tearDownUFO() + ## have dir + infoObject = self.makeInfoObject() + infoObject.woffMetadataVendor = dict(name="foo", url="bar", dir="ltr") + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.woffMetadataVendor = dict(name="foo", url="bar", dir="rtl") + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + self.tearDownUFO() + ## dir not a string + infoObject = self.makeInfoObject() + infoObject.woffMetadataVendor = dict(name="foo", url="bar", dir=1) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## dir not ltr or rtl + infoObject = self.makeInfoObject() + infoObject.woffMetadataVendor = dict(name="foo", url="bar", dir="utd") + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## have class + infoObject = self.makeInfoObject() + infoObject.woffMetadataVendor = {"name": "foo", "url": "bar", "class": "hello"} + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + self.tearDownUFO() + ## class not a string + infoObject = self.makeInfoObject() + infoObject.woffMetadataVendor = {"name": "foo", "url": "bar", "class": 1} + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## class empty string + infoObject = self.makeInfoObject() + infoObject.woffMetadataVendor = {"name": "foo", "url": "bar", "class": ""} + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + self.tearDownUFO() + # woffMetadataCredits + ## no credits attribute + infoObject = self.makeInfoObject() + infoObject.woffMetadataCredits = {} + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## unknown attribute + infoObject = self.makeInfoObject() + infoObject.woffMetadataCredits = dict( + credits=[dict(name="foo")], notTheRightKey=1 + ) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## not a list + infoObject = self.makeInfoObject() + infoObject.woffMetadataCredits = dict(credits="abc") + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## no elements in credits + infoObject = self.makeInfoObject() + infoObject.woffMetadataCredits = dict(credits=[]) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## credit not a dict + infoObject = self.makeInfoObject() + infoObject.woffMetadataCredits = dict(credits=["abc"]) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## unknown key + infoObject = self.makeInfoObject() + infoObject.woffMetadataCredits = dict( + credits=[dict(name="foo", notTheRightKey=1)] + ) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## no name + infoObject = self.makeInfoObject() + infoObject.woffMetadataCredits = dict(credits=[dict(url="foo")]) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## name not a string + infoObject = self.makeInfoObject() + infoObject.woffMetadataCredits = dict(credits=[dict(name=1)]) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## url not a string + infoObject = self.makeInfoObject() + infoObject.woffMetadataCredits = dict(credits=[dict(name="foo", url=1)]) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## role not a string + infoObject = self.makeInfoObject() + infoObject.woffMetadataCredits = dict(credits=[dict(name="foo", role=1)]) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## dir not a string + infoObject = self.makeInfoObject() + infoObject.woffMetadataCredits = dict(credits=[dict(name="foo", dir=1)]) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## dir not ltr or rtl + infoObject = self.makeInfoObject() + infoObject.woffMetadataCredits = dict(credits=[dict(name="foo", dir="utd")]) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## class not a string + infoObject = self.makeInfoObject() + infoObject.woffMetadataCredits = dict(credits=[{"name": "foo", "class": 1}]) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # woffMetadataDescription + ## no url + infoObject = self.makeInfoObject() + infoObject.woffMetadataDescription = dict(text=[dict(text="foo")]) + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + self.tearDownUFO() + ## url not a string + infoObject = self.makeInfoObject() + infoObject.woffMetadataDescription = dict(text=[dict(text="foo")], url=1) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## no text + infoObject = self.makeInfoObject() + infoObject.woffMetadataDescription = dict(url="foo") + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text not a list + infoObject = self.makeInfoObject() + infoObject.woffMetadataDescription = dict(text="abc") + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text item not a dict + infoObject = self.makeInfoObject() + infoObject.woffMetadataDescription = dict(text=["abc"]) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text item unknown key + infoObject = self.makeInfoObject() + infoObject.woffMetadataDescription = dict( + text=[dict(text="foo", notTheRightKey=1)] + ) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text item missing text + infoObject = self.makeInfoObject() + infoObject.woffMetadataDescription = dict(text=[dict(language="foo")]) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text not a string + infoObject = self.makeInfoObject() + infoObject.woffMetadataDescription = dict(text=[dict(text=1)]) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## url not a string + infoObject = self.makeInfoObject() + infoObject.woffMetadataDescription = dict(text=[dict(text="foo", url=1)]) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## language not a string + infoObject = self.makeInfoObject() + infoObject.woffMetadataDescription = dict(text=[dict(text="foo", language=1)]) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## dir not ltr or rtl + infoObject = self.makeInfoObject() + infoObject.woffMetadataDescription = dict(text=[dict(text="foo", dir="utd")]) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## class not a string + infoObject = self.makeInfoObject() + infoObject.woffMetadataDescription = dict(text=[{"text": "foo", "class": 1}]) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # woffMetadataLicense + ## no url + infoObject = self.makeInfoObject() + infoObject.woffMetadataLicense = dict(text=[dict(text="foo")]) + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + self.tearDownUFO() + ## url not a string + infoObject = self.makeInfoObject() + infoObject.woffMetadataLicense = dict(text=[dict(text="foo")], url=1) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## id not a string + infoObject = self.makeInfoObject() + infoObject.woffMetadataLicense = dict(text=[dict(text="foo")], id=1) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## no text + infoObject = self.makeInfoObject() + infoObject.woffMetadataLicense = dict(url="foo") + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + self.tearDownUFO() + ## text not a list + infoObject = self.makeInfoObject() + infoObject.woffMetadataLicense = dict(text="abc") + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text item not a dict + infoObject = self.makeInfoObject() + infoObject.woffMetadataLicense = dict(text=["abc"]) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text item unknown key + infoObject = self.makeInfoObject() + infoObject.woffMetadataLicense = dict(text=[dict(text="foo", notTheRightKey=1)]) + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text item missing text + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataLicense = dict(text=[dict(language="foo")]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text not a string + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataLicense = dict(text=[dict(text=1)]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## url not a string + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataLicense = dict(text=[dict(text="foo", url=1)]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## language not a string + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataLicense = dict(text=[dict(text="foo", language=1)]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## dir not ltr or rtl + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataLicense = dict(text=[dict(text="foo", dir="utd")]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## class not a string + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataLicense = dict(text=[{"text": "foo", "class": 1}]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # woffMetadataCopyright + ## unknown attribute + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataCopyright = dict( + text=[dict(text="foo")], notTheRightKey=1 + ) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## no text + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataCopyright = dict() + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text not a list + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataCopyright = dict(text="abc") + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text item not a dict + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataCopyright = dict(text=["abc"]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text item unknown key + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataCopyright = dict( + text=[dict(text="foo", notTheRightKey=1)] + ) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text item missing text + infoObject = self.makeInfoObject() + infoObject.woffMetadataCopyright = dict(text=[dict(language="foo")]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text not a string + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataCopyright = dict(text=[dict(text=1)]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## url not a string + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataCopyright = dict(text=[dict(text="foo", url=1)]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## language not a string + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataCopyright = dict(text=[dict(text="foo", language=1)]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## dir not ltr or rtl + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataCopyright = dict(text=[dict(text="foo", dir="utd")]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## class not a string + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataCopyright = dict(text=[{"text": "foo", "class": 1}]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # woffMetadataTrademark + ## unknown attribute + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataTrademark = dict( + text=[dict(text="foo")], notTheRightKey=1 + ) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## no text + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataTrademark = dict() + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text not a list + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataTrademark = dict(text="abc") + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text item not a dict + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataTrademark = dict(text=["abc"]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text item unknown key + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataTrademark = dict( + text=[dict(text="foo", notTheRightKey=1)] + ) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text item missing text + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataTrademark = dict(text=[dict(language="foo")]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## text not a string + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataTrademark = dict(text=[dict(text=1)]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## url not a string + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataTrademark = dict(text=[dict(text="foo", url=1)]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## language not a string + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataTrademark = dict(text=[dict(text="foo", language=1)]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## dir not ltr or rtl + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataTrademark = dict(text=[dict(text="foo", dir="utd")]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## class not a string + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataTrademark = dict(text=[{"text": "foo", "class": 1}]) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # woffMetadataLicensee + ## no name + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataLicensee = dict() + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## unknown attribute + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataLicensee = dict(name="foo", notTheRightKey=1) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## name not a string + infoObject = self.makeInfoObject() + writer = UFOWriter(self.dstDir, formatVersion=3) + infoObject.woffMetadataLicensee = dict(name=1) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## dir options + infoObject = self.makeInfoObject() + infoObject.woffMetadataLicensee = dict(name="foo", dir="ltr") + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.woffMetadataLicensee = dict(name="foo", dir="rtl") + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + self.tearDownUFO() + ## dir not ltr or rtl + infoObject = self.makeInfoObject() + infoObject.woffMetadataLicensee = dict(name="foo", dir="utd") + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## have class + infoObject = self.makeInfoObject() + infoObject.woffMetadataLicensee = {"name": "foo", "class": "hello"} + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeInfo(infoObject) + self.tearDownUFO() + ## class not a string + infoObject = self.makeInfoObject() + infoObject.woffMetadataLicensee = {"name": "foo", "class": 1} + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + + def testGuidelinesWrite(self): + # x + ## not an int or float + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x="1")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # y + ## not an int or float + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(y="1")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # angle + ## < 0 + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, y=0, angle=-1)] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## > 360 + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, y=0, angle=361)] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # name + ## not a string + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, name=1)] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # color + ## not a string + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color=1)] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## not enough commas + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="1 0, 0, 0")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="1 0 0, 0")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="1 0 0 0")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## not enough parts + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color=", 0, 0, 0")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="1, , 0, 0")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="1, 0, , 0")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="1, 0, 0, ")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color=", , , ")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## not a number in all positions + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="r, 1, 1, 1")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="1, g, 1, 1")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="1, 1, b, 1")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="1, 1, 1, a")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## too many parts + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="1, 0, 0, 0, 0")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## < 0 in each position + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="-1, 0, 0, 0")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="0, -1, 0, 0")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="0, 0, -1, 0")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="0, 0, 0, -1")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## > 1 in each position + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="2, 0, 0, 0")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="0, 2, 0, 0")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="0, 0, 2, 0")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, color="0, 0, 0, 2")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + # identifier + ## duplicate + infoObject = self.makeInfoObject() + infoObject.guidelines = [ + dict(x=0, identifier="guide1"), + dict(y=0, identifier="guide1"), + ] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## below min + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, identifier="\0x1F")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() + ## above max + infoObject = self.makeInfoObject() + infoObject.guidelines = [dict(x=0, identifier="\0x7F")] + writer = UFOWriter(self.dstDir, formatVersion=3) + self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject) + self.tearDownUFO() # ------ # layers # ------ -class UFO3ReadLayersTestCase(unittest.TestCase): - def setUp(self): - self.tempDir = tempfile.mktemp() - os.mkdir(self.tempDir) - self.ufoPath = os.path.join(self.tempDir, "test.ufo") - - def tearDown(self): - shutil.rmtree(self.tempDir) - - def makeUFO(self, metaInfo=None, layerContents=None): - self.clearUFO() - if not os.path.exists(self.ufoPath): - os.mkdir(self.ufoPath) - # metainfo.plist - if metaInfo is None: - metaInfo = dict(creator="test", formatVersion=3) - path = os.path.join(self.ufoPath, "metainfo.plist") - with open(path, "wb") as f: - plistlib.dump(metaInfo, f) - # layers - if layerContents is None: - layerContents = [ - ("public.default", "glyphs"), - ("layer 1", "glyphs.layer 1"), - ("layer 2", "glyphs.layer 2"), - ] - if layerContents: - path = os.path.join(self.ufoPath, "layercontents.plist") - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - else: - layerContents = [("", "glyphs")] - for name, directory in layerContents: - glyphsPath = os.path.join(self.ufoPath, directory) - os.mkdir(glyphsPath) - contents = dict(a="a.glif") - path = os.path.join(glyphsPath, "contents.plist") - with open(path, "wb") as f: - plistlib.dump(contents, f) - path = os.path.join(glyphsPath, "a.glif") - with open(path, "w") as f: - f.write(" ") - - def clearUFO(self): - if os.path.exists(self.ufoPath): - shutil.rmtree(self.ufoPath) - - # valid - - def testValidRead(self): - # UFO 1 - self.makeUFO( - metaInfo=dict(creator="test", formatVersion=1), - layerContents=dict() - ) - reader = UFOReader(self.ufoPath, validate=True) - reader.getGlyphSet() - # UFO 2 - self.makeUFO( - metaInfo=dict(creator="test", formatVersion=2), - layerContents=dict() - ) - reader = UFOReader(self.ufoPath, validate=True) - reader.getGlyphSet() - # UFO 3 - self.makeUFO() - reader = UFOReader(self.ufoPath, validate=True) - reader.getGlyphSet() - - # missing layer contents - - def testMissingLayerContents(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - reader = UFOReader(self.ufoPath, validate=True) - self.assertRaises(UFOLibError, reader.getGlyphSet) - - # layer contents invalid format - - def testInvalidLayerContentsFormat(self): - # bogus - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - with open(path, "w") as f: - f.write("test") - reader = UFOReader(self.ufoPath, validate=True) - self.assertRaises(UFOLibError, reader.getGlyphSet) - # dict - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = { - "public.default" : "glyphs", - "layer 1" : "glyphs.layer 1", - "layer 2" : "glyphs.layer 2", - } - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - reader = UFOReader(self.ufoPath, validate=True) - self.assertRaises(UFOLibError, reader.getGlyphSet) - - # layer contents invalid name format - - def testInvalidLayerContentsNameFormat(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - (1, "glyphs"), - ("layer 1", "glyphs.layer 1"), - ("layer 2", "glyphs.layer 2") - ] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - reader = UFOReader(self.ufoPath, validate=True) - self.assertRaises(UFOLibError, reader.getGlyphSet) - - # layer contents invalid directory format - - def testInvalidLayerContentsDirectoryFormat(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - ("public.foregound", "glyphs"), - ("layer 1", 1), - ("layer 2", "glyphs.layer 2") - ] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - reader = UFOReader(self.ufoPath, validate=True) - self.assertRaises(UFOLibError, reader.getGlyphSet) - - # directory listed in contents not on disk - - def testLayerContentsHasMissingDirectory(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - ("public.foregound", "glyphs"), - ("layer 1", "glyphs.doesnotexist"), - ("layer 2", "glyphs.layer 2") - ] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - reader = UFOReader(self.ufoPath, validate=True) - self.assertRaises(UFOLibError, reader.getGlyphSet) - - # # directory on disk not listed in contents - # XXX should this raise an error? - # - # def testLayerContentsHasMissingDirectory(self): - # self.makeUFO() - # path = os.path.join(self.ufoPath, "layercontents.plist") - # os.remove(path) - # layerContents = [ - # ("public.foregound", "glyphs"), - # ("layer 1", "glyphs.layer 2") - # ] - # with open(path, "wb") as f: - # plistlib.dump(layerContents, f) - # reader = UFOReader(self.ufoPath, validate=True) - # with self.assertRaises(UFOLibError): - # reader.getGlyphSet() - - # no default layer on disk - - def testMissingDefaultLayer(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - ("layer 1", "glyphs.layer 1"), - ("layer 2", "glyphs.layer 2") - ] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - reader = UFOReader(self.ufoPath, validate=True) - self.assertRaises(UFOLibError, reader.getGlyphSet) - - # duplicate layer name - - def testDuplicateLayerName(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - ("public.foregound", "glyphs"), - ("layer 1", "glyphs.layer 1"), - ("layer 1", "glyphs.layer 2") - ] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - reader = UFOReader(self.ufoPath, validate=True) - self.assertRaises(UFOLibError, reader.getGlyphSet) - - # directory referenced by two layer names - - def testDuplicateLayerDirectory(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - ("public.foregound", "glyphs"), - ("layer 1", "glyphs.layer 1"), - ("layer 2", "glyphs.layer 1") - ] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - reader = UFOReader(self.ufoPath, validate=True) - self.assertRaises(UFOLibError, reader.getGlyphSet) - - # default without a name - - def testDefaultLayerNoName(self): - # get the glyph set - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - ("public.foregound", "glyphs"), - ("layer 1", "glyphs.layer 1"), - ("layer 2", "glyphs.layer 2") - ] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - reader = UFOReader(self.ufoPath, validate=True) - reader.getGlyphSet() - - # default with a name - - def testDefaultLayerName(self): - # get the name - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - ("custom name", "glyphs"), - ("layer 1", "glyphs.layer 1"), - ("layer 2", "glyphs.layer 2") - ] - expected = layerContents[0][0] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - reader = UFOReader(self.ufoPath, validate=True) - result = reader.getDefaultLayerName() - self.assertEqual(expected, result) - # get the glyph set - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - ("custom name", "glyphs"), - ("layer 1", "glyphs.layer 1"), - ("layer 2", "glyphs.layer 2") - ] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - reader = UFOReader(self.ufoPath, validate=True) - reader.getGlyphSet(expected) - - # layer order - - def testLayerOrder(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - ("public.foregound", "glyphs"), - ("layer 1", "glyphs.layer 1"), - ("layer 2", "glyphs.layer 2") - ] - expected = [name for (name, directory) in layerContents] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - reader = UFOReader(self.ufoPath, validate=True) - result = reader.getLayerNames() - self.assertEqual(expected, result) - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - ("layer 1", "glyphs.layer 1"), - ("public.foregound", "glyphs"), - ("layer 2", "glyphs.layer 2") - ] - expected = [name for (name, directory) in layerContents] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - reader = UFOReader(self.ufoPath, validate=True) - result = reader.getLayerNames() - self.assertEqual(expected, result) - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - ("layer 2", "glyphs.layer 2"), - ("layer 1", "glyphs.layer 1"), - ("public.foregound", "glyphs") - ] - expected = [name for (name, directory) in layerContents] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - reader = UFOReader(self.ufoPath, validate=True) - result = reader.getLayerNames() - self.assertEqual(expected, result) +class UFO3ReadLayersTestCase(unittest.TestCase): + def setUp(self): + self.tempDir = tempfile.mktemp() + os.mkdir(self.tempDir) + self.ufoPath = os.path.join(self.tempDir, "test.ufo") + + def tearDown(self): + shutil.rmtree(self.tempDir) + + def makeUFO(self, metaInfo=None, layerContents=None): + self.clearUFO() + if not os.path.exists(self.ufoPath): + os.mkdir(self.ufoPath) + # metainfo.plist + if metaInfo is None: + metaInfo = dict(creator="test", formatVersion=3) + path = os.path.join(self.ufoPath, "metainfo.plist") + with open(path, "wb") as f: + plistlib.dump(metaInfo, f) + # layers + if layerContents is None: + layerContents = [ + ("public.default", "glyphs"), + ("layer 1", "glyphs.layer 1"), + ("layer 2", "glyphs.layer 2"), + ] + if layerContents: + path = os.path.join(self.ufoPath, "layercontents.plist") + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + else: + layerContents = [("", "glyphs")] + for name, directory in layerContents: + glyphsPath = os.path.join(self.ufoPath, directory) + os.mkdir(glyphsPath) + contents = dict(a="a.glif") + path = os.path.join(glyphsPath, "contents.plist") + with open(path, "wb") as f: + plistlib.dump(contents, f) + path = os.path.join(glyphsPath, "a.glif") + with open(path, "w") as f: + f.write(" ") + + def clearUFO(self): + if os.path.exists(self.ufoPath): + shutil.rmtree(self.ufoPath) + + # valid + + def testValidRead(self): + # UFO 1 + self.makeUFO( + metaInfo=dict(creator="test", formatVersion=1), layerContents=dict() + ) + reader = UFOReader(self.ufoPath, validate=True) + reader.getGlyphSet() + # UFO 2 + self.makeUFO( + metaInfo=dict(creator="test", formatVersion=2), layerContents=dict() + ) + reader = UFOReader(self.ufoPath, validate=True) + reader.getGlyphSet() + # UFO 3 + self.makeUFO() + reader = UFOReader(self.ufoPath, validate=True) + reader.getGlyphSet() + + # missing layer contents + + def testMissingLayerContents(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + reader = UFOReader(self.ufoPath, validate=True) + self.assertRaises(UFOLibError, reader.getGlyphSet) + + # layer contents invalid format + + def testInvalidLayerContentsFormat(self): + # bogus + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + with open(path, "w") as f: + f.write("test") + reader = UFOReader(self.ufoPath, validate=True) + self.assertRaises(UFOLibError, reader.getGlyphSet) + # dict + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = { + "public.default": "glyphs", + "layer 1": "glyphs.layer 1", + "layer 2": "glyphs.layer 2", + } + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + reader = UFOReader(self.ufoPath, validate=True) + self.assertRaises(UFOLibError, reader.getGlyphSet) + + # layer contents invalid name format + + def testInvalidLayerContentsNameFormat(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [ + (1, "glyphs"), + ("layer 1", "glyphs.layer 1"), + ("layer 2", "glyphs.layer 2"), + ] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + reader = UFOReader(self.ufoPath, validate=True) + self.assertRaises(UFOLibError, reader.getGlyphSet) + + # layer contents invalid directory format + + def testInvalidLayerContentsDirectoryFormat(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [ + ("public.foregound", "glyphs"), + ("layer 1", 1), + ("layer 2", "glyphs.layer 2"), + ] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + reader = UFOReader(self.ufoPath, validate=True) + self.assertRaises(UFOLibError, reader.getGlyphSet) + + # directory listed in contents not on disk + + def testLayerContentsHasMissingDirectory(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [ + ("public.foregound", "glyphs"), + ("layer 1", "glyphs.doesnotexist"), + ("layer 2", "glyphs.layer 2"), + ] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + reader = UFOReader(self.ufoPath, validate=True) + self.assertRaises(UFOLibError, reader.getGlyphSet) + + # # directory on disk not listed in contents + # XXX should this raise an error? + # + # def testLayerContentsHasMissingDirectory(self): + # self.makeUFO() + # path = os.path.join(self.ufoPath, "layercontents.plist") + # os.remove(path) + # layerContents = [ + # ("public.foregound", "glyphs"), + # ("layer 1", "glyphs.layer 2") + # ] + # with open(path, "wb") as f: + # plistlib.dump(layerContents, f) + # reader = UFOReader(self.ufoPath, validate=True) + # with self.assertRaises(UFOLibError): + # reader.getGlyphSet() + + # no default layer on disk + + def testMissingDefaultLayer(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [("layer 1", "glyphs.layer 1"), ("layer 2", "glyphs.layer 2")] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + reader = UFOReader(self.ufoPath, validate=True) + self.assertRaises(UFOLibError, reader.getGlyphSet) + + # duplicate layer name + + def testDuplicateLayerName(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [ + ("public.foregound", "glyphs"), + ("layer 1", "glyphs.layer 1"), + ("layer 1", "glyphs.layer 2"), + ] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + reader = UFOReader(self.ufoPath, validate=True) + self.assertRaises(UFOLibError, reader.getGlyphSet) + + # directory referenced by two layer names + + def testDuplicateLayerDirectory(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [ + ("public.foregound", "glyphs"), + ("layer 1", "glyphs.layer 1"), + ("layer 2", "glyphs.layer 1"), + ] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + reader = UFOReader(self.ufoPath, validate=True) + self.assertRaises(UFOLibError, reader.getGlyphSet) + + # default without a name + + def testDefaultLayerNoName(self): + # get the glyph set + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [ + ("public.foregound", "glyphs"), + ("layer 1", "glyphs.layer 1"), + ("layer 2", "glyphs.layer 2"), + ] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + reader = UFOReader(self.ufoPath, validate=True) + reader.getGlyphSet() + + # default with a name + + def testDefaultLayerName(self): + # get the name + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [ + ("custom name", "glyphs"), + ("layer 1", "glyphs.layer 1"), + ("layer 2", "glyphs.layer 2"), + ] + expected = layerContents[0][0] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + reader = UFOReader(self.ufoPath, validate=True) + result = reader.getDefaultLayerName() + self.assertEqual(expected, result) + # get the glyph set + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [ + ("custom name", "glyphs"), + ("layer 1", "glyphs.layer 1"), + ("layer 2", "glyphs.layer 2"), + ] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + reader = UFOReader(self.ufoPath, validate=True) + reader.getGlyphSet(expected) + + # layer order + + def testLayerOrder(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [ + ("public.foregound", "glyphs"), + ("layer 1", "glyphs.layer 1"), + ("layer 2", "glyphs.layer 2"), + ] + expected = [name for (name, directory) in layerContents] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + reader = UFOReader(self.ufoPath, validate=True) + result = reader.getLayerNames() + self.assertEqual(expected, result) + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [ + ("layer 1", "glyphs.layer 1"), + ("public.foregound", "glyphs"), + ("layer 2", "glyphs.layer 2"), + ] + expected = [name for (name, directory) in layerContents] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + reader = UFOReader(self.ufoPath, validate=True) + result = reader.getLayerNames() + self.assertEqual(expected, result) + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [ + ("layer 2", "glyphs.layer 2"), + ("layer 1", "glyphs.layer 1"), + ("public.foregound", "glyphs"), + ] + expected = [name for (name, directory) in layerContents] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + reader = UFOReader(self.ufoPath, validate=True) + result = reader.getLayerNames() + self.assertEqual(expected, result) class UFO3WriteLayersTestCase(unittest.TestCase): + def setUp(self): + self.tempDir = tempfile.mktemp() + os.mkdir(self.tempDir) + self.ufoPath = os.path.join(self.tempDir, "test.ufo") + + def tearDown(self): + shutil.rmtree(self.tempDir) + + def makeUFO(self, metaInfo=None, layerContents=None): + self.clearUFO() + if not os.path.exists(self.ufoPath): + os.mkdir(self.ufoPath) + # metainfo.plist + if metaInfo is None: + metaInfo = dict(creator="test", formatVersion=3) + path = os.path.join(self.ufoPath, "metainfo.plist") + with open(path, "wb") as f: + plistlib.dump(metaInfo, f) + # layers + if layerContents is None: + layerContents = [ + ("public.default", "glyphs"), + ("layer 1", "glyphs.layer 1"), + ("layer 2", "glyphs.layer 2"), + ] + if layerContents: + path = os.path.join(self.ufoPath, "layercontents.plist") + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + else: + layerContents = [("", "glyphs")] + for name, directory in layerContents: + glyphsPath = os.path.join(self.ufoPath, directory) + os.mkdir(glyphsPath) + contents = dict(a="a.glif") + path = os.path.join(glyphsPath, "contents.plist") + with open(path, "wb") as f: + plistlib.dump(contents, f) + path = os.path.join(glyphsPath, "a.glif") + with open(path, "w") as f: + f.write(" ") + + def clearUFO(self): + if os.path.exists(self.ufoPath): + shutil.rmtree(self.ufoPath) + + # __init__: missing layer contents + + def testMissingLayerContents(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + self.assertRaises(UFOLibError, UFOWriter, self.ufoPath) + + # __init__: layer contents invalid format + + def testInvalidLayerContentsFormat(self): + # bogus + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + with open(path, "w") as f: + f.write("test") + self.assertRaises(UFOLibError, UFOWriter, self.ufoPath) + # dict + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = { + "public.default": "glyphs", + "layer 1": "glyphs.layer 1", + "layer 2": "glyphs.layer 2", + } + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + self.assertRaises(UFOLibError, UFOWriter, self.ufoPath) + + # __init__: layer contents invalid name format + + def testInvalidLayerContentsNameFormat(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [ + (1, "glyphs"), + ("layer 1", "glyphs.layer 1"), + ("layer 2", "glyphs.layer 2"), + ] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + self.assertRaises(UFOLibError, UFOWriter, self.ufoPath) + + # __init__: layer contents invalid directory format + + def testInvalidLayerContentsDirectoryFormat(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [ + ("public.foregound", "glyphs"), + ("layer 1", 1), + ("layer 2", "glyphs.layer 2"), + ] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + self.assertRaises(UFOLibError, UFOWriter, self.ufoPath) + + # __init__: directory listed in contents not on disk + + def testLayerContentsHasMissingDirectory(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [ + ("public.foregound", "glyphs"), + ("layer 1", "glyphs.doesnotexist"), + ("layer 2", "glyphs.layer 2"), + ] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + self.assertRaises(UFOLibError, UFOWriter, self.ufoPath) + + # __init__: no default layer on disk + + def testMissingDefaultLayer(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [("layer 1", "glyphs.layer 1"), ("layer 2", "glyphs.layer 2")] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + self.assertRaises(UFOLibError, UFOWriter, self.ufoPath) + + # __init__: duplicate layer name + + def testDuplicateLayerName(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [ + ("public.foregound", "glyphs"), + ("layer 1", "glyphs.layer 1"), + ("layer 1", "glyphs.layer 2"), + ] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + self.assertRaises(UFOLibError, UFOWriter, self.ufoPath) + + # __init__: directory referenced by two layer names + + def testDuplicateLayerDirectory(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [ + ("public.foregound", "glyphs"), + ("layer 1", "glyphs.layer 1"), + ("layer 2", "glyphs.layer 1"), + ] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + self.assertRaises(UFOLibError, UFOWriter, self.ufoPath) + + # __init__: default without a name + + def testDefaultLayerNoName(self): + # get the glyph set + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [ + ("public.foregound", "glyphs"), + ("layer 1", "glyphs.layer 1"), + ("layer 2", "glyphs.layer 2"), + ] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + writer = UFOWriter(self.ufoPath) + + # __init__: default with a name + + def testDefaultLayerName(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "layercontents.plist") + os.remove(path) + layerContents = [ + ("custom name", "glyphs"), + ("layer 1", "glyphs.layer 1"), + ("layer 2", "glyphs.layer 2"), + ] + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + writer = UFOWriter(self.ufoPath) + + # __init__: up convert 1 > 3 + + def testUpConvert1To3(self): + self.makeUFO( + metaInfo=dict(creator="test", formatVersion=1), layerContents=dict() + ) + writer = UFOWriter(self.ufoPath) + writer.writeLayerContents(["public.default"]) + path = os.path.join(self.ufoPath, "layercontents.plist") + with open(path, "rb") as f: + result = plistlib.load(f) + expected = [["public.default", "glyphs"]] + self.assertEqual(expected, result) + + # __init__: up convert 2 > 3 + + def testUpConvert2To3(self): + self.makeUFO( + metaInfo=dict(creator="test", formatVersion=2), layerContents=dict() + ) + writer = UFOWriter(self.ufoPath) + writer.writeLayerContents(["public.default"]) + path = os.path.join(self.ufoPath, "layercontents.plist") + with open(path, "rb") as f: + result = plistlib.load(f) + expected = [["public.default", "glyphs"]] + self.assertEqual(expected, result) + + # __init__: down convert 3 > 1 + + def testDownConvert3To1(self): + self.makeUFO() + self.assertRaises(UFOLibError, UFOWriter, self.ufoPath, formatVersion=1) + + # __init__: down convert 3 > 2 + + def testDownConvert3To2(self): + self.makeUFO() + self.assertRaises(UFOLibError, UFOWriter, self.ufoPath, formatVersion=2) + + # get glyph sets + + def testGetGlyphSets(self): + self.makeUFO() + # hack contents.plist + path = os.path.join(self.ufoPath, "glyphs.layer 1", "contents.plist") + with open(path, "wb") as f: + plistlib.dump(dict(b="a.glif"), f) + path = os.path.join(self.ufoPath, "glyphs.layer 2", "contents.plist") + with open(path, "wb") as f: + plistlib.dump(dict(c="a.glif"), f) + # now test + writer = UFOWriter(self.ufoPath) + # default + expected = ["a"] + result = list(writer.getGlyphSet().keys()) + self.assertEqual(expected, result) + # layer 1 + expected = ["b"] + result = list(writer.getGlyphSet("layer 1", defaultLayer=False).keys()) + self.assertEqual(expected, result) + # layer 2 + expected = ["c"] + result = list(writer.getGlyphSet("layer 2", defaultLayer=False).keys()) + self.assertEqual(expected, result) + + def testGetGlyphSetNoContents(self): + self.makeUFO() + os.remove(os.path.join(self.ufoPath, "glyphs.layer 1", "contents.plist")) + + reader = UFOReader(self.ufoPath, validate=True) + with self.assertRaises(GlifLibError): + reader.getGlyphSet("layer 1") + + writer = UFOWriter(self.ufoPath, validate=True) + with self.assertRaises(GlifLibError): + writer.getGlyphSet("layer 1", defaultLayer=False, expectContentsFile=True) + + # There's a separate code path for < v3 UFOs. + with open(os.path.join(self.ufoPath, "metainfo.plist"), "wb") as f: + plistlib.dump(dict(creator="test", formatVersion=2), f) + os.remove(os.path.join(self.ufoPath, "glyphs", "contents.plist")) + writer = UFOWriter(self.ufoPath, validate=True, formatVersion=2) + with self.assertRaises(GlifLibError): + writer.getGlyphSet(expectContentsFile=True) + + # make a new font with two layers + + def testNewFontOneLayer(self): + self.clearUFO() + writer = UFOWriter(self.ufoPath) + writer.getGlyphSet() + writer.writeLayerContents(["public.default"]) + # directory + path = os.path.join(self.ufoPath, "glyphs") + exists = os.path.exists(path) + self.assertEqual(True, exists) + # layer contents + path = os.path.join(self.ufoPath, "layercontents.plist") + with open(path, "rb") as f: + result = plistlib.load(f) + expected = [["public.default", "glyphs"]] + self.assertEqual(expected, result) + + def testNewFontThreeLayers(self): + self.clearUFO() + writer = UFOWriter(self.ufoPath) + writer.getGlyphSet("layer 1", defaultLayer=False) + writer.getGlyphSet() + writer.getGlyphSet("layer 2", defaultLayer=False) + writer.writeLayerContents(["layer 1", "public.default", "layer 2"]) + # directories + path = os.path.join(self.ufoPath, "glyphs") + exists = os.path.exists(path) + self.assertEqual(True, exists) + path = os.path.join(self.ufoPath, "glyphs.layer 1") + exists = os.path.exists(path) + self.assertEqual(True, exists) + path = os.path.join(self.ufoPath, "glyphs.layer 2") + exists = os.path.exists(path) + self.assertEqual(True, exists) + # layer contents + path = os.path.join(self.ufoPath, "layercontents.plist") + with open(path, "rb") as f: + result = plistlib.load(f) + expected = [ + ["layer 1", "glyphs.layer 1"], + ["public.default", "glyphs"], + ["layer 2", "glyphs.layer 2"], + ] + self.assertEqual(expected, result) + + # add a layer to an existing font + + def testAddLayerToExistingFont(self): + self.makeUFO() + writer = UFOWriter(self.ufoPath) + writer.getGlyphSet("layer 3", defaultLayer=False) + writer.writeLayerContents(["public.default", "layer 1", "layer 2", "layer 3"]) + # directories + path = os.path.join(self.ufoPath, "glyphs") + exists = os.path.exists(path) + self.assertEqual(True, exists) + path = os.path.join(self.ufoPath, "glyphs.layer 1") + exists = os.path.exists(path) + self.assertEqual(True, exists) + path = os.path.join(self.ufoPath, "glyphs.layer 2") + exists = os.path.exists(path) + self.assertEqual(True, exists) + path = os.path.join(self.ufoPath, "glyphs.layer 3") + exists = os.path.exists(path) + self.assertEqual(True, exists) + # layer contents + path = os.path.join(self.ufoPath, "layercontents.plist") + with open(path, "rb") as f: + result = plistlib.load(f) + expected = [ + ["public.default", "glyphs"], + ["layer 1", "glyphs.layer 1"], + ["layer 2", "glyphs.layer 2"], + ["layer 3", "glyphs.layer 3"], + ] + self.assertEqual(expected, result) + + # rename valid name + + def testRenameLayer(self): + self.makeUFO() + writer = UFOWriter(self.ufoPath) + writer.renameGlyphSet("layer 1", "layer 3") + writer.writeLayerContents(["public.default", "layer 3", "layer 2"]) + # directories + path = os.path.join(self.ufoPath, "glyphs") + exists = os.path.exists(path) + self.assertEqual(True, exists) + path = os.path.join(self.ufoPath, "glyphs.layer 1") + exists = os.path.exists(path) + self.assertEqual(False, exists) + path = os.path.join(self.ufoPath, "glyphs.layer 2") + exists = os.path.exists(path) + self.assertEqual(True, exists) + path = os.path.join(self.ufoPath, "glyphs.layer 3") + exists = os.path.exists(path) + self.assertEqual(True, exists) + # layer contents + path = os.path.join(self.ufoPath, "layercontents.plist") + with open(path, "rb") as f: + result = plistlib.load(f) + expected = [ + ["public.default", "glyphs"], + ["layer 3", "glyphs.layer 3"], + ["layer 2", "glyphs.layer 2"], + ] + self.assertEqual(expected, result) + + def testRenameLayerDefault(self): + self.makeUFO() + writer = UFOWriter(self.ufoPath) + writer.renameGlyphSet("public.default", "layer xxx") + writer.renameGlyphSet("layer 1", "layer 1", defaultLayer=True) + writer.writeLayerContents(["layer xxx", "layer 1", "layer 2"]) + path = os.path.join(self.ufoPath, "glyphs") + exists = os.path.exists(path) + self.assertEqual(True, exists) + path = os.path.join(self.ufoPath, "glyphs.layer 1") + exists = os.path.exists(path) + self.assertEqual(False, exists) + path = os.path.join(self.ufoPath, "glyphs.layer 2") + exists = os.path.exists(path) + self.assertEqual(True, exists) + path = os.path.join(self.ufoPath, "glyphs.layer xxx") + exists = os.path.exists(path) + self.assertEqual(True, exists) + # layer contents + path = os.path.join(self.ufoPath, "layercontents.plist") + with open(path, "rb") as f: + result = plistlib.load(f) + expected = [ + ["layer xxx", "glyphs.layer xxx"], + ["layer 1", "glyphs"], + ["layer 2", "glyphs.layer 2"], + ] + self.assertEqual(expected, result) + + # rename duplicate name + + def testRenameLayerDuplicateName(self): + self.makeUFO() + writer = UFOWriter(self.ufoPath) + self.assertRaises(UFOLibError, writer.renameGlyphSet, "layer 1", "layer 2") + + # rename unknown layer + + def testRenameLayerUnknownName(self): + self.makeUFO() + writer = UFOWriter(self.ufoPath) + self.assertRaises( + UFOLibError, writer.renameGlyphSet, "does not exist", "layer 2" + ) + + # remove valid layer + + def testRemoveLayer(self): + self.makeUFO() + writer = UFOWriter(self.ufoPath) + writer.deleteGlyphSet("layer 1") + writer.writeLayerContents(["public.default", "layer 2"]) + # directories + path = os.path.join(self.ufoPath, "glyphs") + exists = os.path.exists(path) + self.assertEqual(True, exists) + path = os.path.join(self.ufoPath, "glyphs.layer 1") + exists = os.path.exists(path) + self.assertEqual(False, exists) + path = os.path.join(self.ufoPath, "glyphs.layer 2") + exists = os.path.exists(path) + self.assertEqual(True, exists) + # layer contents + path = os.path.join(self.ufoPath, "layercontents.plist") + with open(path, "rb") as f: + result = plistlib.load(f) + expected = [["public.default", "glyphs"], ["layer 2", "glyphs.layer 2"]] + self.assertEqual(expected, result) + + # remove default layer + + def testRemoveDefaultLayer(self): + self.makeUFO() + writer = UFOWriter(self.ufoPath) + writer.deleteGlyphSet("public.default") + writer.writeLayerContents(["layer 1", "layer 2"]) + # directories + path = os.path.join(self.ufoPath, "glyphs") + self.assertEqual(False, os.path.exists(path)) + path = os.path.join(self.ufoPath, "glyphs.layer 1") + self.assertEqual(True, os.path.exists(path)) + path = os.path.join(self.ufoPath, "glyphs.layer 2") + self.assertEqual(True, os.path.exists(path)) + # layer contents + path = os.path.join(self.ufoPath, "layercontents.plist") + with open(path, "rb") as f: + result = plistlib.load(f) + expected = [["layer 1", "glyphs.layer 1"], ["layer 2", "glyphs.layer 2"]] + self.assertEqual(expected, result) + + # remove unknown layer + + def testRemoveDefaultLayer2(self): + self.makeUFO() + writer = UFOWriter(self.ufoPath) + self.assertRaises(UFOLibError, writer.deleteGlyphSet, "does not exist") + + def testWriteAsciiLayerOrder(self): + self.makeUFO( + layerContents=[ + ["public.default", "glyphs"], + ["layer 1", "glyphs.layer 1"], + ["layer 2", "glyphs.layer 2"], + ] + ) + writer = UFOWriter(self.ufoPath) + writer.writeLayerContents(["public.default", "layer 2", "layer 1"]) + path = os.path.join(self.ufoPath, "layercontents.plist") + with open(path, "rb") as f: + result = plistlib.load(f) + expected = [ + ["public.default", "glyphs"], + ["layer 2", "glyphs.layer 2"], + ["layer 1", "glyphs.layer 1"], + ] + self.assertEqual(expected, result) + for layerName, _ in result: + assert isinstance(layerName, str) - def setUp(self): - self.tempDir = tempfile.mktemp() - os.mkdir(self.tempDir) - self.ufoPath = os.path.join(self.tempDir, "test.ufo") - - def tearDown(self): - shutil.rmtree(self.tempDir) - - def makeUFO(self, metaInfo=None, layerContents=None): - self.clearUFO() - if not os.path.exists(self.ufoPath): - os.mkdir(self.ufoPath) - # metainfo.plist - if metaInfo is None: - metaInfo = dict(creator="test", formatVersion=3) - path = os.path.join(self.ufoPath, "metainfo.plist") - with open(path, "wb") as f: - plistlib.dump(metaInfo, f) - # layers - if layerContents is None: - layerContents = [ - ("public.default", "glyphs"), - ("layer 1", "glyphs.layer 1"), - ("layer 2", "glyphs.layer 2"), - ] - if layerContents: - path = os.path.join(self.ufoPath, "layercontents.plist") - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - else: - layerContents = [("", "glyphs")] - for name, directory in layerContents: - glyphsPath = os.path.join(self.ufoPath, directory) - os.mkdir(glyphsPath) - contents = dict(a="a.glif") - path = os.path.join(glyphsPath, "contents.plist") - with open(path, "wb") as f: - plistlib.dump(contents, f) - path = os.path.join(glyphsPath, "a.glif") - with open(path, "w") as f: - f.write(" ") - - def clearUFO(self): - if os.path.exists(self.ufoPath): - shutil.rmtree(self.ufoPath) - - # __init__: missing layer contents - - def testMissingLayerContents(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - self.assertRaises(UFOLibError, UFOWriter, self.ufoPath) - - # __init__: layer contents invalid format - - def testInvalidLayerContentsFormat(self): - # bogus - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - with open(path, "w") as f: - f.write("test") - self.assertRaises(UFOLibError, UFOWriter, self.ufoPath) - # dict - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = { - "public.default" : "glyphs", - "layer 1" : "glyphs.layer 1", - "layer 2" : "glyphs.layer 2", - } - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - self.assertRaises(UFOLibError, UFOWriter, self.ufoPath) - - # __init__: layer contents invalid name format - - def testInvalidLayerContentsNameFormat(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - (1, "glyphs"), - ("layer 1", "glyphs.layer 1"), - ("layer 2", "glyphs.layer 2") - ] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - self.assertRaises(UFOLibError, UFOWriter, self.ufoPath) - - # __init__: layer contents invalid directory format - - def testInvalidLayerContentsDirectoryFormat(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - ("public.foregound", "glyphs"), - ("layer 1", 1), - ("layer 2", "glyphs.layer 2") - ] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - self.assertRaises(UFOLibError, UFOWriter, self.ufoPath) - - # __init__: directory listed in contents not on disk - - def testLayerContentsHasMissingDirectory(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - ("public.foregound", "glyphs"), - ("layer 1", "glyphs.doesnotexist"), - ("layer 2", "glyphs.layer 2") - ] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - self.assertRaises(UFOLibError, UFOWriter, self.ufoPath) - - # __init__: no default layer on disk - - def testMissingDefaultLayer(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - ("layer 1", "glyphs.layer 1"), - ("layer 2", "glyphs.layer 2") - ] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - self.assertRaises(UFOLibError, UFOWriter, self.ufoPath) - - # __init__: duplicate layer name - - def testDuplicateLayerName(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - ("public.foregound", "glyphs"), - ("layer 1", "glyphs.layer 1"), - ("layer 1", "glyphs.layer 2") - ] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - self.assertRaises(UFOLibError, UFOWriter, self.ufoPath) - - # __init__: directory referenced by two layer names - - def testDuplicateLayerDirectory(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - ("public.foregound", "glyphs"), - ("layer 1", "glyphs.layer 1"), - ("layer 2", "glyphs.layer 1") - ] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - self.assertRaises(UFOLibError, UFOWriter, self.ufoPath) - - # __init__: default without a name - - def testDefaultLayerNoName(self): - # get the glyph set - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - ("public.foregound", "glyphs"), - ("layer 1", "glyphs.layer 1"), - ("layer 2", "glyphs.layer 2") - ] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - writer = UFOWriter(self.ufoPath) - - # __init__: default with a name - - def testDefaultLayerName(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "layercontents.plist") - os.remove(path) - layerContents = [ - ("custom name", "glyphs"), - ("layer 1", "glyphs.layer 1"), - ("layer 2", "glyphs.layer 2") - ] - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - writer = UFOWriter(self.ufoPath) - - # __init__: up convert 1 > 3 - - def testUpConvert1To3(self): - self.makeUFO( - metaInfo=dict(creator="test", formatVersion=1), - layerContents=dict() - ) - writer = UFOWriter(self.ufoPath) - writer.writeLayerContents(["public.default"]) - path = os.path.join(self.ufoPath, "layercontents.plist") - with open(path, "rb") as f: - result = plistlib.load(f) - expected = [["public.default", "glyphs"]] - self.assertEqual(expected, result) - - # __init__: up convert 2 > 3 - - def testUpConvert2To3(self): - self.makeUFO( - metaInfo=dict(creator="test", formatVersion=2), - layerContents=dict() - ) - writer = UFOWriter(self.ufoPath) - writer.writeLayerContents(["public.default"]) - path = os.path.join(self.ufoPath, "layercontents.plist") - with open(path, "rb") as f: - result = plistlib.load(f) - expected = [["public.default", "glyphs"]] - self.assertEqual(expected, result) - - # __init__: down convert 3 > 1 - - def testDownConvert3To1(self): - self.makeUFO() - self.assertRaises(UFOLibError, UFOWriter, self.ufoPath, formatVersion=1) - - # __init__: down convert 3 > 2 - - def testDownConvert3To2(self): - self.makeUFO() - self.assertRaises(UFOLibError, UFOWriter, self.ufoPath, formatVersion=2) - - # get glyph sets - - def testGetGlyphSets(self): - self.makeUFO() - # hack contents.plist - path = os.path.join(self.ufoPath, "glyphs.layer 1", "contents.plist") - with open(path, "wb") as f: - plistlib.dump(dict(b="a.glif"), f) - path = os.path.join(self.ufoPath, "glyphs.layer 2", "contents.plist") - with open(path, "wb") as f: - plistlib.dump(dict(c="a.glif"), f) - # now test - writer = UFOWriter(self.ufoPath) - # default - expected = ["a"] - result = list(writer.getGlyphSet().keys()) - self.assertEqual(expected, result) - # layer 1 - expected = ["b"] - result = list(writer.getGlyphSet("layer 1", defaultLayer=False).keys()) - self.assertEqual(expected, result) - # layer 2 - expected = ["c"] - result = list(writer.getGlyphSet("layer 2", defaultLayer=False).keys()) - self.assertEqual(expected, result) - - def testGetGlyphSetNoContents(self): - self.makeUFO() - os.remove(os.path.join(self.ufoPath, "glyphs.layer 1", "contents.plist")) - - reader = UFOReader(self.ufoPath, validate=True) - with self.assertRaises(GlifLibError): - reader.getGlyphSet("layer 1") - - writer = UFOWriter(self.ufoPath, validate=True) - with self.assertRaises(GlifLibError): - writer.getGlyphSet("layer 1", defaultLayer=False, expectContentsFile=True) - - # There's a separate code path for < v3 UFOs. - with open(os.path.join(self.ufoPath, "metainfo.plist"), "wb") as f: - plistlib.dump(dict(creator="test", formatVersion=2), f) - os.remove(os.path.join(self.ufoPath, "glyphs", "contents.plist")) - writer = UFOWriter(self.ufoPath, validate=True, formatVersion=2) - with self.assertRaises(GlifLibError): - writer.getGlyphSet(expectContentsFile=True) - - # make a new font with two layers - - def testNewFontOneLayer(self): - self.clearUFO() - writer = UFOWriter(self.ufoPath) - writer.getGlyphSet() - writer.writeLayerContents(["public.default"]) - # directory - path = os.path.join(self.ufoPath, "glyphs") - exists = os.path.exists(path) - self.assertEqual(True, exists) - # layer contents - path = os.path.join(self.ufoPath, "layercontents.plist") - with open(path, "rb") as f: - result = plistlib.load(f) - expected = [["public.default", "glyphs"]] - self.assertEqual(expected, result) - - def testNewFontThreeLayers(self): - self.clearUFO() - writer = UFOWriter(self.ufoPath) - writer.getGlyphSet("layer 1", defaultLayer=False) - writer.getGlyphSet() - writer.getGlyphSet("layer 2", defaultLayer=False) - writer.writeLayerContents(["layer 1", "public.default", "layer 2"]) - # directories - path = os.path.join(self.ufoPath, "glyphs") - exists = os.path.exists(path) - self.assertEqual(True, exists) - path = os.path.join(self.ufoPath, "glyphs.layer 1") - exists = os.path.exists(path) - self.assertEqual(True, exists) - path = os.path.join(self.ufoPath, "glyphs.layer 2") - exists = os.path.exists(path) - self.assertEqual(True, exists) - # layer contents - path = os.path.join(self.ufoPath, "layercontents.plist") - with open(path, "rb") as f: - result = plistlib.load(f) - expected = [["layer 1", "glyphs.layer 1"], ["public.default", "glyphs"], ["layer 2", "glyphs.layer 2"]] - self.assertEqual(expected, result) - - # add a layer to an existing font - - def testAddLayerToExistingFont(self): - self.makeUFO() - writer = UFOWriter(self.ufoPath) - writer.getGlyphSet("layer 3", defaultLayer=False) - writer.writeLayerContents(["public.default", "layer 1", "layer 2", "layer 3"]) - # directories - path = os.path.join(self.ufoPath, "glyphs") - exists = os.path.exists(path) - self.assertEqual(True, exists) - path = os.path.join(self.ufoPath, "glyphs.layer 1") - exists = os.path.exists(path) - self.assertEqual(True, exists) - path = os.path.join(self.ufoPath, "glyphs.layer 2") - exists = os.path.exists(path) - self.assertEqual(True, exists) - path = os.path.join(self.ufoPath, "glyphs.layer 3") - exists = os.path.exists(path) - self.assertEqual(True, exists) - # layer contents - path = os.path.join(self.ufoPath, "layercontents.plist") - with open(path, "rb") as f: - result = plistlib.load(f) - expected = [['public.default', 'glyphs'], ['layer 1', 'glyphs.layer 1'], ['layer 2', 'glyphs.layer 2'], ["layer 3", "glyphs.layer 3"]] - self.assertEqual(expected, result) - - # rename valid name - - def testRenameLayer(self): - self.makeUFO() - writer = UFOWriter(self.ufoPath) - writer.renameGlyphSet("layer 1", "layer 3") - writer.writeLayerContents(["public.default", "layer 3", "layer 2"]) - # directories - path = os.path.join(self.ufoPath, "glyphs") - exists = os.path.exists(path) - self.assertEqual(True, exists) - path = os.path.join(self.ufoPath, "glyphs.layer 1") - exists = os.path.exists(path) - self.assertEqual(False, exists) - path = os.path.join(self.ufoPath, "glyphs.layer 2") - exists = os.path.exists(path) - self.assertEqual(True, exists) - path = os.path.join(self.ufoPath, "glyphs.layer 3") - exists = os.path.exists(path) - self.assertEqual(True, exists) - # layer contents - path = os.path.join(self.ufoPath, "layercontents.plist") - with open(path, "rb") as f: - result = plistlib.load(f) - expected = [['public.default', 'glyphs'], ['layer 3', 'glyphs.layer 3'], ['layer 2', 'glyphs.layer 2']] - self.assertEqual(expected, result) - - def testRenameLayerDefault(self): - self.makeUFO() - writer = UFOWriter(self.ufoPath) - writer.renameGlyphSet("public.default", "layer xxx") - writer.renameGlyphSet("layer 1", "layer 1", defaultLayer=True) - writer.writeLayerContents(["layer xxx", "layer 1", "layer 2"]) - path = os.path.join(self.ufoPath, "glyphs") - exists = os.path.exists(path) - self.assertEqual(True, exists) - path = os.path.join(self.ufoPath, "glyphs.layer 1") - exists = os.path.exists(path) - self.assertEqual(False, exists) - path = os.path.join(self.ufoPath, "glyphs.layer 2") - exists = os.path.exists(path) - self.assertEqual(True, exists) - path = os.path.join(self.ufoPath, "glyphs.layer xxx") - exists = os.path.exists(path) - self.assertEqual(True, exists) - # layer contents - path = os.path.join(self.ufoPath, "layercontents.plist") - with open(path, "rb") as f: - result = plistlib.load(f) - expected = [['layer xxx', 'glyphs.layer xxx'], ['layer 1', 'glyphs'], ['layer 2', 'glyphs.layer 2']] - self.assertEqual(expected, result) - - # rename duplicate name - - def testRenameLayerDuplicateName(self): - self.makeUFO() - writer = UFOWriter(self.ufoPath) - self.assertRaises(UFOLibError, writer.renameGlyphSet, "layer 1", "layer 2") - - # rename unknown layer - - def testRenameLayerUnknownName(self): - self.makeUFO() - writer = UFOWriter(self.ufoPath) - self.assertRaises(UFOLibError, writer.renameGlyphSet, "does not exist", "layer 2") - - # remove valid layer - - def testRemoveLayer(self): - self.makeUFO() - writer = UFOWriter(self.ufoPath) - writer.deleteGlyphSet("layer 1") - writer.writeLayerContents(["public.default", "layer 2"]) - # directories - path = os.path.join(self.ufoPath, "glyphs") - exists = os.path.exists(path) - self.assertEqual(True, exists) - path = os.path.join(self.ufoPath, "glyphs.layer 1") - exists = os.path.exists(path) - self.assertEqual(False, exists) - path = os.path.join(self.ufoPath, "glyphs.layer 2") - exists = os.path.exists(path) - self.assertEqual(True, exists) - # layer contents - path = os.path.join(self.ufoPath, "layercontents.plist") - with open(path, "rb") as f: - result = plistlib.load(f) - expected = [["public.default", "glyphs"], ["layer 2", "glyphs.layer 2"]] - self.assertEqual(expected, result) - - # remove default layer - - def testRemoveDefaultLayer(self): - self.makeUFO() - writer = UFOWriter(self.ufoPath) - writer.deleteGlyphSet("public.default") - writer.writeLayerContents(["layer 1", "layer 2"]) - # directories - path = os.path.join(self.ufoPath, "glyphs") - self.assertEqual(False, os.path.exists(path)) - path = os.path.join(self.ufoPath, "glyphs.layer 1") - self.assertEqual(True, os.path.exists(path)) - path = os.path.join(self.ufoPath, "glyphs.layer 2") - self.assertEqual(True, os.path.exists(path)) - # layer contents - path = os.path.join(self.ufoPath, "layercontents.plist") - with open(path, "rb") as f: - result = plistlib.load(f) - expected = [["layer 1", "glyphs.layer 1"], ["layer 2", "glyphs.layer 2"]] - self.assertEqual(expected, result) - - # remove unknown layer - - def testRemoveDefaultLayer2(self): - self.makeUFO() - writer = UFOWriter(self.ufoPath) - self.assertRaises(UFOLibError, writer.deleteGlyphSet, "does not exist") - - def testWriteAsciiLayerOrder(self): - self.makeUFO( - layerContents=[ - ["public.default", "glyphs"], - ["layer 1", "glyphs.layer 1"], - ["layer 2", "glyphs.layer 2"], - ] - ) - writer = UFOWriter(self.ufoPath) - writer.writeLayerContents(["public.default", "layer 2", "layer 1"]) - path = os.path.join(self.ufoPath, "layercontents.plist") - with open(path, "rb") as f: - result = plistlib.load(f) - expected = [ - ["public.default", "glyphs"], - ["layer 2", "glyphs.layer 2"], - ["layer 1", "glyphs.layer 1"], - ] - self.assertEqual(expected, result) - for layerName, _ in result: - assert isinstance(layerName, str) # ----- # /data @@ -4175,539 +4529,549 @@ class UFO3WriteLayersTestCase(unittest.TestCase): class UFO3ReadDataTestCase(unittest.TestCase): - - def getFontPath(self): - testdata = os.path.join(os.path.dirname(__file__), "testdata") - return os.path.join(testdata, "UFO3-Read Data.ufo") - - def testUFOReaderDataDirectoryListing(self): - reader = UFOReader(self.getFontPath()) - found = reader.getDataDirectoryListing() - expected = [ - 'org.unifiedfontobject.directory/bar/lol.txt', - 'org.unifiedfontobject.directory/foo.txt', - 'org.unifiedfontobject.file.txt' - ] - self.assertEqual(set(found), set(expected)) - - def testUFOReaderBytesFromPath(self): - reader = UFOReader(self.getFontPath()) - found = reader.readBytesFromPath("data/org.unifiedfontobject.file.txt") - expected = b"file.txt" - self.assertEqual(found, expected) - found = reader.readBytesFromPath("data/org.unifiedfontobject.directory/bar/lol.txt") - expected = b"lol.txt" - self.assertEqual(found, expected) - found = reader.readBytesFromPath("data/org.unifiedfontobject.doesNotExist") - expected = None - self.assertEqual(found, expected) - - def testUFOReaderReadFileFromPath(self): - reader = UFOReader(self.getFontPath()) - fileObject = reader.getReadFileForPath("data/org.unifiedfontobject.file.txt") - self.assertNotEqual(fileObject, None) - hasRead = hasattr(fileObject, "read") - self.assertEqual(hasRead, True) - fileObject.close() - fileObject = reader.getReadFileForPath("data/org.unifiedfontobject.doesNotExist") - self.assertEqual(fileObject, None) - - def testUFOReaderKernGroupDuplicatesRemoved(self): - # Non-kerning group duplicates are kept - # Kerning group duplicates are removed - expected_groups = { - "group1" : ["A"], - "group2" : ["B", "C", "B"], - "public.kern1.A" : ["A"], - "public.kern2.B" : ["B", "A", "C"], - } - reader = UFOReader(self.getFontPath()) - groups = reader.readGroups() - self.assertEqual(expected_groups, groups) + def getFontPath(self): + testdata = os.path.join(os.path.dirname(__file__), "testdata") + return os.path.join(testdata, "UFO3-Read Data.ufo") + + def testUFOReaderDataDirectoryListing(self): + reader = UFOReader(self.getFontPath()) + found = reader.getDataDirectoryListing() + expected = [ + "org.unifiedfontobject.directory/bar/lol.txt", + "org.unifiedfontobject.directory/foo.txt", + "org.unifiedfontobject.file.txt", + ] + self.assertEqual(set(found), set(expected)) + + def testUFOReaderBytesFromPath(self): + reader = UFOReader(self.getFontPath()) + found = reader.readBytesFromPath("data/org.unifiedfontobject.file.txt") + expected = b"file.txt" + self.assertEqual(found, expected) + found = reader.readBytesFromPath( + "data/org.unifiedfontobject.directory/bar/lol.txt" + ) + expected = b"lol.txt" + self.assertEqual(found, expected) + found = reader.readBytesFromPath("data/org.unifiedfontobject.doesNotExist") + expected = None + self.assertEqual(found, expected) + + def testUFOReaderReadFileFromPath(self): + reader = UFOReader(self.getFontPath()) + fileObject = reader.getReadFileForPath("data/org.unifiedfontobject.file.txt") + self.assertNotEqual(fileObject, None) + hasRead = hasattr(fileObject, "read") + self.assertEqual(hasRead, True) + fileObject.close() + fileObject = reader.getReadFileForPath( + "data/org.unifiedfontobject.doesNotExist" + ) + self.assertEqual(fileObject, None) + + def testUFOReaderKernGroupDuplicatesRemoved(self): + # Non-kerning group duplicates are kept + # Kerning group duplicates are removed + expected_groups = { + "group1": ["A"], + "group2": ["B", "C", "B"], + "public.kern1.A": ["A"], + "public.kern2.B": ["B", "A", "C"], + } + reader = UFOReader(self.getFontPath()) + groups = reader.readGroups() + self.assertEqual(expected_groups, groups) class UFO3WriteDataTestCase(unittest.TestCase): + def setUp(self): + self.tempDir = tempfile.mktemp() + os.mkdir(self.tempDir) + self.dstDir = os.path.join(self.tempDir, "test.ufo") + + def tearDown(self): + shutil.rmtree(self.tempDir) + + def tearDownUFO(self): + if os.path.exists(self.dstDir): + shutil.rmtree(self.dstDir) + + def testUFOWriterWriteBytesToPath(self): + # basic file + path = "data/org.unifiedfontobject.writebytesbasicfile.txt" + testBytes = b"test" + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeBytesToPath(path, testBytes) + path = os.path.join(self.dstDir, path) + self.assertEqual(os.path.exists(path), True) + with open(path, "rb") as f: + written = f.read() + self.assertEqual(testBytes, written) + self.tearDownUFO() + # basic file with unicode text + path = "data/org.unifiedfontobject.writebytesbasicunicodefile.txt" + text = b"t\xeb\xdft" + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeBytesToPath(path, text) + path = os.path.join(self.dstDir, path) + self.assertEqual(os.path.exists(path), True) + with open(path, "rb") as f: + written = f.read() + self.assertEqual(text, written) + self.tearDownUFO() + # basic directory + path = "data/org.unifiedfontobject.writebytesdirectory/level1/level2/file.txt" + testBytes = b"test" + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeBytesToPath(path, testBytes) + path = os.path.join(self.dstDir, path) + self.assertEqual(os.path.exists(path), True) + with open(path, "rb") as f: + written = f.read() + self.assertEqual(testBytes, written) + self.tearDownUFO() + + def testUFOWriterWriteFileToPath(self): + # basic file + path = "data/org.unifiedfontobject.getwritefile.txt" + writer = UFOWriter(self.dstDir, formatVersion=3) + fileObject = writer.getFileObjectForPath(path) + self.assertNotEqual(fileObject, None) + hasRead = hasattr(fileObject, "read") + self.assertEqual(hasRead, True) + fileObject.close() + self.tearDownUFO() + + def testUFOWriterRemoveFile(self): + path1 = "data/org.unifiedfontobject.removefile/level1/level2/file1.txt" + path2 = "data/org.unifiedfontobject.removefile/level1/level2/file2.txt" + path3 = "data/org.unifiedfontobject.removefile/level1/file3.txt" + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.writeBytesToPath(path1, b"test") + writer.writeBytesToPath(path2, b"test") + writer.writeBytesToPath(path3, b"test") + self.assertEqual(os.path.exists(os.path.join(self.dstDir, path1)), True) + self.assertEqual(os.path.exists(os.path.join(self.dstDir, path2)), True) + self.assertEqual(os.path.exists(os.path.join(self.dstDir, path3)), True) + writer.removeFileForPath(path1) + self.assertEqual(os.path.exists(os.path.join(self.dstDir, path1)), False) + self.assertEqual( + os.path.exists(os.path.dirname(os.path.join(self.dstDir, path1))), True + ) + self.assertEqual(os.path.exists(os.path.join(self.dstDir, path2)), True) + self.assertEqual(os.path.exists(os.path.join(self.dstDir, path3)), True) + writer.removeFileForPath(path2) + self.assertEqual( + os.path.exists(os.path.dirname(os.path.join(self.dstDir, path1))), False + ) + self.assertEqual(os.path.exists(os.path.join(self.dstDir, path2)), False) + self.assertEqual(os.path.exists(os.path.join(self.dstDir, path3)), True) + writer.removeFileForPath(path3) + self.assertEqual(os.path.exists(os.path.join(self.dstDir, path3)), False) + self.assertEqual( + os.path.exists(os.path.dirname(os.path.join(self.dstDir, path2))), False + ) + self.assertEqual( + os.path.exists( + os.path.join(self.dstDir, "data/org.unifiedfontobject.removefile") + ), + False, + ) + self.assertRaises( + UFOLibError, + writer.removeFileForPath, + path="data/org.unifiedfontobject.doesNotExist.txt", + ) + self.tearDownUFO() + + def testUFOWriterCopy(self): + sourceDir = self.dstDir.replace(".ufo", "") + "-copy source" + ".ufo" + dataPath = "data/org.unifiedfontobject.copy/level1/level2/file1.txt" + writer = UFOWriter(sourceDir, formatVersion=3) + writer.writeBytesToPath(dataPath, b"test") + # copy a file + reader = UFOReader(sourceDir) + writer = UFOWriter(self.dstDir, formatVersion=3) + writer.copyFromReader(reader, dataPath, dataPath) + path = os.path.join(self.dstDir, dataPath) + self.assertEqual(os.path.exists(path), True) + self.tearDownUFO() + # copy a directory + reader = UFOReader(sourceDir) + writer = UFOWriter(self.dstDir, formatVersion=3) + p = "data/org.unifiedfontobject.copy" + writer.copyFromReader(reader, p, p) + path = os.path.join(self.dstDir, dataPath) + self.assertEqual(os.path.exists(path), True) + self.tearDownUFO() - def setUp(self): - self.tempDir = tempfile.mktemp() - os.mkdir(self.tempDir) - self.dstDir = os.path.join(self.tempDir, "test.ufo") - - def tearDown(self): - shutil.rmtree(self.tempDir) - - def tearDownUFO(self): - if os.path.exists(self.dstDir): - shutil.rmtree(self.dstDir) - - def testUFOWriterWriteBytesToPath(self): - # basic file - path = "data/org.unifiedfontobject.writebytesbasicfile.txt" - testBytes = b"test" - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeBytesToPath(path, testBytes) - path = os.path.join(self.dstDir, path) - self.assertEqual(os.path.exists(path), True) - with open(path, "rb") as f: - written = f.read() - self.assertEqual(testBytes, written) - self.tearDownUFO() - # basic file with unicode text - path = "data/org.unifiedfontobject.writebytesbasicunicodefile.txt" - text = b"t\xeb\xdft" - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeBytesToPath(path, text) - path = os.path.join(self.dstDir, path) - self.assertEqual(os.path.exists(path), True) - with open(path, "rb") as f: - written = f.read() - self.assertEqual(text, written) - self.tearDownUFO() - # basic directory - path = "data/org.unifiedfontobject.writebytesdirectory/level1/level2/file.txt" - testBytes = b"test" - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeBytesToPath(path, testBytes) - path = os.path.join(self.dstDir, path) - self.assertEqual(os.path.exists(path), True) - with open(path, "rb") as f: - written = f.read() - self.assertEqual(testBytes, written) - self.tearDownUFO() - - def testUFOWriterWriteFileToPath(self): - # basic file - path = "data/org.unifiedfontobject.getwritefile.txt" - writer = UFOWriter(self.dstDir, formatVersion=3) - fileObject = writer.getFileObjectForPath(path) - self.assertNotEqual(fileObject, None) - hasRead = hasattr(fileObject, "read") - self.assertEqual(hasRead, True) - fileObject.close() - self.tearDownUFO() - - def testUFOWriterRemoveFile(self): - path1 = "data/org.unifiedfontobject.removefile/level1/level2/file1.txt" - path2 = "data/org.unifiedfontobject.removefile/level1/level2/file2.txt" - path3 = "data/org.unifiedfontobject.removefile/level1/file3.txt" - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.writeBytesToPath(path1, b"test") - writer.writeBytesToPath(path2, b"test") - writer.writeBytesToPath(path3, b"test") - self.assertEqual(os.path.exists(os.path.join(self.dstDir, path1)), True) - self.assertEqual(os.path.exists(os.path.join(self.dstDir, path2)), True) - self.assertEqual(os.path.exists(os.path.join(self.dstDir, path3)), True) - writer.removeFileForPath(path1) - self.assertEqual(os.path.exists(os.path.join(self.dstDir, path1)), False) - self.assertEqual(os.path.exists(os.path.dirname(os.path.join(self.dstDir, path1))), True) - self.assertEqual(os.path.exists(os.path.join(self.dstDir, path2)), True) - self.assertEqual(os.path.exists(os.path.join(self.dstDir, path3)), True) - writer.removeFileForPath(path2) - self.assertEqual(os.path.exists(os.path.dirname(os.path.join(self.dstDir, path1))), False) - self.assertEqual(os.path.exists(os.path.join(self.dstDir, path2)), False) - self.assertEqual(os.path.exists(os.path.join(self.dstDir, path3)), True) - writer.removeFileForPath(path3) - self.assertEqual(os.path.exists(os.path.join(self.dstDir, path3)), False) - self.assertEqual(os.path.exists(os.path.dirname(os.path.join(self.dstDir, path2))), False) - self.assertEqual(os.path.exists(os.path.join(self.dstDir, "data/org.unifiedfontobject.removefile")), False) - self.assertRaises(UFOLibError, writer.removeFileForPath, path="data/org.unifiedfontobject.doesNotExist.txt") - self.tearDownUFO() - - def testUFOWriterCopy(self): - sourceDir = self.dstDir.replace(".ufo", "") + "-copy source" + ".ufo" - dataPath = "data/org.unifiedfontobject.copy/level1/level2/file1.txt" - writer = UFOWriter(sourceDir, formatVersion=3) - writer.writeBytesToPath(dataPath, b"test") - # copy a file - reader = UFOReader(sourceDir) - writer = UFOWriter(self.dstDir, formatVersion=3) - writer.copyFromReader(reader, dataPath, dataPath) - path = os.path.join(self.dstDir, dataPath) - self.assertEqual(os.path.exists(path), True) - self.tearDownUFO() - # copy a directory - reader = UFOReader(sourceDir) - writer = UFOWriter(self.dstDir, formatVersion=3) - p = "data/org.unifiedfontobject.copy" - writer.copyFromReader(reader, p, p) - path = os.path.join(self.dstDir, dataPath) - self.assertEqual(os.path.exists(path), True) - self.tearDownUFO() # --------------- # layerinfo.plist # --------------- -class TestLayerInfoObject: - color = guidelines = lib = None +class TestLayerInfoObject: + color = guidelines = lib = None class UFO3ReadLayerInfoTestCase(unittest.TestCase): - - def setUp(self): - self.tempDir = tempfile.mktemp() - os.mkdir(self.tempDir) - self.ufoPath = os.path.join(self.tempDir, "test.ufo") - - def tearDown(self): - shutil.rmtree(self.tempDir) - - def makeUFO(self, formatVersion=3, layerInfo=None): - self.clearUFO() - if not os.path.exists(self.ufoPath): - os.mkdir(self.ufoPath) - # metainfo.plist - metaInfo = dict(creator="test", formatVersion=formatVersion) - path = os.path.join(self.ufoPath, "metainfo.plist") - with open(path, "wb") as f: - plistlib.dump(metaInfo, f) - # layercontents.plist - layerContents = [("public.default", "glyphs")] - path = os.path.join(self.ufoPath, "layercontents.plist") - with open(path, "wb") as f: - plistlib.dump(layerContents, f) - # glyphs - glyphsPath = os.path.join(self.ufoPath, "glyphs") - os.mkdir(glyphsPath) - contents = dict(a="a.glif") - path = os.path.join(glyphsPath, "contents.plist") - with open(path, "wb") as f: - plistlib.dump(contents, f) - path = os.path.join(glyphsPath, "a.glif") - with open(path, "w") as f: - f.write(" ") - # layerinfo.plist - if layerInfo is None: - layerInfo = dict( - color="0,0,0,1", - lib={"foo" : "bar"} - ) - path = os.path.join(glyphsPath, "layerinfo.plist") - with open(path, "wb") as f: - plistlib.dump(layerInfo, f) - - def clearUFO(self): - if os.path.exists(self.ufoPath): - shutil.rmtree(self.ufoPath) - - def testValidLayerInfo(self): - self.makeUFO() - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - info = TestLayerInfoObject() - glyphSet.readLayerInfo(info) - expectedColor = "0,0,0,1" - self.assertEqual(expectedColor, info.color) - expectedLib = {"foo": "bar"} - self.assertEqual(expectedLib, info.lib) - - def testMissingLayerInfo(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "glyphs", "layerinfo.plist") - os.remove(path) - # read - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - info = TestLayerInfoObject() - glyphSet.readLayerInfo(info) - self.assertEqual(None, info.color) - self.assertEqual(None, info.guidelines) - self.assertEqual(None, info.lib) - - def testBogusLayerInfo(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "glyphs", "layerinfo.plist") - os.remove(path) - with open(path, "w") as f: - f.write("test") - # read - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - info = TestLayerInfoObject() - self.assertRaises(UFOLibError, glyphSet.readLayerInfo, info) - - def testInvalidFormatLayerInfo(self): - self.makeUFO() - path = os.path.join(self.ufoPath, "glyphs", "layerinfo.plist") - info = [("color", "0,0,0,0")] - with open(path, "wb") as f: - plistlib.dump(info, f) - # read - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - info = TestLayerInfoObject() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, info) - - def testColor(self): - ## not a string - info = {} - info["color"] = 1 - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - ## not enough commas - info = {} - info["color"] = "1 0, 0, 0" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - info = {} - info["color"] = "1 0 0, 0" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - info = {} - info["color"] = "1 0 0 0" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - ## not enough parts - info = {} - info["color"] = ", 0, 0, 0" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - info = {} - info["color"] = "1, , 0, 0" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - info = {} - info["color"] = "1, 0, , 0" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - info = {} - info["color"] = "1, 0, 0, " - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - info = {} - info["color"] = ", , , " - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - ## not a number in all positions - info = {} - info["color"] = "r, 1, 1, 1" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - info = {} - info["color"] = "1, g, 1, 1" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - info = {} - info["color"] = "1, 1, b, 1" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - info = {} - info["color"] = "1, 1, 1, a" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - ## too many parts - info = {} - info["color"] = "1, 0, 0, 0, 0" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - ## < 0 in each position - info = {} - info["color"] = "-1, 0, 0, 0" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - info = {} - info["color"] = "0, -1, 0, 0" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - info = {} - info["color"] = "0, 0, -1, 0" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - info = {} - info["color"] = "0, 0, 0, -1" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - ## > 1 in each position - info = {} - info["color"] = "2, 0, 0, 0" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - info = {} - info["color"] = "0, 2, 0, 0" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - info = {} - info["color"] = "0, 0, 2, 0" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) - info = {} - info["color"] = "0, 0, 0, 2" - self.makeUFO(layerInfo=info) - reader = UFOReader(self.ufoPath, validate=True) - glyphSet = reader.getGlyphSet() - self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + def setUp(self): + self.tempDir = tempfile.mktemp() + os.mkdir(self.tempDir) + self.ufoPath = os.path.join(self.tempDir, "test.ufo") + + def tearDown(self): + shutil.rmtree(self.tempDir) + + def makeUFO(self, formatVersion=3, layerInfo=None): + self.clearUFO() + if not os.path.exists(self.ufoPath): + os.mkdir(self.ufoPath) + # metainfo.plist + metaInfo = dict(creator="test", formatVersion=formatVersion) + path = os.path.join(self.ufoPath, "metainfo.plist") + with open(path, "wb") as f: + plistlib.dump(metaInfo, f) + # layercontents.plist + layerContents = [("public.default", "glyphs")] + path = os.path.join(self.ufoPath, "layercontents.plist") + with open(path, "wb") as f: + plistlib.dump(layerContents, f) + # glyphs + glyphsPath = os.path.join(self.ufoPath, "glyphs") + os.mkdir(glyphsPath) + contents = dict(a="a.glif") + path = os.path.join(glyphsPath, "contents.plist") + with open(path, "wb") as f: + plistlib.dump(contents, f) + path = os.path.join(glyphsPath, "a.glif") + with open(path, "w") as f: + f.write(" ") + # layerinfo.plist + if layerInfo is None: + layerInfo = dict(color="0,0,0,1", lib={"foo": "bar"}) + path = os.path.join(glyphsPath, "layerinfo.plist") + with open(path, "wb") as f: + plistlib.dump(layerInfo, f) + + def clearUFO(self): + if os.path.exists(self.ufoPath): + shutil.rmtree(self.ufoPath) + + def testValidLayerInfo(self): + self.makeUFO() + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + info = TestLayerInfoObject() + glyphSet.readLayerInfo(info) + expectedColor = "0,0,0,1" + self.assertEqual(expectedColor, info.color) + expectedLib = {"foo": "bar"} + self.assertEqual(expectedLib, info.lib) + + def testMissingLayerInfo(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "glyphs", "layerinfo.plist") + os.remove(path) + # read + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + info = TestLayerInfoObject() + glyphSet.readLayerInfo(info) + self.assertEqual(None, info.color) + self.assertEqual(None, info.guidelines) + self.assertEqual(None, info.lib) + + def testBogusLayerInfo(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "glyphs", "layerinfo.plist") + os.remove(path) + with open(path, "w") as f: + f.write("test") + # read + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + info = TestLayerInfoObject() + self.assertRaises(UFOLibError, glyphSet.readLayerInfo, info) + + def testInvalidFormatLayerInfo(self): + self.makeUFO() + path = os.path.join(self.ufoPath, "glyphs", "layerinfo.plist") + info = [("color", "0,0,0,0")] + with open(path, "wb") as f: + plistlib.dump(info, f) + # read + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + info = TestLayerInfoObject() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, info) + + def testColor(self): + ## not a string + info = {} + info["color"] = 1 + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + ## not enough commas + info = {} + info["color"] = "1 0, 0, 0" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + info = {} + info["color"] = "1 0 0, 0" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + info = {} + info["color"] = "1 0 0 0" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + ## not enough parts + info = {} + info["color"] = ", 0, 0, 0" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + info = {} + info["color"] = "1, , 0, 0" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + info = {} + info["color"] = "1, 0, , 0" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + info = {} + info["color"] = "1, 0, 0, " + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + info = {} + info["color"] = ", , , " + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + ## not a number in all positions + info = {} + info["color"] = "r, 1, 1, 1" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + info = {} + info["color"] = "1, g, 1, 1" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + info = {} + info["color"] = "1, 1, b, 1" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + info = {} + info["color"] = "1, 1, 1, a" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + ## too many parts + info = {} + info["color"] = "1, 0, 0, 0, 0" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + ## < 0 in each position + info = {} + info["color"] = "-1, 0, 0, 0" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + info = {} + info["color"] = "0, -1, 0, 0" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + info = {} + info["color"] = "0, 0, -1, 0" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + info = {} + info["color"] = "0, 0, 0, -1" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + ## > 1 in each position + info = {} + info["color"] = "2, 0, 0, 0" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + info = {} + info["color"] = "0, 2, 0, 0" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + info = {} + info["color"] = "0, 0, 2, 0" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) + info = {} + info["color"] = "0, 0, 0, 2" + self.makeUFO(layerInfo=info) + reader = UFOReader(self.ufoPath, validate=True) + glyphSet = reader.getGlyphSet() + self.assertRaises(GlifLibError, glyphSet.readLayerInfo, TestLayerInfoObject()) class UFO3WriteLayerInfoTestCase(unittest.TestCase): - - def setUp(self): - self.tempDir = tempfile.mktemp() - os.mkdir(self.tempDir) - self.ufoPath = os.path.join(self.tempDir, "test.ufo") - - def tearDown(self): - shutil.rmtree(self.tempDir) - - def makeGlyphSet(self): - self.clearUFO() - writer = UFOWriter(self.ufoPath) - return writer.getGlyphSet() - - def clearUFO(self): - if os.path.exists(self.ufoPath): - shutil.rmtree(self.ufoPath) - - def testValidWrite(self): - expected = dict( - color="0,0,0,1", - lib={"foo" : "bar"} - ) - info = TestLayerInfoObject() - info.color = expected["color"] - info.lib = expected["lib"] - glyphSet = self.makeGlyphSet() - glyphSet.writeLayerInfo(info) - path = os.path.join(self.ufoPath, "glyphs", "layerinfo.plist") - with open(path, "rb") as f: - result = plistlib.load(f) - self.assertEqual(expected, result) - - def testColor(self): - ## not a string - info = TestLayerInfoObject() - info.color = 1 - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - ## not enough commas - info = TestLayerInfoObject() - info.color = "1 0, 0, 0" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - info = TestLayerInfoObject() - info.color = "1 0 0, 0" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - info = TestLayerInfoObject() - info.color = "1 0 0 0" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - ## not enough parts - info = TestLayerInfoObject() - info.color = ", 0, 0, 0" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - info = TestLayerInfoObject() - info.color = "1, , 0, 0" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - info = TestLayerInfoObject() - info.color = "1, 0, , 0" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - info = TestLayerInfoObject() - info.color = "1, 0, 0, " - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - info = TestLayerInfoObject() - info.color = ", , , " - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - ## not a number in all positions - info = TestLayerInfoObject() - info.color = "r, 1, 1, 1" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - info = TestLayerInfoObject() - info.color = "1, g, 1, 1" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - info = TestLayerInfoObject() - info.color = "1, 1, b, 1" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - info = TestLayerInfoObject() - info.color = "1, 1, 1, a" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - ## too many parts - info = TestLayerInfoObject() - info.color = "1, 0, 0, 0, 0" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - ## < 0 in each position - info = TestLayerInfoObject() - info.color = "-1, 0, 0, 0" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - info = TestLayerInfoObject() - info.color = "0, -1, 0, 0" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - info = TestLayerInfoObject() - info.color = "0, 0, -1, 0" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - info = TestLayerInfoObject() - info.color = "0, 0, 0, -1" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - ## > 1 in each position - info = TestLayerInfoObject() - info.color = "2, 0, 0, 0" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - info = TestLayerInfoObject() - info.color = "0, 2, 0, 0" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - info = TestLayerInfoObject() - info.color = "0, 0, 2, 0" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) - info = TestLayerInfoObject() - info.color = "0, 0, 0, 2" - glyphSet = self.makeGlyphSet() - self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + def setUp(self): + self.tempDir = tempfile.mktemp() + os.mkdir(self.tempDir) + self.ufoPath = os.path.join(self.tempDir, "test.ufo") + + def tearDown(self): + shutil.rmtree(self.tempDir) + + def makeGlyphSet(self): + self.clearUFO() + writer = UFOWriter(self.ufoPath) + return writer.getGlyphSet() + + def clearUFO(self): + if os.path.exists(self.ufoPath): + shutil.rmtree(self.ufoPath) + + def testValidWrite(self): + expected = dict(color="0,0,0,1", lib={"foo": "bar"}) + info = TestLayerInfoObject() + info.color = expected["color"] + info.lib = expected["lib"] + glyphSet = self.makeGlyphSet() + glyphSet.writeLayerInfo(info) + path = os.path.join(self.ufoPath, "glyphs", "layerinfo.plist") + with open(path, "rb") as f: + result = plistlib.load(f) + self.assertEqual(expected, result) + + def testColor(self): + ## not a string + info = TestLayerInfoObject() + info.color = 1 + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + ## not enough commas + info = TestLayerInfoObject() + info.color = "1 0, 0, 0" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + info = TestLayerInfoObject() + info.color = "1 0 0, 0" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + info = TestLayerInfoObject() + info.color = "1 0 0 0" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + ## not enough parts + info = TestLayerInfoObject() + info.color = ", 0, 0, 0" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + info = TestLayerInfoObject() + info.color = "1, , 0, 0" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + info = TestLayerInfoObject() + info.color = "1, 0, , 0" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + info = TestLayerInfoObject() + info.color = "1, 0, 0, " + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + info = TestLayerInfoObject() + info.color = ", , , " + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + ## not a number in all positions + info = TestLayerInfoObject() + info.color = "r, 1, 1, 1" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + info = TestLayerInfoObject() + info.color = "1, g, 1, 1" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + info = TestLayerInfoObject() + info.color = "1, 1, b, 1" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + info = TestLayerInfoObject() + info.color = "1, 1, 1, a" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + ## too many parts + info = TestLayerInfoObject() + info.color = "1, 0, 0, 0, 0" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + ## < 0 in each position + info = TestLayerInfoObject() + info.color = "-1, 0, 0, 0" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + info = TestLayerInfoObject() + info.color = "0, -1, 0, 0" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + info = TestLayerInfoObject() + info.color = "0, 0, -1, 0" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + info = TestLayerInfoObject() + info.color = "0, 0, 0, -1" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + ## > 1 in each position + info = TestLayerInfoObject() + info.color = "2, 0, 0, 0" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + info = TestLayerInfoObject() + info.color = "0, 2, 0, 0" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + info = TestLayerInfoObject() + info.color = "0, 0, 2, 0" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) + info = TestLayerInfoObject() + info.color = "0, 0, 0, 2" + glyphSet = self.makeGlyphSet() + self.assertRaises(GlifLibError, glyphSet.writeLayerInfo, info) |