2008-01-07 17:40:34 +00:00
|
|
|
import os
|
|
|
|
import tempfile
|
|
|
|
import shutil
|
|
|
|
import unittest
|
2015-11-02 14:48:06 +00:00
|
|
|
from io import open
|
|
|
|
from ufoLib.test.testSupport import getDemoFontGlyphSetPath
|
2015-11-05 10:12:15 +00:00
|
|
|
from ufoLib.glifLib import GlyphSet, glyphNameToFileName
|
2008-01-07 17:40:34 +00:00
|
|
|
|
|
|
|
|
|
|
|
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):
|
2015-11-03 22:07:21 +00:00
|
|
|
import difflib
|
2008-01-07 17:40:34 +00:00
|
|
|
srcDir = GLYPHSETDIR
|
|
|
|
dstDir = self.dstDir
|
2015-11-03 22:07:21 +00:00
|
|
|
src = GlyphSet(srcDir, ufoFormatVersion=2)
|
|
|
|
dst = GlyphSet(dstDir, ufoFormatVersion=2)
|
2015-11-05 09:03:19 +00:00
|
|
|
for glyphName in list(src.keys()):
|
2008-01-07 17:40:34 +00:00
|
|
|
g = src[glyphName]
|
|
|
|
g.drawPoints(None) # load attrs
|
|
|
|
dst.writeGlyph(glyphName, g, g.drawPoints)
|
|
|
|
# compare raw file data:
|
2015-11-02 14:48:06 +00:00
|
|
|
for glyphName in sorted(src.keys()):
|
2008-01-07 17:40:34 +00:00
|
|
|
fileName = src.contents[glyphName]
|
2015-11-05 10:12:15 +00:00
|
|
|
with open(os.path.join(srcDir, fileName), "r") as f:
|
2015-11-02 14:48:06 +00:00
|
|
|
org = f.read()
|
2015-11-05 10:12:15 +00:00
|
|
|
with open(os.path.join(dstDir, fileName), "r") as f:
|
2015-11-02 14:48:06 +00:00
|
|
|
new = f.read()
|
2015-11-03 22:07:21 +00:00
|
|
|
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)
|
2008-01-07 17:40:34 +00:00
|
|
|
|
|
|
|
def testRebuildContents(self):
|
|
|
|
gset = GlyphSet(GLYPHSETDIR)
|
|
|
|
contents = gset.contents
|
|
|
|
gset.rebuildContents()
|
|
|
|
self.assertEqual(contents, gset.contents)
|
|
|
|
|
|
|
|
def testReverseContents(self):
|
|
|
|
gset = GlyphSet(GLYPHSETDIR)
|
|
|
|
d = {}
|
2015-11-05 09:03:19 +00:00
|
|
|
for k, v in list(gset.getReverseContents().items()):
|
2008-01-07 17:40:34 +00:00
|
|
|
d[v] = k
|
|
|
|
org = {}
|
2015-11-05 09:03:19 +00:00
|
|
|
for k, v in list(gset.contents.items()):
|
2008-01-07 17:40:34 +00:00
|
|
|
org[k] = v.lower()
|
|
|
|
self.assertEqual(d, org)
|
|
|
|
|
|
|
|
def testReverseContents2(self):
|
|
|
|
src = GlyphSet(GLYPHSETDIR)
|
|
|
|
dst = GlyphSet(self.dstDir)
|
|
|
|
dstMap = dst.getReverseContents()
|
|
|
|
self.assertEqual(dstMap, {})
|
2015-11-05 09:03:19 +00:00
|
|
|
for glyphName in list(src.keys()):
|
2008-01-07 17:40:34 +00:00
|
|
|
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)
|
2015-11-05 09:03:19 +00:00
|
|
|
for glyphName in list(src.keys()):
|
2008-01-07 17:40:34 +00:00
|
|
|
g = src[glyphName]
|
|
|
|
g.drawPoints(None) # load attrs
|
|
|
|
dst.writeGlyph(glyphName, g, g.drawPoints)
|
|
|
|
d = {}
|
2015-11-05 09:03:19 +00:00
|
|
|
for k, v in list(src.contents.items()):
|
|
|
|
print(k, v)
|
2008-01-07 17:40:34 +00:00
|
|
|
d[k] = "prefix" + v
|
|
|
|
self.assertEqual(d, dst.contents)
|
|
|
|
|
|
|
|
def testGetUnicodes(self):
|
|
|
|
src = GlyphSet(GLYPHSETDIR)
|
|
|
|
unicodes = src.getUnicodes()
|
2015-11-05 09:03:19 +00:00
|
|
|
for glyphName in list(src.keys()):
|
2008-01-07 17:40:34 +00:00
|
|
|
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")
|
2015-11-02 14:48:23 +00:00
|
|
|
self.assertEqual(glyphNameToFileName("Aring", None), "A_ring.glif")
|
2009-03-30 19:19:16 +00:00
|
|
|
self.assertEqual(glyphNameToFileName("F_A_B", None), "F__A__B_.glif")
|
2008-01-07 17:40:34 +00:00
|
|
|
self.assertEqual(glyphNameToFileName("A.alt", None), "A_.alt.glif")
|
2015-11-02 14:48:23 +00:00
|
|
|
self.assertEqual(glyphNameToFileName("A.Alt", None), "A_.A_lt.glif")
|
2008-01-07 17:40:34 +00:00
|
|
|
self.assertEqual(glyphNameToFileName(".notdef", None), "_notdef.glif")
|
2009-03-30 19:19:16 +00:00
|
|
|
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")
|
2015-11-06 14:19:50 +00:00
|
|
|
self.assertEqual(glyphNameToFileName("F_F_I", None), "F__F__I_.glif")
|
|
|
|
self.assertEqual(glyphNameToFileName("f_f_i", None), "f_f_i.glif")
|
|
|
|
self.assertEqual(glyphNameToFileName("AE", None), "A_E_.glif")
|
|
|
|
self.assertEqual(glyphNameToFileName("Ae", None), "A_e.glif")
|
|
|
|
self.assertEqual(glyphNameToFileName("ae", None), "ae.glif")
|
|
|
|
self.assertEqual(glyphNameToFileName("aE", None), "aE_.glif")
|
|
|
|
self.assertEqual(glyphNameToFileName("a.alt", None), "a.alt.glif")
|
|
|
|
self.assertEqual(glyphNameToFileName("A.aLt", None), "A_.aL_t.glif")
|
|
|
|
self.assertEqual(glyphNameToFileName("A.alT", None), "A_.alT_.glif")
|
|
|
|
self.assertEqual(glyphNameToFileName("Aacute_V.swash", None), "A_acute_V_.swash.glif")
|
|
|
|
self.assertEqual(glyphNameToFileName(".notdef", None), "_notdef.glif")
|
|
|
|
self.assertEqual(glyphNameToFileName("con", None), "_con.glif")
|
|
|
|
self.assertEqual(glyphNameToFileName("CON", None), "C_O_N_.glif")
|
|
|
|
self.assertEqual(glyphNameToFileName("con.alt", None), "_con.alt.glif")
|
|
|
|
self.assertEqual(glyphNameToFileName("alt.con", None), "alt._con.glif")
|
2008-01-07 17:40:34 +00:00
|
|
|
|
|
|
|
|
|
|
|
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()
|