105
105
"""
106
106
107
107
108
- fails_with_expat_2_6_0 = (unittest .expectedFailure
109
- if pyexpat .version_info >= (2 , 6 , 0 ) else
110
- lambda test : test )
111
-
112
-
113
108
def checkwarnings (* filters , quiet = False ):
114
109
def decorator (test ):
115
110
def newtest (* args , ** kwargs ):
@@ -1250,12 +1245,14 @@ def test_tree_write_attribute_order(self):
1250
1245
1251
1246
class XMLPullParserTest (unittest .TestCase ):
1252
1247
1253
- def _feed (self , parser , data , chunk_size = None ):
1248
+ def _feed (self , parser , data , chunk_size = None , flush = False ):
1254
1249
if chunk_size is None :
1255
1250
parser .feed (data )
1256
1251
else :
1257
1252
for i in range (0 , len (data ), chunk_size ):
1258
1253
parser .feed (data [i :i + chunk_size ])
1254
+ if flush :
1255
+ parser .flush ()
1259
1256
1260
1257
def assert_events (self , parser , expected , max_events = None ):
1261
1258
self .assertEqual (
@@ -1273,34 +1270,32 @@ def assert_event_tags(self, parser, expected, max_events=None):
1273
1270
self .assertEqual ([(action , elem .tag ) for action , elem in events ],
1274
1271
expected )
1275
1272
1276
- def test_simple_xml (self , chunk_size = None ):
1273
+ def test_simple_xml (self , chunk_size = None , flush = False ):
1277
1274
parser = ET .XMLPullParser ()
1278
1275
self .assert_event_tags (parser , [])
1279
- self ._feed (parser , "<!-- comment -->\n " , chunk_size )
1276
+ self ._feed (parser , "<!-- comment -->\n " , chunk_size , flush )
1280
1277
self .assert_event_tags (parser , [])
1281
1278
self ._feed (parser ,
1282
1279
"<root>\n <element key='value'>text</element" ,
1283
- chunk_size )
1280
+ chunk_size , flush )
1284
1281
self .assert_event_tags (parser , [])
1285
- self ._feed (parser , ">\n " , chunk_size )
1282
+ self ._feed (parser , ">\n " , chunk_size , flush )
1286
1283
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 )
1289
1286
self .assert_event_tags (parser , [
1290
1287
('end' , 'element' ),
1291
1288
('end' , 'empty-element' ),
1292
1289
])
1293
- self ._feed (parser , "</root>\n " , chunk_size )
1290
+ self ._feed (parser , "</root>\n " , chunk_size , flush )
1294
1291
self .assert_event_tags (parser , [('end' , 'root' )])
1295
1292
self .assertIsNone (parser .close ())
1296
1293
1297
- @fails_with_expat_2_6_0
1298
1294
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 )
1300
1296
1301
- @fails_with_expat_2_6_0
1302
1297
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 )
1304
1299
1305
1300
def test_simple_xml_chunk_22 (self ):
1306
1301
self .test_simple_xml (chunk_size = 22 )
@@ -1499,6 +1494,57 @@ def test_unknown_event(self):
1499
1494
with self .assertRaises (ValueError ):
1500
1495
ET .XMLPullParser (events = ('start' , 'end' , 'bogus' ))
1501
1496
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' )])
1502
1548
1503
1549
#
1504
1550
# xinclude tests (samples from appendix C of the xinclude specification)
0 commit comments