@@ -112,6 +112,9 @@ def newtest(*args, **kwargs):
112
112
return newtest
113
113
return decorator
114
114
115
+ def convlinesep (data ):
116
+ return data .replace (b'\n ' , os .linesep .encode ())
117
+
115
118
116
119
class ModuleTest (unittest .TestCase ):
117
120
def test_sanity (self ):
@@ -3654,48 +3657,108 @@ def test_encoding(self):
3654
3657
3655
3658
def test_write_to_filename (self ):
3656
3659
self .addCleanup (support .unlink , TESTFN )
3657
- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3660
+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
3658
3661
tree .write (TESTFN )
3659
3662
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 )
3661
3695
3662
3696
def test_write_to_text_file (self ):
3663
3697
self .addCleanup (support .unlink , TESTFN )
3664
- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3698
+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
3665
3699
with open (TESTFN , 'w' , encoding = 'utf-8' ) as f :
3666
3700
tree .write (f , encoding = 'unicode' )
3667
3701
self .assertFalse (f .closed )
3668
3702
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>''' )
3670
3716
3671
3717
def test_write_to_binary_file (self ):
3672
3718
self .addCleanup (support .unlink , TESTFN )
3673
- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3719
+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
3674
3720
with open (TESTFN , 'wb' ) as f :
3675
3721
tree .write (f )
3676
3722
self .assertFalse (f .closed )
3677
3723
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>''' )
3679
3742
3680
3743
def test_write_to_binary_file_with_bom (self ):
3681
3744
self .addCleanup (support .unlink , TESTFN )
3682
- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3745
+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
3683
3746
# test BOM writing to buffered file
3684
3747
with open (TESTFN , 'wb' ) as f :
3685
3748
tree .write (f , encoding = 'utf-16' )
3686
3749
self .assertFalse (f .closed )
3687
3750
with open (TESTFN , 'rb' ) as f :
3688
3751
self .assertEqual (f .read (),
3689
3752
'''<?xml version='1.0' encoding='utf-16'?>\n '''
3690
- '''<site / >''' .encode ("utf-16" ))
3753
+ '''<site> \xf8 </site >''' .encode ("utf-16" ))
3691
3754
# test BOM writing to non-buffered file
3692
3755
with open (TESTFN , 'wb' , buffering = 0 ) as f :
3693
3756
tree .write (f , encoding = 'utf-16' )
3694
3757
self .assertFalse (f .closed )
3695
3758
with open (TESTFN , 'rb' ) as f :
3696
3759
self .assertEqual (f .read (),
3697
3760
'''<?xml version='1.0' encoding='utf-16'?>\n '''
3698
- '''<site / >''' .encode ("utf-16" ))
3761
+ '''<site> \xf8 </site >''' .encode ("utf-16" ))
3699
3762
3700
3763
def test_read_from_stringio (self ):
3701
3764
tree = ET .ElementTree ()
@@ -3704,10 +3767,10 @@ def test_read_from_stringio(self):
3704
3767
self .assertEqual (tree .getroot ().tag , 'site' )
3705
3768
3706
3769
def test_write_to_stringio (self ):
3707
- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3770
+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
3708
3771
stream = io .StringIO ()
3709
3772
tree .write (stream , encoding = 'unicode' )
3710
- self .assertEqual (stream .getvalue (), '''<site / >''' )
3773
+ self .assertEqual (stream .getvalue (), '''<site> \xf8 </site >''' )
3711
3774
3712
3775
def test_read_from_bytesio (self ):
3713
3776
tree = ET .ElementTree ()
@@ -3716,10 +3779,10 @@ def test_read_from_bytesio(self):
3716
3779
self .assertEqual (tree .getroot ().tag , 'site' )
3717
3780
3718
3781
def test_write_to_bytesio (self ):
3719
- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3782
+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
3720
3783
raw = io .BytesIO ()
3721
3784
tree .write (raw )
3722
- self .assertEqual (raw .getvalue (), b'''<site / >''' )
3785
+ self .assertEqual (raw .getvalue (), b'''<site>ø</site >''' )
3723
3786
3724
3787
class dummy :
3725
3788
pass
@@ -3733,12 +3796,12 @@ def test_read_from_user_text_reader(self):
3733
3796
self .assertEqual (tree .getroot ().tag , 'site' )
3734
3797
3735
3798
def test_write_to_user_text_writer (self ):
3736
- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3799
+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
3737
3800
stream = io .StringIO ()
3738
3801
writer = self .dummy ()
3739
3802
writer .write = stream .write
3740
3803
tree .write (writer , encoding = 'unicode' )
3741
- self .assertEqual (stream .getvalue (), '''<site / >''' )
3804
+ self .assertEqual (stream .getvalue (), '''<site> \xf8 </site >''' )
3742
3805
3743
3806
def test_read_from_user_binary_reader (self ):
3744
3807
raw = io .BytesIO (b'''<?xml version="1.0"?><site></site>''' )
@@ -3750,12 +3813,12 @@ def test_read_from_user_binary_reader(self):
3750
3813
tree = ET .ElementTree ()
3751
3814
3752
3815
def test_write_to_user_binary_writer (self ):
3753
- tree = ET .ElementTree (ET .XML ('''<site / >''' ))
3816
+ tree = ET .ElementTree (ET .XML ('''<site> \xf8 </site >''' ))
3754
3817
raw = io .BytesIO ()
3755
3818
writer = self .dummy ()
3756
3819
writer .write = raw .write
3757
3820
tree .write (writer )
3758
- self .assertEqual (raw .getvalue (), b'''<site / >''' )
3821
+ self .assertEqual (raw .getvalue (), b'''<site>ø</site >''' )
3759
3822
3760
3823
def test_write_to_user_binary_writer_with_bom (self ):
3761
3824
tree = ET .ElementTree (ET .XML ('''<site />''' ))
0 commit comments