def setUpFont(self, doInfo=False, doKerning=False, doGroups=False): self.dstDir = tempfile.mktemp() os.mkdir(self.dstDir) self.font = OpenFont(vfbPath) self.font.writeUFO(self.dstDir, doInfo=doInfo, doKerning=doKerning, doGroups=doGroups, formatVersion=1) self.font.close()
def setUpFont(self, doInfo=False, doKerning=False, doGroups=False, doLib=False, doFeatures=False): self.dstDir = tempfile.mktemp() os.mkdir(self.dstDir) self.font = OpenFont(vfbPath) self.font.writeUFO(self.dstDir, doInfo=doInfo, doKerning=doKerning, doGroups=doGroups, doLib=doLib, doFeatures=doFeatures) self.font.close()
class WriteUFOFormatVersion2TestCase(unittest.TestCase): def setUpFont(self, doInfo=False, doKerning=False, doGroups=False, doLib=False, doFeatures=False): self.dstDir = tempfile.mktemp() os.mkdir(self.dstDir) self.font = OpenFont(vfbPath) self.font.writeUFO(self.dstDir, doInfo=doInfo, doKerning=doKerning, doGroups=doGroups, doLib=doLib, doFeatures=doFeatures) self.font.close() def tearDownFont(self): shutil.rmtree(self.dstDir) def compareToUFO(self, doInfo=True, doKerning=True, doGroups=True, doLib=True, doFeatures=True): readerExpected = UFOReader(ufoPath2) readerWritten = UFOReader(self.dstDir) results = {} if doInfo: matches = True expectedPath = os.path.join(ufoPath2, "fontinfo.plist") writtenPath = os.path.join(self.dstDir, "fontinfo.plist") if not os.path.exists(writtenPath): matches = False else: dummyFont = NewFont() _ufoToFLAttrMapping = dict(dummyFont.info._ufoToFLAttrMapping) dummyFont.close() expected = readPlist(expectedPath) written = readPlist(writtenPath) for attr, expectedValue in expected.items(): # cheat by skipping attrs that aren't supported if _ufoToFLAttrMapping[attr]["nakedAttribute"] is None: continue if expectedValue != written[attr]: matches = False break results["info"] = matches if doKerning: matches = True expectedPath = os.path.join(ufoPath2, "kerning.plist") writtenPath = os.path.join(self.dstDir, "kerning.plist") if not os.path.exists(writtenPath): matches = False else: matches = readPlist(expectedPath) == readPlist(writtenPath) results["kerning"] = matches if doGroups: matches = True expectedPath = os.path.join(ufoPath2, "groups.plist") writtenPath = os.path.join(self.dstDir, "groups.plist") if not os.path.exists(writtenPath): matches = False else: matches = readPlist(expectedPath) == readPlist(writtenPath) results["groups"] = matches if doFeatures: matches = True expectedPath = os.path.join(ufoPath2, "features.fea") writtenPath = os.path.join(self.dstDir, "features.fea") if not os.path.exists(writtenPath): matches = False else: f = open(expectedPath, "r") expectedText = f.read() f.close() f = open(writtenPath, "r") writtenText = f.read() f.close() # FontLab likes to add lines to the features, so skip blank lines. expectedText = [line for line in expectedText.splitlines() if line] writtenText = [line for line in writtenText.splitlines() if line] matches = "\n".join(expectedText) == "\n".join(writtenText) results["features"] = matches if doLib: matches = True expectedPath = os.path.join(ufoPath2, "lib.plist") writtenPath = os.path.join(self.dstDir, "lib.plist") if not os.path.exists(writtenPath): matches = False else: # the test file doesn't have the glyph order # so purge it from the written writtenLib = readPlist(writtenPath) del writtenLib["org.robofab.glyphOrder"] matches = readPlist(expectedPath) == writtenLib results["lib"] = matches return results def testFull(self): self.setUpFont(doInfo=True, doKerning=True, doGroups=True, doFeatures=True, doLib=True) otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], True) self.assertEqual(otherResults["kerning"], True) self.assertEqual(otherResults["groups"], True) self.assertEqual(otherResults["features"], True) self.assertEqual(otherResults["lib"], True) self.tearDownFont() def testInfo(self): self.setUpFont(doInfo=True) otherResults = self.compareToUFO(doInfo=False) self.assertEqual(otherResults["kerning"], False) self.assertEqual(otherResults["groups"], False) self.assertEqual(otherResults["features"], False) self.assertEqual(otherResults["lib"], False) expectedPath = os.path.join(ufoPath2, "fontinfo.plist") writtenPath = os.path.join(self.dstDir, "fontinfo.plist") expected = readPlist(expectedPath) written = readPlist(writtenPath) dummyFont = NewFont() _ufoToFLAttrMapping = dict(dummyFont.info._ufoToFLAttrMapping) dummyFont.close() for attr, expectedValue in expected.items(): # cheat by skipping attrs that aren't supported if _ufoToFLAttrMapping[attr]["nakedAttribute"] is None: continue self.assertEqual((attr, expectedValue), (attr, written[attr])) self.tearDownFont() def testFeatures(self): self.setUpFont(doFeatures=True) otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], False) self.assertEqual(otherResults["kerning"], False) self.assertEqual(otherResults["groups"], False) self.assertEqual(otherResults["features"], True) self.assertEqual(otherResults["lib"], False) self.tearDownFont() def testKerning(self): self.setUpFont(doKerning=True) otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], False) self.assertEqual(otherResults["kerning"], True) self.assertEqual(otherResults["groups"], False) self.assertEqual(otherResults["features"], False) self.assertEqual(otherResults["lib"], False) self.tearDownFont() def testGroups(self): self.setUpFont(doGroups=True) otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], False) self.assertEqual(otherResults["kerning"], False) self.assertEqual(otherResults["groups"], True) self.assertEqual(otherResults["features"], False) self.assertEqual(otherResults["lib"], False) self.tearDownFont() def testLib(self): self.setUpFont(doLib=True) otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], False) self.assertEqual(otherResults["kerning"], False) self.assertEqual(otherResults["groups"], False) self.assertEqual(otherResults["features"], False) self.assertEqual(otherResults["lib"], True) self.tearDownFont()
class WriteUFOFormatVersion1TestCase(unittest.TestCase): def setUpFont(self, doInfo=False, doKerning=False, doGroups=False): self.dstDir = tempfile.mktemp() os.mkdir(self.dstDir) self.font = OpenFont(vfbPath) self.font.writeUFO(self.dstDir, doInfo=doInfo, doKerning=doKerning, doGroups=doGroups, formatVersion=1) self.font.close() def tearDownFont(self): shutil.rmtree(self.dstDir) def compareToUFO(self, doInfo=True, doKerning=True, doGroups=True, doLib=True, doFeatures=True): readerExpected = UFOReader(ufoPath1) readerWritten = UFOReader(self.dstDir) results = {} if doInfo: matches = True expectedPath = os.path.join(ufoPath1, "fontinfo.plist") writtenPath = os.path.join(self.dstDir, "fontinfo.plist") if not os.path.exists(writtenPath): matches = False else: expected = readPlist(expectedPath) written = readPlist(writtenPath) for attr, expectedValue in expected.items(): if expectedValue != written[attr]: matches = False break results["info"] = matches if doKerning: matches = True expectedPath = os.path.join(ufoPath1, "kerning.plist") writtenPath = os.path.join(self.dstDir, "kerning.plist") if not os.path.exists(writtenPath): matches = False else: matches = readPlist(expectedPath) == readPlist(writtenPath) results["kerning"] = matches if doGroups: matches = True expectedPath = os.path.join(ufoPath1, "groups.plist") writtenPath = os.path.join(self.dstDir, "groups.plist") if not os.path.exists(writtenPath): matches = False else: matches = readPlist(expectedPath) == readPlist(writtenPath) results["groups"] = matches if doFeatures: matches = True featuresPath = os.path.join(self.dstDir, "features.fea") libPath = os.path.join(self.dstDir, "lib.plist") if os.path.exists(featuresPath): matches = False else: fontLib = readPlist(libPath) writtenText = [fontLib.get("org.robofab.opentype.classes", "")] features = fontLib.get("org.robofab.opentype.features", {}) featureOrder= fontLib.get("org.robofab.opentype.featureorder", []) for featureName in featureOrder: writtenText.append(features.get(featureName, "")) writtenText = "\n".join(writtenText) # FontLab likes to add lines to the features, so skip blank lines. expectedText = [line for line in expectedFormatVersion1Features.splitlines() if line] writtenText = [line for line in writtenText.splitlines() if line] matches = "\n".join(expectedText) == "\n".join(writtenText) results["features"] = matches if doLib: matches = True expectedPath = os.path.join(ufoPath1, "lib.plist") writtenPath = os.path.join(self.dstDir, "lib.plist") if not os.path.exists(writtenPath): matches = False else: # the test file doesn't have the glyph order # so purge it from the written writtenLib = readPlist(writtenPath) del writtenLib["org.robofab.glyphOrder"] matches = readPlist(expectedPath) == writtenLib results["lib"] = matches return results def testFull(self): self.setUpFont(doInfo=True, doKerning=True, doGroups=True) otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], True) self.assertEqual(otherResults["kerning"], True) self.assertEqual(otherResults["groups"], True) self.assertEqual(otherResults["features"], True) self.assertEqual(otherResults["lib"], True) self.tearDownFont() def testInfo(self): self.setUpFont(doInfo=True) otherResults = self.compareToUFO(doInfo=False) self.assertEqual(otherResults["kerning"], False) self.assertEqual(otherResults["groups"], False) expectedPath = os.path.join(ufoPath1, "fontinfo.plist") writtenPath = os.path.join(self.dstDir, "fontinfo.plist") expected = readPlist(expectedPath) written = readPlist(writtenPath) for attr, expectedValue in expected.items(): self.assertEqual((attr, expectedValue), (attr, written[attr])) self.tearDownFont() def testFeatures(self): self.setUpFont() otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], False) self.assertEqual(otherResults["kerning"], False) self.assertEqual(otherResults["groups"], False) self.assertEqual(otherResults["features"], True) self.tearDownFont() def testKerning(self): self.setUpFont(doKerning=True) otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], False) self.assertEqual(otherResults["kerning"], True) self.assertEqual(otherResults["groups"], False) self.tearDownFont() def testGroups(self): self.setUpFont(doGroups=True) otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], False) self.assertEqual(otherResults["kerning"], False) self.assertEqual(otherResults["groups"], True) self.tearDownFont() def testLib(self): self.setUpFont() otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], False) self.assertEqual(otherResults["kerning"], False) self.assertEqual(otherResults["groups"], False) self.assertEqual(otherResults["lib"], True) self.tearDownFont()
class WriteUFOFormatVersion2TestCase(unittest.TestCase): def setUpFont(self, doInfo=False, doKerning=False, doGroups=False, doLib=False, doFeatures=False): self.dstDir = tempfile.mktemp() os.mkdir(self.dstDir) self.font = OpenFont(vfbPath) self.font.writeUFO(self.dstDir, doInfo=doInfo, doKerning=doKerning, doGroups=doGroups, doLib=doLib, doFeatures=doFeatures) self.font.close() def tearDownFont(self): shutil.rmtree(self.dstDir) def compareToUFO(self, doInfo=True, doKerning=True, doGroups=True, doLib=True, doFeatures=True): readerExpected = UFOReader(ufoPath2) readerWritten = UFOReader(self.dstDir) results = {} if doInfo: matches = True expectedPath = os.path.join(ufoPath2, "fontinfo.plist") writtenPath = os.path.join(self.dstDir, "fontinfo.plist") if not os.path.exists(writtenPath): matches = False else: dummyFont = NewFont() _ufoToFLAttrMapping = dict(dummyFont.info._ufoToFLAttrMapping) dummyFont.close() expected = readPlist(expectedPath) written = readPlist(writtenPath) for attr, expectedValue in expected.items(): # cheat by skipping attrs that aren't supported if _ufoToFLAttrMapping[attr]["nakedAttribute"] is None: continue if expectedValue != written[attr]: matches = False break results["info"] = matches if doKerning: matches = True expectedPath = os.path.join(ufoPath2, "kerning.plist") writtenPath = os.path.join(self.dstDir, "kerning.plist") if not os.path.exists(writtenPath): matches = False else: matches = readPlist(expectedPath) == readPlist(writtenPath) results["kerning"] = matches if doGroups: matches = True expectedPath = os.path.join(ufoPath2, "groups.plist") writtenPath = os.path.join(self.dstDir, "groups.plist") if not os.path.exists(writtenPath): matches = False else: matches = readPlist(expectedPath) == readPlist(writtenPath) results["groups"] = matches if doFeatures: matches = True expectedPath = os.path.join(ufoPath2, "features.fea") writtenPath = os.path.join(self.dstDir, "features.fea") if not os.path.exists(writtenPath): matches = False else: f = open(expectedPath, "r") expectedText = f.read() f.close() f = open(writtenPath, "r") writtenText = f.read() f.close() # FontLab likes to add lines to the features, so skip blank lines. expectedText = [ line for line in expectedText.splitlines() if line ] writtenText = [ line for line in writtenText.splitlines() if line ] matches = "\n".join(expectedText) == "\n".join(writtenText) results["features"] = matches if doLib: matches = True expectedPath = os.path.join(ufoPath2, "lib.plist") writtenPath = os.path.join(self.dstDir, "lib.plist") if not os.path.exists(writtenPath): matches = False else: # the test file doesn't have the glyph order # so purge it from the written writtenLib = readPlist(writtenPath) del writtenLib["org.robofab.glyphOrder"] matches = readPlist(expectedPath) == writtenLib results["lib"] = matches return results def testFull(self): self.setUpFont(doInfo=True, doKerning=True, doGroups=True, doFeatures=True, doLib=True) otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], True) self.assertEqual(otherResults["kerning"], True) self.assertEqual(otherResults["groups"], True) self.assertEqual(otherResults["features"], True) self.assertEqual(otherResults["lib"], True) self.tearDownFont() def testInfo(self): self.setUpFont(doInfo=True) otherResults = self.compareToUFO(doInfo=False) self.assertEqual(otherResults["kerning"], False) self.assertEqual(otherResults["groups"], False) self.assertEqual(otherResults["features"], False) self.assertEqual(otherResults["lib"], False) expectedPath = os.path.join(ufoPath2, "fontinfo.plist") writtenPath = os.path.join(self.dstDir, "fontinfo.plist") expected = readPlist(expectedPath) written = readPlist(writtenPath) dummyFont = NewFont() _ufoToFLAttrMapping = dict(dummyFont.info._ufoToFLAttrMapping) dummyFont.close() for attr, expectedValue in expected.items(): # cheat by skipping attrs that aren't supported if _ufoToFLAttrMapping[attr]["nakedAttribute"] is None: continue self.assertEqual((attr, expectedValue), (attr, written[attr])) self.tearDownFont() def testFeatures(self): self.setUpFont(doFeatures=True) otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], False) self.assertEqual(otherResults["kerning"], False) self.assertEqual(otherResults["groups"], False) self.assertEqual(otherResults["features"], True) self.assertEqual(otherResults["lib"], False) self.tearDownFont() def testKerning(self): self.setUpFont(doKerning=True) otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], False) self.assertEqual(otherResults["kerning"], True) self.assertEqual(otherResults["groups"], False) self.assertEqual(otherResults["features"], False) self.assertEqual(otherResults["lib"], False) self.tearDownFont() def testGroups(self): self.setUpFont(doGroups=True) otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], False) self.assertEqual(otherResults["kerning"], False) self.assertEqual(otherResults["groups"], True) self.assertEqual(otherResults["features"], False) self.assertEqual(otherResults["lib"], False) self.tearDownFont() def testLib(self): self.setUpFont(doLib=True) otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], False) self.assertEqual(otherResults["kerning"], False) self.assertEqual(otherResults["groups"], False) self.assertEqual(otherResults["features"], False) self.assertEqual(otherResults["lib"], True) self.tearDownFont()
class WriteUFOFormatVersion1TestCase(unittest.TestCase): def setUpFont(self, doInfo=False, doKerning=False, doGroups=False): self.dstDir = tempfile.mktemp() os.mkdir(self.dstDir) self.font = OpenFont(vfbPath) self.font.writeUFO(self.dstDir, doInfo=doInfo, doKerning=doKerning, doGroups=doGroups, formatVersion=1) self.font.close() def tearDownFont(self): shutil.rmtree(self.dstDir) def compareToUFO(self, doInfo=True, doKerning=True, doGroups=True, doLib=True, doFeatures=True): readerExpected = UFOReader(ufoPath1) readerWritten = UFOReader(self.dstDir) results = {} if doInfo: matches = True expectedPath = os.path.join(ufoPath1, "fontinfo.plist") writtenPath = os.path.join(self.dstDir, "fontinfo.plist") if not os.path.exists(writtenPath): matches = False else: expected = readPlist(expectedPath) written = readPlist(writtenPath) for attr, expectedValue in expected.items(): if expectedValue != written[attr]: matches = False break results["info"] = matches if doKerning: matches = True expectedPath = os.path.join(ufoPath1, "kerning.plist") writtenPath = os.path.join(self.dstDir, "kerning.plist") if not os.path.exists(writtenPath): matches = False else: matches = readPlist(expectedPath) == readPlist(writtenPath) results["kerning"] = matches if doGroups: matches = True expectedPath = os.path.join(ufoPath1, "groups.plist") writtenPath = os.path.join(self.dstDir, "groups.plist") if not os.path.exists(writtenPath): matches = False else: matches = readPlist(expectedPath) == readPlist(writtenPath) results["groups"] = matches if doFeatures: matches = True featuresPath = os.path.join(self.dstDir, "features.fea") libPath = os.path.join(self.dstDir, "lib.plist") if os.path.exists(featuresPath): matches = False else: fontLib = readPlist(libPath) writtenText = [fontLib.get("org.robofab.opentype.classes", "")] features = fontLib.get("org.robofab.opentype.features", {}) featureOrder = fontLib.get("org.robofab.opentype.featureorder", []) for featureName in featureOrder: writtenText.append(features.get(featureName, "")) writtenText = "\n".join(writtenText) # FontLab likes to add lines to the features, so skip blank lines. expectedText = [ line for line in expectedFormatVersion1Features.splitlines() if line ] writtenText = [ line for line in writtenText.splitlines() if line ] matches = "\n".join(expectedText) == "\n".join(writtenText) results["features"] = matches if doLib: matches = True expectedPath = os.path.join(ufoPath1, "lib.plist") writtenPath = os.path.join(self.dstDir, "lib.plist") if not os.path.exists(writtenPath): matches = False else: # the test file doesn't have the glyph order # so purge it from the written writtenLib = readPlist(writtenPath) del writtenLib["org.robofab.glyphOrder"] matches = readPlist(expectedPath) == writtenLib results["lib"] = matches return results def testFull(self): self.setUpFont(doInfo=True, doKerning=True, doGroups=True) otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], True) self.assertEqual(otherResults["kerning"], True) self.assertEqual(otherResults["groups"], True) self.assertEqual(otherResults["features"], True) self.assertEqual(otherResults["lib"], True) self.tearDownFont() def testInfo(self): self.setUpFont(doInfo=True) otherResults = self.compareToUFO(doInfo=False) self.assertEqual(otherResults["kerning"], False) self.assertEqual(otherResults["groups"], False) expectedPath = os.path.join(ufoPath1, "fontinfo.plist") writtenPath = os.path.join(self.dstDir, "fontinfo.plist") expected = readPlist(expectedPath) written = readPlist(writtenPath) for attr, expectedValue in expected.items(): self.assertEqual((attr, expectedValue), (attr, written[attr])) self.tearDownFont() def testFeatures(self): self.setUpFont() otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], False) self.assertEqual(otherResults["kerning"], False) self.assertEqual(otherResults["groups"], False) self.assertEqual(otherResults["features"], True) self.tearDownFont() def testKerning(self): self.setUpFont(doKerning=True) otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], False) self.assertEqual(otherResults["kerning"], True) self.assertEqual(otherResults["groups"], False) self.tearDownFont() def testGroups(self): self.setUpFont(doGroups=True) otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], False) self.assertEqual(otherResults["kerning"], False) self.assertEqual(otherResults["groups"], True) self.tearDownFont() def testLib(self): self.setUpFont() otherResults = self.compareToUFO() self.assertEqual(otherResults["info"], False) self.assertEqual(otherResults["kerning"], False) self.assertEqual(otherResults["groups"], False) self.assertEqual(otherResults["lib"], True) self.tearDownFont()