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