from io import BytesIO import os import unittest from fontTools.misc.textTools import bytesjoin, tobytes from fontTools.misc.xmlWriter import XMLWriter HEADER = b'\n' class TestXMLWriter(unittest.TestCase): def test_comment_escaped(self): writer = XMLWriter(BytesIO()) writer.comment("This&that are ") self.assertEqual( HEADER + b"", writer.file.getvalue(), ) def test_comment_multiline(self): writer = XMLWriter(BytesIO()) writer.comment("Hello world\nHow are you?") self.assertEqual( HEADER + b"", writer.file.getvalue() ) def test_encoding_default(self): writer = XMLWriter(BytesIO()) self.assertEqual( b'\n', writer.file.getvalue() ) def test_encoding_utf8(self): # https://github.com/fonttools/fonttools/issues/246 writer = XMLWriter(BytesIO(), encoding="utf8") self.assertEqual( b'\n', writer.file.getvalue() ) def test_encoding_UTF_8(self): # https://github.com/fonttools/fonttools/issues/246 writer = XMLWriter(BytesIO(), encoding="UTF-8") self.assertEqual( b'\n', writer.file.getvalue() ) def test_encoding_UTF8(self): # https://github.com/fonttools/fonttools/issues/246 writer = XMLWriter(BytesIO(), encoding="UTF8") self.assertEqual( b'\n', writer.file.getvalue() ) def test_encoding_other(self): self.assertRaises(Exception, XMLWriter, BytesIO(), encoding="iso-8859-1") def test_write(self): writer = XMLWriter(BytesIO()) writer.write("foo&bar") self.assertEqual(HEADER + b"foo&bar", writer.file.getvalue()) def test_indent_dedent(self): writer = XMLWriter(BytesIO()) writer.write("foo") writer.newline() writer.indent() writer.write("bar") writer.newline() writer.dedent() writer.write("baz") self.assertEqual( HEADER + bytesjoin(["foo", " bar", "baz"], "\n"), writer.file.getvalue() ) def test_writecdata(self): writer = XMLWriter(BytesIO()) writer.writecdata("foo&bar") self.assertEqual(HEADER + b"", writer.file.getvalue()) def test_simpletag(self): writer = XMLWriter(BytesIO()) writer.simpletag("tag", a="1", b="2") self.assertEqual(HEADER + b'', writer.file.getvalue()) def test_begintag_endtag(self): writer = XMLWriter(BytesIO()) writer.begintag("tag", attr="value") writer.write("content") writer.endtag("tag") self.assertEqual( HEADER + b'content', writer.file.getvalue() ) def test_dumphex(self): writer = XMLWriter(BytesIO()) writer.dumphex( "Type is a beautiful group of letters, not a group of beautiful letters." ) self.assertEqual( HEADER + bytesjoin( [ "54797065 20697320 61206265 61757469", "66756c20 67726f75 70206f66 206c6574", "74657273 2c206e6f 74206120 67726f75", "70206f66 20626561 75746966 756c206c", "65747465 72732e ", "", ], joiner="\n", ), writer.file.getvalue(), ) def test_stringifyattrs(self): writer = XMLWriter(BytesIO()) expected = ' attr="0"' self.assertEqual(expected, writer.stringifyattrs(attr=0)) self.assertEqual(expected, writer.stringifyattrs(attr=b"0")) self.assertEqual(expected, writer.stringifyattrs(attr="0")) self.assertEqual(expected, writer.stringifyattrs(attr="0")) def test_carriage_return_escaped(self): writer = XMLWriter(BytesIO()) writer.write("two lines\r\nseparated by Windows line endings") self.assertEqual( HEADER + b"two lines \nseparated by Windows line endings", writer.file.getvalue(), ) def test_newlinestr(self): header = b'' for nls in (None, "\n", "\r\n", "\r", ""): writer = XMLWriter(BytesIO(), newlinestr=nls) writer.write("hello") writer.newline() writer.write("world") writer.newline() linesep = tobytes(os.linesep) if nls is None else tobytes(nls) self.assertEqual( header + linesep + b"hello" + linesep + b"world" + linesep, writer.file.getvalue(), ) if __name__ == "__main__": import sys sys.exit(unittest.main())