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( ['', "cafebeef", ""], [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( [ '', "", "48656c6c 6f21", "", ], [line.strip() for line in xml.splitlines()][1:], ) def test_fromXML(self): table = table__m_e_t_a() for name, attrs, content in parseXML( '' " cafebeef" "" ): 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( ['', "Latn,Grek,Cyrl", ""], [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( '' " Latn,Grek,Cyrl" "" ): table.fromXML(name, attrs, content, ttFont=None) self.assertEqual({"dlng": "Latn,Grek,Cyrl"}, table.data) if __name__ == "__main__": import sys sys.exit(unittest.main())