fonttools/Lib/ufoLib/test/test_glifLib.py
2015-11-06 15:06:52 +00:00

152 lines
5.5 KiB
Python

import os
import tempfile
import shutil
import unittest
from io import open
from ufoLib.test.testSupport import getDemoFontGlyphSetPath
from ufoLib.glifLib import GlyphSet, glyphNameToFileName
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):
import difflib
srcDir = GLYPHSETDIR
dstDir = self.dstDir
src = GlyphSet(srcDir, ufoFormatVersion=2)
dst = GlyphSet(dstDir, ufoFormatVersion=2)
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 sorted(src.keys()):
fileName = src.contents[glyphName]
with open(os.path.join(srcDir, fileName), "r") as f:
org = f.read()
with open(os.path.join(dstDir, fileName), "r") as f:
new = f.read()
added = []
removed = []
for line in difflib.unified_diff(
org.split("\n"), new.split("\n")):
if line.startswith("+ "):
added.append(line[1:])
elif line.startswith("- "):
removed.append(line[1:])
self.assertEqual(
added, removed,
"%s.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), "A_ring.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_.A_lt.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()