Skip to content

Commit 993bb16

Browse files
[3.9] gh-91810: Expand ElementTree.write() tests to use non-ASCII data (GH-91989). (GH-91994)
(cherry picked from commit f60b4c3)
1 parent 24ce123 commit 993bb16

File tree

1 file changed

+80
-17
lines changed

1 file changed

+80
-17
lines changed

Lib/test/test_xml_etree.py

+80-17
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ def newtest(*args, **kwargs):
112112
return newtest
113113
return decorator
114114

115+
def convlinesep(data):
116+
return data.replace(b'\n', os.linesep.encode())
117+
115118

116119
class ModuleTest(unittest.TestCase):
117120
def test_sanity(self):
@@ -3654,48 +3657,108 @@ def test_encoding(self):
36543657

36553658
def test_write_to_filename(self):
36563659
self.addCleanup(support.unlink, TESTFN)
3657-
tree = ET.ElementTree(ET.XML('''<site />'''))
3660+
tree = ET.ElementTree(ET.XML('''<site>\xf8</site>'''))
36583661
tree.write(TESTFN)
36593662
with open(TESTFN, 'rb') as f:
3660-
self.assertEqual(f.read(), b'''<site />''')
3663+
self.assertEqual(f.read(), b'''<site>&#248;</site>''')
3664+
3665+
def test_write_to_filename_with_encoding(self):
3666+
self.addCleanup(support.unlink, TESTFN)
3667+
tree = ET.ElementTree(ET.XML('''<site>\xf8</site>'''))
3668+
tree.write(TESTFN, encoding='utf-8')
3669+
with open(TESTFN, 'rb') as f:
3670+
self.assertEqual(f.read(), b'''<site>\xc3\xb8</site>''')
3671+
3672+
tree.write(TESTFN, encoding='ISO-8859-1')
3673+
with open(TESTFN, 'rb') as f:
3674+
self.assertEqual(f.read(), convlinesep(
3675+
b'''<?xml version='1.0' encoding='ISO-8859-1'?>\n'''
3676+
b'''<site>\xf8</site>'''))
3677+
3678+
def test_write_to_filename_as_unicode(self):
3679+
self.addCleanup(support.unlink, TESTFN)
3680+
with open(TESTFN, 'w') as f:
3681+
encoding = f.encoding
3682+
support.unlink(TESTFN)
3683+
3684+
try:
3685+
'\xf8'.encode(encoding)
3686+
except UnicodeEncodeError:
3687+
self.skipTest(f'default file encoding {encoding} not supported')
3688+
3689+
tree = ET.ElementTree(ET.XML('''<site>\xf8</site>'''))
3690+
tree.write(TESTFN, encoding='unicode')
3691+
with open(TESTFN, 'rb') as f:
3692+
data = f.read()
3693+
expected = "<site>\xf8</site>".encode(encoding, 'xmlcharrefreplace')
3694+
self.assertEqual(data, expected)
36613695

36623696
def test_write_to_text_file(self):
36633697
self.addCleanup(support.unlink, TESTFN)
3664-
tree = ET.ElementTree(ET.XML('''<site />'''))
3698+
tree = ET.ElementTree(ET.XML('''<site>\xf8</site>'''))
36653699
with open(TESTFN, 'w', encoding='utf-8') as f:
36663700
tree.write(f, encoding='unicode')
36673701
self.assertFalse(f.closed)
36683702
with open(TESTFN, 'rb') as f:
3669-
self.assertEqual(f.read(), b'''<site />''')
3703+
self.assertEqual(f.read(), b'''<site>\xc3\xb8</site>''')
3704+
3705+
with open(TESTFN, 'w', encoding='ascii', errors='xmlcharrefreplace') as f:
3706+
tree.write(f, encoding='unicode')
3707+
self.assertFalse(f.closed)
3708+
with open(TESTFN, 'rb') as f:
3709+
self.assertEqual(f.read(), b'''<site>&#248;</site>''')
3710+
3711+
with open(TESTFN, 'w', encoding='ISO-8859-1') as f:
3712+
tree.write(f, encoding='unicode')
3713+
self.assertFalse(f.closed)
3714+
with open(TESTFN, 'rb') as f:
3715+
self.assertEqual(f.read(), b'''<site>\xf8</site>''')
36703716

36713717
def test_write_to_binary_file(self):
36723718
self.addCleanup(support.unlink, TESTFN)
3673-
tree = ET.ElementTree(ET.XML('''<site />'''))
3719+
tree = ET.ElementTree(ET.XML('''<site>\xf8</site>'''))
36743720
with open(TESTFN, 'wb') as f:
36753721
tree.write(f)
36763722
self.assertFalse(f.closed)
36773723
with open(TESTFN, 'rb') as f:
3678-
self.assertEqual(f.read(), b'''<site />''')
3724+
self.assertEqual(f.read(), b'''<site>&#248;</site>''')
3725+
3726+
def test_write_to_binary_file_with_encoding(self):
3727+
self.addCleanup(support.unlink, TESTFN)
3728+
tree = ET.ElementTree(ET.XML('''<site>\xf8</site>'''))
3729+
with open(TESTFN, 'wb') as f:
3730+
tree.write(f, encoding='utf-8')
3731+
self.assertFalse(f.closed)
3732+
with open(TESTFN, 'rb') as f:
3733+
self.assertEqual(f.read(), b'''<site>\xc3\xb8</site>''')
3734+
3735+
with open(TESTFN, 'wb') as f:
3736+
tree.write(f, encoding='ISO-8859-1')
3737+
self.assertFalse(f.closed)
3738+
with open(TESTFN, 'rb') as f:
3739+
self.assertEqual(f.read(),
3740+
b'''<?xml version='1.0' encoding='ISO-8859-1'?>\n'''
3741+
b'''<site>\xf8</site>''')
36793742

