104
104
"""
105
105
106
106
107
- fails_with_expat_2_6_0 = (unittest .expectedFailure
108
- if pyexpat .version_info >= (2 , 6 , 0 ) else
109
- lambda test : test )
110
-
111
-
112
107
def checkwarnings (* filters , quiet = False ):
113
108
def decorator (test ):
114
109
def newtest (* args , ** kwargs ):
@@ -1375,12 +1370,14 @@ def test_tree_write_attribute_order(self):
1375
1370
1376
1371
class XMLPullParserTest (unittest .TestCase ):
1377
1372
1378
- def _feed (self , parser , data , chunk_size = None ):
1373
+ def _feed (self , parser , data , chunk_size = None , flush = False ):
1379
1374
if chunk_size is None :
1380
1375
parser .feed (data )
1381
1376
else :
1382
1377
for i in range (0 , len (data ), chunk_size ):
1383
1378
parser .feed (data [i :i + chunk_size ])
1379
+ if flush :
1380
+ parser .flush ()
1384
1381
1385
1382
def assert_events (self , parser , expected , max_events = None ):
1386
1383
self .assertEqual (
@@ -1398,34 +1395,32 @@ def assert_event_tags(self, parser, expected, max_events=None):
1398
1395
self .assertEqual ([(action , elem .tag ) for action , elem in events ],
1399
1396
expected )
1400
1397
1401
- def test_simple_xml (self , chunk_size = None ):
1398
+ def test_simple_xml (self , chunk_size = None , flush = False ):
1402
1399
parser = ET .XMLPullParser ()
1403
1400
self .assert_event_tags (parser , [])
1404
- self ._feed (parser , "<!-- comment -->\n " , chunk_size )
1401
+ self ._feed (parser , "<!-- comment -->\n " , chunk_size , flush )
1405
1402
self .assert_event_tags (parser , [])
1406
1403
self ._feed (parser ,
1407
1404
"<root>\n <element key='value'>text</element" ,
1408
- chunk_size )
1405
+ chunk_size , flush )
1409
1406
self .assert_event_tags (parser , [])
1410
- self ._feed (parser , ">\n " , chunk_size )
1407
+ self ._feed (parser , ">\n " , chunk_size , flush )
1411
1408
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 )
1414
1411
self .assert_event_tags (parser , [
1415
1412
('end' , 'element' ),
1416
1413
('end' , 'empty-element' ),
1417
1414
])
1418
- self ._feed (parser , "</root>\n " , chunk_size )
1415
+ self ._feed (parser , "</root>\n " , chunk_size , flush )
1419
1416
self .assert_event_tags (parser , [('end' , 'root' )])
1420
1417
self .assertIsNone (parser .close ())
1421
1418
1422
- @fails_with_expat_2_6_0
1423
1419
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 )
1425
1421
1426
- @fails_with_expat_2_6_0
1427
1422
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 )
1429
1424
1430
1425
def test_simple_xml_chunk_22 (self ):
1431
1426
self .test_simple_xml (chunk_size = 22 )
@@ -1624,6 +1619,57 @@ def test_unknown_event(self):
1624
1619
with self .assertRaises (ValueError ):
1625
1620
ET .XMLPullParser (events = ('start' , 'end' , 'bogus' ))
1626
1621
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' )])
1627
1673
1628
1674
#
1629
1675
# xinclude tests (samples from appendix C of the xinclude specification)
0 commit comments