121121</foo> 
122122""" 
123123
124- fails_with_expat_2_6_0  =  (unittest .expectedFailure 
125-                         if  pyexpat .version_info  >=  (2 , 6 , 0 ) else 
126-                         lambda  test : test )
127- 
128124def  checkwarnings (* filters , quiet = False ):
129125    def  decorator (test ):
130126        def  newtest (* args , ** kwargs ):
@@ -1382,12 +1378,14 @@ def test_attlist_default(self):
13821378
13831379class  XMLPullParserTest (unittest .TestCase ):
13841380
1385-     def  _feed (self , parser , data , chunk_size = None ):
1381+     def  _feed (self , parser , data , chunk_size = None ,  flush = False ):
13861382        if  chunk_size  is  None :
13871383            parser .feed (data )
13881384        else :
13891385            for  i  in  range (0 , len (data ), chunk_size ):
13901386                parser .feed (data [i :i + chunk_size ])
1387+         if  flush :
1388+             parser .flush ()
13911389
13921390    def  assert_events (self , parser , expected , max_events = None ):
13931391        self .assertEqual (
@@ -1405,34 +1403,32 @@ def assert_event_tags(self, parser, expected, max_events=None):
14051403        self .assertEqual ([(action , elem .tag ) for  action , elem  in  events ],
14061404                         expected )
14071405
1408-     def  test_simple_xml (self , chunk_size = None ):
1406+     def  test_simple_xml (self , chunk_size = None ,  flush = False ):
14091407        parser  =  ET .XMLPullParser ()
14101408        self .assert_event_tags (parser , [])
1411-         self ._feed (parser , "<!-- comment -->\n " , chunk_size )
1409+         self ._feed (parser , "<!-- comment -->\n " , chunk_size ,  flush )
14121410        self .assert_event_tags (parser , [])
14131411        self ._feed (parser ,
14141412                   "<root>\n   <element key='value'>text</element" ,
1415-                    chunk_size )
1413+                    chunk_size ,  flush )
14161414        self .assert_event_tags (parser , [])
1417-         self ._feed (parser , ">\n " , chunk_size )
1415+         self ._feed (parser , ">\n " , chunk_size ,  flush )
14181416        self .assert_event_tags (parser , [('end' , 'element' )])
1419-         self ._feed (parser , "<element>text</element>tail\n " , chunk_size )
1420-         self ._feed (parser , "<empty-element/>\n " , chunk_size )
1417+         self ._feed (parser , "<element>text</element>tail\n " , chunk_size ,  flush )
1418+         self ._feed (parser , "<empty-element/>\n " , chunk_size ,  flush )
14211419        self .assert_event_tags (parser , [
14221420            ('end' , 'element' ),
14231421            ('end' , 'empty-element' ),
14241422            ])
1425-         self ._feed (parser , "</root>\n " , chunk_size )
1423+         self ._feed (parser , "</root>\n " , chunk_size ,  flush )
14261424        self .assert_event_tags (parser , [('end' , 'root' )])
14271425        self .assertIsNone (parser .close ())
14281426
1429-     @fails_with_expat_2_6_0  
14301427    def  test_simple_xml_chunk_1 (self ):
1431-         self .test_simple_xml (chunk_size = 1 )
1428+         self .test_simple_xml (chunk_size = 1 ,  flush = True )
14321429
1433-     @fails_with_expat_2_6_0  
14341430    def  test_simple_xml_chunk_5 (self ):
1435-         self .test_simple_xml (chunk_size = 5 )
1431+         self .test_simple_xml (chunk_size = 5 ,  flush = True )
14361432
14371433    def  test_simple_xml_chunk_22 (self ):
14381434        self .test_simple_xml (chunk_size = 22 )
@@ -1631,6 +1627,57 @@ def test_unknown_event(self):
16311627        with  self .assertRaises (ValueError ):
16321628            ET .XMLPullParser (events = ('start' , 'end' , 'bogus' ))
16331629
1630+     def  test_flush_reparse_deferral_enabled (self ):
1631+         if  pyexpat .version_info  <  (2 , 6 , 0 ):
1632+             self .skipTest (f'Expat { pyexpat .version_info }  
1633+                           'support reparse deferral' )
1634+ 
1635+         parser  =  ET .XMLPullParser (events = ('start' , 'end' ))
1636+ 
1637+         for  chunk  in  ("<doc" , ">" ):
1638+             parser .feed (chunk )
1639+ 
1640+         self .assert_event_tags (parser , [])  # i.e. no elements started 
1641+         if  ET  is  pyET :
1642+             self .assertTrue (parser ._parser ._parser .GetReparseDeferralEnabled ())
1643+ 
1644+         parser .flush ()
1645+ 
1646+         self .assert_event_tags (parser , [('start' , 'doc' )])
1647+         if  ET  is  pyET :
1648+             self .assertTrue (parser ._parser ._parser .GetReparseDeferralEnabled ())
1649+ 
1650+         parser .feed ("</doc>" )
1651+         parser .close ()
1652+ 
1653+         self .assert_event_tags (parser , [('end' , 'doc' )])
1654+ 
1655+     def  test_flush_reparse_deferral_disabled (self ):
1656+         parser  =  ET .XMLPullParser (events = ('start' , 'end' ))
1657+ 
1658+         for  chunk  in  ("<doc" , ">" ):
1659+             parser .feed (chunk )
1660+ 
1661+         if  pyexpat .version_info  >=  (2 , 6 , 0 ):
1662+             if  not  ET  is  pyET :
1663+                 self .skipTest (f'XMLParser.(Get|Set)ReparseDeferralEnabled ' 
1664+                               'methods not available in C' )
1665+             parser ._parser ._parser .SetReparseDeferralEnabled (False )
1666+ 
1667+         self .assert_event_tags (parser , [])  # i.e. no elements started 
1668+         if  ET  is  pyET :
1669+             self .assertFalse (parser ._parser ._parser .GetReparseDeferralEnabled ())
1670+ 
1671+         parser .flush ()
1672+ 
1673+         self .assert_event_tags (parser , [('start' , 'doc' )])
1674+         if  ET  is  pyET :
1675+             self .assertFalse (parser ._parser ._parser .GetReparseDeferralEnabled ())
1676+ 
1677+         parser .feed ("</doc>" )
1678+         parser .close ()
1679+ 
1680+         self .assert_event_tags (parser , [('end' , 'doc' )])
16341681
16351682# 
16361683# xinclude tests (samples from appendix C of the xinclude specification) 
0 commit comments