@@ -340,8 +340,6 @@ def test_int_memoryview(self):
340
340
def test_string_float (self ):
341
341
self .assertRaises (ValueError , int , '1.2' )
342
342
343
- # TODO: RUSTPYTHON
344
- @unittest .expectedFailure
345
343
def test_intconversion (self ):
346
344
# Test __int__()
347
345
class ClassicMissingMethods :
@@ -380,15 +378,23 @@ def __trunc__(self):
380
378
int (ExceptionalTrunc ())
381
379
382
380
for trunc_result_base in (object , Classic ):
383
- class Integral (trunc_result_base ):
384
- def __int__ (self ):
381
+ class Index (trunc_result_base ):
382
+ def __index__ (self ):
385
383
return 42
386
384
387
385
class TruncReturnsNonInt (base ):
388
386
def __trunc__ (self ):
389
- return Integral ()
390
- with self .assertWarns (DeprecationWarning ):
391
- self .assertEqual (int (TruncReturnsNonInt ()), 42 )
387
+ return Index ()
388
+ self .assertEqual (int (TruncReturnsNonInt ()), 42 )
389
+
390
+ class Intable (trunc_result_base ):
391
+ def __int__ (self ):
392
+ return 42
393
+
394
+ class TruncReturnsNonIndex (base ):
395
+ def __trunc__ (self ):
396
+ return Intable ()
397
+ self .assertEqual (int (TruncReturnsNonInt ()), 42 )
392
398
393
399
class NonIntegral (trunc_result_base ):
394
400
def __trunc__ (self ):
@@ -420,6 +426,21 @@ def __trunc__(self):
420
426
with self .assertRaises (TypeError ):
421
427
int (TruncReturnsBadInt ())
422
428
429
+ def test_int_subclass_with_index (self ):
430
+ class MyIndex (int ):
431
+ def __index__ (self ):
432
+ return 42
433
+
434
+ class BadIndex (int ):
435
+ def __index__ (self ):
436
+ return 42.0
437
+
438
+ my_int = MyIndex (7 )
439
+ self .assertEqual (my_int , 7 )
440
+ self .assertEqual (int (my_int ), 7 )
441
+
442
+ self .assertEqual (int (BadIndex ()), 0 )
443
+
423
444
def test_int_subclass_with_int (self ):
424
445
class MyInt (int ):
425
446
def __int__ (self ):
@@ -433,11 +454,21 @@ def __int__(self):
433
454
self .assertEqual (my_int , 7 )
434
455
self .assertEqual (int (my_int ), 42 )
435
456
436
- self .assertRaises (TypeError , int , BadInt ())
457
+ my_int = BadInt (7 )
458
+ self .assertEqual (my_int , 7 )
459
+ self .assertRaises (TypeError , int , my_int )
437
460
438
461
# TODO: RUSTPYTHON
439
462
@unittest .expectedFailure
440
463
def test_int_returns_int_subclass (self ):
464
+ class BadIndex :
465
+ def __index__ (self ):
466
+ return True
467
+
468
+ class BadIndex2 (int ):
469
+ def __index__ (self ):
470
+ return True
471
+
441
472
class BadInt :
442
473
def __int__ (self ):
443
474
return True
@@ -446,6 +477,10 @@ class BadInt2(int):
446
477
def __int__ (self ):
447
478
return True
448
479
480
+ class TruncReturnsBadIndex :
481
+ def __trunc__ (self ):
482
+ return BadIndex ()
483
+
449
484
class TruncReturnsBadInt :
450
485
def __trunc__ (self ):
451
486
return BadInt ()
@@ -454,6 +489,17 @@ class TruncReturnsIntSubclass:
454
489
def __trunc__ (self ):
455
490
return True
456
491
492
+ bad_int = BadIndex ()
493
+ with self .assertWarns (DeprecationWarning ):
494
+ n = int (bad_int )
495
+ self .assertEqual (n , 1 )
496
+ self .assertIs (type (n ), int )
497
+
498
+ bad_int = BadIndex2 ()
499
+ n = int (bad_int )
500
+ self .assertEqual (n , 0 )
501
+ self .assertIs (type (n ), int )
502
+
457
503
bad_int = BadInt ()
458
504
with self .assertWarns (DeprecationWarning ):
459
505
n = int (bad_int )
@@ -466,12 +512,15 @@ def __trunc__(self):
466
512
self .assertEqual (n , 1 )
467
513
self .assertIs (type (n ), int )
468
514
469
- bad_int = TruncReturnsBadInt ()
515
+ bad_int = TruncReturnsBadIndex ()
470
516
with self .assertWarns (DeprecationWarning ):
471
517
n = int (bad_int )
472
518
self .assertEqual (n , 1 )
473
519
self .assertIs (type (n ), int )
474
520
521
+ bad_int = TruncReturnsBadInt ()
522
+ self .assertRaises (TypeError , int , bad_int )
523
+
475
524
good_int = TruncReturnsIntSubclass ()
476
525
n = int (good_int )
477
526
self .assertEqual (n , 1 )
0 commit comments