@@ -148,6 +148,9 @@ def filter_char(arg):
148
148
def map_char (arg ):
149
149
return chr (ord (arg )+ 1 )
150
150
151
+ def pack (* args ):
152
+ return args
153
+
151
154
class BuiltinTest (unittest .TestCase ):
152
155
# Helper to check picklability
153
156
def check_iter_pickle (self , it , seq , proto ):
@@ -1269,6 +1272,108 @@ def test_map_pickle(self):
1269
1272
m2 = map (map_char , "Is this the real life?" )
1270
1273
self .check_iter_pickle (m1 , list (m2 ), proto )
1271
1274
1275
+ # strict map tests based on strict zip tests
1276
+
1277
+ def test_map_pickle_strict (self ):
1278
+ a = (1 , 2 , 3 )
1279
+ b = (4 , 5 , 6 )
1280
+ t = [(1 , 4 ), (2 , 5 ), (3 , 6 )]
1281
+ for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
1282
+ m1 = map (pack , a , b , strict = True )
1283
+ self .check_iter_pickle (m1 , t , proto )
1284
+
1285
+ def test_map_pickle_strict_fail (self ):
1286
+ a = (1 , 2 , 3 )
1287
+ b = (4 , 5 , 6 , 7 )
1288
+ t = [(1 , 4 ), (2 , 5 ), (3 , 6 )]
1289
+ for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
1290
+ m1 = map (pack , a , b , strict = True )
1291
+ m2 = pickle .loads (pickle .dumps (m1 , proto ))
1292
+ self .assertEqual (self .iter_error (m1 , ValueError ), t )
1293
+ self .assertEqual (self .iter_error (m2 , ValueError ), t )
1294
+
1295
+ def test_map_strict (self ):
1296
+ self .assertEqual (tuple (map (pack , (1 , 2 , 3 ), 'abc' , strict = True )),
1297
+ ((1 , 'a' ), (2 , 'b' ), (3 , 'c' )))
1298
+ self .assertRaises (ValueError , tuple ,
1299
+ map (pack , (1 , 2 , 3 , 4 ), 'abc' , strict = True ))
1300
+ self .assertRaises (ValueError , tuple ,
1301
+ map (pack , (1 , 2 ), 'abc' , strict = True ))
1302
+ self .assertRaises (ValueError , tuple ,
1303
+ map (pack , (1 , 2 ), (1 , 2 ), 'abc' , strict = True ))
1304
+
1305
+ def test_map_strict_iterators (self ):
1306
+ x = iter (range (5 ))
1307
+ y = [0 ]
1308
+ z = iter (range (5 ))
1309
+ self .assertRaises (ValueError , list ,
1310
+ (map (pack , x , y , z , strict = True )))
1311
+ self .assertEqual (next (x ), 2 )
1312
+ self .assertEqual (next (z ), 1 )
1313
+
1314
+ def test_map_strict_error_handling (self ):
1315
+
1316
+ class Error (Exception ):
1317
+ pass
1318
+
1319
+ class Iter :
1320
+ def __init__ (self , size ):
1321
+ self .size = size
1322
+ def __iter__ (self ):
1323
+ return self
1324
+ def __next__ (self ):
1325
+ self .size -= 1
1326
+ if self .size < 0 :
1327
+ raise Error
1328
+ return self .size
1329
+
1330
+ l1 = self .iter_error (map (pack , "AB" , Iter (1 ), strict = True ), Error )
1331
+ self .assertEqual (l1 , [("A" , 0 )])
1332
+ l2 = self .iter_error (map (pack , "AB" , Iter (2 ), "A" , strict = True ), ValueError )
1333
+ self .assertEqual (l2 , [("A" , 1 , "A" )])
1334
+ l3 = self .iter_error (map (pack , "AB" , Iter (2 ), "ABC" , strict = True ), Error )
1335
+ self .assertEqual (l3 , [("A" , 1 , "A" ), ("B" , 0 , "B" )])
1336
+ l4 = self .iter_error (map (pack , "AB" , Iter (3 ), strict = True ), ValueError )
1337
+ self .assertEqual (l4 , [("A" , 2 ), ("B" , 1 )])
1338
+ l5 = self .iter_error (map (pack , Iter (1 ), "AB" , strict = True ), Error )
1339
+ self .assertEqual (l5 , [(0 , "A" )])
1340
+ l6 = self .iter_error (map (pack , Iter (2 ), "A" , strict = True ), ValueError )
1341
+ self .assertEqual (l6 , [(1 , "A" )])
1342
+ l7 = self .iter_error (map (pack , Iter (2 ), "ABC" , strict = True ), Error )
1343
+ self .assertEqual (l7 , [(1 , "A" ), (0 , "B" )])
1344
+ l8 = self .iter_error (map (pack , Iter (3 ), "AB" , strict = True ), ValueError )
1345
+ self .assertEqual (l8 , [(2 , "A" ), (1 , "B" )])
1346
+
1347
+ def test_map_strict_error_handling_stopiteration (self ):
1348
+
1349
+ class Iter :
1350
+ def __init__ (self , size ):
1351
+ self .size = size
1352
+ def __iter__ (self ):
1353
+ return self
1354
+ def __next__ (self ):
1355
+ self .size -= 1
1356
+ if self .size < 0 :
1357
+ raise StopIteration
1358
+ return self .size
1359
+
1360
+ l1 = self .iter_error (map (pack , "AB" , Iter (1 ), strict = True ), ValueError )
1361
+ self .assertEqual (l1 , [("A" , 0 )])
1362
+ l2 = self .iter_error (map (pack , "AB" , Iter (2 ), "A" , strict = True ), ValueError )
1363
+ self .assertEqual (l2 , [("A" , 1 , "A" )])
1364
+ l3 = self .iter_error (map (pack , "AB" , Iter (2 ), "ABC" , strict = True ), ValueError )
1365
+ self .assertEqual (l3 , [("A" , 1 , "A" ), ("B" , 0 , "B" )])
1366
+ l4 = self .iter_error (map (pack , "AB" , Iter (3 ), strict = True ), ValueError )
1367
+ self .assertEqual (l4 , [("A" , 2 ), ("B" , 1 )])
1368
+ l5 = self .iter_error (map (pack , Iter (1 ), "AB" , strict = True ), ValueError )
1369
+ self .assertEqual (l5 , [(0 , "A" )])
1370
+ l6 = self .iter_error (map (pack , Iter (2 ), "A" , strict = True ), ValueError )
1371
+ self .assertEqual (l6 , [(1 , "A" )])
1372
+ l7 = self .iter_error (map (pack , Iter (2 ), "ABC" , strict = True ), ValueError )
1373
+ self .assertEqual (l7 , [(1 , "A" ), (0 , "B" )])
1374
+ l8 = self .iter_error (map (pack , Iter (3 ), "AB" , strict = True ), ValueError )
1375
+ self .assertEqual (l8 , [(2 , "A" ), (1 , "B" )])
1376
+
1272
1377
def test_max (self ):
1273
1378
self .assertEqual (max ('123123' ), '3' )
1274
1379
self .assertEqual (max (1 , 2 , 3 ), 3 )
0 commit comments