diff options
Diffstat (limited to 'Tests/ttLib/tables/otTables_test.py')
-rw-r--r-- | Tests/ttLib/tables/otTables_test.py | 254 |
1 files changed, 142 insertions, 112 deletions
diff --git a/Tests/ttLib/tables/otTables_test.py b/Tests/ttLib/tables/otTables_test.py index 9202aa55..3f74b7a9 100644 --- a/Tests/ttLib/tables/otTables_test.py +++ b/Tests/ttLib/tables/otTables_test.py @@ -1,4 +1,4 @@ -from fontTools.misc.testTools import getXML, parseXML, FakeFont +from fontTools.misc.testTools import getXML, parseXML, parseXmlInto, FakeFont from fontTools.misc.textTools import deHexStr, hexStr from fontTools.misc.xmlWriter import XMLWriter from fontTools.ttLib.tables.otBase import OTTableReader, OTTableWriter @@ -512,8 +512,11 @@ class InsertionMorphActionTest(unittest.TestCase): for name, attrs, content in parseXML(self.MORPH_ACTION_XML): a.fromXML(name, attrs, content, self.font) writer = OTTableWriter() - a.compile(writer, self.font, - actionIndex={('B', 'C'): 9, ('B', 'A', 'D'): 7}) + a.compile( + writer, + self.font, + actionIndex={('B', 'C'): 9, ('B', 'A', 'D'): 7}, + ) self.assertEqual(hexStr(writer.getAllData()), "1234fc4300090007") def testCompileActions_empty(self): @@ -551,13 +554,11 @@ class SplitMultipleSubstTest: from fontTools.ttLib.tables.otBase import OverflowErrorRecord oldSubTable = buildMultipleSubstSubtable({'e': 1, 'a': 2, 'b': 3, 'c': 4, 'd': 5}) - oldSubTable.Format = 1 newSubTable = otTables.MultipleSubst() ok = otTables.splitMultipleSubst(oldSubTable, newSubTable, OverflowErrorRecord((None, None, None, itemName, itemRecord))) assert ok - assert oldSubTable.Format == newSubTable.Format return oldSubTable.mapping, newSubTable.mapping def test_Coverage(self): @@ -577,113 +578,142 @@ class SplitMultipleSubstTest: def test_splitMarkBasePos(): - from fontTools.otlLib.builder import buildAnchor, buildMarkBasePosSubtable - - marks = { - "acutecomb": (0, buildAnchor(0, 600)), - "gravecomb": (0, buildAnchor(0, 590)), - "cedillacomb": (1, buildAnchor(0, 0)), - } - bases = { - "a": { - 0: buildAnchor(350, 500), - 1: None, - }, - "c": { - 0: buildAnchor(300, 700), - 1: buildAnchor(300, 0), - }, - } - glyphOrder = ["a", "c", "acutecomb", "gravecomb", "cedillacomb"] - glyphMap = {g: i for i, g in enumerate(glyphOrder)} - - oldSubTable = buildMarkBasePosSubtable(marks, bases, glyphMap) - newSubTable = otTables.MarkBasePos() - - ok = otTables.splitMarkBasePos(oldSubTable, newSubTable, overflowRecord=None) - - assert ok - - assert getXML(oldSubTable.toXML) == [ - '<MarkBasePos Format="1">', - ' <MarkCoverage>', - ' <Glyph value="acutecomb"/>', - ' <Glyph value="gravecomb"/>', - ' </MarkCoverage>', - ' <BaseCoverage>', - ' <Glyph value="a"/>', - ' <Glyph value="c"/>', - ' </BaseCoverage>', - ' <!-- ClassCount=1 -->', - ' <MarkArray>', - ' <!-- MarkCount=2 -->', - ' <MarkRecord index="0">', - ' <Class value="0"/>', - ' <MarkAnchor Format="1">', - ' <XCoordinate value="0"/>', - ' <YCoordinate value="600"/>', - ' </MarkAnchor>', - ' </MarkRecord>', - ' <MarkRecord index="1">', - ' <Class value="0"/>', - ' <MarkAnchor Format="1">', - ' <XCoordinate value="0"/>', - ' <YCoordinate value="590"/>', - ' </MarkAnchor>', - ' </MarkRecord>', - ' </MarkArray>', - ' <BaseArray>', - ' <!-- BaseCount=2 -->', - ' <BaseRecord index="0">', - ' <BaseAnchor index="0" Format="1">', - ' <XCoordinate value="350"/>', - ' <YCoordinate value="500"/>', - ' </BaseAnchor>', - ' </BaseRecord>', - ' <BaseRecord index="1">', - ' <BaseAnchor index="0" Format="1">', - ' <XCoordinate value="300"/>', - ' <YCoordinate value="700"/>', - ' </BaseAnchor>', - ' </BaseRecord>', - ' </BaseArray>', - '</MarkBasePos>', - ] - - assert getXML(newSubTable.toXML) == [ - '<MarkBasePos Format="1">', - ' <MarkCoverage>', - ' <Glyph value="cedillacomb"/>', - ' </MarkCoverage>', - ' <BaseCoverage>', - ' <Glyph value="a"/>', - ' <Glyph value="c"/>', - ' </BaseCoverage>', - ' <!-- ClassCount=1 -->', - ' <MarkArray>', - ' <!-- MarkCount=1 -->', - ' <MarkRecord index="0">', - ' <Class value="0"/>', - ' <MarkAnchor Format="1">', - ' <XCoordinate value="0"/>', - ' <YCoordinate value="0"/>', - ' </MarkAnchor>', - ' </MarkRecord>', - ' </MarkArray>', - ' <BaseArray>', - ' <!-- BaseCount=2 -->', - ' <BaseRecord index="0">', - ' <BaseAnchor index="0" empty="1"/>', - ' </BaseRecord>', - ' <BaseRecord index="1">', - ' <BaseAnchor index="0" Format="1">', - ' <XCoordinate value="300"/>', - ' <YCoordinate value="0"/>', - ' </BaseAnchor>', - ' </BaseRecord>', - ' </BaseArray>', - '</MarkBasePos>', - ] + from fontTools.otlLib.builder import buildAnchor, buildMarkBasePosSubtable + + marks = { + "acutecomb": (0, buildAnchor(0, 600)), + "gravecomb": (0, buildAnchor(0, 590)), + "cedillacomb": (1, buildAnchor(0, 0)), + } + bases = { + "a": { + 0: buildAnchor(350, 500), + 1: None, + }, + "c": { + 0: buildAnchor(300, 700), + 1: buildAnchor(300, 0), + }, + } + glyphOrder = ["a", "c", "acutecomb", "gravecomb", "cedillacomb"] + glyphMap = {g: i for i, g in enumerate(glyphOrder)} + + oldSubTable = buildMarkBasePosSubtable(marks, bases, glyphMap) + newSubTable = otTables.MarkBasePos() + + ok = otTables.splitMarkBasePos(oldSubTable, newSubTable, overflowRecord=None) + + assert ok + + assert getXML(oldSubTable.toXML) == [ + '<MarkBasePos Format="1">', + ' <MarkCoverage>', + ' <Glyph value="acutecomb"/>', + ' <Glyph value="gravecomb"/>', + ' </MarkCoverage>', + ' <BaseCoverage>', + ' <Glyph value="a"/>', + ' <Glyph value="c"/>', + ' </BaseCoverage>', + ' <!-- ClassCount=1 -->', + ' <MarkArray>', + ' <!-- MarkCount=2 -->', + ' <MarkRecord index="0">', + ' <Class value="0"/>', + ' <MarkAnchor Format="1">', + ' <XCoordinate value="0"/>', + ' <YCoordinate value="600"/>', + ' </MarkAnchor>', + ' </MarkRecord>', + ' <MarkRecord index="1">', + ' <Class value="0"/>', + ' <MarkAnchor Format="1">', + ' <XCoordinate value="0"/>', + ' <YCoordinate value="590"/>', + ' </MarkAnchor>', + ' </MarkRecord>', + ' </MarkArray>', + ' <BaseArray>', + ' <!-- BaseCount=2 -->', + ' <BaseRecord index="0">', + ' <BaseAnchor index="0" Format="1">', + ' <XCoordinate value="350"/>', + ' <YCoordinate value="500"/>', + ' </BaseAnchor>', + ' </BaseRecord>', + ' <BaseRecord index="1">', + ' <BaseAnchor index="0" Format="1">', + ' <XCoordinate value="300"/>', + ' <YCoordinate value="700"/>', + ' </BaseAnchor>', + ' </BaseRecord>', + ' </BaseArray>', + '</MarkBasePos>', + ] + + assert getXML(newSubTable.toXML) == [ + '<MarkBasePos Format="1">', + ' <MarkCoverage>', + ' <Glyph value="cedillacomb"/>', + ' </MarkCoverage>', + ' <BaseCoverage>', + ' <Glyph value="a"/>', + ' <Glyph value="c"/>', + ' </BaseCoverage>', + ' <!-- ClassCount=1 -->', + ' <MarkArray>', + ' <!-- MarkCount=1 -->', + ' <MarkRecord index="0">', + ' <Class value="0"/>', + ' <MarkAnchor Format="1">', + ' <XCoordinate value="0"/>', + ' <YCoordinate value="0"/>', + ' </MarkAnchor>', + ' </MarkRecord>', + ' </MarkArray>', + ' <BaseArray>', + ' <!-- BaseCount=2 -->', + ' <BaseRecord index="0">', + ' <BaseAnchor index="0" empty="1"/>', + ' </BaseRecord>', + ' <BaseRecord index="1">', + ' <BaseAnchor index="0" Format="1">', + ' <XCoordinate value="300"/>', + ' <YCoordinate value="0"/>', + ' </BaseAnchor>', + ' </BaseRecord>', + ' </BaseArray>', + '</MarkBasePos>', + ] + + +class ColrV1Test(unittest.TestCase): + def setUp(self): + self.font = FakeFont(['.notdef', 'meh']) + + def test_traverseEmptyPaintColrLayersNeedsNoLayerList(self): + colr = parseXmlInto( + self.font, + otTables.COLR(), + ''' + <Version value="1"/> + <BaseGlyphList> + <BaseGlyphPaintRecord index="0"> + <BaseGlyph value="meh"/> + <Paint Format="1"><!-- PaintColrLayers --> + <NumLayers value="0"/> + <FirstLayerIndex value="42"/> + </Paint> + </BaseGlyphPaintRecord> + </BaseGlyphList> + ''', + ) + paint = colr.BaseGlyphList.BaseGlyphPaintRecord[0].Paint + + # Just want to confirm we don't crash + visited = [] + paint.traverse(colr, lambda p: visited.append(p)) + assert len(visited) == 1 if __name__ == "__main__": |