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 ):
@@ -1378,12 +1374,14 @@ def test_attlist_default(self):
13781374
13791375class XMLPullParserTest (unittest .TestCase ):
13801376
1381- def _feed (self , parser , data , chunk_size = None ):
1377+ def _feed (self , parser , data , chunk_size = None , flush = False ):
13821378 if chunk_size is None :
13831379 parser .feed (data )
13841380 else :
13851381 for i in range (0 , len (data ), chunk_size ):
13861382 parser .feed (data [i :i + chunk_size ])
1383+ if flush :
1384+ parser .flush ()
13871385
13881386 def assert_events (self , parser , expected , max_events = None ):
13891387 self .assertEqual (
@@ -1401,34 +1399,32 @@ def assert_event_tags(self, parser, expected, max_events=None):
14011399 self .assertEqual ([(action , elem .tag ) for action , elem in events ],
14021400 expected )
14031401
1404- def test_simple_xml (self , chunk_size = None ):
1402+ def test_simple_xml (self , chunk_size = None , flush = False ):
14051403 parser = ET .XMLPullParser ()
14061404 self .assert_event_tags (parser , [])
1407- self ._feed (parser , "<!-- comment -->\n " , chunk_size )
1405+ self ._feed (parser , "<!-- comment -->\n " , chunk_size , flush )
14081406 self .assert_event_tags (parser , [])
14091407 self ._feed (parser ,
14101408 "<root>\n <element key='value'>text</element" ,
1411- chunk_size )
1409+ chunk_size , flush )
14121410 self .assert_event_tags (parser , [])
1413- self ._feed (parser , ">\n " , chunk_size )
1411+ self ._feed (parser , ">\n " , chunk_size , flush )
14141412 self .assert_event_tags (parser , [('end' , 'element' )])
1415- self ._feed (parser , "<element>text</element>tail\n " , chunk_size )
1416- self ._feed (parser , "<empty-element/>\n " , chunk_size )
1413+ self ._feed (parser , "<element>text</element>tail\n " , chunk_size , flush )
1414+ self ._feed (parser , "<empty-element/>\n " , chunk_size , flush )
14171415 self .assert_event_tags (parser , [
14181416 ('end' , 'element' ),
14191417 ('end' , 'empty-element' ),
14201418 ])
1421- self ._feed (parser , "</root>\n " , chunk_size )
1419+ self ._feed (parser , "</root>\n " , chunk_size , flush )
14221420 self .assert_event_tags (parser , [('end' , 'root' )])
14231421 self .assertIsNone (parser .close ())
14241422
1425- @fails_with_expat_2_6_0
14261423 def test_simple_xml_chunk_1 (self ):
1427- self .test_simple_xml (chunk_size = 1 )
1424+ self .test_simple_xml (chunk_size = 1 , flush = True )
14281425
1429- @fails_with_expat_2_6_0
14301426 def test_simple_xml_chunk_5 (self ):
1431- self .test_simple_xml (chunk_size = 5 )
1427+ self .test_simple_xml (chunk_size = 5 , flush = True )
14321428
14331429 def test_simple_xml_chunk_22 (self ):
14341430 self .test_simple_xml (chunk_size = 22 )
@@ -1627,6 +1623,57 @@ def test_unknown_event(self):
16271623 with self .assertRaises (ValueError ):
16281624 ET .XMLPullParser (events = ('start' , 'end' , 'bogus' ))
16291625
1626+ def test_flush_reparse_deferral_enabled (self ):
1627+ if pyexpat .version_info < (2 , 6 , 0 ):
1628+ self .skipTest (f'Expat { pyexpat .version_info } does not '
1629+ 'support reparse deferral' )
1630+
1631+ parser = ET .XMLPullParser (events = ('start' , 'end' ))
1632+
1633+ for chunk in ("<doc" , ">" ):
1634+ parser .feed (chunk )
1635+
1636+ self .assert_event_tags (parser , []) # i.e. no elements started
1637+ if ET is pyET :
1638+ self .assertTrue (parser ._parser ._parser .GetReparseDeferralEnabled ())
1639+
1640+ parser .flush ()
1641+
1642+ self .assert_event_tags (parser , [('start' , 'doc' )])
1643+ if ET is pyET :
1644+ self .assertTrue (parser ._parser ._parser .GetReparseDeferralEnabled ())
1645+
1646+ parser .feed ("</doc>" )
1647+ parser .close ()
1648+
1649+ self .assert_event_tags (parser , [('end' , 'doc' )])
1650+
1651+ def test_flush_reparse_deferral_disabled (self ):
1652+ parser = ET .XMLPullParser (events = ('start' , 'end' ))
1653+
1654+ for chunk in ("<doc" , ">" ):
1655+ parser .feed (chunk )
1656+
1657+ if pyexpat .version_info >= (2 , 6 , 0 ):
1658+ if not ET is pyET :
1659+ self .skipTest (f'XMLParser.(Get|Set)ReparseDeferralEnabled '
1660+ 'methods not available in C' )
1661+ parser ._parser ._parser .SetReparseDeferralEnabled (False )
1662+
1663+ self .assert_event_tags (parser , []) # i.e. no elements started
1664+ if ET is pyET :
1665+ self .assertFalse (parser ._parser ._parser .GetReparseDeferralEnabled ())
1666+
1667+ parser .flush ()
1668+
1669+ self .assert_event_tags (parser , [('start' , 'doc' )])
1670+ if ET is pyET :
1671+ self .assertFalse (parser ._parser ._parser .GetReparseDeferralEnabled ())
1672+
1673+ parser .feed ("</doc>" )
1674+ parser .close ()
1675+
1676+ self .assert_event_tags (parser , [('end' , 'doc' )])
16301677
16311678#
16321679# xinclude tests (samples from appendix C of the xinclude specification)
0 commit comments