121
121
</foo>
122
122
"""
123
123
124
- fails_with_expat_2_6_0 = (unittest .expectedFailure
125
- if pyexpat .version_info >= (2 , 6 , 0 ) else
126
- lambda test : test )
127
-
128
124
def checkwarnings (* filters , quiet = False ):
129
125
def decorator (test ):
130
126
def newtest (* args , ** kwargs ):
@@ -1378,12 +1374,14 @@ def test_attlist_default(self):
1378
1374
1379
1375
class XMLPullParserTest (unittest .TestCase ):
1380
1376
1381
- def _feed (self , parser , data , chunk_size = None ):
1377
+ def _feed (self , parser , data , chunk_size = None , flush = False ):
1382
1378
if chunk_size is None :
1383
1379
parser .feed (data )
1384
1380
else :
1385
1381
for i in range (0 , len (data ), chunk_size ):
1386
1382
parser .feed (data [i :i + chunk_size ])
1383
+ if flush :
1384
+ parser .flush ()
1387
1385
1388
1386
def assert_events (self , parser , expected , max_events = None ):
1389
1387
self .assertEqual (
@@ -1401,34 +1399,32 @@ def assert_event_tags(self, parser, expected, max_events=None):
1401
1399
self .assertEqual ([(action , elem .tag ) for action , elem in events ],
1402
1400
expected )
1403
1401
1404
- def test_simple_xml (self , chunk_size = None ):
1402
+ def test_simple_xml (self , chunk_size = None , flush = False ):
1405
1403
parser = ET .XMLPullParser ()
1406
1404
self .assert_event_tags (parser , [])
1407
- self ._feed (parser , "<!-- comment -->\n " , chunk_size )
1405
+ self ._feed (parser , "<!-- comment -->\n " , chunk_size , flush )
1408
1406
self .assert_event_tags (parser , [])
1409
1407
self ._feed (parser ,
1410
1408
"<root>\n <element key='value'>text</element" ,
1411
- chunk_size )
1409
+ chunk_size , flush )
1412
1410
self .assert_event_tags (parser , [])
1413
- self ._feed (parser , ">\n " , chunk_size )
1411
+ self ._feed (parser , ">\n " , chunk_size , flush )
1414
1412
self .assert_event_tags (parser , [('end' , 'element' )])
1415
- self ._feed (parser , "<element>text</element>tail\n " , chunk_size )
1416
- self ._feed (parser , "<empty-element/>\n " , chunk_size )
1413
+ self ._feed (parser , "<element>text</element>tail\n " , chunk_size , flush )
1414
+ self ._feed (parser , "<empty-element/>\n " , chunk_size , flush )
1417
1415
self .assert_event_tags (parser , [
1418
1416
('end' , 'element' ),
1419
1417
('end' , 'empty-element' ),
1420
1418
])
1421
- self ._feed (parser , "</root>\n " , chunk_size )
1419
+ self ._feed (parser , "</root>\n " , chunk_size , flush )
1422
1420
self .assert_event_tags (parser , [('end' , 'root' )])
1423
1421
self .assertIsNone (parser .close ())
1424
1422
1425
- @fails_with_expat_2_6_0
1426
1423
def test_simple_xml_chunk_1 (self ):
1427
- self .test_simple_xml (chunk_size = 1 )
1424
+ self .test_simple_xml (chunk_size = 1 , flush = True )
1428
1425
1429
- @fails_with_expat_2_6_0
1430
1426
def test_simple_xml_chunk_5 (self ):
1431
- self .test_simple_xml (chunk_size = 5 )
1427
+ self .test_simple_xml (chunk_size = 5 , flush = True )
1432
1428
1433
1429
def test_simple_xml_chunk_22 (self ):
1434
1430
self .test_simple_xml (chunk_size = 22 )
@@ -1627,6 +1623,57 @@ def test_unknown_event(self):
1627
1623
with self .assertRaises (ValueError ):
1628
1624
ET .XMLPullParser (events = ('start' , 'end' , 'bogus' ))
1629
1625
1626
+ def test_flush_reparse_deferral_enabled (self ):
1627
+ if pyexpat .version_info < (2 , 6 , 0 ):
1628
+ self .skipTest (f'Expat { pyexpat .version_info } does not '
1629
+ 'support reparse deferral' )
1630
+
1631
+ parser = ET .XMLPullParser (events = ('start' , 'end' ))
1632
+
1633
+ for chunk in ("<doc" , ">" ):
1634
+ parser .feed (chunk )
1635
+
1636
+ self .assert_event_tags (parser , []) # i.e. no elements started
1637
+ if ET is pyET :
1638
+ self .assertTrue (parser ._parser ._parser .GetReparseDeferralEnabled ())
1639
+
1640
+ parser .flush ()
1641
+
1642
+ self .assert_event_tags (parser , [('start' , 'doc' )])
1643
+ if ET is pyET :
1644
+ self .assertTrue (parser ._parser ._parser .GetReparseDeferralEnabled ())
1645
+
1646
+ parser .feed ("</doc>" )
1647
+ parser .close ()
1648
+
1649
+ self .assert_event_tags (parser , [('end' , 'doc' )])
1650
+
1651
+ def test_flush_reparse_deferral_disabled (self ):
1652
+ parser = ET .XMLPullParser (events = ('start' , 'end' ))
1653
+
1654
+ for chunk in ("<doc" , ">" ):
1655
+ parser .feed (chunk )
1656
+
1657
+ if pyexpat .version_info >= (2 , 6 , 0 ):
1658
+ if not ET is pyET :
1659
+ self .skipTest (f'XMLParser.(Get|Set)ReparseDeferralEnabled '
1660
+ 'methods not available in C' )
1661
+ parser ._parser ._parser .SetReparseDeferralEnabled (False )
1662
+
1663
+ self .assert_event_tags (parser , []) # i.e. no elements started
1664
+ if ET is pyET :
1665
+ self .assertFalse (parser ._parser ._parser .GetReparseDeferralEnabled ())
1666
+
1667
+ parser .flush ()
1668
+
1669
+ self .assert_event_tags (parser , [('start' , 'doc' )])
1670
+ if ET is pyET :
1671
+ self .assertFalse (parser ._parser ._parser .GetReparseDeferralEnabled ())
1672
+
1673
+ parser .feed ("</doc>" )
1674
+ parser .close ()
1675
+
1676
+ self .assert_event_tags (parser , [('end' , 'doc' )])
1630
1677
1631
1678
#
1632
1679
# xinclude tests (samples from appendix C of the xinclude specification)
0 commit comments