@@ -135,6 +135,14 @@ def __str__(self):
135
135
def __repr__ (self ):
136
136
return f'{ self .__class__ .__name__ } ({ self .value !r} )'
137
137
138
+ class SymbolicReal (Symbolic ):
139
+ pass
140
+ numbers .Real .register (SymbolicReal )
141
+
142
+ class SymbolicComplex (Symbolic ):
143
+ pass
144
+ numbers .Complex .register (SymbolicComplex )
145
+
138
146
class Rat :
139
147
"""Simple Rational class for testing mixed arithmetic."""
140
148
def __init__ (self , n , d ):
@@ -273,6 +281,8 @@ def __repr__(self):
273
281
return f'{ self .__class__ .__name__ } ({ self .x !r} , { self .y !r} )'
274
282
numbers .Complex .register (Rect )
275
283
284
+ class RectComplex (Rect , complex ):
285
+ pass
276
286
277
287
class FractionTest (unittest .TestCase ):
278
288
@@ -790,12 +800,17 @@ def testMixedMultiplication(self):
790
800
791
801
self .assertTypedEquals (F (3 , 2 ) * Root (4 ), Root (F (9 , 1 )))
792
802
self .assertTypedEquals (Root (4 ) * F (3 , 2 ), 3.0 )
803
+ self .assertEqual (F (3 , 2 ) * SymbolicReal ('X' ), SymbolicReal ('3/2 * X' ))
804
+ self .assertRaises (TypeError , operator .mul , SymbolicReal ('X' ), F (3 , 2 ))
793
805
794
806
self .assertTypedEquals (F (3 , 2 ) * Polar (4 , 2 ), Polar (F (6 , 1 ), 2 ))
795
807
self .assertTypedEquals (F (3 , 2 ) * Polar (4.0 , 2 ), Polar (6.0 , 2 ))
796
808
self .assertTypedEquals (F (3 , 2 ) * Rect (4 , 3 ), Rect (F (6 , 1 ), F (9 , 2 )))
809
+ self .assertTypedEquals (F (3 , 2 ) * RectComplex (4 , 3 ), RectComplex (6.0 + 0j , 4.5 + 0j ))
797
810
self .assertRaises (TypeError , operator .mul , Polar (4 , 2 ), F (3 , 2 ))
798
811
self .assertTypedEquals (Rect (4 , 3 ) * F (3 , 2 ), 6.0 + 4.5j )
812
+ self .assertEqual (F (3 , 2 ) * SymbolicComplex ('X' ), SymbolicComplex ('3/2 * X' ))
813
+ self .assertRaises (TypeError , operator .mul , SymbolicComplex ('X' ), F (3 , 2 ))
799
814
800
815
self .assertEqual (F (3 , 2 ) * Symbolic ('X' ), Symbolic ('3/2 * X' ))
801
816
self .assertRaises (TypeError , operator .mul , Symbolic ('X' ), F (3 , 2 ))
@@ -815,12 +830,16 @@ def testMixedDivision(self):
815
830
816
831
self .assertTypedEquals (F (2 , 3 ) / Root (4 ), Root (F (1 , 9 )))
817
832
self .assertTypedEquals (Root (4 ) / F (2 , 3 ), 3.0 )
833
+ self .assertEqual (F (3 , 2 ) / SymbolicReal ('X' ), SymbolicReal ('3/2 / X' ))
834
+ self .assertRaises (TypeError , operator .truediv , SymbolicReal ('X' ), F (3 , 2 ))
818
835
819
836
self .assertTypedEquals (F (3 , 2 ) / Polar (4 , 2 ), Polar (F (3 , 8 ), - 2 ))
820
837
self .assertTypedEquals (F (3 , 2 ) / Polar (4.0 , 2 ), Polar (0.375 , - 2 ))
821
838
self .assertTypedEquals (F (3 , 2 ) / Rect (4 , 3 ), Rect (0.24 , 0.18 ))
822
839
self .assertRaises (TypeError , operator .truediv , Polar (4 , 2 ), F (2 , 3 ))
823
840
self .assertTypedEquals (Rect (4 , 3 ) / F (2 , 3 ), 6.0 + 4.5j )
841
+ self .assertEqual (F (3 , 2 ) / SymbolicComplex ('X' ), SymbolicComplex ('3/2 / X' ))
842
+ self .assertRaises (TypeError , operator .truediv , SymbolicComplex ('X' ), F (3 , 2 ))
824
843
825
844
self .assertEqual (F (3 , 2 ) / Symbolic ('X' ), Symbolic ('3/2 / X' ))
826
845
self .assertRaises (TypeError , operator .truediv , Symbolic ('X' ), F (2 , 3 ))
@@ -857,9 +876,14 @@ def testMixedIntegerDivision(self):
857
876
858
877
self .assertRaises (TypeError , operator .mod , F (2 , 3 ), Root (4 ))
859
878
self .assertTypedEquals (Root (4 ) % F (3 , 2 ), 0.5 )
879
+ self .assertEqual (F (3 , 2 ) % SymbolicReal ('X' ), SymbolicReal ('3/2 % X' ))
880
+ self .assertRaises (TypeError , operator .mod , SymbolicReal ('X' ), F (3 , 2 ))
860
881
861
882
self .assertRaises (TypeError , operator .mod , F (3 , 2 ), Polar (4 , 2 ))
883
+ self .assertRaises (TypeError , operator .mod , F (3 , 2 ), RectComplex (4 , 3 ))
862
884
self .assertRaises (TypeError , operator .mod , Rect (4 , 3 ), F (2 , 3 ))
885
+ self .assertEqual (F (3 , 2 ) % SymbolicComplex ('X' ), SymbolicComplex ('3/2 % X' ))
886
+ self .assertRaises (TypeError , operator .mod , SymbolicComplex ('X' ), F (3 , 2 ))
863
887
864
888
self .assertEqual (F (3 , 2 ) % Symbolic ('X' ), Symbolic ('3/2 % X' ))
865
889
self .assertRaises (TypeError , operator .mod , Symbolic ('X' ), F (2 , 3 ))
@@ -888,7 +912,6 @@ def testMixedPower(self):
888
912
self .assertIsInstance (F (4 , 9 ) ** Rat (- 3 , 2 ), float )
889
913
self .assertAlmostEqual (F (4 , 9 ) ** Rat (- 3 , 2 ), 3.375 )
890
914
self .assertAlmostEqual (F (- 4 , 9 ) ** Rat (- 3 , 2 ), 3.375j )
891
-
892
915
self .assertTypedEquals (Rat (9 , 4 ) ** F (3 , 2 ), 3.375 )
893
916
self .assertTypedEquals (Rat (3 , 2 ) ** F (3 , 1 ), Rat (27 , 8 ))
894
917
self .assertTypedEquals (Rat (3 , 2 ) ** F (- 3 , 1 ), F (8 , 27 ))
@@ -899,16 +922,22 @@ def testMixedPower(self):
899
922
self .assertTypedEquals (Root (4 ) ** F (2 , 1 ), Root (4 , F (1 )))
900
923
self .assertTypedEquals (Root (4 ) ** F (- 2 , 1 ), Root (4 , - F (1 )))
901
924
self .assertTypedEquals (Root (4 ) ** F (- 2 , 3 ), Root (4 , - 3.0 ))
925
+ self .assertEqual (F (3 , 2 ) ** SymbolicReal ('X' ), SymbolicReal ('1.5 ** X' ))
926
+ self .assertEqual (SymbolicReal ('X' ) ** F (3 , 2 ), SymbolicReal ('X ** 1.5' ))
902
927
903
928
self .assertTypedEquals (F (3 , 2 ) ** Rect (2 , 0 ), Polar (2.25 , 0.0 ))
904
929
self .assertTypedEquals (F (1 , 1 ) ** Rect (2 , 3 ), Polar (1.0 , 0.0 ))
930
+ self .assertTypedEquals (F (3 , 2 ) ** RectComplex (2 , 0 ), Polar (2.25 , 0.0 ))
931
+ self .assertTypedEquals (F (1 , 1 ) ** RectComplex (2 , 3 ), Polar (1.0 , 0.0 ))
905
932
self .assertTypedEquals (Polar (4 , 2 ) ** F (3 , 2 ), Polar (8.0 , 3.0 ))
906
933
self .assertTypedEquals (Polar (4 , 2 ) ** F (3 , 1 ), Polar (64 , 6 ))
907
934
self .assertTypedEquals (Polar (4 , 2 ) ** F (- 3 , 1 ), Polar (0.015625 , - 6 ))
908
935
self .assertTypedEquals (Polar (4 , 2 ) ** F (- 3 , 2 ), Polar (0.125 , - 3.0 ))
936
+ self .assertEqual (F (3 , 2 ) ** SymbolicComplex ('X' ), SymbolicComplex ('1.5 ** X' ))
937
+ self .assertEqual (SymbolicComplex ('X' ) ** F (3 , 2 ), SymbolicComplex ('X ** 1.5' ))
909
938
910
- self .assertTypedEquals (F (3 , 2 ) ** Symbolic ('X' ), Symbolic ('1.5 ** X' ))
911
- self .assertTypedEquals (Symbolic ('X' ) ** F (3 , 2 ), Symbolic ('X ** 1.5' ))
939
+ self .assertEqual (F (3 , 2 ) ** Symbolic ('X' ), Symbolic ('1.5 ** X' ))
940
+ self .assertEqual (Symbolic ('X' ) ** F (3 , 2 ), Symbolic ('X ** 1.5' ))
912
941
913
942
def testMixingWithDecimal (self ):
914
943
# Decimal refuses mixed arithmetic (but not mixed comparisons)
0 commit comments