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 ):
129125def decorator (test ):
130126def 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 ):
14661462if chunk_size is None :
14671463parser .feed (data )
14681464else :
14691465for i in range (0 ,len (data ),chunk_size ):
14701466parser .feed (data [i :i + chunk_size ])
1467+ if flush :
1468+ parser .flush ()
14711469
14721470def assert_events (self ,parser ,expected ,max_events = None ):
14731471self .assertEqual (
@@ -1485,34 +1483,32 @@ def assert_event_tags(self, parser, expected, max_events=None):
14851483self .assertEqual ([(action ,elem .tag )for action ,elem in events ],
14861484expected )
14871485
1488- def test_simple_xml (self ,chunk_size = None ):
1486+ def test_simple_xml (self ,chunk_size = None , flush = False ):
14891487parser = ET .XMLPullParser ()
14901488self .assert_event_tags (parser , [])
1491- self ._feed (parser ,"<!-- comment -->\n " ,chunk_size )
1489+ self ._feed (parser ,"<!-- comment -->\n " ,chunk_size , flush )
14921490self .assert_event_tags (parser , [])
14931491self ._feed (parser ,
14941492"<root>\n <element key='value'>text</element" ,
1495- chunk_size )
1493+ chunk_size , flush )
14961494self .assert_event_tags (parser , [])
1497- self ._feed (parser ,">\n " ,chunk_size )
1495+ self ._feed (parser ,">\n " ,chunk_size , flush )
14981496self .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 )
15011499self .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 )
15061504self .assert_event_tags (parser , [('end' ,'root' )])
15071505self .assertIsNone (parser .close ())
15081506
1509- @fails_with_expat_2_6_0
15101507def 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
15141510def 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
15171513def test_simple_xml_chunk_22 (self ):
15181514self .test_simple_xml (chunk_size = 22 )
@@ -1711,6 +1707,57 @@ def test_unknown_event(self):
17111707with self .assertRaises (ValueError ):
17121708ET .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)