139 lines
5.2 KiB
Python
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()
|