(self)
| 1314 | self.assertAlmostEqual(math.log10(v), size * 0.3010299956639812) |
| 1315 | |
| 1316 | def testSumProd(self): |
| 1317 | sumprod = math.sumprod |
| 1318 | Decimal = decimal.Decimal |
| 1319 | Fraction = fractions.Fraction |
| 1320 | |
| 1321 | # Core functionality |
| 1322 | self.assertEqual(sumprod(iter([10, 20, 30]), (1, 2, 3)), 140) |
| 1323 | self.assertEqual(sumprod([1.5, 2.5], [3.5, 4.5]), 16.5) |
| 1324 | self.assertEqual(sumprod([], []), 0) |
| 1325 | self.assertEqual(sumprod([-1], [1.]), -1) |
| 1326 | self.assertEqual(sumprod([1.], [-1]), -1) |
| 1327 | |
| 1328 | # Type preservation and coercion |
| 1329 | for v in [ |
| 1330 | (10, 20, 30), |
| 1331 | (1.5, -2.5), |
| 1332 | (Fraction(3, 5), Fraction(4, 5)), |
| 1333 | (Decimal(3.5), Decimal(4.5)), |
| 1334 | (2.5, 10), # float/int |
| 1335 | (2.5, Fraction(3, 5)), # float/fraction |
| 1336 | (25, Fraction(3, 5)), # int/fraction |
| 1337 | (25, Decimal(4.5)), # int/decimal |
| 1338 | ]: |
| 1339 | for p, q in [(v, v), (v, v[::-1])]: |
| 1340 | with self.subTest(p=p, q=q): |
| 1341 | expected = sum(p_i * q_i for p_i, q_i in zip(p, q, strict=True)) |
| 1342 | actual = sumprod(p, q) |
| 1343 | self.assertEqual(expected, actual) |
| 1344 | self.assertEqual(type(expected), type(actual)) |
| 1345 | |
| 1346 | # Bad arguments |
| 1347 | self.assertRaises(TypeError, sumprod) # No args |
| 1348 | self.assertRaises(TypeError, sumprod, []) # One arg |
| 1349 | self.assertRaises(TypeError, sumprod, [], [], []) # Three args |
| 1350 | self.assertRaises(TypeError, sumprod, None, [10]) # Non-iterable |
| 1351 | self.assertRaises(TypeError, sumprod, [10], None) # Non-iterable |
| 1352 | self.assertRaises(TypeError, sumprod, ['x'], [1.0]) |
| 1353 | |
| 1354 | # Uneven lengths |
| 1355 | self.assertRaises(ValueError, sumprod, [10, 20], [30]) |
| 1356 | self.assertRaises(ValueError, sumprod, [10], [20, 30]) |
| 1357 | |
| 1358 | # Overflows |
| 1359 | self.assertEqual(sumprod([10**20], [1]), 10**20) |
| 1360 | self.assertEqual(sumprod([1], [10**20]), 10**20) |
| 1361 | self.assertEqual(sumprod([10**10], [10**10]), 10**20) |
| 1362 | self.assertEqual(sumprod([10**7]*10**5, [10**7]*10**5), 10**19) |
| 1363 | self.assertRaises(OverflowError, sumprod, [10**1000], [1.0]) |
| 1364 | self.assertRaises(OverflowError, sumprod, [1.0], [10**1000]) |
| 1365 | |
| 1366 | # Error in iterator |
| 1367 | def raise_after(n): |
| 1368 | for i in range(n): |
| 1369 | yield i |
| 1370 | raise RuntimeError |
| 1371 | with self.assertRaises(RuntimeError): |
| 1372 | sumprod(range(10), raise_after(5)) |
| 1373 | with self.assertRaises(RuntimeError): |
nothing calls this directly
no test coverage detected