1010import html
1111import io
1212import itertools
13- import locale
1413import operator
1514import os
1615import pickle
@@ -130,6 +129,9 @@ def newtest(*args, **kwargs):
130129 return newtest
131130 return decorator
132131
132+ def convlinesep (data ):
133+ return data .replace (b'\n ' , os .linesep .encode ())
134+
133135
134136class ModuleTest (unittest .TestCase ):
135137 def test_sanity (self ):
@@ -1023,17 +1025,15 @@ def test_tostring_xml_declaration(self):
10231025 @unittest .expectedFailure
10241026 def test_tostring_xml_declaration_unicode_encoding (self ):
10251027 elem = ET .XML ('<body><tag/></body>' )
1026- preferredencoding = locale .getpreferredencoding ()
10271028 self .assertEqual (
1028- f"<?xml version='1.0' encoding='{ preferredencoding } '?> \n <body><tag /></body>" ,
1029- ET . tostring ( elem , encoding = 'unicode' , xml_declaration = True )
1029+ ET . tostring ( elem , encoding = 'unicode' , xml_declaration = True ) ,
1030+ "<?xml version='1.0' encoding='utf-8'?> \n <body><tag /></body>"
10301031 )
10311032
10321033 # TODO: RUSTPYTHON
10331034 @unittest .expectedFailure
10341035 def test_tostring_xml_declaration_cases (self ):
10351036 elem = ET .XML ('<body><tag>ø</tag></body>' )
1036- preferredencoding = locale .getpreferredencoding ()
10371037 TESTCASES = [
10381038 # (expected_retval, encoding, xml_declaration)
10391039 # ... xml_declaration = None
@@ -1060,7 +1060,7 @@ def test_tostring_xml_declaration_cases(self):
10601060 b"<body><tag>ø</tag></body>" , 'US-ASCII' , True ),
10611061 (b"<?xml version='1.0' encoding='ISO-8859-1'?>\n "
10621062 b"<body><tag>\xf8 </tag></body>" , 'ISO-8859-1' , True ),
1063- (f "<?xml version='1.0' encoding='{ preferredencoding } '?>\n "
1063+ ("<?xml version='1.0' encoding='utf-8 '?>\n "
10641064 "<body><tag>ø</tag></body>" , 'unicode' , True ),
10651065
10661066 ]
@@ -1102,11 +1102,10 @@ def test_tostringlist_xml_declaration(self):
11021102 b"<?xml version='1.0' encoding='us-ascii'?>\n <body><tag /></body>"
11031103 )
11041104
1105- preferredencoding = locale .getpreferredencoding ()
11061105 stringlist = ET .tostringlist (elem , encoding = 'unicode' , xml_declaration = True )
11071106 self .assertEqual (
11081107 '' .join (stringlist ),
1109- f "<?xml version='1.0' encoding='{ preferredencoding } '?>\n <body><tag /></body>"
1108+ "<?xml version='1.0' encoding='utf-8 '?>\n <body><tag /></body>"
11101109 )
11111110 self .assertRegex (stringlist [0 ], r"^<\?xml version='1.0' encoding='.+'?>" )
11121111 self .assertEqual (['<body' , '>' , '<tag' , ' />' , '</body>' ], stringlist [1 :])
@@ -3914,54 +3913,107 @@ def test_encoding(self):
39143913 @unittest .expectedFailure
39153914 def test_write_to_filename (self ):
39163915 self .addCleanup (os_helper .unlink , TESTFN )
3917- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3916+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
39183917 tree .write (TESTFN )
39193918 with open (TESTFN , 'rb' ) as f :
3920- self .assertEqual (f .read (), b'''<site />''' )
3919+ self .assertEqual (f .read (), b'''<site>ø</site>''' )
3920+
3921+ def test_write_to_filename_with_encoding (self ):
3922+ self .addCleanup (os_helper .unlink , TESTFN )
3923+ tree = ET .ElementTree (ET .XML ('''<site>\xf8 </site>''' ))
3924+ tree .write (TESTFN , encoding = 'utf-8' )
3925+ with open (TESTFN , 'rb' ) as f :
3926+ self .assertEqual (f .read (), b'''<site>\xc3 \xb8 </site>''' )
3927+
3928+ tree .write (TESTFN , encoding = 'ISO-8859-1' )
3929+ with open (TESTFN , 'rb' ) as f :
3930+ self .assertEqual (f .read (), convlinesep (
3931+ b'''<?xml version='1.0' encoding='ISO-8859-1'?>\n '''
3932+ b'''<site>\xf8 </site>''' ))
3933+
3934+ def test_write_to_filename_as_unicode (self ):
3935+ self .addCleanup (os_helper .unlink , TESTFN )
3936+ with open (TESTFN , 'w' ) as f :
3937+ encoding = f .encoding
3938+ os_helper .unlink (TESTFN )
3939+
3940+ tree = ET .ElementTree (ET .XML ('''<site>\xf8 </site>''' ))
3941+ tree .write (TESTFN , encoding = 'unicode' )
3942+ with open (TESTFN , 'rb' ) as f :
3943+ self .assertEqual (f .read (), b"<site>\xc3 \xb8 </site>" )
39213944
39223945 # TODO: RUSTPYTHON
39233946 @unittest .expectedFailure
39243947 def test_write_to_text_file (self ):
39253948 self .addCleanup (os_helper .unlink , TESTFN )
3926- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3949+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
39273950 with open (TESTFN , 'w' , encoding = 'utf-8' ) as f :
39283951 tree .write (f , encoding = 'unicode' )
39293952 self .assertFalse (f .closed )
39303953 with open (TESTFN , 'rb' ) as f :
3931- self .assertEqual (f .read (), b'''<site />''' )
3954+ self .assertEqual (f .read (), b'''<site>\xc3 \xb8 </site>''' )
3955+
3956+ with open (TESTFN , 'w' , encoding = 'ascii' , errors = 'xmlcharrefreplace' ) as f :
3957+ tree .write (f , encoding = 'unicode' )
3958+ self .assertFalse (f .closed )
3959+ with open (TESTFN , 'rb' ) as f :
3960+ self .assertEqual (f .read (), b'''<site>ø</site>''' )
3961+
3962+ with open (TESTFN , 'w' , encoding = 'ISO-8859-1' ) as f :
3963+ tree .write (f , encoding = 'unicode' )
3964+ self .assertFalse (f .closed )
3965+ with open (TESTFN , 'rb' ) as f :
3966+ self .assertEqual (f .read (), b'''<site>\xf8 </site>''' )
39323967
39333968 # TODO: RUSTPYTHON
39343969 @unittest .expectedFailure
39353970 def test_write_to_binary_file (self ):
39363971 self .addCleanup (os_helper .unlink , TESTFN )
3937- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3972+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
39383973 with open (TESTFN , 'wb' ) as f :
39393974 tree .write (f )
39403975 self .assertFalse (f .closed )
39413976 with open (TESTFN , 'rb' ) as f :
3942- self .assertEqual (f .read (), b'''<site />''' )
3977+ self .assertEqual (f .read (), b'''<site>ø</site>''' )
3978+
3979+ def test_write_to_binary_file_with_encoding (self ):
3980+ self .addCleanup (os_helper .unlink , TESTFN )
3981+ tree = ET .ElementTree (ET .XML ('''<site>\xf8 </site>''' ))
3982+ with open (TESTFN , 'wb' ) as f :
3983+ tree .write (f , encoding = 'utf-8' )
3984+ self .assertFalse (f .closed )
3985+ with open (TESTFN , 'rb' ) as f :
3986+ self .assertEqual (f .read (), b'''<site>\xc3 \xb8 </site>''' )
3987+
3988+ with open (TESTFN , 'wb' ) as f :
3989+ tree .write (f , encoding = 'ISO-8859-1' )
3990+ self .assertFalse (f .closed )
3991+ with open (TESTFN , 'rb' ) as f :
3992+ self .assertEqual (f .read (),
3993+ b'''<?xml version='1.0' encoding='ISO-8859-1'?>\n '''
3994+ b'''<site>\xf8 </site>''' )
39433995
39443996 # TODO: RUSTPYTHON
39453997 @unittest .expectedFailure
39463998 def test_write_to_binary_file_with_bom (self ):
39473999 self .addCleanup (os_helper .unlink , TESTFN )
3948- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
4000+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
39494001 # test BOM writing to buffered file
39504002 with open (TESTFN , 'wb' ) as f :
39514003 tree .write (f , encoding = 'utf-16' )
39524004 self .assertFalse (f .closed )
39534005 with open (TESTFN , 'rb' ) as f :
39544006 self .assertEqual (f .read (),
39554007 '''<?xml version='1.0' encoding='utf-16'?>\n '''
3956- '''<site / >''' .encode ("utf-16" ))
4008+ '''<site> \xf8 </site >''' .encode ("utf-16" ))
39574009 # test BOM writing to non-buffered file
39584010 with open (TESTFN , 'wb' , buffering = 0 ) as f :
39594011 tree .write (f , encoding = 'utf-16' )
39604012 self .assertFalse (f .closed )
39614013 with open (TESTFN , 'rb' ) as f :
39624014 self .assertEqual (f .read (),
39634015 '''<?xml version='1.0' encoding='utf-16'?>\n '''
3964- '''<site / >''' .encode ("utf-16" ))
4016+ '''<site> \xf8 </site >''' .encode ("utf-16" ))
39654017
39664018 # TODO: RUSTPYTHON
39674019 @unittest .expectedFailure
@@ -3974,10 +4026,10 @@ def test_read_from_stringio(self):
39744026 # TODO: RUSTPYTHON
39754027 @unittest .expectedFailure
39764028 def test_write_to_stringio (self ):
3977- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
4029+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
39784030 stream = io .StringIO ()
39794031 tree .write (stream , encoding = 'unicode' )
3980- self .assertEqual (stream .getvalue (), '''<site / >''' )
4032+ self .assertEqual (stream .getvalue (), '''<site> \xf8 </site >''' )
39814033
39824034 # TODO: RUSTPYTHON
39834035 @unittest .expectedFailure
@@ -3990,10 +4042,10 @@ def test_read_from_bytesio(self):
39904042 # TODO: RUSTPYTHON
39914043 @unittest .expectedFailure
39924044 def test_write_to_bytesio (self ):
3993- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
4045+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
39944046 raw = io .BytesIO ()
39954047 tree .write (raw )
3996- self .assertEqual (raw .getvalue (), b'''<site / >''' )
4048+ self .assertEqual (raw .getvalue (), b'''<site>ø</site >''' )
39974049
39984050 class dummy :
39994051 pass
@@ -4011,12 +4063,12 @@ def test_read_from_user_text_reader(self):
40114063 # TODO: RUSTPYTHON
40124064 @unittest .expectedFailure
40134065 def test_write_to_user_text_writer (self ):
4014- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
4066+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
40154067 stream = io .StringIO ()
40164068 writer = self .dummy ()
40174069 writer .write = stream .write
40184070 tree .write (writer , encoding = 'unicode' )
4019- self .assertEqual (stream .getvalue (), '''<site / >''' )
4071+ self .assertEqual (stream .getvalue (), '''<site> \xf8 </site >''' )
40204072
40214073 # TODO: RUSTPYTHON
40224074 @unittest .expectedFailure
@@ -4032,12 +4084,12 @@ def test_read_from_user_binary_reader(self):
40324084 # TODO: RUSTPYTHON
40334085 @unittest .expectedFailure
40344086 def test_write_to_user_binary_writer (self ):
4035- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
4087+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
40364088 raw = io .BytesIO ()
40374089 writer = self .dummy ()
40384090 writer .write = raw .write
40394091 tree .write (writer )
4040- self .assertEqual (raw .getvalue (), b'''<site / >''' )
4092+ self .assertEqual (raw .getvalue (), b'''<site>ø</site >''' )
40414093
40424094 # TODO: RUSTPYTHON
40434095 @unittest .expectedFailure
0 commit comments