@@ -130,6 +130,9 @@ def newtest(*args, **kwargs):
130
130
return newtest
131
131
return decorator
132
132
133
+ def convlinesep (data ):
134
+ return data .replace (b'\n ' , os .linesep .encode ())
135
+
133
136
134
137
class ModuleTest (unittest .TestCase ):
135
138
def test_sanity (self ):
@@ -3713,48 +3716,108 @@ def test_encoding(self):
3713
3716
3714
3717
def test_write_to_filename (self ):
3715
3718
self .addCleanup (os_helper .unlink , TESTFN )
3716
- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3719
+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
3717
3720
tree .write (TESTFN )
3718
3721
with open (TESTFN , 'rb' ) as f :
3719
- self .assertEqual (f .read (), b'''<site />''' )
3722
+ self .assertEqual (f .read (), b'''<site>ø</site>''' )
3723
+
3724
+ def test_write_to_filename_with_encoding (self ):
3725
+ self .addCleanup (os_helper .unlink , TESTFN )
3726
+ tree = ET .ElementTree (ET .XML ('''<site>\xf8 </site>''' ))
3727
+ tree .write (TESTFN , encoding = 'utf-8' )
3728
+ with open (TESTFN , 'rb' ) as f :
3729
+ self .assertEqual (f .read (), b'''<site>\xc3 \xb8 </site>''' )
3730
+
3731
+ tree .write (TESTFN , encoding = 'ISO-8859-1' )
3732
+ with open (TESTFN , 'rb' ) as f :
3733
+ self .assertEqual (f .read (), convlinesep (
3734
+ b'''<?xml version='1.0' encoding='ISO-8859-1'?>\n '''
3735
+ b'''<site>\xf8 </site>''' ))
3736
+
3737
+ def test_write_to_filename_as_unicode (self ):
3738
+ self .addCleanup (os_helper .unlink , TESTFN )
3739
+ with open (TESTFN , 'w' ) as f :
3740
+ encoding = f .encoding
3741
+ os_helper .unlink (TESTFN )
3742
+
3743
+ try :
3744
+ '\xf8 ' .encode (encoding )
3745
+ except UnicodeEncodeError :
3746
+ self .skipTest (f'default file encoding { encoding } not supported' )
3747
+
3748
+ tree = ET .ElementTree (ET .XML ('''<site>\xf8 </site>''' ))
3749
+ tree .write (TESTFN , encoding = 'unicode' )
3750
+ with open (TESTFN , 'rb' ) as f :
3751
+ data = f .read ()
3752
+ expected = "<site>\xf8 </site>" .encode (encoding , 'xmlcharrefreplace' )
3753
+ self .assertEqual (data , expected )
3720
3754
3721
3755
def test_write_to_text_file (self ):
3722
3756
self .addCleanup (os_helper .unlink , TESTFN )
3723
- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3757
+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
3724
3758
with open (TESTFN , 'w' , encoding = 'utf-8' ) as f :
3725
3759
tree .write (f , encoding = 'unicode' )
3726
3760
self .assertFalse (f .closed )
3727
3761
with open (TESTFN , 'rb' ) as f :
3728
- self .assertEqual (f .read (), b'''<site />''' )
3762
+ self .assertEqual (f .read (), b'''<site>\xc3 \xb8 </site>''' )
3763
+
3764
+ with open (TESTFN , 'w' , encoding = 'ascii' , errors = 'xmlcharrefreplace' ) as f :
3765
+ tree .write (f , encoding = 'unicode' )
3766
+ self .assertFalse (f .closed )
3767
+ with open (TESTFN , 'rb' ) as f :
3768
+ self .assertEqual (f .read (), b'''<site>ø</site>''' )
3769
+
3770
+ with open (TESTFN , 'w' , encoding = 'ISO-8859-1' ) as f :
3771
+ tree .write (f , encoding = 'unicode' )
3772
+ self .assertFalse (f .closed )
3773
+ with open (TESTFN , 'rb' ) as f :
3774
+ self .assertEqual (f .read (), b'''<site>\xf8 </site>''' )
3729
3775
3730
3776
def test_write_to_binary_file (self ):
3731
3777
self .addCleanup (os_helper .unlink , TESTFN )
3732
- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3778
+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
3733
3779
with open (TESTFN , 'wb' ) as f :
3734
3780
tree .write (f )
3735
3781
self .assertFalse (f .closed )
3736
3782
with open (TESTFN , 'rb' ) as f :
3737
- self .assertEqual (f .read (), b'''<site />''' )
3783
+ self .assertEqual (f .read (), b'''<site>ø</site>''' )
3784
+
3785
+ def test_write_to_binary_file_with_encoding (self ):
3786
+ self .addCleanup (os_helper .unlink , TESTFN )
3787
+ tree = ET .ElementTree (ET .XML ('''<site>\xf8 </site>''' ))
3788
+ with open (TESTFN , 'wb' ) as f :
3789
+ tree .write (f , encoding = 'utf-8' )
3790
+ self .assertFalse (f .closed )
3791
+ with open (TESTFN , 'rb' ) as f :
3792
+ self .assertEqual (f .read (), b'''<site>\xc3 \xb8 </site>''' )
3793
+
3794
+ with open (TESTFN , 'wb' ) as f :
3795
+ tree .write (f , encoding = 'ISO-8859-1' )
3796
+ self .assertFalse (f .closed )
3797
+ with open (TESTFN , 'rb' ) as f :
3798
+ self .assertEqual (f .read (),
3799
+ b'''<?xml version='1.0' encoding='ISO-8859-1'?>\n '''
3800
+ b'''<site>\xf8 </site>''' )
3738
3801
3739
3802
def test_write_to_binary_file_with_bom (self ):
3740
3803
self .addCleanup (os_helper .unlink , TESTFN )
3741
- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3804
+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
3742
3805
# test BOM writing to buffered file
3743
3806
with open (TESTFN , 'wb' ) as f :
3744
3807
tree .write (f , encoding = 'utf-16' )
3745
3808
self .assertFalse (f .closed )
3746
3809
with open (TESTFN , 'rb' ) as f :
3747
3810
self .assertEqual (f .read (),
3748
3811
'''<?xml version='1.0' encoding='utf-16'?>\n '''
3749
- '''<site / >''' .encode ("utf-16" ))
3812
+ '''<site> \xf8 </site >''' .encode ("utf-16" ))
3750
3813
# test BOM writing to non-buffered file
3751
3814
with open (TESTFN , 'wb' , buffering = 0 ) as f :
3752
3815
tree .write (f , encoding = 'utf-16' )
3753
3816
self .assertFalse (f .closed )
3754
3817
with open (TESTFN , 'rb' ) as f :
3755
3818
self .assertEqual (f .read (),
3756
3819
'''<?xml version='1.0' encoding='utf-16'?>\n '''
3757
- '''<site / >''' .encode ("utf-16" ))
3820
+ '''<site> \xf8 </site >''' .encode ("utf-16" ))
3758
3821
3759
3822
def test_read_from_stringio (self ):
3760
3823
tree = ET .ElementTree ()
@@ -3763,10 +3826,10 @@ def test_read_from_stringio(self):
3763
3826
self .assertEqual (tree .getroot ().tag , 'site' )
3764
3827
3765
3828
def test_write_to_stringio (self ):
3766
- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3829
+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
3767
3830
stream = io .StringIO ()
3768
3831
tree .write (stream , encoding = 'unicode' )
3769
- self .assertEqual (stream .getvalue (), '''<site / >''' )
3832
+ self .assertEqual (stream .getvalue (), '''<site> \xf8 </site >''' )
3770
3833
3771
3834
def test_read_from_bytesio (self ):
3772
3835
tree = ET .ElementTree ()
@@ -3775,10 +3838,10 @@ def test_read_from_bytesio(self):
3775
3838
self .assertEqual (tree .getroot ().tag , 'site' )
3776
3839
3777
3840
def test_write_to_bytesio (self ):
3778
- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3841
+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
3779
3842
raw = io .BytesIO ()
3780
3843
tree .write (raw )
3781
- self .assertEqual (raw .getvalue (), b'''<site / >''' )
3844
+ self .assertEqual (raw .getvalue (), b'''<site>ø</site >''' )
3782
3845
3783
3846
class dummy :
3784
3847
pass
@@ -3792,12 +3855,12 @@ def test_read_from_user_text_reader(self):
3792
3855
self .assertEqual (tree .getroot ().tag , 'site' )
3793
3856
3794
3857
def test_write_to_user_text_writer (self ):
3795
- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3858
+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
3796
3859
stream = io .StringIO ()
3797
3860
writer = self .dummy ()
3798
3861
writer .write = stream .write
3799
3862
tree .write (writer , encoding = 'unicode' )
3800
- self .assertEqual (stream .getvalue (), '''<site / >''' )
3863
+ self .assertEqual (stream .getvalue (), '''<site> \xf8 </site >''' )
3801
3864
3802
3865
def test_read_from_user_binary_reader (self ):
3803
3866
raw = io .BytesIO (b'''<?xml version="1.0"?><site></site>''' )
@@ -3809,12 +3872,12 @@ def test_read_from_user_binary_reader(self):
3809
3872
tree = ET .ElementTree ()
3810
3873
3811
3874
def test_write_to_user_binary_writer (self ):
3812
- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3875
+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
3813
3876
raw = io .BytesIO ()
3814
3877
writer = self .dummy ()
3815
3878
writer .write = raw .write
3816
3879
tree .write (writer )
3817
- self .assertEqual (raw .getvalue (), b'''<site / >''' )
3880
+ self .assertEqual (raw .getvalue (), b'''<site>ø</site >''' )
3818
3881
3819
3882
def test_write_to_user_binary_writer_with_bom (self ):
3820
3883
tree = ET .ElementTree (ET .XML ('''<site />''' ))
0 commit comments