@@ -398,7 +398,7 @@ def __trunc__(self):
398398 ####################################################################
399399 # future-specific tests are below:
400400 ####################################################################
401-
401+
402402 # Exception messages in Py2 are 8-bit strings. The following fails,
403403 # even if the testlist strings are wrapped in str() calls...
404404 @expectedFailurePY2
@@ -618,6 +618,165 @@ class longsubclass(long):
618618 print (b .dtype )
619619 assert b .dtype == np .int64 == c .dtype
620620
621+ def test_upcasting_to_floats (self ):
622+ """
623+ Integers should automatically be upcasted to floats for arithmetic
624+ operations.
625+ """
626+ a = int (3 )
627+
628+ # Addition with floats.
629+ self .assertEqual (a + 0.5 , 3.5 )
630+ self .assertEqual (0.5 + a , 3.5 )
631+ self .assertTrue (isinstance (a + 0.5 , float ))
632+ self .assertTrue (isinstance (0.5 + a , float ))
633+
634+ # Subtraction with floats.
635+ self .assertEqual (a - 0.5 , 2.5 )
636+ self .assertEqual (0.5 - a , - 2.5 )
637+ self .assertTrue (isinstance (a - 0.5 , float ))
638+ self .assertTrue (isinstance (0.5 - a , float ))
639+
640+ # Multiplication with floats.
641+ self .assertEqual (a * 0.5 , 1.5 )
642+ self .assertEqual (0.5 * a , 1.5 )
643+ self .assertTrue (isinstance (a * 0.5 , float ))
644+ self .assertTrue (isinstance (0.5 * a , float ))
645+
646+ # Division with floats.
647+ self .assertEqual (a / 0.5 , 6.0 )
648+ self .assertEqual (0.5 / a , 0.5 / 3.0 )
649+ self .assertTrue (isinstance (a / 0.5 , float ))
650+ self .assertTrue (isinstance (0.5 / a , float ))
651+
652+ # Modulo with floats.
653+ self .assertEqual (a % 0.5 , 0.0 )
654+ self .assertEqual (0.5 % a , 0.5 )
655+ self .assertTrue (isinstance (a % 0.5 , float ))
656+ self .assertTrue (isinstance (0.5 % a , float ))
657+
658+ # Power with floats.
659+ self .assertEqual (1.0 ** a , 1.0 )
660+ self .assertTrue (isinstance (1.0 ** a , float ))
661+
662+ self .assertEqual (a ** 1.0 , a )
663+ self .assertTrue (isinstance (a ** 1.0 , float ))
664+
665+ def test_upcasting_to_complex (self ):
666+ """
667+ Integers should automatically be upcasted to complex numbers for
668+ arithmetic operations.
669+
670+ Python 3 cannot mod complex numbers so this does not have to be
671+ supported here.
672+ """
673+ a = int (3 )
674+
675+ # Addition with complex.
676+ self .assertEqual (a + 0.5j , 3.0 + 0.5j )
677+ self .assertEqual (0.5j + a , 3.0 + 0.5j )
678+ self .assertTrue (isinstance (a + 0.5j , complex ))
679+ self .assertTrue (isinstance (0.5j + a , complex ))
680+
681+ # Subtraction with complex.
682+ self .assertEqual (a - 0.5j , 3.0 - 0.5j )
683+ self .assertEqual (0.5j - a , - 3.0 + 0.5j )
684+ self .assertTrue (isinstance (a - 0.5j , complex ))
685+ self .assertTrue (isinstance (0.5j - a , complex ))
686+
687+ # Multiplication with complex.
688+ self .assertEqual (a * 0.5j , 1.5j )
689+ self .assertEqual (0.5j * a , 1.5j )
690+ self .assertTrue (isinstance (a * 0.5j , complex ))
691+ self .assertTrue (isinstance (0.5j * a , complex ))
692+
693+ # Division with complex.
694+ self .assertEqual (a / 0.5j , - 6.0j )
695+ self .assertEqual (0.5j / a , (0.5 / 3.0 ) * 1j )
696+ self .assertTrue (isinstance (a / 0.5j , complex ))
697+ self .assertTrue (isinstance (0.5j / a , complex ))
698+
699+ # Power with floats.
700+ self .assertEqual (5.0j ** int (1 ), 5.0j )
701+ self .assertTrue (isinstance (5.0j ** int (1 ), complex ))
702+
703+ self .assertEqual (a ** 1.0j , 3.0 ** 1.0j )
704+ self .assertTrue (isinstance (a ** 1.0j , complex ))
705+
706+ def test_more_arithmetics (self ):
707+ """
708+ More arithmetic tests to improve test coverage.
709+ """
710+ a = int (3 )
711+ b = int (5 )
712+ c = int (- 5 )
713+
714+ self .assertEqual (b - a , 2 )
715+ self .assertTrue (isinstance (b - a , int ))
716+
717+ self .assertEqual (a * b , 15 )
718+ self .assertTrue (isinstance (a * b , int ))
719+
720+ self .assertEqual (b % a , 2 )
721+ self .assertTrue (isinstance (b % a , int ))
722+
723+ self .assertEqual (a ** b , 243 )
724+ self .assertTrue (isinstance (a ** b , int ))
725+
726+ self .assertEqual (abs (c ), 5 )
727+ self .assertEqual (abs (c ), b )
728+ self .assertTrue (isinstance (abs (c ), int ))
729+
730+ def test_bitwise_operations (self ):
731+ """
732+ Tests bitwise operations.
733+ """
734+ a = int (3 )
735+ b = int (1 )
736+
737+ self .assertEqual (a >> b , 1 )
738+ self .assertEqual (a >> 1 , 1 )
739+ self .assertTrue (isinstance (a >> b , int ))
740+ self .assertTrue (isinstance (a >> 1 , int ))
741+
742+ self .assertEqual (a << b , 6 )
743+ self .assertEqual (a << 1 , 6 )
744+ self .assertTrue (isinstance (a << b , int ))
745+ self .assertTrue (isinstance (a << 1 , int ))
746+
747+ self .assertEqual (a & b , 1 )
748+ self .assertEqual (a & 1 , 1 )
749+ self .assertTrue (isinstance (a & b , int ))
750+ self .assertTrue (isinstance (a & 1 , int ))
751+
752+ self .assertEqual (a | b , 3 )
753+ self .assertEqual (a | 1 , 3 )
754+ self .assertTrue (isinstance (a | b , int ))
755+ self .assertTrue (isinstance (a | 1 , int ))
756+
757+ self .assertEqual (a ^ b , 2 )
758+ self .assertEqual (a ^ 1 , 2 )
759+ self .assertTrue (isinstance (a ^ b , int ))
760+ self .assertTrue (isinstance (a ^ 1 , int ))
761+
762+ self .assertEqual (~ a , - 4 )
763+ self .assertTrue (isinstance (~ a , int ))
764+
765+ def test_unary_operators (self ):
766+ a = int (3 )
767+ b = int (- 3 )
768+
769+ self .assertEqual (+ a , a )
770+ self .assertEqual (+ a , 3 )
771+ self .assertEqual (+ b , b )
772+ self .assertEqual (+ b , - 3 )
773+ self .assertTrue (isinstance (+ a , int ))
774+
775+ self .assertEqual (- a , b )
776+ self .assertEqual (- a , - 3 )
777+ self .assertEqual (- b , a )
778+ self .assertEqual (- b , 3 )
779+ self .assertTrue (isinstance (- a , int ))
621780
622781if __name__ == "__main__" :
623782 unittest .main ()
0 commit comments