36803743
def test_write_to_binary_file_with_bom(self):
36813744
self.addCleanup(support.unlink, TESTFN)
3682-
tree = ET.ElementTree(ET.XML('''<site />'''))
3745+
tree = ET.ElementTree(ET.XML('''<site>\xf8</site>'''))
36833746
# test BOM writing to buffered file
36843747
with open(TESTFN, 'wb') as f:
36853748
tree.write(f, encoding='utf-16')
36863749
self.assertFalse(f.closed)
36873750
with open(TESTFN, 'rb') as f:
36883751
self.assertEqual(f.read(),
36893752
'''<?xml version='1.0' encoding='utf-16'?>\n'''
3690-
'''<site />'''.encode("utf-16"))
3753+
'''<site>\xf8</site>'''.encode("utf-16"))
36913754
# test BOM writing to non-buffered file
36923755
with open(TESTFN, 'wb', buffering=0) as f:
36933756
tree.write(f, encoding='utf-16')
36943757
self.assertFalse(f.closed)
36953758
with open(TESTFN, 'rb') as f:
36963759
self.assertEqual(f.read(),
36973760
'''<?xml version='1.0' encoding='utf-16'?>\n'''
3698-
'''<site />'''.encode("utf-16"))
3761+
'''<site>\xf8</site>'''.encode("utf-16"))
36993762

37003763
def test_read_from_stringio(self):
37013764
tree = ET.ElementTree()
@@ -3704,10 +3767,10 @@ def test_read_from_stringio(self):
37043767
self.assertEqual(tree.getroot().tag, 'site')
37053768

37063769
def test_write_to_stringio(self):
3707-
tree = ET.ElementTree(ET.XML('''<site />'''))
3770+
tree = ET.ElementTree(ET.XML('''<site>\xf8</site>'''))
37083771
stream = io.StringIO()
37093772
tree.write(stream, encoding='unicode')
3710-
self.assertEqual(stream.getvalue(), '''<site />''')
3773+
self.assertEqual(stream.getvalue(), '''<site>\xf8</site>''')
37113774

37123775
def test_read_from_bytesio(self):
37133776
tree = ET.ElementTree()
@@ -3716,10 +3779,10 @@ def test_read_from_bytesio(self):
37163779
self.assertEqual(tree.getroot().tag, 'site')
37173780

37183781
def test_write_to_bytesio(self):
3719-
tree = ET.ElementTree(ET.XML('''<site />'''))
3782+
tree = ET.ElementTree(ET.XML('''<site>\xf8</site>'''))
37203783
raw = io.BytesIO()
37213784
tree.write(raw)
3722-
self.assertEqual(raw.getvalue(), b'''<site />''')
3785+
self.assertEqual(raw.getvalue(), b'''<site>&#248;</site>''')
37233786

37243787
class dummy:
37253788
pass
@@ -3733,12 +3796,12 @@ def test_read_from_user_text_reader(self):
37333796
self.assertEqual(tree.getroot().tag, 'site')
37343797

37353798
def test_write_to_user_text_writer(self):
3736-
tree = ET.ElementTree(ET.XML('''<site />'''))
3799+
tree = ET.ElementTree(ET.XML('''<site>\xf8</site>'''))
37373800
stream = io.StringIO()
37383801
writer = self.dummy()
37393802
writer.write = stream.write
37403803
tree.write(writer, encoding='unicode')
3741-
self.assertEqual(stream.getvalue(), '''<site />''')
3804+
self.assertEqual(stream.getvalue(), '''<site>\xf8</site>''')
37423805

37433806
def test_read_from_user_binary_reader(self):
37443807
raw = io.BytesIO(b'''<?xml version="1.0"?><site></site>''')
@@ -3750,12 +3813,12 @@ def test_read_from_user_binary_reader(self):
37503813
tree = ET.ElementTree()
37513814

37523815
def test_write_to_user_binary_writer(self):
3753-
tree = ET.ElementTree(ET.XML('''<site />'''))
3816+
tree = ET.ElementTree(ET.XML('''<site>\xf8</site>'''))
37543817
raw = io.BytesIO()
37553818
writer = self.dummy()
37563819
writer.write = raw.write
37573820
tree.write(writer)
3758-
self.assertEqual(raw.getvalue(), b'''<site />''')
3821+
self.assertEqual(raw.getvalue(), b'''<site>&#248;</site>''')
37593822

37603823
def test_write_to_user_binary_writer_with_bom(self):
37613824
tree = ET.ElementTree(ET.XML('''<site />'''))

0 commit comments

Comments
 (0)