105105"""
106106
107107
108- fails_with_expat_2_6_0 = (unittest .expectedFailure
109- if pyexpat .version_info >= (2 , 6 , 0 ) else
110- lambda test : test )
111-
112-
113108def checkwarnings (* filters , quiet = False ):
114109 def decorator (test ):
115110 def newtest (* args , ** kwargs ):
@@ -1250,12 +1245,14 @@ def test_tree_write_attribute_order(self):
12501245
12511246class XMLPullParserTest (unittest .TestCase ):
12521247
1253- def _feed (self , parser , data , chunk_size = None ):
1248+ def _feed (self , parser , data , chunk_size = None , flush = False ):
12541249 if chunk_size is None :
12551250 parser .feed (data )
12561251 else :
12571252 for i in range (0 , len (data ), chunk_size ):
12581253 parser .feed (data [i :i + chunk_size ])
1254+ if flush :
1255+ parser .flush ()
12591256
12601257 def assert_events (self , parser , expected , max_events = None ):
12611258 self .assertEqual (
@@ -1273,34 +1270,32 @@ def assert_event_tags(self, parser, expected, max_events=None):
12731270 self .assertEqual ([(action , elem .tag ) for action , elem in events ],
12741271 expected )
12751272
1276- def test_simple_xml (self , chunk_size = None ):
1273+ def test_simple_xml (self , chunk_size = None , flush = False ):
12771274 parser = ET .XMLPullParser ()
12781275 self .assert_event_tags (parser , [])
1279- self ._feed (parser , "<!-- comment -->\n " , chunk_size )
1276+ self ._feed (parser , "<!-- comment -->\n " , chunk_size , flush )
12801277 self .assert_event_tags (parser , [])
12811278 self ._feed (parser ,
12821279 "<root>\n <element key='value'>text</element" ,
1283- chunk_size )
1280+ chunk_size , flush )
12841281 self .assert_event_tags (parser , [])
1285- self ._feed (parser , ">\n " , chunk_size )
1282+ self ._feed (parser , ">\n " , chunk_size , flush )
12861283 self .assert_event_tags (parser , [('end' , 'element' )])
1287- self ._feed (parser , "<element>text</element>tail\n " , chunk_size )
1288- self ._feed (parser , "<empty-element/>\n " , chunk_size )
1284+ self ._feed (parser , "<element>text</element>tail\n " , chunk_size , flush )
1285+ self ._feed (parser , "<empty-element/>\n " , chunk_size , flush )
12891286 self .assert_event_tags (parser , [
12901287 ('end' , 'element' ),
12911288 ('end' , 'empty-element' ),
12921289 ])
1293- self ._feed (parser , "</root>\n " , chunk_size )
1290+ self ._feed (parser , "</root>\n " , chunk_size , flush )
12941291 self .assert_event_tags (parser , [('end' , 'root' )])
12951292 self .assertIsNone (parser .close ())
12961293
1297- @fails_with_expat_2_6_0
12981294 def test_simple_xml_chunk_1 (self ):
1299- self .test_simple_xml (chunk_size = 1 )
1295+ self .test_simple_xml (chunk_size = 1 , flush = True )
13001296
1301- @fails_with_expat_2_6_0
13021297 def test_simple_xml_chunk_5 (self ):
1303- self .test_simple_xml (chunk_size = 5 )
1298+ self .test_simple_xml (chunk_size = 5 , flush = True )
13041299
13051300 def test_simple_xml_chunk_22 (self ):
13061301 self .test_simple_xml (chunk_size = 22 )
@@ -1499,6 +1494,57 @@ def test_unknown_event(self):
14991494 with self .assertRaises (ValueError ):
15001495 ET .XMLPullParser (events = ('start' , 'end' , 'bogus' ))
15011496
1497+ def test_flush_reparse_deferral_enabled (self ):
1498+ if pyexpat .version_info < (2 , 6 , 0 ):
1499+ self .skipTest (f'Expat { pyexpat .version_info } does not '
1500+ 'support reparse deferral' )
1501+
1502+ parser = ET .XMLPullParser (events = ('start' , 'end' ))
1503+
1504+ for chunk in ("<doc" , ">" ):
1505+ parser .feed (chunk )
1506+
1507+ self .assert_event_tags (parser , []) # i.e. no elements started
1508+ if ET is pyET :
1509+ self .assertTrue (parser ._parser ._parser .GetReparseDeferralEnabled ())
1510+
1511+ parser .flush ()
1512+
1513+ self .assert_event_tags (parser , [('start' , 'doc' )])
1514+ if ET is pyET :
1515+ self .assertTrue (parser ._parser ._parser .GetReparseDeferralEnabled ())
1516+
1517+ parser .feed ("</doc>" )
1518+ parser .close ()
1519+
1520+ self .assert_event_tags (parser , [('end' , 'doc' )])
1521+
1522+ def test_flush_reparse_deferral_disabled (self ):
1523+ parser = ET .XMLPullParser (events = ('start' , 'end' ))
1524+
1525+ for chunk in ("<doc" , ">" ):
1526+ parser .feed (chunk )
1527+
1528+ if pyexpat .version_info >= (2 , 6 , 0 ):
1529+ if not ET is pyET :
1530+ self .skipTest (f'XMLParser.(Get|Set)ReparseDeferralEnabled '
1531+ 'methods not available in C' )
1532+ parser ._parser ._parser .SetReparseDeferralEnabled (False )
1533+
1534+ self .assert_event_tags (parser , []) # i.e. no elements started
1535+ if ET is pyET :
1536+ self .assertFalse (parser ._parser ._parser .GetReparseDeferralEnabled ())
1537+
1538+ parser .flush ()
1539+
1540+ self .assert_event_tags (parser , [('start' , 'doc' )])
1541+ if ET is pyET :
1542+ self .assertFalse (parser ._parser ._parser .GetReparseDeferralEnabled ())
1543+
1544+ parser .feed ("</doc>" )
1545+ parser .close ()
1546+
1547+ self .assert_event_tags (parser , [('end' , 'doc' )])
15021548
15031549#
15041550# xinclude tests (samples from appendix C of the xinclude specification)
0 commit comments