import unittest from ufoLib.glifLib import GlifLibError, readGlyphFromString, writeGlyphToString from ufoLib.test.testSupport import Glyph, stripText # ---------- # Test Cases # ---------- class TestGLIF1(unittest.TestCase): def assertEqual(self, first, second, msg=None): if isinstance(first, basestring): first = stripText(first) if isinstance(second, basestring): second = stripText(second) return super(TestGLIF1, self).assertEqual(first, second, msg=msg) def glyphToGLIF(self, py): py = stripText(py) glyph = Glyph() exec py in {"glyph" : glyph, "pointPen" : glyph} glif = writeGlyphToString(glyph.name, glyphObject=glyph, drawPointsFunc=glyph.drawPoints, formatVersion=1) glif = "\n".join(glif.splitlines()[1:]) return glif def glifToPy(self, glif): glif = stripText(glif) glif = "\n" + glif glyph = Glyph() readGlyphFromString(glif, glyphObject=glyph, pointPen=glyph) return glyph.py() def testTopElement(self): # not glyph glif = """ """ self.assertRaises(GlifLibError, self.glifToPy, glif) def testName(self): # legal glif = """ """ py = """ glyph.name = "a" """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # empty glif = """ """ py = """ glyph.name = "" """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) # not a string py = """ glyph.name = 1 """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) def testFormat(self): # legal glif = """ """ py = """ glyph.name = "a" """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # wrong number glif = """ """ self.assertRaises(GlifLibError, self.glifToPy, glif) # not an int glif = """ """ self.assertRaises(GlifLibError, self.glifToPy, glif) def testBogusGlyphStructure(self): # unknown element glif = """ """ self.assertRaises(GlifLibError, self.glifToPy, glif) # content glif = """ Hello World. """ self.assertRaises(GlifLibError, self.glifToPy, glif) def testAdvance(self): # legal: width and height glif = """ """ py = """ glyph.name = "a" glyph.width = 100 glyph.height = 200 """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # legal: width and height floats glif = """ """ py = """ glyph.name = "a" glyph.width = 100.1 glyph.height = 200.1 """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # legal: width glif = """ """ py = """ glyph.name = "a" glyph.width = 100 """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # legal: height glif = """ """ py = """ glyph.name = "a" glyph.height = 200 """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # illegal: not a number glif = """ """ py = """ glyph.name = "a" glyph.width = "a" """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) glif = """ """ py = """ glyph.name = "a" glyph.height = "a" """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) def testUnicodes(self): # legal glif = """ """ py = """ glyph.name = "a" glyph.unicodes = [97] """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) glif = """ """ py = """ glyph.name = "a" glyph.unicodes = [98, 99, 97] """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # illegal glif = """ """ py = """ glyph.name = "zzzzzz" glyph.unicodes = ["1.1"] """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) def testNote(self): glif = """ hello """ py = """ glyph.name = "a" glyph.note = "hello" """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) def testLib(self): glif = """ dict hello world float 2.5 int 1 list a b 1 2.5 string a """ py = """ glyph.name = "a" glyph.lib = {"dict" : {"hello" : "world"}, "float" : 2.5, "int" : 1, "list" : ["a", "b", 1, 2.5], "string" : "a"} """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) def testOutline(self): # unknown element glif = """ """ self.assertRaises(GlifLibError, self.glifToPy, glif) # content glif = """ hello """ self.assertRaises(GlifLibError, self.glifToPy, glif) def testComponent(self): # legal glif = """ """ py = """ glyph.name = "a" pointPen.addComponent(*["x", (2, 3, 6, 5, 1, 4)]) """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # no base glif = """ """ self.assertRaises(GlifLibError, self.glifToPy, glif) # bogus values in transformation glif = """ """ py = """ glyph.name = "a" pointPen.addComponent(*["x", ("a", 3, 6, 5, 1, 4)]) """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) glif = """ """ py = """ glyph.name = "a" pointPen.addComponent(*["x", (2, "a", 6, 5, 1, 4)]) """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) glif = """ """ py = """ glyph.name = "a" pointPen.addComponent(*["x", (2, 3, "a", 5, 1, 4)]) """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) glif = """ """ py = """ glyph.name = "a" pointPen.addComponent(*["x", (2, 3, 6, "a", 1, 4)]) """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) glif = """ """ py = """ glyph.name = "a" pointPen.addComponent(*["x", (2, 3, 6, 5, "a", 4)]) """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) glif = """ """ py = """ glyph.name = "a" pointPen.addComponent(*["x", (2, 3, 6, 5, 1, "a")]) """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) def testContour(self): # legal: one contour glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # legal: two contours glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(1, 2)], **{"segmentType" : "move", "smooth" : False}) pointPen.endPath() pointPen.beginPath() pointPen.addPoint(*[(1, 2)], **{"segmentType" : "move", "smooth" : False}) pointPen.addPoint(*[(10, 20)], **{"segmentType" : "line", "smooth" : False}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # unknown element glif = """ """ self.assertRaises(GlifLibError, self.glifToPy, glif) def testPointCoordinates(self): # legal: int glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(1, -2)], **{"segmentType" : "move", "smooth" : False}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # legal: float glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(1.1, -2.2)], **{"segmentType" : "move", "smooth" : False}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # legal: int glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[("a", 2)], **{"segmentType" : "move", "smooth" : False}) pointPen.endPath() """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) # legal: int glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(1, "a")], **{"segmentType" : "move", "smooth" : False}) pointPen.endPath() """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) def testPointTypeMove(self): # legal glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(1, -2)], **{"segmentType" : "move", "smooth" : False}) pointPen.addPoint(*[(3, -4)], **{"segmentType" : "line", "smooth" : False}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # illegal: smooth=True glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(1, -2)], **{"segmentType" : "move", "smooth" : True}) pointPen.addPoint(*[(3, -4)], **{"segmentType" : "line", "smooth" : False}) pointPen.endPath() """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) # illegal: not at start glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(3, -4)], **{"segmentType" : "line", "smooth" : False}) pointPen.addPoint(*[(1, -2)], **{"segmentType" : "move", "smooth" : False}) pointPen.endPath() """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) def testPointTypeLine(self): # legal glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(1, -2)], **{"segmentType" : "move", "smooth" : False}) pointPen.addPoint(*[(3, -4)], **{"segmentType" : "line", "smooth" : False}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # legal: start of contour glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(1, -2)], **{"segmentType" : "line", "smooth" : False}) pointPen.addPoint(*[(3, -4)], **{"segmentType" : "line", "smooth" : False}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # illegal: smooth=True glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(1, -2)], **{"segmentType" : "move", "smooth" : False}) pointPen.addPoint(*[(3, -4)], **{"segmentType" : "line", "smooth" : True}) pointPen.endPath() """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) def testPointTypeCurve(self): # legal glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False}) pointPen.addPoint(*[(0, 65)], **{"smooth" : False}) pointPen.addPoint(*[(65, 200)], **{"smooth" : False}) pointPen.addPoint(*[(100, 200)], **{"segmentType" : "curve", "smooth" : False}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # legal: start of contour glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(100, 200)], **{"segmentType" : "curve", "smooth" : False}) pointPen.addPoint(*[(0, 65)], **{"smooth" : False}) pointPen.addPoint(*[(65, 200)], **{"smooth" : False}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # legal: smooth=True glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False}) pointPen.addPoint(*[(0, 65)], **{"smooth" : False}) pointPen.addPoint(*[(65, 200)], **{"smooth" : False}) pointPen.addPoint(*[(100, 200)], **{"segmentType" : "curve", "smooth" : True}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # legal: no off-curves glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False}) pointPen.addPoint(*[(100, 200)], **{"segmentType" : "curve", "smooth" : False}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # legal: 1 off-curve glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False}) pointPen.addPoint(*[(50, 100)], **{"smooth" : False}) pointPen.addPoint(*[(100, 200)], **{"segmentType" : "curve", "smooth" : False}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # illegal: 3 off-curves glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False}) pointPen.addPoint(*[(0, 100)], **{"smooth" : False}) pointPen.addPoint(*[(35, 125)], **{"smooth" : False}) pointPen.addPoint(*[(65, 200)], **{"smooth" : False}) pointPen.addPoint(*[(100, 200)], **{"segmentType" : "curve", "smooth" : False}) pointPen.endPath() """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) def testPointQCurve(self): # legal glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False}) pointPen.addPoint(*[(0, 65)], **{"smooth" : False}) pointPen.addPoint(*[(65, 200)], **{"smooth" : False}) pointPen.addPoint(*[(100, 200)], **{"segmentType" : "qcurve", "smooth" : False}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # legal: start of contour glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(100, 200)], **{"segmentType" : "qcurve", "smooth" : False}) pointPen.addPoint(*[(0, 65)], **{"smooth" : False}) pointPen.addPoint(*[(65, 200)], **{"smooth" : False}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # legal: smooth=True glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False}) pointPen.addPoint(*[(0, 65)], **{"smooth" : False}) pointPen.addPoint(*[(65, 200)], **{"smooth" : False}) pointPen.addPoint(*[(100, 200)], **{"segmentType" : "qcurve", "smooth" : True}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # legal: no off-curves glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False}) pointPen.addPoint(*[(100, 200)], **{"segmentType" : "qcurve", "smooth" : False}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # legal: 1 off-curve glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False}) pointPen.addPoint(*[(50, 100)], **{"smooth" : False}) pointPen.addPoint(*[(100, 200)], **{"segmentType" : "qcurve", "smooth" : False}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # legal: 3 off-curves glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False}) pointPen.addPoint(*[(0, 100)], **{"smooth" : False}) pointPen.addPoint(*[(35, 125)], **{"smooth" : False}) pointPen.addPoint(*[(65, 200)], **{"smooth" : False}) pointPen.addPoint(*[(100, 200)], **{"segmentType" : "qcurve", "smooth" : False}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) def testPointTypeOffCurve(self): # legal glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False}) pointPen.addPoint(*[(0, 65)], **{"smooth" : False}) pointPen.addPoint(*[(65, 200)], **{"smooth" : False}) pointPen.addPoint(*[(100, 200)], **{"segmentType" : "curve", "smooth" : False}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # legal: start of contour glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(0, 65)], **{"smooth" : False}) pointPen.addPoint(*[(65, 200)], **{"smooth" : False}) pointPen.addPoint(*[(100, 200)], **{"segmentType" : "curve", "smooth" : False}) pointPen.endPath() """ resultGlif = self.glyphToGLIF(py) resultPy = self.glifToPy(glif) self.assertEqual(glif, resultGlif) self.assertEqual(py, resultPy) # before move glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(0, 65)], **{"smooth" : False}) pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False}) pointPen.endPath() """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) # before line glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(0, 65)], **{"smooth" : False}) pointPen.addPoint(*[(0, 0)], **{"segmentType" : "line", "smooth" : False}) pointPen.endPath() """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) # smooth=True glif = """ """ py = """ glyph.name = "a" pointPen.beginPath() pointPen.addPoint(*[(0, 65)], **{"smooth" : True}) pointPen.addPoint(*[(0, 0)], **{"segmentType" : "curve", "smooth" : False}) pointPen.endPath() """ self.assertRaises(GlifLibError, self.glyphToGLIF, py) self.assertRaises(GlifLibError, self.glifToPy, glif) if __name__ == "__main__": from robofab.test.testSupport import runTests runTests()