| 942 | self.assertEqual(hypot(x, y), z) |
| 943 | |
| 944 | def testDist(self): |
| 945 | from decimal import Decimal as D |
| 946 | from fractions import Fraction as F |
| 947 | |
| 948 | dist = math.dist |
| 949 | sqrt = math.sqrt |
| 950 | |
| 951 | # Simple exact cases |
| 952 | self.assertEqual(dist((1.0, 2.0, 3.0), (4.0, 2.0, -1.0)), 5.0) |
| 953 | self.assertEqual(dist((1, 2, 3), (4, 2, -1)), 5.0) |
| 954 | |
| 955 | # Test different numbers of arguments (from zero to nine) |
| 956 | # against a straightforward pure python implementation |
| 957 | for i in range(9): |
| 958 | for j in range(5): |
| 959 | p = tuple(random.uniform(-5, 5) for k in range(i)) |
| 960 | q = tuple(random.uniform(-5, 5) for k in range(i)) |
| 961 | self.assertAlmostEqual( |
| 962 | dist(p, q), |
| 963 | sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q))) |
| 964 | ) |
| 965 | |
| 966 | # Test non-tuple inputs |
| 967 | self.assertEqual(dist([1.0, 2.0, 3.0], [4.0, 2.0, -1.0]), 5.0) |
| 968 | self.assertEqual(dist(iter([1.0, 2.0, 3.0]), iter([4.0, 2.0, -1.0])), 5.0) |
| 969 | |
| 970 | # Test allowable types (those with __float__) |
| 971 | self.assertEqual(dist((14.0, 1.0), (2.0, -4.0)), 13.0) |
| 972 | self.assertEqual(dist((14, 1), (2, -4)), 13) |
| 973 | self.assertEqual(dist((FloatLike(14.), 1), (2, -4)), 13) |
| 974 | self.assertEqual(dist((11, 1), (FloatLike(-1.), -4)), 13) |
| 975 | self.assertEqual(dist((14, FloatLike(-1.)), (2, -6)), 13) |
| 976 | self.assertEqual(dist((14, -1), (2, -6)), 13) |
| 977 | self.assertEqual(dist((D(14), D(1)), (D(2), D(-4))), D(13)) |
| 978 | self.assertEqual(dist((F(14, 32), F(1, 32)), (F(2, 32), F(-4, 32))), |
| 979 | F(13, 32)) |
| 980 | self.assertEqual(dist((True, True, False, False, True, True), |
| 981 | (True, False, True, False, False, False)), |
| 982 | 2.0) |
| 983 | |
| 984 | # Test corner cases |
| 985 | self.assertEqual(dist((13.25, 12.5, -3.25), |
| 986 | (13.25, 12.5, -3.25)), |
| 987 | 0.0) # Distance with self is zero |
| 988 | self.assertEqual(dist((), ()), 0.0) # Zero-dimensional case |
| 989 | self.assertEqual(1.0, # Convert negative zero to positive zero |
| 990 | math.copysign(1.0, dist((-0.0,), (0.0,))) |
| 991 | ) |
| 992 | self.assertEqual(1.0, # Convert negative zero to positive zero |
| 993 | math.copysign(1.0, dist((0.0,), (-0.0,))) |
| 994 | ) |
| 995 | self.assertEqual( # Handling of moving max to the end |
| 996 | dist((1.5, 1.5, 0.5), (0, 0, 0)), |
| 997 | dist((1.5, 0.5, 1.5), (0, 0, 0)) |
| 998 | ) |
| 999 | |
| 1000 | # Verify tuple subclasses are allowed |
| 1001 | class T(tuple): |