105105""" 
106106
107107
108- fails_with_expat_2_6_0  =  (unittest .expectedFailure 
109-                         if  pyexpat .version_info  >=  (2 , 6 , 0 ) else 
110-                         lambda  test : test )
111- 
112- 
113108def  checkwarnings (* filters , quiet = False ):
114109    def  decorator (test ):
115110        def  newtest (* args , ** kwargs ):
@@ -1250,12 +1245,14 @@ def test_tree_write_attribute_order(self):
12501245
12511246class  XMLPullParserTest (unittest .TestCase ):
12521247
1253-     def  _feed (self , parser , data , chunk_size = None ):
1248+     def  _feed (self , parser , data , chunk_size = None ,  flush = False ):
12541249        if  chunk_size  is  None :
12551250            parser .feed (data )
12561251        else :
12571252            for  i  in  range (0 , len (data ), chunk_size ):
12581253                parser .feed (data [i :i + chunk_size ])
1254+         if  flush :
1255+             parser .flush ()
12591256
12601257    def  assert_events (self , parser , expected , max_events = None ):
12611258        self .assertEqual (
@@ -1273,34 +1270,32 @@ def assert_event_tags(self, parser, expected, max_events=None):
12731270        self .assertEqual ([(action , elem .tag ) for  action , elem  in  events ],
12741271                         expected )
12751272
1276-     def  test_simple_xml (self , chunk_size = None ):
1273+     def  test_simple_xml (self , chunk_size = None ,  flush = False ):
12771274        parser  =  ET .XMLPullParser ()
12781275        self .assert_event_tags (parser , [])
1279-         self ._feed (parser , "<!-- comment -->\n " , chunk_size )
1276+         self ._feed (parser , "<!-- comment -->\n " , chunk_size ,  flush )
12801277        self .assert_event_tags (parser , [])
12811278        self ._feed (parser ,
12821279                   "<root>\n   <element key='value'>text</element" ,
1283-                    chunk_size )
1280+                    chunk_size ,  flush )
12841281        self .assert_event_tags (parser , [])
1285-         self ._feed (parser , ">\n " , chunk_size )
1282+         self ._feed (parser , ">\n " , chunk_size ,  flush )
12861283        self .assert_event_tags (parser , [('end' , 'element' )])
1287-         self ._feed (parser , "<element>text</element>tail\n " , chunk_size )
1288-         self ._feed (parser , "<empty-element/>\n " , chunk_size )
1284+         self ._feed (parser , "<element>text</element>tail\n " , chunk_size ,  flush )
1285+         self ._feed (parser , "<empty-element/>\n " , chunk_size ,  flush )
12891286        self .assert_event_tags (parser , [
12901287            ('end' , 'element' ),
12911288            ('end' , 'empty-element' ),
12921289            ])
1293-         self ._feed (parser , "</root>\n " , chunk_size )
1290+         self ._feed (parser , "</root>\n " , chunk_size ,  flush )
12941291        self .assert_event_tags (parser , [('end' , 'root' )])
12951292        self .assertIsNone (parser .close ())
12961293
1297-     @fails_with_expat_2_6_0  
12981294    def  test_simple_xml_chunk_1 (self ):
1299-         self .test_simple_xml (chunk_size = 1 )
1295+         self .test_simple_xml (chunk_size = 1 ,  flush = True )
13001296
1301-     @fails_with_expat_2_6_0  
13021297    def  test_simple_xml_chunk_5 (self ):
1303-         self .test_simple_xml (chunk_size = 5 )
1298+         self .test_simple_xml (chunk_size = 5 ,  flush = True )
13041299
13051300    def  test_simple_xml_chunk_22 (self ):
13061301        self .test_simple_xml (chunk_size = 22 )
@@ -1499,6 +1494,57 @@ def test_unknown_event(self):
14991494        with  self .assertRaises (ValueError ):
15001495            ET .XMLPullParser (events = ('start' , 'end' , 'bogus' ))
15011496
1497+     def  test_flush_reparse_deferral_enabled (self ):
1498+         if  pyexpat .version_info  <  (2 , 6 , 0 ):
1499+             self .skipTest (f'Expat { pyexpat .version_info }  
1500+                           'support reparse deferral' )
1501+ 
1502+         parser  =  ET .XMLPullParser (events = ('start' , 'end' ))
1503+ 
1504+         for  chunk  in  ("<doc" , ">" ):
1505+             parser .feed (chunk )
1506+ 
1507+         self .assert_event_tags (parser , [])  # i.e. no elements started 
1508+         if  ET  is  pyET :
1509+             self .assertTrue (parser ._parser ._parser .GetReparseDeferralEnabled ())
1510+ 
1511+         parser .flush ()
1512+ 
1513+         self .assert_event_tags (parser , [('start' , 'doc' )])
1514+         if  ET  is  pyET :
1515+             self .assertTrue (parser ._parser ._parser .GetReparseDeferralEnabled ())
1516+ 
1517+         parser .feed ("</doc>" )
1518+         parser .close ()
1519+ 
1520+         self .assert_event_tags (parser , [('end' , 'doc' )])
1521+ 
1522+     def  test_flush_reparse_deferral_disabled (self ):
1523+         parser  =  ET .XMLPullParser (events = ('start' , 'end' ))
1524+ 
1525+         for  chunk  in  ("<doc" , ">" ):
1526+             parser .feed (chunk )
1527+ 
1528+         if  pyexpat .version_info  >=  (2 , 6 , 0 ):
1529+             if  not  ET  is  pyET :
1530+                 self .skipTest (f'XMLParser.(Get|Set)ReparseDeferralEnabled ' 
1531+                               'methods not available in C' )
1532+             parser ._parser ._parser .SetReparseDeferralEnabled (False )
1533+ 
1534+         self .assert_event_tags (parser , [])  # i.e. no elements started 
1535+         if  ET  is  pyET :
1536+             self .assertFalse (parser ._parser ._parser .GetReparseDeferralEnabled ())
1537+ 
1538+         parser .flush ()
1539+ 
1540+         self .assert_event_tags (parser , [('start' , 'doc' )])
1541+         if  ET  is  pyET :
1542+             self .assertFalse (parser ._parser ._parser .GetReparseDeferralEnabled ())
1543+ 
1544+         parser .feed ("</doc>" )
1545+         parser .close ()
1546+ 
1547+         self .assert_event_tags (parser , [('end' , 'doc' )])
15021548
15031549# 
15041550# xinclude tests (samples from appendix C of the xinclude specification) 
0 commit comments