from fontTools.misc.transform import Identity from fontTools.pens.hashPointPen import HashPointPen import pytest class _TestGlyph(object): width = 500 def drawPoints(self, pen): pen.beginPath(identifier="abc") pen.addPoint((0.0, 0.0), "line", False, "start", identifier="0000") pen.addPoint((10, 110), "line", False, None, identifier="0001") pen.addPoint((50.0, 75.0), None, False, None, identifier="0002") pen.addPoint((60.0, 50.0), None, False, None, identifier="0003") pen.addPoint((50.0, 0.0), "curve", True, "last", identifier="0004") pen.endPath() class _TestGlyph2(_TestGlyph): def drawPoints(self, pen): pen.beginPath(identifier="abc") pen.addPoint((0.0, 0.0), "line", False, "start", identifier="0000") # Minor difference to _TestGlyph() is in the next line: pen.addPoint((101, 10), "line", False, None, identifier="0001") pen.addPoint((50.0, 75.0), None, False, None, identifier="0002") pen.addPoint((60.0, 50.0), None, False, None, identifier="0003") pen.addPoint((50.0, 0.0), "curve", True, "last", identifier="0004") pen.endPath() class _TestGlyph3(_TestGlyph): def drawPoints(self, pen): pen.beginPath(identifier="abc") pen.addPoint((0.0, 0.0), "line", False, "start", identifier="0000") pen.addPoint((10, 110), "line", False, None, identifier="0001") pen.endPath() # Same segment, but in a different path: pen.beginPath(identifier="pth2") pen.addPoint((50.0, 75.0), None, False, None, identifier="0002") pen.addPoint((60.0, 50.0), None, False, None, identifier="0003") pen.addPoint((50.0, 0.0), "curve", True, "last", identifier="0004") pen.endPath() class _TestGlyph4(_TestGlyph): def drawPoints(self, pen): pen.beginPath(identifier="abc") pen.addPoint((0.0, 0.0), "move", False, "start", identifier="0000") pen.addPoint((10, 110), "line", False, None, identifier="0001") pen.addPoint((50.0, 75.0), None, False, None, identifier="0002") pen.addPoint((60.0, 50.0), None, False, None, identifier="0003") pen.addPoint((50.0, 0.0), "curve", True, "last", identifier="0004") pen.endPath() class _TestGlyph5(_TestGlyph): def drawPoints(self, pen): pen.addComponent("b", Identity) class HashPointPenTest(object): def test_addComponent(self): pen = HashPointPen(_TestGlyph().width, {"a": _TestGlyph()}) pen.addComponent("a", (2, 0, 0, 3, -10, 5)) assert pen.hash == "w500[l0+0l10+110o50+75o60+50c50+0|(+2+0+0+3-10+5)]" def test_NestedComponents(self): pen = HashPointPen( _TestGlyph().width, {"a": _TestGlyph5(), "b": _TestGlyph()} ) # "a" contains "b" as a component pen.addComponent("a", (2, 0, 0, 3, -10, 5)) assert ( pen.hash == "w500[[l0+0l10+110o50+75o60+50c50+0|(+1+0+0+1+0+0)](+2+0+0+3-10+5)]" ) def test_outlineAndComponent(self): pen = HashPointPen(_TestGlyph().width, {"a": _TestGlyph()}) glyph = _TestGlyph() glyph.drawPoints(pen) pen.addComponent("a", (2, 0, 0, 2, -10, 5)) assert ( pen.hash == "w500l0+0l10+110o50+75o60+50c50+0|[l0+0l10+110o50+75o60+50c50+0|(+2+0+0+2-10+5)]" ) def test_addComponent_missing_raises(self): pen = HashPointPen(_TestGlyph().width, dict()) with pytest.raises(KeyError) as excinfo: pen.addComponent("a", Identity) assert excinfo.value.args[0] == "a" def test_similarGlyphs(self): pen = HashPointPen(_TestGlyph().width) glyph = _TestGlyph() glyph.drawPoints(pen) pen2 = HashPointPen(_TestGlyph2().width) glyph = _TestGlyph2() glyph.drawPoints(pen2) assert pen.hash != pen2.hash def test_similarGlyphs2(self): pen = HashPointPen(_TestGlyph().width) glyph = _TestGlyph() glyph.drawPoints(pen) pen2 = HashPointPen(_TestGlyph3().width) glyph = _TestGlyph3() glyph.drawPoints(pen2) assert pen.hash != pen2.hash def test_similarGlyphs3(self): pen = HashPointPen(_TestGlyph().width) glyph = _TestGlyph() glyph.drawPoints(pen) pen2 = HashPointPen(_TestGlyph4().width) glyph = _TestGlyph4() glyph.drawPoints(pen2) assert pen.hash != pen2.hash def test_glyphVsComposite(self): # If a glyph contains a component, the decomposed glyph should still # compare false pen = HashPointPen(_TestGlyph().width, {"a": _TestGlyph()}) pen.addComponent("a", Identity) pen2 = HashPointPen(_TestGlyph().width) glyph = _TestGlyph() glyph.drawPoints(pen2) assert pen.hash != pen2.hash