(self)
| 2213 | '\n '.join(failures)) |
| 2214 | |
| 2215 | def test_prod(self): |
| 2216 | from fractions import Fraction as F |
| 2217 | |
| 2218 | prod = math.prod |
| 2219 | self.assertEqual(prod([]), 1) |
| 2220 | self.assertEqual(prod([], start=5), 5) |
| 2221 | self.assertEqual(prod(list(range(2,8))), 5040) |
| 2222 | self.assertEqual(prod(iter(list(range(2,8)))), 5040) |
| 2223 | self.assertEqual(prod(range(1, 10), start=10), 3628800) |
| 2224 | |
| 2225 | self.assertEqual(prod([1, 2, 3, 4, 5]), 120) |
| 2226 | self.assertEqual(prod([1.0, 2.0, 3.0, 4.0, 5.0]), 120.0) |
| 2227 | self.assertEqual(prod([1, 2, 3, 4.0, 5.0]), 120.0) |
| 2228 | self.assertEqual(prod([1.0, 2.0, 3.0, 4, 5]), 120.0) |
| 2229 | self.assertEqual(prod([1., F(3, 2)]), 1.5) |
| 2230 | |
| 2231 | # Error in multiplication |
| 2232 | class BadMultiply: |
| 2233 | def __rmul__(self, other): |
| 2234 | raise RuntimeError |
| 2235 | with self.assertRaises(RuntimeError): |
| 2236 | prod([10., BadMultiply()]) |
| 2237 | |
| 2238 | # Test overflow in fast-path for integers |
| 2239 | self.assertEqual(prod([1, 1, 2**32, 1, 1]), 2**32) |
| 2240 | # Test overflow in fast-path for floats |
| 2241 | self.assertEqual(prod([1.0, 1.0, 2**32, 1, 1]), float(2**32)) |
| 2242 | |
| 2243 | self.assertRaises(TypeError, prod) |
| 2244 | self.assertRaises(TypeError, prod, 42) |
| 2245 | self.assertRaises(TypeError, prod, ['a', 'b', 'c']) |
| 2246 | self.assertRaises(TypeError, prod, ['a', 'b', 'c'], start='') |
| 2247 | self.assertRaises(TypeError, prod, [b'a', b'c'], start=b'') |
| 2248 | values = [bytearray(b'a'), bytearray(b'b')] |
| 2249 | self.assertRaises(TypeError, prod, values, start=bytearray(b'')) |
| 2250 | self.assertRaises(TypeError, prod, [[1], [2], [3]]) |
| 2251 | self.assertRaises(TypeError, prod, [{2:3}]) |
| 2252 | self.assertRaises(TypeError, prod, [{2:3}]*2, start={2:3}) |
| 2253 | self.assertRaises(TypeError, prod, [[1], [2], [3]], start=[]) |
| 2254 | |
| 2255 | # Some odd cases |
| 2256 | self.assertEqual(prod([2, 3], start='ab'), 'abababababab') |
| 2257 | self.assertEqual(prod([2, 3], start=[1, 2]), [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2]) |
| 2258 | self.assertEqual(prod([], start={2: 3}), {2:3}) |
| 2259 | |
| 2260 | with self.assertRaises(TypeError): |
| 2261 | prod([10, 20], 1) # start is a keyword-only argument |
| 2262 | |
| 2263 | self.assertEqual(prod([0, 1, 2, 3]), 0) |
| 2264 | self.assertEqual(prod([1, 0, 2, 3]), 0) |
| 2265 | self.assertEqual(prod([1, 2, 3, 0]), 0) |
| 2266 | |
| 2267 | def _naive_prod(iterable, start=1): |
| 2268 | for elem in iterable: |
| 2269 | start *= elem |
| 2270 | return start |
| 2271 | |
| 2272 | # Big integers |
nothing calls this directly
no test coverage detected