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 } does not '
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