@@ -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
116119class 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>ø</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>ø</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>ø</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>ø</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>ø</site >''' )
37593822
37603823 def test_write_to_user_binary_writer_with_bom (self ):
37613824 tree = ET .ElementTree (ET .XML ('''<site />''' ))
0 commit comments