(self)
| 315 | self.assertIs(type(perm(MyIndexable(5), MyIndexable(k))), int) |
| 316 | |
| 317 | def test_comb(self): |
| 318 | comb = self.module.comb |
| 319 | factorial = self.module.factorial |
| 320 | # Test if factorial definition is satisfied |
| 321 | for n in range(500): |
| 322 | for k in (range(n + 1) if n < 100 else range(30) if n < 200 else range(10)): |
| 323 | self.assertEqual(comb(n, k), factorial(n) |
| 324 | // (factorial(k) * factorial(n - k))) |
| 325 | |
| 326 | # Test for Pascal's identity |
| 327 | for n in range(1, 100): |
| 328 | for k in range(1, n): |
| 329 | self.assertEqual(comb(n, k), comb(n - 1, k - 1) + comb(n - 1, k)) |
| 330 | |
| 331 | # Test corner cases |
| 332 | for n in range(100): |
| 333 | self.assertEqual(comb(n, 0), 1) |
| 334 | self.assertEqual(comb(n, n), 1) |
| 335 | |
| 336 | for n in range(1, 100): |
| 337 | self.assertEqual(comb(n, 1), n) |
| 338 | self.assertEqual(comb(n, n - 1), n) |
| 339 | |
| 340 | # Test Symmetry |
| 341 | for n in range(100): |
| 342 | for k in range(n // 2): |
| 343 | self.assertEqual(comb(n, k), comb(n, n - k)) |
| 344 | |
| 345 | # Raises TypeError if any argument is non-integer or argument count is |
| 346 | # not 2 |
| 347 | self.assertRaises(TypeError, comb, 10, 1.0) |
| 348 | self.assertRaises(TypeError, comb, 10, Decimal(1.0)) |
| 349 | self.assertRaises(TypeError, comb, 10, "1") |
| 350 | self.assertRaises(TypeError, comb, 10.0, 1) |
| 351 | self.assertRaises(TypeError, comb, Decimal(10.0), 1) |
| 352 | self.assertRaises(TypeError, comb, "10", 1) |
| 353 | |
| 354 | self.assertRaises(TypeError, comb, 10) |
| 355 | self.assertRaises(TypeError, comb, 10, 1, 3) |
| 356 | self.assertRaises(TypeError, comb) |
| 357 | |
| 358 | # Raises Value error if not k or n are negative numbers |
| 359 | self.assertRaises(ValueError, comb, -1, 1) |
| 360 | self.assertRaises(ValueError, comb, -2**1000, 1) |
| 361 | self.assertRaises(ValueError, comb, 1, -1) |
| 362 | self.assertRaises(ValueError, comb, 1, -2**1000) |
| 363 | |
| 364 | # Returns zero if k is greater than n |
| 365 | self.assertEqual(comb(1, 2), 0) |
| 366 | self.assertEqual(comb(1, 2**1000), 0) |
| 367 | |
| 368 | n = 2**1000 |
| 369 | self.assertEqual(comb(n, 0), 1) |
| 370 | self.assertEqual(comb(n, 1), n) |
| 371 | self.assertEqual(comb(n, 2), n * (n-1) // 2) |
| 372 | self.assertEqual(comb(n, n), 1) |
| 373 | self.assertEqual(comb(n, n-1), n) |
| 374 | self.assertEqual(comb(n, n-2), n * (n-1) // 2) |
nothing calls this directly
no test coverage detected