104104"""
105105
106106
107- fails_with_expat_2_6_0 = (unittest .expectedFailure
108- if pyexpat .version_info >= (2 , 6 , 0 ) else
109- lambda test : test )
110-
111-
112107def checkwarnings (* filters , quiet = False ):
113108 def decorator (test ):
114109 def newtest (* args , ** kwargs ):
@@ -1375,12 +1370,14 @@ def test_tree_write_attribute_order(self):
13751370
13761371class XMLPullParserTest (unittest .TestCase ):
13771372
1378- def _feed (self , parser , data , chunk_size = None ):
1373+ def _feed (self , parser , data , chunk_size = None , flush = False ):
13791374 if chunk_size is None :
13801375 parser .feed (data )
13811376 else :
13821377 for i in range (0 , len (data ), chunk_size ):
13831378 parser .feed (data [i :i + chunk_size ])
1379+ if flush :
1380+ parser .flush ()
13841381
13851382 def assert_events (self , parser , expected , max_events = None ):
13861383 self .assertEqual (
@@ -1398,34 +1395,32 @@ def assert_event_tags(self, parser, expected, max_events=None):
13981395 self .assertEqual ([(action , elem .tag ) for action , elem in events ],
13991396 expected )
14001397
1401- def test_simple_xml (self , chunk_size = None ):
1398+ def test_simple_xml (self , chunk_size = None , flush = False ):
14021399 parser = ET .XMLPullParser ()
14031400 self .assert_event_tags (parser , [])
1404- self ._feed (parser , "<!-- comment -->\n " , chunk_size )
1401+ self ._feed (parser , "<!-- comment -->\n " , chunk_size , flush )
14051402 self .assert_event_tags (parser , [])
14061403 self ._feed (parser ,
14071404 "<root>\n <element key='value'>text</element" ,
1408- chunk_size )
1405+ chunk_size , flush )
14091406 self .assert_event_tags (parser , [])
1410- self ._feed (parser , ">\n " , chunk_size )
1407+ self ._feed (parser , ">\n " , chunk_size , flush )
14111408 self .assert_event_tags (parser , [('end' , 'element' )])
1412- self ._feed (parser , "<element>text</element>tail\n " , chunk_size )
1413- self ._feed (parser , "<empty-element/>\n " , chunk_size )
1409+ self ._feed (parser , "<element>text</element>tail\n " , chunk_size , flush )
1410+ self ._feed (parser , "<empty-element/>\n " , chunk_size , flush )
14141411 self .assert_event_tags (parser , [
14151412 ('end' , 'element' ),
14161413 ('end' , 'empty-element' ),
14171414 ])
1418- self ._feed (parser , "</root>\n " , chunk_size )
1415+ self ._feed (parser , "</root>\n " , chunk_size , flush )
14191416 self .assert_event_tags (parser , [('end' , 'root' )])
14201417 self .assertIsNone (parser .close ())
14211418
1422- @fails_with_expat_2_6_0
14231419 def test_simple_xml_chunk_1 (self ):
1424- self .test_simple_xml (chunk_size = 1 )
1420+ self .test_simple_xml (chunk_size = 1 , flush = True )
14251421
1426- @fails_with_expat_2_6_0
14271422 def test_simple_xml_chunk_5 (self ):
1428- self .test_simple_xml (chunk_size = 5 )
1423+ self .test_simple_xml (chunk_size = 5 , flush = True )
14291424
14301425 def test_simple_xml_chunk_22 (self ):
14311426 self .test_simple_xml (chunk_size = 22 )
@@ -1624,6 +1619,57 @@ def test_unknown_event(self):
16241619 with self .assertRaises (ValueError ):
16251620 ET .XMLPullParser (events = ('start' , 'end' , 'bogus' ))
16261621
1622+ def test_flush_reparse_deferral_enabled (self ):
1623+ if pyexpat .version_info < (2 , 6 , 0 ):
1624+ self .skipTest (f'Expat { pyexpat .version_info } does not '
1625+ 'support reparse deferral' )
1626+
1627+ parser = ET .XMLPullParser (events = ('start' , 'end' ))
1628+
1629+ for chunk in ("<doc" , ">" ):
1630+ parser .feed (chunk )
1631+
1632+ self .assert_event_tags (parser , []) # i.e. no elements started
1633+ if ET is pyET :
1634+ self .assertTrue (parser ._parser ._parser .GetReparseDeferralEnabled ())
1635+
1636+ parser .flush ()
1637+
1638+ self .assert_event_tags (parser , [('start' , 'doc' )])
1639+ if ET is pyET :
1640+ self .assertTrue (parser ._parser ._parser .GetReparseDeferralEnabled ())
1641+
1642+ parser .feed ("</doc>" )
1643+ parser .close ()
1644+
1645+ self .assert_event_tags (parser , [('end' , 'doc' )])
1646+
1647+ def test_flush_reparse_deferral_disabled (self ):
1648+ parser = ET .XMLPullParser (events = ('start' , 'end' ))
1649+
1650+ for chunk in ("<doc" , ">" ):
1651+ parser .feed (chunk )
1652+
1653+ if pyexpat .version_info >= (2 , 6 , 0 ):
1654+ if not ET is pyET :
1655+ self .skipTest (f'XMLParser.(Get|Set)ReparseDeferralEnabled '
1656+ 'methods not available in C' )
1657+ parser ._parser ._parser .SetReparseDeferralEnabled (False )
1658+
1659+ self .assert_event_tags (parser , []) # i.e. no elements started
1660+ if ET is pyET :
1661+ self .assertFalse (parser ._parser ._parser .GetReparseDeferralEnabled ())
1662+
1663+ parser .flush ()
1664+
1665+ self .assert_event_tags (parser , [('start' , 'doc' )])
1666+ if ET is pyET :
1667+ self .assertFalse (parser ._parser ._parser .GetReparseDeferralEnabled ())
1668+
1669+ parser .feed ("</doc>" )
1670+ parser .close ()
1671+
1672+ self .assert_event_tags (parser , [('end' , 'doc' )])
16271673
16281674#
16291675# xinclude tests (samples from appendix C of the xinclude specification)
0 commit comments