for constency with the rest of fontTools tests. Also, in setup.cfg we tell pytest to only search for modules named like these
165 lines
5.7 KiB
Python
165 lines
5.7 KiB
Python
from __future__ import absolute_import, unicode_literals
|
|
import os
|
|
import tempfile
|
|
import shutil
|
|
import unittest
|
|
from io import open
|
|
from .testSupport import getDemoFontGlyphSetPath
|
|
from fontTools.ufoLib.glifLib import (
|
|
GlyphSet, glyphNameToFileName, readGlyphFromString, writeGlyphToString,
|
|
_XML_DECLARATION,
|
|
)
|
|
|
|
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, validateRead=True, validateWrite=True)
|
|
dst = GlyphSet(dstDir, ufoFormatVersion=2, validateRead=True, validateWrite=True)
|
|
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 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, validateRead=True, validateWrite=True)
|
|
contents = gset.contents
|
|
gset.rebuildContents()
|
|
self.assertEqual(contents, gset.contents)
|
|
|
|
def testReverseContents(self):
|
|
gset = GlyphSet(GLYPHSETDIR, validateRead=True, validateWrite=True)
|
|
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, validateRead=True, validateWrite=True)
|
|
dst = GlyphSet(self.dstDir, validateRead=True, validateWrite=True)
|
|
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, validateRead=True, validateWrite=True)
|
|
dst = GlyphSet(self.dstDir, myGlyphNameToFileName, validateRead=True, validateWrite=True)
|
|
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():
|
|
d[k] = "prefix" + v
|
|
self.assertEqual(d, dst.contents)
|
|
|
|
def testGetUnicodes(self):
|
|
src = GlyphSet(GLYPHSETDIR, validateRead=True, validateWrite=True)
|
|
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), "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")
|
|
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")
|
|
|
|
|
|
class _Glyph(object):
|
|
pass
|
|
|
|
|
|
class ReadWriteFuncTest(unittest.TestCase):
|
|
|
|
def testRoundTrip(self):
|
|
glyph = _Glyph()
|
|
glyph.name = "a"
|
|
glyph.unicodes = [0x0061]
|
|
|
|
s1 = writeGlyphToString(glyph.name, glyph)
|
|
|
|
glyph2 = _Glyph()
|
|
readGlyphFromString(s1, glyph2)
|
|
self.assertEqual(glyph.__dict__, glyph2.__dict__)
|
|
|
|
s2 = writeGlyphToString(glyph2.name, glyph2)
|
|
self.assertEqual(s1, s2)
|
|
|
|
def testXmlDeclaration(self):
|
|
s = writeGlyphToString("a", _Glyph())
|
|
self.assertTrue(s.startswith(_XML_DECLARATION.decode("utf-8")))
|