112 lines
3.8 KiB
Python
112 lines
3.8 KiB
Python
from fontTools.misc.testTools import parseXML
|
|
from fontTools.misc.textTools import deHexStr
|
|
from fontTools.misc.xmlWriter import XMLWriter
|
|
from fontTools.ttLib import TTLibError
|
|
from fontTools.ttLib.tables._m_e_t_a import table__m_e_t_a
|
|
from io import BytesIO
|
|
import unittest
|
|
|
|
|
|
# From a real font on MacOS X, but substituted 'bild' tag by 'TEST',
|
|
# and shortened the payload.
|
|
META_DATA = deHexStr(
|
|
"00 00 00 01 00 00 00 00 00 00 00 1C 00 00 00 01 "
|
|
"54 45 53 54 00 00 00 1C 00 00 00 04 CA FE BE EF"
|
|
)
|
|
|
|
# The 'dlng' and 'slng' tag with text data containing "augmented" BCP 47
|
|
# comma-separated or comma-space-separated tags. These should be UTF-8 encoded
|
|
# text.
|
|
META_DATA_TEXT = deHexStr(
|
|
"00 00 00 01 00 00 00 00 00 00 00 28 00 00 00 02 "
|
|
"64 6C 6E 67 00 00 00 28 00 00 00 0E 73 6C 6E 67 "
|
|
"00 00 00 36 00 00 00 0E 4C 61 74 6E 2C 47 72 65 "
|
|
"6B 2C 43 79 72 6C 4C 61 74 6E 2C 47 72 65 6B 2C "
|
|
"43 79 72 6C"
|
|
)
|
|
|
|
|
|
class MetaTableTest(unittest.TestCase):
|
|
def test_decompile(self):
|
|
table = table__m_e_t_a()
|
|
table.decompile(META_DATA, ttFont={"meta": table})
|
|
self.assertEqual({"TEST": b"\xCA\xFE\xBE\xEF"}, table.data)
|
|
|
|
def test_compile(self):
|
|
table = table__m_e_t_a()
|
|
table.data["TEST"] = b"\xCA\xFE\xBE\xEF"
|
|
self.assertEqual(META_DATA, table.compile(ttFont={"meta": table}))
|
|
|
|
def test_decompile_text(self):
|
|
table = table__m_e_t_a()
|
|
table.decompile(META_DATA_TEXT, ttFont={"meta": table})
|
|
self.assertEqual(
|
|
{"dlng": "Latn,Grek,Cyrl", "slng": "Latn,Grek,Cyrl"}, table.data
|
|
)
|
|
|
|
def test_compile_text(self):
|
|
table = table__m_e_t_a()
|
|
table.data["dlng"] = "Latn,Grek,Cyrl"
|
|
table.data["slng"] = "Latn,Grek,Cyrl"
|
|
self.assertEqual(META_DATA_TEXT, table.compile(ttFont={"meta": table}))
|
|
|
|
def test_toXML(self):
|
|
table = table__m_e_t_a()
|
|
table.data["TEST"] = b"\xCA\xFE\xBE\xEF"
|
|
writer = XMLWriter(BytesIO())
|
|
table.toXML(writer, {"meta": table})
|
|
xml = writer.file.getvalue().decode("utf-8")
|
|
self.assertEqual(
|
|
['<hexdata tag="TEST">', "cafebeef", "</hexdata>"],
|
|
[line.strip() for line in xml.splitlines()][1:],
|
|
)
|
|
|
|
def test_toXML_ascii_data(self):
|
|
table = table__m_e_t_a()
|
|
table.data["TEST"] = b"Hello!"
|
|
writer = XMLWriter(BytesIO())
|
|
table.toXML(writer, {"meta": table})
|
|
xml = writer.file.getvalue().decode("utf-8")
|
|
self.assertEqual(
|
|
[
|
|
'<hexdata tag="TEST">',
|
|
"<!-- ascii: Hello! -->",
|
|
"48656c6c 6f21",
|
|
"</hexdata>",
|
|
],
|
|
[line.strip() for line in xml.splitlines()][1:],
|
|
)
|
|
|
|
def test_fromXML(self):
|
|
table = table__m_e_t_a()
|
|
for name, attrs, content in parseXML(
|
|
'<hexdata tag="TEST">' " cafebeef" "</hexdata>"
|
|
):
|
|
table.fromXML(name, attrs, content, ttFont=None)
|
|
self.assertEqual({"TEST": b"\xCA\xFE\xBE\xEF"}, table.data)
|
|
|
|
def test_toXML_text(self):
|
|
table = table__m_e_t_a()
|
|
table.data["dlng"] = "Latn,Grek,Cyrl"
|
|
writer = XMLWriter(BytesIO())
|
|
table.toXML(writer, {"meta": table})
|
|
xml = writer.file.getvalue().decode("utf-8")
|
|
self.assertEqual(
|
|
['<text tag="dlng">', "Latn,Grek,Cyrl", "</text>"],
|
|
[line.strip() for line in xml.splitlines()][1:],
|
|
)
|
|
|
|
def test_fromXML_text(self):
|
|
table = table__m_e_t_a()
|
|
for name, attrs, content in parseXML(
|
|
'<text tag="dlng">' " Latn,Grek,Cyrl" "</text>"
|
|
):
|
|
table.fromXML(name, attrs, content, ttFont=None)
|
|
self.assertEqual({"dlng": "Latn,Grek,Cyrl"}, table.data)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import sys
|
|
|
|
sys.exit(unittest.main())
|