def testRoundTripVersion2(self): font = NewFont() infoObject = font.info for attr, value in fontInfoVersion2.items(): if attr in infoObject._ufoToFLAttrMapping and infoObject._ufoToFLAttrMapping[attr]["nakedAttribute"] is None: continue setattr(infoObject, attr, value) newValue = getattr(infoObject, attr) self.assertEqual((attr, newValue), (attr, value)) font.close()
def testRoundTripVersion2(self): font = NewFont() infoObject = font.info for attr, value in fontInfoVersion2.items(): if attr in infoObject._ufoToFLAttrMapping and infoObject._ufoToFLAttrMapping[ attr]["nakedAttribute"] is None: continue setattr(infoObject, attr, value) newValue = getattr(infoObject, attr) self.assertEqual((attr, newValue), (attr, value)) font.close()
def testRoundTripVersion1(self): font = NewFont() infoObject = font.info for attr, value in fontInfoVersion1.items(): if attr not in ufoLib.deprecatedFontInfoAttributesVersion2: setattr(infoObject, attr, value) for attr, expectedValue in fontInfoVersion1.items(): if attr not in ufoLib.deprecatedFontInfoAttributesVersion2: value = getattr(infoObject, attr) self.assertEqual((attr, expectedValue), (attr, value)) font.close()
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 testVersion2UnsupportedGet(self): saveStderr = sys.stderr saveStdout = sys.stdout tempStderr = StringIO() sys.stderr = tempStderr sys.stdout = tempStderr font = NewFont() infoObject = font.info requiredWarnings = [] try: for attr, value in fontInfoVersion2.items(): if attr in infoObject._ufoToFLAttrMapping and infoObject._ufoToFLAttrMapping[attr]["nakedAttribute"] is not None: continue getattr(infoObject, attr, value) s = "The attribute %s is not supported by FontLab." % attr requiredWarnings.append((attr, s)) finally: sys.stderr = saveStderr sys.stdout = saveStdout tempStderr = tempStderr.getvalue() for attr, line in requiredWarnings: self.assertEquals((attr, line in tempStderr), (attr, True)) font.close()
def testVersion2UnsupportedGet(self): saveStderr = sys.stderr saveStdout = sys.stdout tempStderr = StringIO() sys.stderr = tempStderr sys.stdout = tempStderr font = NewFont() infoObject = font.info requiredWarnings = [] try: for attr, value in fontInfoVersion2.items(): if attr in infoObject._ufoToFLAttrMapping and infoObject._ufoToFLAttrMapping[ attr]["nakedAttribute"] is not None: continue getattr(infoObject, attr, value) s = "The attribute %s is not supported by FontLab." % attr requiredWarnings.append((attr, s)) finally: sys.stderr = saveStderr sys.stdout = saveStdout tempStderr = tempStderr.getvalue() for attr, line in requiredWarnings: self.assertEquals((attr, line in tempStderr), (attr, True)) font.close()
def testVersion1DeprecationRoundTrip(self): saveStderr = sys.stderr saveStdout = sys.stdout tempStderr = StringIO() sys.stderr = tempStderr sys.stdout = tempStderr font = NewFont() infoObject = font.info requiredWarnings = [] try: for attr, value in fontInfoVersion1.items(): if attr in ufoLib.deprecatedFontInfoAttributesVersion2: setattr(infoObject, attr, value) v = getattr(infoObject, attr) self.assertEquals((attr, value), (attr, v)) s = "DeprecationWarning: The %s attribute has been deprecated." % attr requiredWarnings.append((attr, s)) finally: sys.stderr = saveStderr sys.stdout = saveStdout tempStderr = tempStderr.getvalue() for attr, line in requiredWarnings: self.assertEquals((attr, line in tempStderr), (attr, True)) font.close()
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
class ReadUFOFormatVersion1TestCase(unittest.TestCase): def setUpFont(self, doInfo=False, doKerning=False, doGroups=False, doLib=False, doFeatures=False): self.font = NewFont() self.ufoPath = ufoPath1 self.font.readUFO(ufoPath1, doInfo=doInfo, doKerning=doKerning, doGroups=doGroups, doLib=doLib, doFeatures=doFeatures) self.font.update() def tearDownFont(self): self.font.close() self.font = None def compareToUFO(self, doInfo=True, doKerning=True, doGroups=True, doLib=True, doFeatures=True): reader = UFOReader(self.ufoPath) results = {} if doInfo: infoMatches = True info = self.font.info for attr, expectedValue in expectedFontInfo1To2Conversion.items(): writtenValue = getattr(info, attr) if expectedValue != writtenValue: infoMatches = False break results["info"]= infoMatches if doKerning: kerning = self.font.kerning.asDict() expectedKerning = reader.readKerning() results["kerning"] = expectedKerning == kerning if doGroups: groups = dict(self.font.groups) expectedGroups = reader.readGroups() results["groups"] = expectedGroups == groups if doFeatures: features = self.font.features.text expectedFeatures = expectedFormatVersion1Features # FontLab likes to add lines to the features, so skip blank lines. features = [line for line in features.splitlines() if line] expectedFeatures = [line for line in expectedFeatures.splitlines() if line] results["features"] = expectedFeatures == features if doLib: lib = dict(self.font.lib) expectedLib = reader.readLib() for key in removeFromFormatVersion1Lib: if key in expectedLib: del expectedLib[key] results["lib"] = expectedLib == lib 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) info = self.font.info for attr, expectedValue in expectedFontInfo1To2Conversion.items(): writtenValue = getattr(info, attr) self.assertEqual((attr, expectedValue), (attr, writtenValue)) 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 ReadUFOFormatVersion2TestCase(unittest.TestCase): def setUpFont(self, doInfo=False, doKerning=False, doGroups=False, doLib=False, doFeatures=False): self.font = NewFont() self.ufoPath = ufoPath2 self.font.readUFO(ufoPath2, doInfo=doInfo, doKerning=doKerning, doGroups=doGroups, doLib=doLib, doFeatures=doFeatures) self.font.update() def tearDownFont(self): self.font.close() self.font = None def compareToUFO(self, doInfo=True, doKerning=True, doGroups=True, doLib=True, doFeatures=True): reader = UFOReader(self.ufoPath) results = {} if doInfo: infoMatches = True info = self.font.info for attr, expectedValue in fontInfoVersion2.items(): # cheat by skipping attrs that aren't supported if info._ufoToFLAttrMapping[attr]["nakedAttribute"] is None: continue writtenValue = getattr(info, attr) if expectedValue != writtenValue: infoMatches = False break results["info"]= infoMatches if doKerning: kerning = self.font.kerning.asDict() expectedKerning = reader.readKerning() results["kerning"] = expectedKerning == kerning if doGroups: groups = dict(self.font.groups) expectedGroups = reader.readGroups() results["groups"] = expectedGroups == groups if doFeatures: features = self.font.features.text expectedFeatures = reader.readFeatures() results["features"] = expectedFeatures == features if doLib: lib = dict(self.font.lib) expectedLib = reader.readLib() results["lib"] = expectedLib == lib 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) info = self.font.info for attr, expectedValue in fontInfoVersion2.items(): # cheat by skipping attrs that aren't supported if info._ufoToFLAttrMapping[attr]["nakedAttribute"] is None: continue writtenValue = getattr(info, attr) self.assertEqual((attr, expectedValue), (attr, writtenValue)) 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()
""" Remove overlap on all glyphs in a .ufo font. This script sis more than a little silly, but it demonstrates how objectsRF and objectsFL can work hand in hand. """ from robofab.objects.objectsRF import OpenFont from robofab.objects.objectsFL import NewFont from robofab.interface.all.dialogs import ProgressBar ufoFont = OpenFont(note="Select a .ufo") if ufoFont: bar = ProgressBar('Removing Overlap...', len(ufoFont)) flFont = NewFont() flGlyph = flFont.newGlyph('OverlapRemover') for ufoGlyph in ufoFont: flPen = flGlyph.getPointPen() ufoGlyph.drawPoints(flPen) flGlyph.removeOverlap() ufoPen = ufoGlyph.getPointPen() ufoGlyph.clear() flGlyph.drawPoints(ufoPen) flGlyph.clear() bar.tick() flFont.close(save=0) bar.close() ufoFont.save(doProgress=True)
class ReadUFOFormatVersion2TestCase(unittest.TestCase): def setUpFont(self, doInfo=False, doKerning=False, doGroups=False, doLib=False, doFeatures=False): self.font = NewFont() self.ufoPath = ufoPath2 self.font.readUFO(ufoPath2, doInfo=doInfo, doKerning=doKerning, doGroups=doGroups, doLib=doLib, doFeatures=doFeatures) self.font.update() def tearDownFont(self): self.font.close() self.font = None def compareToUFO(self, doInfo=True, doKerning=True, doGroups=True, doLib=True, doFeatures=True): reader = UFOReader(self.ufoPath) results = {} if doInfo: infoMatches = True info = self.font.info for attr, expectedValue in fontInfoVersion2.items(): # cheat by skipping attrs that aren't supported if info._ufoToFLAttrMapping[attr]["nakedAttribute"] is None: continue writtenValue = getattr(info, attr) if expectedValue != writtenValue: infoMatches = False break results["info"] = infoMatches if doKerning: kerning = self.font.kerning.asDict() expectedKerning = reader.readKerning() results["kerning"] = expectedKerning == kerning if doGroups: groups = dict(self.font.groups) expectedGroups = reader.readGroups() results["groups"] = expectedGroups == groups if doFeatures: features = self.font.features.text expectedFeatures = reader.readFeatures() results["features"] = expectedFeatures == features if doLib: lib = dict(self.font.lib) expectedLib = reader.readLib() results["lib"] = expectedLib == lib 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) info = self.font.info for attr, expectedValue in fontInfoVersion2.items(): # cheat by skipping attrs that aren't supported if info._ufoToFLAttrMapping[attr]["nakedAttribute"] is None: continue writtenValue = getattr(info, attr) self.assertEqual((attr, expectedValue), (attr, writtenValue)) 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()
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
class ReadUFOFormatVersion1TestCase(unittest.TestCase): def setUpFont(self, doInfo=False, doKerning=False, doGroups=False, doLib=False, doFeatures=False): self.font = NewFont() self.ufoPath = ufoPath1 self.font.readUFO(ufoPath1, doInfo=doInfo, doKerning=doKerning, doGroups=doGroups, doLib=doLib, doFeatures=doFeatures) self.font.update() def tearDownFont(self): self.font.close() self.font = None def compareToUFO(self, doInfo=True, doKerning=True, doGroups=True, doLib=True, doFeatures=True): reader = UFOReader(self.ufoPath) results = {} if doInfo: infoMatches = True info = self.font.info for attr, expectedValue in expectedFontInfo1To2Conversion.items(): writtenValue = getattr(info, attr) if expectedValue != writtenValue: infoMatches = False break results["info"] = infoMatches if doKerning: kerning = self.font.kerning.asDict() expectedKerning = reader.readKerning() results["kerning"] = expectedKerning == kerning if doGroups: groups = dict(self.font.groups) expectedGroups = reader.readGroups() results["groups"] = expectedGroups == groups if doFeatures: features = self.font.features.text expectedFeatures = expectedFormatVersion1Features # FontLab likes to add lines to the features, so skip blank lines. features = [line for line in features.splitlines() if line] expectedFeatures = [ line for line in expectedFeatures.splitlines() if line ] results["features"] = expectedFeatures == features if doLib: lib = dict(self.font.lib) expectedLib = reader.readLib() for key in removeFromFormatVersion1Lib: if key in expectedLib: del expectedLib[key] results["lib"] = expectedLib == lib 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) info = self.font.info for attr, expectedValue in expectedFontInfo1To2Conversion.items(): writtenValue = getattr(info, attr) self.assertEqual((attr, expectedValue), (attr, writtenValue)) 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()