[gvar] Add unit tests for gvar.fromXML() and gvar.toXML()

This commit is contained in:
Sascha Brawer 2017-01-11 15:35:56 +01:00
parent 963b63b536
commit 3ef8b0dbba

View File

@ -1,6 +1,6 @@
from __future__ import print_function, division, absolute_import, unicode_literals from __future__ import print_function, division, absolute_import, unicode_literals
from fontTools.misc.py23 import * from fontTools.misc.py23 import *
from fontTools.misc.testTools import FakeFont from fontTools.misc.testTools import FakeFont, getXML, parseXML
from fontTools.misc.textTools import deHexStr, hexStr from fontTools.misc.textTools import deHexStr, hexStr
from fontTools.ttLib import TTLibError, getTableClass, getTableModule, newTable from fontTools.ttLib import TTLibError, getTableClass, getTableModule, newTable
import unittest import unittest
@ -80,6 +80,44 @@ GVAR_VARIATIONS = {
} }
GVAR_XML = [
'<version value="1"/>',
'<reserved value="0"/>',
'<glyphVariations glyph="space">',
' <tuple>',
' <coord axis="wdth" value="0.7"/>',
' <delta pt="0" x="1" y="11"/>',
' <delta pt="1" x="2" y="22"/>',
' <delta pt="2" x="3" y="33"/>',
' <delta pt="3" x="4" y="44"/>',
' </tuple>',
'</glyphVariations>',
'<glyphVariations glyph="I">',
' <tuple>',
' <coord axis="wght" max="1.0" min="0.0" value="0.5"/>',
' <delta pt="0" x="3" y="3"/>',
' <delta pt="1" x="1" y="1"/>',
' <delta pt="2" x="4" y="4"/>',
' <delta pt="3" x="1" y="1"/>',
' <delta pt="4" x="5" y="5"/>',
' <delta pt="5" x="9" y="9"/>',
' <delta pt="6" x="2" y="2"/>',
' <delta pt="7" x="6" y="6"/>',
' </tuple>',
' <tuple>',
' <coord axis="wght" value="-1.0"/>',
' <coord axis="wdth" value="0.8"/>',
' <delta pt="0" x="-8" y="-88"/>',
' <delta pt="1" x="7" y="77"/>',
' <delta pt="4" x="-4" y="44"/>',
' <delta pt="5" x="3" y="33"/>',
' <delta pt="6" x="-2" y="-22"/>',
' <delta pt="7" x="1" y="11"/>',
' </tuple>',
'</glyphVariations>',
]
GVAR_DATA_EMPTY_VARIATIONS = deHexStr( GVAR_DATA_EMPTY_VARIATIONS = deHexStr(
"0001 0000 " # 0: majorVersion=1 minorVersion=0 "0001 0000 " # 0: majorVersion=1 minorVersion=0
"0002 0000 " # 4: axisCount=2 sharedTupleCount=0 "0002 0000 " # 4: axisCount=2 sharedTupleCount=0
@ -96,7 +134,8 @@ def hexencode(s):
class GVARTableTest(unittest.TestCase): class GVARTableTest(unittest.TestCase):
def makeFont(self, glyphs=[".notdef", "space", "I"]): def makeFont(self, variations):
glyphs=[".notdef", "space", "I"]
Axis = getTableModule("fvar").Axis Axis = getTableModule("fvar").Axis
Glyph = getTableModule("glyf").Glyph Glyph = getTableModule("glyf").Glyph
glyf, fvar, gvar = newTable("glyf"), newTable("fvar"), newTable("gvar") glyf, fvar, gvar = newTable("glyf"), newTable("fvar"), newTable("gvar")
@ -106,35 +145,45 @@ class GVARTableTest(unittest.TestCase):
glyf.glyphs["I"].coordinates = [(10, 10), (10, 20), (20, 20), (20, 10)] glyf.glyphs["I"].coordinates = [(10, 10), (10, 20), (20, 20), (20, 10)]
fvar.axes = [Axis(), Axis()] fvar.axes = [Axis(), Axis()]
fvar.axes[0].axisTag, fvar.axes[1].axisTag = "wght", "wdth" fvar.axes[0].axisTag, fvar.axes[1].axisTag = "wght", "wdth"
gvar.variations = variations
return font, gvar return font, gvar
def test_compile(self): def test_compile(self):
font, gvar = self.makeFont() font, gvar = self.makeFont(GVAR_VARIATIONS)
gvar.variations = GVAR_VARIATIONS
self.assertEqual(hexStr(gvar.compile(font)), hexStr(GVAR_DATA)) self.assertEqual(hexStr(gvar.compile(font)), hexStr(GVAR_DATA))
def test_compile_noVariations(self): def test_compile_noVariations(self):
font, gvar = self.makeFont() font, gvar = self.makeFont({})
self.assertEqual(hexStr(gvar.compile(font)), self.assertEqual(hexStr(gvar.compile(font)),
hexStr(GVAR_DATA_EMPTY_VARIATIONS)) hexStr(GVAR_DATA_EMPTY_VARIATIONS))
def test_compile_emptyVariations(self): def test_compile_emptyVariations(self):
font, gvar = self.makeFont() font, gvar = self.makeFont({".notdef": [], "space": [], "I": []})
gvar.variations = {".notdef": [], "space": [], "I": []}
self.assertEqual(hexStr(gvar.compile(font)), self.assertEqual(hexStr(gvar.compile(font)),
hexStr(GVAR_DATA_EMPTY_VARIATIONS)) hexStr(GVAR_DATA_EMPTY_VARIATIONS))
def test_decompile(self): def test_decompile(self):
font, gvar = self.makeFont() font, gvar = self.makeFont({})
gvar.decompile(GVAR_DATA, font) gvar.decompile(GVAR_DATA, font)
self.assertEqual(gvar.variations, GVAR_VARIATIONS) self.assertEqual(gvar.variations, GVAR_VARIATIONS)
def test_decompile_noVariations(self): def test_decompile_noVariations(self):
font, gvar = self.makeFont() font, gvar = self.makeFont({})
gvar.decompile(GVAR_DATA_EMPTY_VARIATIONS, font) gvar.decompile(GVAR_DATA_EMPTY_VARIATIONS, font)
self.assertEqual(gvar.variations, self.assertEqual(gvar.variations,
{".notdef": [], "space": [], "I": []}) {".notdef": [], "space": [], "I": []})
def test_fromXML(self):
font, gvar = self.makeFont({})
for name, attrs, content in parseXML(GVAR_XML):
gvar.fromXML(name, attrs, content, ttFont=font)
self.assertEqual(gvar.variations,
{g:v for g,v in GVAR_VARIATIONS.items() if v})
def test_toXML(self):
font, gvar = self.makeFont(GVAR_VARIATIONS)
self.assertEqual(getXML(gvar.toXML, font), GVAR_XML)
def test_compileOffsets_shortFormat(self): def test_compileOffsets_shortFormat(self):
self.assertEqual((deHexStr("00 00 00 02 FF C0"), 0), self.assertEqual((deHexStr("00 00 00 02 FF C0"), 0),
gvarClass.compileOffsets_([0, 4, 0x1ff80])) gvarClass.compileOffsets_([0, 4, 0x1ff80]))