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=u'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())