diff options
Diffstat (limited to 'misc/pylib/robofab/test/test_glifLib.py')
-rw-r--r-- | misc/pylib/robofab/test/test_glifLib.py | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/misc/pylib/robofab/test/test_glifLib.py b/misc/pylib/robofab/test/test_glifLib.py new file mode 100644 index 000000000..13eca3a6a --- /dev/null +++ b/misc/pylib/robofab/test/test_glifLib.py @@ -0,0 +1,150 @@ +import os +import tempfile +import shutil +import unittest + +from robofab.test.testSupport import getDemoFontGlyphSetPath +from robofab.glifLib import GlyphSet, glyphNameToFileName, READ_MODE +from robofab.tools.glyphNameSchemes import glyphNameToShortFileName + + +GLYPHSETDIR = getDemoFontGlyphSetPath() + + +class GlyphSetTests(unittest.TestCase): + + def setUp(self): + self.dstDir = tempfile.mktemp() + os.mkdir(self.dstDir) + + def tearDown(self): + shutil.rmtree(self.dstDir) + + def testRoundTrip(self): + srcDir = GLYPHSETDIR + dstDir = self.dstDir + src = GlyphSet(srcDir) + dst = GlyphSet(dstDir) + for glyphName in src.keys(): + g = src[glyphName] + g.drawPoints(None) # load attrs + dst.writeGlyph(glyphName, g, g.drawPoints) + # compare raw file data: + for glyphName in src.keys(): + fileName = src.contents[glyphName] + org = file(os.path.join(srcDir, fileName), READ_MODE).read() + new = file(os.path.join(dstDir, fileName), READ_MODE).read() + self.assertEqual(org, new, "%r .glif file differs after round tripping" % glyphName) + + def testRebuildContents(self): + gset = GlyphSet(GLYPHSETDIR) + contents = gset.contents + gset.rebuildContents() + self.assertEqual(contents, gset.contents) + + def testReverseContents(self): + gset = GlyphSet(GLYPHSETDIR) + d = {} + for k, v in gset.getReverseContents().items(): + d[v] = k + org = {} + for k, v in gset.contents.items(): + org[k] = v.lower() + self.assertEqual(d, org) + + def testReverseContents2(self): + src = GlyphSet(GLYPHSETDIR) + dst = GlyphSet(self.dstDir) + dstMap = dst.getReverseContents() + self.assertEqual(dstMap, {}) + for glyphName in src.keys(): + g = src[glyphName] + g.drawPoints(None) # load attrs + dst.writeGlyph(glyphName, g, g.drawPoints) + self.assertNotEqual(dstMap, {}) + srcMap = dict(src.getReverseContents()) # copy + self.assertEqual(dstMap, srcMap) + del srcMap["a.glif"] + dst.deleteGlyph("a") + self.assertEqual(dstMap, srcMap) + + def testCustomFileNamingScheme(self): + def myGlyphNameToFileName(glyphName, glyphSet): + return "prefix" + glyphNameToFileName(glyphName, glyphSet) + src = GlyphSet(GLYPHSETDIR) + dst = GlyphSet(self.dstDir, myGlyphNameToFileName) + for glyphName in src.keys(): + g = src[glyphName] + g.drawPoints(None) # load attrs + dst.writeGlyph(glyphName, g, g.drawPoints) + d = {} + for k, v in src.contents.items(): + print k, v + d[k] = "prefix" + v + self.assertEqual(d, dst.contents) + + def testGetUnicodes(self): + src = GlyphSet(GLYPHSETDIR) + unicodes = src.getUnicodes() + for glyphName in src.keys(): + g = src[glyphName] + g.drawPoints(None) # load attrs + if not hasattr(g, "unicodes"): + self.assertEqual(unicodes[glyphName], []) + else: + self.assertEqual(g.unicodes, unicodes[glyphName]) + + +class FileNameTests(unittest.TestCase): + + def testDefaultFileNameScheme(self): + self.assertEqual(glyphNameToFileName("a", None), "a.glif") + self.assertEqual(glyphNameToFileName("A", None), "A_.glif") + self.assertEqual(glyphNameToFileName("Aring", None), "Aring_.glif") + self.assertEqual(glyphNameToFileName("F_A_B", None), "F__A__B_.glif") + self.assertEqual(glyphNameToFileName("A.alt", None), "A_.alt.glif") + self.assertEqual(glyphNameToFileName("A.Alt", None), "A_.Alt_.glif") + self.assertEqual(glyphNameToFileName(".notdef", None), "_notdef.glif") + self.assertEqual(glyphNameToFileName("T_H", None), "T__H_.glif") + self.assertEqual(glyphNameToFileName("T_h", None), "T__h.glif") + self.assertEqual(glyphNameToFileName("t_h", None), "t_h.glif") + self.assertEqual(glyphNameToFileName('F_F_I', None), "F__F__I_.glif") + self.assertEqual(glyphNameToFileName('f_f_i', None), "f_f_i.glif") + + + def testShortFileNameScheme(self): + print "testShortFileNameScheme" + self.assertEqual(glyphNameToShortFileName("a", None), "a.glif") + self.assertEqual(glyphNameToShortFileName("A", None), "A_.glif") + self.assertEqual(glyphNameToShortFileName("aE", None), "aE_.glif") + self.assertEqual(glyphNameToShortFileName("AE", None), "A_E_.glif") + self.assertEqual(glyphNameToShortFileName("a.alt", None), "a_alt.glif") + self.assertEqual(glyphNameToShortFileName("A.alt", None), "A__alt.glif") + self.assertEqual(glyphNameToShortFileName("a.alt#swash", None), "a_alt_swash.glif") + self.assertEqual(glyphNameToShortFileName("A.alt", None), "A__alt.glif") + self.assertEqual(glyphNameToShortFileName(".notdef", None), "_notdef.glif") + self.assertEqual(glyphNameToShortFileName("f_f_i", None), "f_f_i.glif") + self.assertEqual(glyphNameToShortFileName("F_F_I", None), "F__F__I_.glif") + self.assertEqual(glyphNameToShortFileName("acircumflexdieresis.swash.alt1", None), "acircumflexdieresi0cfc8352.glif") + self.assertEqual(glyphNameToShortFileName("acircumflexdieresis.swash.alt2", None), "acircumflexdieresi95f5d2e8.glif") + self.assertEqual(glyphNameToShortFileName("Acircumflexdieresis.swash.alt1", None), "A_circumflexdieresed24fb56.glif") + self.assertEqual(glyphNameToShortFileName("F#weight0.800_width0.425", None), "F__weight0_800_width0_425.glif") + self.assertEqual(glyphNameToShortFileName("F#weight0.83245511_width0.425693567", None), "F__weight0_8324551c9a4143c.glif") + self.assertEqual(len(glyphNameToShortFileName("F#weight0.83245511_width0.425693567", None)), 31) + + def testShortFileNameScheme_clashes(self): + # test for the condition in code.robofab.com ticket #5 + name1 = glyphNameToShortFileName('Adieresis', None) + name2 = glyphNameToShortFileName('a_dieresis', None) + self.assertNotEqual(name1, name2) + name1 = glyphNameToShortFileName('AE', None) + name2 = glyphNameToShortFileName('aE', None) + self.assertNotEqual(name1, name2) + + +if __name__ == "__main__": + from robofab.test.testSupport import runTests + import sys + if len(sys.argv) > 1 and os.path.isdir(sys.argv[-1]): + GLYPHSETDIR = sys.argv.pop() + runTests() |