fonttools/Lib/ufoLib/test/test_glifLib.py
2015-11-05 09:30:43 +00:00

139 lines
5.2 KiB
Python

import os
import tempfile
import shutil
import unittest
from robofab.test.testSupport import getDemoFontGlyphSetPath
from ufoLib.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 list(src.keys()):
g = src[glyphName]
g.drawPoints(None) # load attrs
dst.writeGlyph(glyphName, g, g.drawPoints)
# compare raw file data:
for glyphName in list(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 list(gset.getReverseContents().items()):
d[v] = k
org = {}
for k, v in list(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 list(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 list(src.keys()):
g = src[glyphName]
g.drawPoints(None) # load attrs
dst.writeGlyph(glyphName, g, g.drawPoints)
d = {}
for k, v in list(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 list(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):
self.assertEqual(glyphNameToShortFileName("a", None), "a.glif")
self.assertEqual(glyphNameToShortFileName("A", None), "A_.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)
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()