import os
import shutil
import unittest
import tempfile
from io import open
from fontTools.ufoLib import UFOReader, UFOWriter, UFOLibError
from fontTools.ufoLib import plistlib
from .testSupport import fontInfoVersion2


class TestInfoObject:
    pass


class ReadFontInfoVersion2TestCase(unittest.TestCase):
    def setUp(self):
        self.dstDir = tempfile.mktemp()
        os.mkdir(self.dstDir)
        metaInfo = {"creator": "test", "formatVersion": 2}
        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(fontInfoVersion2)
        self._writeInfoToPlist(originalData)
        infoObject = TestInfoObject()
        reader = UFOReader(self.dstDir, validate=True)
        reader.readInfo(infoObject)
        readData = {}
        for attr in list(fontInfoVersion2.keys()):
            readData[attr] = getattr(infoObject, attr)
        self.assertEqual(originalData, readData)

    def testGenericRead(self):
        # familyName
        info = dict(fontInfoVersion2)
        info["familyName"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # styleName
        info = dict(fontInfoVersion2)
        info["styleName"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # styleMapFamilyName
        info = dict(fontInfoVersion2)
        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(fontInfoVersion2)
        info["styleMapStyleName"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        ## out of range
        info = dict(fontInfoVersion2)
        info["styleMapStyleName"] = "REGULAR"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # versionMajor
        info = dict(fontInfoVersion2)
        info["versionMajor"] = "1"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # versionMinor
        info = dict(fontInfoVersion2)
        info["versionMinor"] = "0"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # copyright
        info = dict(fontInfoVersion2)
        info["copyright"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # trademark
        info = dict(fontInfoVersion2)
        info["trademark"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # unitsPerEm
        info = dict(fontInfoVersion2)
        info["unitsPerEm"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # descender
        info = dict(fontInfoVersion2)
        info["descender"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # xHeight
        info = dict(fontInfoVersion2)
        info["xHeight"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # capHeight
        info = dict(fontInfoVersion2)
        info["capHeight"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # ascender
        info = dict(fontInfoVersion2)
        info["ascender"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # italicAngle
        info = dict(fontInfoVersion2)
        info["italicAngle"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())

    def testHeadRead(self):
        # openTypeHeadCreated
        ## not a string
        info = dict(fontInfoVersion2)
        info["openTypeHeadCreated"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        ## invalid format
        info = dict(fontInfoVersion2)
        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(fontInfoVersion2)
        info["openTypeHeadLowestRecPPEM"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeHeadFlags
        info = dict(fontInfoVersion2)
        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(fontInfoVersion2)
        info["openTypeHheaAscender"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeHheaDescender
        info = dict(fontInfoVersion2)
        info["openTypeHheaDescender"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeHheaLineGap
        info = dict(fontInfoVersion2)
        info["openTypeHheaLineGap"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeHheaCaretSlopeRise
        info = dict(fontInfoVersion2)
        info["openTypeHheaCaretSlopeRise"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeHheaCaretSlopeRun
        info = dict(fontInfoVersion2)
        info["openTypeHheaCaretSlopeRun"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeHheaCaretOffset
        info = dict(fontInfoVersion2)
        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(fontInfoVersion2)
        info["openTypeNameDesigner"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeNameDesignerURL
        info = dict(fontInfoVersion2)
        info["openTypeNameDesignerURL"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeNameManufacturer
        info = dict(fontInfoVersion2)
        info["openTypeNameManufacturer"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeNameManufacturerURL
        info = dict(fontInfoVersion2)
        info["openTypeNameManufacturerURL"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeNameLicense
        info = dict(fontInfoVersion2)
        info["openTypeNameLicense"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeNameLicenseURL
        info = dict(fontInfoVersion2)
        info["openTypeNameLicenseURL"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeNameVersion
        info = dict(fontInfoVersion2)
        info["openTypeNameVersion"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeNameUniqueID
        info = dict(fontInfoVersion2)
        info["openTypeNameUniqueID"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeNameDescription
        info = dict(fontInfoVersion2)
        info["openTypeNameDescription"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeNamePreferredFamilyName
        info = dict(fontInfoVersion2)
        info["openTypeNamePreferredFamilyName"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeNamePreferredSubfamilyName
        info = dict(fontInfoVersion2)
        info["openTypeNamePreferredSubfamilyName"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeNameCompatibleFullName
        info = dict(fontInfoVersion2)
        info["openTypeNameCompatibleFullName"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeNameSampleText
        info = dict(fontInfoVersion2)
        info["openTypeNameSampleText"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeNameWWSFamilyName
        info = dict(fontInfoVersion2)
        info["openTypeNameWWSFamilyName"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeNameWWSSubfamilyName
        info = dict(fontInfoVersion2)
        info["openTypeNameWWSSubfamilyName"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())

    def testOS2Read(self):
        # openTypeOS2WidthClass
        ## not an int
        info = dict(fontInfoVersion2)
        info["openTypeOS2WidthClass"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        ## out or range
        info = dict(fontInfoVersion2)
        info["openTypeOS2WidthClass"] = 15
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeOS2WeightClass
        info = dict(fontInfoVersion2)
        ## 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(fontInfoVersion2)
        info["openTypeOS2Selection"] = [-1]
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeOS2VendorID
        info = dict(fontInfoVersion2)
        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(fontInfoVersion2)
        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())
        ## too few values
        info = dict(fontInfoVersion2)
        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(fontInfoVersion2)
        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(fontInfoVersion2)
        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(fontInfoVersion2)
        info["openTypeOS2FamilyClass"] = [1]
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        ## too many values
        info = dict(fontInfoVersion2)
        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(fontInfoVersion2)
        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(fontInfoVersion2)
        info["openTypeOS2UnicodeRanges"] = ["0"]
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        ## out of range
        info = dict(fontInfoVersion2)
        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(fontInfoVersion2)
        info["openTypeOS2CodePageRanges"] = ["0"]
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        ## out of range
        info = dict(fontInfoVersion2)
        info["openTypeOS2CodePageRanges"] = [-1]
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeOS2TypoAscender
        info = dict(fontInfoVersion2)
        info["openTypeOS2TypoAscender"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeOS2TypoDescender
        info = dict(fontInfoVersion2)
        info["openTypeOS2TypoDescender"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeOS2TypoLineGap
        info = dict(fontInfoVersion2)
        info["openTypeOS2TypoLineGap"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeOS2WinAscent
        info = dict(fontInfoVersion2)
        info["openTypeOS2WinAscent"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeOS2WinDescent
        info = dict(fontInfoVersion2)
        info["openTypeOS2WinDescent"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeOS2Type
        ## not an int
        info = dict(fontInfoVersion2)
        info["openTypeOS2Type"] = ["1"]
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        ## out of range
        info = dict(fontInfoVersion2)
        info["openTypeOS2Type"] = [-1]
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeOS2SubscriptXSize
        info = dict(fontInfoVersion2)
        info["openTypeOS2SubscriptXSize"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeOS2SubscriptYSize
        info = dict(fontInfoVersion2)
        info["openTypeOS2SubscriptYSize"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeOS2SubscriptXOffset
        info = dict(fontInfoVersion2)
        info["openTypeOS2SubscriptXOffset"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeOS2SubscriptYOffset
        info = dict(fontInfoVersion2)
        info["openTypeOS2SubscriptYOffset"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeOS2SuperscriptXSize
        info = dict(fontInfoVersion2)
        info["openTypeOS2SuperscriptXSize"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeOS2SuperscriptYSize
        info = dict(fontInfoVersion2)
        info["openTypeOS2SuperscriptYSize"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeOS2SuperscriptXOffset
        info = dict(fontInfoVersion2)
        info["openTypeOS2SuperscriptXOffset"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeOS2SuperscriptYOffset
        info = dict(fontInfoVersion2)
        info["openTypeOS2SuperscriptYOffset"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeOS2StrikeoutSize
        info = dict(fontInfoVersion2)
        info["openTypeOS2StrikeoutSize"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeOS2StrikeoutPosition
        info = dict(fontInfoVersion2)
        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(fontInfoVersion2)
        info["openTypeVheaVertTypoAscender"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeVheaVertTypoDescender
        info = dict(fontInfoVersion2)
        info["openTypeVheaVertTypoDescender"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeVheaVertTypoLineGap
        info = dict(fontInfoVersion2)
        info["openTypeVheaVertTypoLineGap"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeVheaCaretSlopeRise
        info = dict(fontInfoVersion2)
        info["openTypeVheaCaretSlopeRise"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeVheaCaretSlopeRun
        info = dict(fontInfoVersion2)
        info["openTypeVheaCaretSlopeRun"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # openTypeVheaCaretOffset
        info = dict(fontInfoVersion2)
        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(fontInfoVersion2)
        info["macintoshFONDFamilyID"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # macintoshFONDName
        info = dict(fontInfoVersion2)
        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(fontInfoVersion2)
        info["postscriptFontName"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # postscriptFullName
        info = dict(fontInfoVersion2)
        info["postscriptFullName"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # postscriptSlantAngle
        info = dict(fontInfoVersion2)
        info["postscriptSlantAngle"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, info=TestInfoObject())
        # postscriptUniqueID
        info = dict(fontInfoVersion2)
        info["postscriptUniqueID"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        # postscriptUnderlineThickness
        info = dict(fontInfoVersion2)
        info["postscriptUnderlineThickness"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        # postscriptUnderlinePosition
        info = dict(fontInfoVersion2)
        info["postscriptUnderlinePosition"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        # postscriptIsFixedPitch
        info = dict(fontInfoVersion2)
        info["postscriptIsFixedPitch"] = 2
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        # postscriptBlueValues
        ## not a list
        info = dict(fontInfoVersion2)
        info["postscriptBlueValues"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        ## uneven value count
        info = dict(fontInfoVersion2)
        info["postscriptBlueValues"] = [500]
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        ## too many values
        info = dict(fontInfoVersion2)
        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(fontInfoVersion2)
        info["postscriptOtherBlues"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        ## uneven value count
        info = dict(fontInfoVersion2)
        info["postscriptOtherBlues"] = [500]
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        ## too many values
        info = dict(fontInfoVersion2)
        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(fontInfoVersion2)
        info["postscriptFamilyBlues"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        ## uneven value count
        info = dict(fontInfoVersion2)
        info["postscriptFamilyBlues"] = [500]
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        ## too many values
        info = dict(fontInfoVersion2)
        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(fontInfoVersion2)
        info["postscriptFamilyOtherBlues"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        ## uneven value count
        info = dict(fontInfoVersion2)
        info["postscriptFamilyOtherBlues"] = [500]
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        ## too many values
        info = dict(fontInfoVersion2)
        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(fontInfoVersion2)
        info["postscriptStemSnapH"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        ## too many values
        info = dict(fontInfoVersion2)
        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(fontInfoVersion2)
        info["postscriptStemSnapV"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        ## too many values
        info = dict(fontInfoVersion2)
        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(fontInfoVersion2)
        info["postscriptBlueFuzz"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        # postscriptBlueShift
        info = dict(fontInfoVersion2)
        info["postscriptBlueShift"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        # postscriptBlueScale
        info = dict(fontInfoVersion2)
        info["postscriptBlueScale"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        # postscriptForceBold
        info = dict(fontInfoVersion2)
        info["postscriptForceBold"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        # postscriptDefaultWidthX
        info = dict(fontInfoVersion2)
        info["postscriptDefaultWidthX"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        # postscriptNominalWidthX
        info = dict(fontInfoVersion2)
        info["postscriptNominalWidthX"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        # postscriptWeightName
        info = dict(fontInfoVersion2)
        info["postscriptWeightName"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        # postscriptDefaultCharacter
        info = dict(fontInfoVersion2)
        info["postscriptDefaultCharacter"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        # postscriptWindowsCharacterSet
        info = dict(fontInfoVersion2)
        info["postscriptWindowsCharacterSet"] = -1
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        # macintoshFONDFamilyID
        info = dict(fontInfoVersion2)
        info["macintoshFONDFamilyID"] = "abc"
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
        # macintoshFONDName
        info = dict(fontInfoVersion2)
        info["macintoshFONDName"] = 123
        self._writeInfoToPlist(info)
        reader = UFOReader(self.dstDir, validate=True)
        self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())


class WriteFontInfoVersion2TestCase(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 makeInfoObject(self):
        infoObject = TestInfoObject()
        for attr, value in list(fontInfoVersion2.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=2)
        writer.writeInfo(infoObject)
        writtenData = self.readPlist()
        for attr, originalValue in list(fontInfoVersion2.items()):
            newValue = writtenData[attr]
            self.assertEqual(newValue, originalValue)

    def testGenericWrite(self):
        # familyName
        infoObject = self.makeInfoObject()
        infoObject.familyName = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # styleName
        infoObject = self.makeInfoObject()
        infoObject.styleName = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # styleMapFamilyName
        infoObject = self.makeInfoObject()
        infoObject.styleMapFamilyName = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # styleMapStyleName
        ## not a string
        infoObject = self.makeInfoObject()
        infoObject.styleMapStyleName = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## out of range
        infoObject = self.makeInfoObject()
        infoObject.styleMapStyleName = "REGULAR"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # versionMajor
        infoObject = self.makeInfoObject()
        infoObject.versionMajor = "1"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # versionMinor
        infoObject = self.makeInfoObject()
        infoObject.versionMinor = "0"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # copyright
        infoObject = self.makeInfoObject()
        infoObject.copyright = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # trademark
        infoObject = self.makeInfoObject()
        infoObject.trademark = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # unitsPerEm
        infoObject = self.makeInfoObject()
        infoObject.unitsPerEm = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # descender
        infoObject = self.makeInfoObject()
        infoObject.descender = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # xHeight
        infoObject = self.makeInfoObject()
        infoObject.xHeight = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # capHeight
        infoObject = self.makeInfoObject()
        infoObject.capHeight = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # ascender
        infoObject = self.makeInfoObject()
        infoObject.ascender = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # italicAngle
        infoObject = self.makeInfoObject()
        infoObject.italicAngle = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)

    def testHeadWrite(self):
        # openTypeHeadCreated
        ## not a string
        infoObject = self.makeInfoObject()
        infoObject.openTypeHeadCreated = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## invalid format
        infoObject = self.makeInfoObject()
        infoObject.openTypeHeadCreated = "2000-Jan-01 00:00:00"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeHeadLowestRecPPEM
        infoObject = self.makeInfoObject()
        infoObject.openTypeHeadLowestRecPPEM = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeHeadFlags
        infoObject = self.makeInfoObject()
        infoObject.openTypeHeadFlags = [-1]
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)

    def testHheaWrite(self):
        # openTypeHheaAscender
        infoObject = self.makeInfoObject()
        infoObject.openTypeHheaAscender = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeHheaDescender
        infoObject = self.makeInfoObject()
        infoObject.openTypeHheaDescender = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeHheaLineGap
        infoObject = self.makeInfoObject()
        infoObject.openTypeHheaLineGap = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeHheaCaretSlopeRise
        infoObject = self.makeInfoObject()
        infoObject.openTypeHheaCaretSlopeRise = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeHheaCaretSlopeRun
        infoObject = self.makeInfoObject()
        infoObject.openTypeHheaCaretSlopeRun = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeHheaCaretOffset
        infoObject = self.makeInfoObject()
        infoObject.openTypeHheaCaretOffset = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)

    def testNameWrite(self):
        # openTypeNameDesigner
        infoObject = self.makeInfoObject()
        infoObject.openTypeNameDesigner = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeNameDesignerURL
        infoObject = self.makeInfoObject()
        infoObject.openTypeNameDesignerURL = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeNameManufacturer
        infoObject = self.makeInfoObject()
        infoObject.openTypeNameManufacturer = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeNameManufacturerURL
        infoObject = self.makeInfoObject()
        infoObject.openTypeNameManufacturerURL = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeNameLicense
        infoObject = self.makeInfoObject()
        infoObject.openTypeNameLicense = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeNameLicenseURL
        infoObject = self.makeInfoObject()
        infoObject.openTypeNameLicenseURL = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeNameVersion
        infoObject = self.makeInfoObject()
        infoObject.openTypeNameVersion = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeNameUniqueID
        infoObject = self.makeInfoObject()
        infoObject.openTypeNameUniqueID = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeNameDescription
        infoObject = self.makeInfoObject()
        infoObject.openTypeNameDescription = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeNamePreferredFamilyName
        infoObject = self.makeInfoObject()
        infoObject.openTypeNamePreferredFamilyName = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeNamePreferredSubfamilyName
        infoObject = self.makeInfoObject()
        infoObject.openTypeNamePreferredSubfamilyName = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeNameCompatibleFullName
        infoObject = self.makeInfoObject()
        infoObject.openTypeNameCompatibleFullName = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeNameSampleText
        infoObject = self.makeInfoObject()
        infoObject.openTypeNameSampleText = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeNameWWSFamilyName
        infoObject = self.makeInfoObject()
        infoObject.openTypeNameWWSFamilyName = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeNameWWSSubfamilyName
        infoObject = self.makeInfoObject()
        infoObject.openTypeNameWWSSubfamilyName = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)

    def testOS2Write(self):
        # openTypeOS2WidthClass
        ## not an int
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2WidthClass = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## out or range
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2WidthClass = 15
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2WeightClass
        infoObject = self.makeInfoObject()
        ## not an int
        infoObject.openTypeOS2WeightClass = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## out of range
        infoObject.openTypeOS2WeightClass = -50
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2Selection
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2Selection = [-1]
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2VendorID
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2VendorID = 1234
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # 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=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## too few values
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2Panose = [0, 1, 2, 3]
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## too many values
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2Panose = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2FamilyClass
        ## not an int
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2FamilyClass = [0, str(1)]
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## too few values
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2FamilyClass = [1]
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## too many values
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2FamilyClass = [1, 1, 1]
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## out of range
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2FamilyClass = [1, 20]
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2UnicodeRanges
        ## not an int
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2UnicodeRanges = ["0"]
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## out of range
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2UnicodeRanges = [-1]
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2CodePageRanges
        ## not an int
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2CodePageRanges = ["0"]
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## out of range
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2CodePageRanges = [-1]
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2TypoAscender
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2TypoAscender = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2TypoDescender
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2TypoDescender = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2TypoLineGap
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2TypoLineGap = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2WinAscent
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2WinAscent = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2WinDescent
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2WinDescent = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2Type
        ## not an int
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2Type = ["1"]
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## out of range
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2Type = [-1]
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2SubscriptXSize
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2SubscriptXSize = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2SubscriptYSize
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2SubscriptYSize = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2SubscriptXOffset
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2SubscriptXOffset = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2SubscriptYOffset
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2SubscriptYOffset = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2SuperscriptXSize
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2SuperscriptXSize = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2SuperscriptYSize
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2SuperscriptYSize = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2SuperscriptXOffset
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2SuperscriptXOffset = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2SuperscriptYOffset
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2SuperscriptYOffset = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2StrikeoutSize
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2StrikeoutSize = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeOS2StrikeoutPosition
        infoObject = self.makeInfoObject()
        infoObject.openTypeOS2StrikeoutPosition = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)

    def testVheaWrite(self):
        # openTypeVheaVertTypoAscender
        infoObject = self.makeInfoObject()
        infoObject.openTypeVheaVertTypoAscender = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeVheaVertTypoDescender
        infoObject = self.makeInfoObject()
        infoObject.openTypeVheaVertTypoDescender = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeVheaVertTypoLineGap
        infoObject = self.makeInfoObject()
        infoObject.openTypeVheaVertTypoLineGap = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeVheaCaretSlopeRise
        infoObject = self.makeInfoObject()
        infoObject.openTypeVheaCaretSlopeRise = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeVheaCaretSlopeRun
        infoObject = self.makeInfoObject()
        infoObject.openTypeVheaCaretSlopeRun = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # openTypeVheaCaretOffset
        infoObject = self.makeInfoObject()
        infoObject.openTypeVheaCaretOffset = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)

    def testFONDWrite(self):
        # macintoshFONDFamilyID
        infoObject = self.makeInfoObject()
        infoObject.macintoshFONDFamilyID = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # macintoshFONDName
        infoObject = self.makeInfoObject()
        infoObject.macintoshFONDName = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)

    def testPostscriptWrite(self):
        # postscriptFontName
        infoObject = self.makeInfoObject()
        infoObject.postscriptFontName = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptFullName
        infoObject = self.makeInfoObject()
        infoObject.postscriptFullName = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptSlantAngle
        infoObject = self.makeInfoObject()
        infoObject.postscriptSlantAngle = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptUniqueID
        infoObject = self.makeInfoObject()
        infoObject.postscriptUniqueID = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptUnderlineThickness
        infoObject = self.makeInfoObject()
        infoObject.postscriptUnderlineThickness = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptUnderlinePosition
        infoObject = self.makeInfoObject()
        infoObject.postscriptUnderlinePosition = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptIsFixedPitch
        infoObject = self.makeInfoObject()
        infoObject.postscriptIsFixedPitch = 2
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptBlueValues
        ## not a list
        infoObject = self.makeInfoObject()
        infoObject.postscriptBlueValues = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## uneven value count
        infoObject = self.makeInfoObject()
        infoObject.postscriptBlueValues = [500]
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## 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=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptOtherBlues
        ## not a list
        infoObject = self.makeInfoObject()
        infoObject.postscriptOtherBlues = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## uneven value count
        infoObject = self.makeInfoObject()
        infoObject.postscriptOtherBlues = [500]
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## 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=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptFamilyBlues
        ## not a list
        infoObject = self.makeInfoObject()
        infoObject.postscriptFamilyBlues = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## uneven value count
        infoObject = self.makeInfoObject()
        infoObject.postscriptFamilyBlues = [500]
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## 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=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptFamilyOtherBlues
        ## not a list
        infoObject = self.makeInfoObject()
        infoObject.postscriptFamilyOtherBlues = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## uneven value count
        infoObject = self.makeInfoObject()
        infoObject.postscriptFamilyOtherBlues = [500]
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## 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=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptStemSnapH
        ## not list
        infoObject = self.makeInfoObject()
        infoObject.postscriptStemSnapH = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## 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=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptStemSnapV
        ## not list
        infoObject = self.makeInfoObject()
        infoObject.postscriptStemSnapV = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        ## 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=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptBlueFuzz
        infoObject = self.makeInfoObject()
        infoObject.postscriptBlueFuzz = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptBlueShift
        infoObject = self.makeInfoObject()
        infoObject.postscriptBlueShift = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptBlueScale
        infoObject = self.makeInfoObject()
        infoObject.postscriptBlueScale = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptForceBold
        infoObject = self.makeInfoObject()
        infoObject.postscriptForceBold = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptDefaultWidthX
        infoObject = self.makeInfoObject()
        infoObject.postscriptDefaultWidthX = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptNominalWidthX
        infoObject = self.makeInfoObject()
        infoObject.postscriptNominalWidthX = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptWeightName
        infoObject = self.makeInfoObject()
        infoObject.postscriptWeightName = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptDefaultCharacter
        infoObject = self.makeInfoObject()
        infoObject.postscriptDefaultCharacter = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # postscriptWindowsCharacterSet
        infoObject = self.makeInfoObject()
        infoObject.postscriptWindowsCharacterSet = -1
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # macintoshFONDFamilyID
        infoObject = self.makeInfoObject()
        infoObject.macintoshFONDFamilyID = "abc"
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
        # macintoshFONDName
        infoObject = self.makeInfoObject()
        infoObject.macintoshFONDName = 123
        writer = UFOWriter(self.dstDir, formatVersion=2)
        self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
