def test_lower_boundary(self):
        n = 2
        p1 = 0.333  # 33.3%
        p2 = 0.334  # 33.4%

        self.assertEqual(rank(p1, n), 1)
        # can't use assertEqual here b/c floating point numbers
        self.assertAlmostEqual(rank(p2, n), p2 * (n + 1))
    def test_upper_boundary(self):
        n = 4
        p1 = 0.80  # 80%
        p2 = 0.799  # 79.9%

        # should trigger the 3rd case
        self.assertEqual(rank(p1, n), n)
        # should trigger the second case
        self.assertAlmostEqual(rank(p2, n), p2 * (n + 1))
 def test_median(self):
     for n in range(1, 14):
         with self.subTest(size=n):
             x = rank(0.5, n)
             midpoint = (n + 1) / 2
             self.assertEqual(x, midpoint)
    def test_excluded_percentile(self):
        with self.assertRaises(PercentileBoundsError):
            rank(0, 100)

        with self.assertRaises(PercentileBoundsError):
            rank(1, 100)
 def test_one_sample_size(self):
     for p in range(1, 100):
         with self.subTest(p=p):
             x = rank(p / 100, 1)
             self.assertEqual(x, 1)
 def test_zero_sample_size(self):
     for p in range(1, 10):
         x = rank(p / 10, 0)
         self.assertEqual(x, 1)