(self)
| 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): |
nothing calls this directly
no test coverage detected