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 ):
@@ -1462,12 +1458,14 @@ def test_attlist_default(self):
14621458
14631459class XMLPullParserTest (unittest .TestCase ):
14641460
1465- def _feed (self , parser , data , chunk_size = None ):
1461+ def _feed (self , parser , data , chunk_size = None , flush = False ):
14661462 if chunk_size is None :
14671463 parser .feed (data )
14681464 else :
14691465 for i in range (0 , len (data ), chunk_size ):
14701466 parser .feed (data [i :i + chunk_size ])
1467+ if flush :
1468+ parser .flush ()
14711469
14721470 def assert_events (self , parser , expected , max_events = None ):
14731471 self .assertEqual (
@@ -1485,34 +1483,32 @@ def assert_event_tags(self, parser, expected, max_events=None):
14851483 self .assertEqual ([(action , elem .tag ) for action , elem in events ],
14861484 expected )
14871485
1488- def test_simple_xml (self , chunk_size = None ):
1486+ def test_simple_xml (self , chunk_size = None , flush = False ):
14891487 parser = ET .XMLPullParser ()
14901488 self .assert_event_tags (parser , [])
1491- self ._feed (parser , "<!-- comment -->\n " , chunk_size )
1489+ self ._feed (parser , "<!-- comment -->\n " , chunk_size , flush )
14921490 self .assert_event_tags (parser , [])
14931491 self ._feed (parser ,
14941492 "<root>\n <element key='value'>text</element" ,
1495- chunk_size )
1493+ chunk_size , flush )
14961494 self .assert_event_tags (parser , [])
1497- self ._feed (parser , ">\n " , chunk_size )
1495+ self ._feed (parser , ">\n " , chunk_size , flush )
14981496 self .assert_event_tags (parser , [('end' , 'element' )])
1499- self ._feed (parser , "<element>text</element>tail\n " , chunk_size )
1500- self ._feed (parser , "<empty-element/>\n " , chunk_size )
1497+ self ._feed (parser , "<element>text</element>tail\n " , chunk_size , flush )
1498+ self ._feed (parser , "<empty-element/>\n " , chunk_size , flush )
15011499 self .assert_event_tags (parser , [
15021500 ('end' , 'element' ),
15031501 ('end' , 'empty-element' ),
15041502 ])
1505- self ._feed (parser , "</root>\n " , chunk_size )
1503+ self ._feed (parser , "</root>\n " , chunk_size , flush )
15061504 self .assert_event_tags (parser , [('end' , 'root' )])
15071505 self .assertIsNone (parser .close ())
15081506
1509- @fails_with_expat_2_6_0
15101507 def test_simple_xml_chunk_1 (self ):
1511- self .test_simple_xml (chunk_size = 1 )
1508+ self .test_simple_xml (chunk_size = 1 , flush = True )
15121509
1513- @fails_with_expat_2_6_0
15141510 def test_simple_xml_chunk_5 (self ):
1515- self .test_simple_xml (chunk_size = 5 )
1511+ self .test_simple_xml (chunk_size = 5 , flush = True )
15161512
15171513 def test_simple_xml_chunk_22 (self ):
15181514 self .test_simple_xml (chunk_size = 22 )
@@ -1711,6 +1707,57 @@ def test_unknown_event(self):
17111707 with self .assertRaises (ValueError ):
17121708 ET .XMLPullParser (events = ('start' , 'end' , 'bogus' ))
17131709
1710+ def test_flush_reparse_deferral_enabled (self ):
1711+ if pyexpat .version_info < (2 , 6 , 0 ):
1712+ self .skipTest (f'Expat { pyexpat .version_info } does not '
1713+ 'support reparse deferral' )
1714+
1715+ parser = ET .XMLPullParser (events = ('start' , 'end' ))
1716+
1717+ for chunk in ("<doc" , ">" ):
1718+ parser .feed (chunk )
1719+
1720+ self .assert_event_tags (parser , []) # i.e. no elements started
1721+ if ET is pyET :
1722+ self .assertTrue (parser ._parser ._parser .GetReparseDeferralEnabled ())
1723+
1724+ parser .flush ()
1725+
1726+ self .assert_event_tags (parser , [('start' , 'doc' )])
1727+ if ET is pyET :
1728+ self .assertTrue (parser ._parser ._parser .GetReparseDeferralEnabled ())
1729+
1730+ parser .feed ("</doc>" )
1731+ parser .close ()
1732+
1733+ self .assert_event_tags (parser , [('end' , 'doc' )])
1734+
1735+ def test_flush_reparse_deferral_disabled (self ):
1736+ parser = ET .XMLPullParser (events = ('start' , 'end' ))
1737+
1738+ for chunk in ("<doc" , ">" ):
1739+ parser .feed (chunk )
1740+
1741+ if pyexpat .version_info >= (2 , 6 , 0 ):
1742+ if not ET is pyET :
1743+ self .skipTest (f'XMLParser.(Get|Set)ReparseDeferralEnabled '
1744+ 'methods not available in C' )
1745+ parser ._parser ._parser .SetReparseDeferralEnabled (False )
1746+
1747+ self .assert_event_tags (parser , []) # i.e. no elements started
1748+ if ET is pyET :
1749+ self .assertFalse (parser ._parser ._parser .GetReparseDeferralEnabled ())
1750+
1751+ parser .flush ()
1752+
1753+ self .assert_event_tags (parser , [('start' , 'doc' )])
1754+ if ET is pyET :
1755+ self .assertFalse (parser ._parser ._parser .GetReparseDeferralEnabled ())
1756+
1757+ parser .feed ("</doc>" )
1758+ parser .close ()
1759+
1760+ self .assert_event_tags (parser , [('end' , 'doc' )])
17141761
17151762#
17161763# xinclude tests (samples from appendix C of the xinclude specification)
0 commit comments