MCPcopy Index your code
hub / github.com/python/cpython / test_perm

Method test_perm

Lib/test/test_math_integer.py:252–315  ·  view source on GitHub ↗
(self)

Source from the content-addressed store, hash-verified

250 self.assertEqual(w.bit_count(), 1)
251
252 def test_perm(self):
253 perm = self.module.perm
254 factorial = self.module.factorial
255 # Test if factorial definition is satisfied
256 for n in range(500):
257 for k in (range(n + 1) if n < 100 else range(30) if n < 200 else range(10)):
258 self.assertEqual(perm(n, k),
259 factorial(n) // factorial(n - k))
260
261 # Test for Pascal's identity
262 for n in range(1, 100):
263 for k in range(1, n):
264 self.assertEqual(perm(n, k), perm(n - 1, k - 1) * k + perm(n - 1, k))
265
266 # Test corner cases
267 for n in range(1, 100):
268 self.assertEqual(perm(n, 0), 1)
269 self.assertEqual(perm(n, 1), n)
270 self.assertEqual(perm(n, n), factorial(n))
271
272 # Test one argument form
273 for n in range(20):
274 self.assertEqual(perm(n), factorial(n))
275 self.assertEqual(perm(n, None), factorial(n))
276
277 # Raises TypeError if any argument is non-integer or argument count is
278 # not 1 or 2
279 self.assertRaises(TypeError, perm, 10, 1.0)
280 self.assertRaises(TypeError, perm, 10, Decimal(1.0))
281 self.assertRaises(TypeError, perm, 10, Fraction(1, 1))
282 self.assertRaises(TypeError, perm, 10, "1")
283 self.assertRaises(TypeError, perm, 10.0, 1)
284 self.assertRaises(TypeError, perm, Decimal(10.0), 1)
285 self.assertRaises(TypeError, perm, Fraction(10, 1), 1)
286 self.assertRaises(TypeError, perm, "10", 1)
287
288 self.assertRaises(TypeError, perm)
289 self.assertRaises(TypeError, perm, 10, 1, 3)
290 self.assertRaises(TypeError, perm)
291
292 # Raises Value error if not k or n are negative numbers
293 self.assertRaises(ValueError, perm, -1, 1)
294 self.assertRaises(ValueError, perm, -2**1000, 1)
295 self.assertRaises(ValueError, perm, 1, -1)
296 self.assertRaises(ValueError, perm, 1, -2**1000)
297
298 # Returns zero if k is greater than n
299 self.assertEqual(perm(1, 2), 0)
300 self.assertEqual(perm(1, 2**1000), 0)
301
302 n = 2**1000
303 self.assertEqual(perm(n, 0), 1)
304 self.assertEqual(perm(n, 1), n)
305 self.assertEqual(perm(n, 2), n * (n-1))
306 if support.check_impl_detail(cpython=True):
307 self.assertRaises(OverflowError, perm, n, n)
308
309 for n, k in (True, True), (True, False), (False, False):

Callers

nothing calls this directly

Calls 9

assertIntEqualMethod · 0.95
DecimalClass · 0.90
FractionClass · 0.90
factorialFunction · 0.70
IntSubclassClass · 0.70
MyIndexableClass · 0.70
assertEqualMethod · 0.45
assertRaisesMethod · 0.45
assertIsMethod · 0.45

Tested by

no test coverage detected