]> granicus.if.org Git - python/commitdiff
bpo-36018: Test idempotence. Test two methods against one-another. (GH-13021)
authorRaymond Hettinger <rhettinger@users.noreply.github.com>
Tue, 30 Apr 2019 06:47:33 +0000 (23:47 -0700)
committerGitHub <noreply@github.com>
Tue, 30 Apr 2019 06:47:33 +0000 (23:47 -0700)
Lib/test/test_statistics.py

index 0a967055f0fe6c55a514e3e58e142f67b371542d..903ee8f343cb1c8d9a727b97c3f1831b9969ccbe 100644 (file)
@@ -2158,6 +2158,20 @@ class TestQuantiles(unittest.TestCase):
                 result = quantiles(map(datatype, data), n=n)
                 self.assertTrue(all(type(x) == datatype) for x in result)
                 self.assertEqual(result, list(map(datatype, expected)))
+            # Quantiles should be idempotent
+            if len(expected) >= 2:
+                self.assertEqual(quantiles(expected, n=n), expected)
+            # Cross-check against other methods
+            if len(data) >= n:
+                # After end caps are added, method='inclusive' should
+                # give the same result as method='exclusive' whenever
+                # there are more data points than desired cut points.
+                padded_data = [min(data) - 1000] + data + [max(data) + 1000]
+                self.assertEqual(
+                    quantiles(data, n=n),
+                    quantiles(padded_data, n=n, method='inclusive'),
+                    (n, data),
+                )
             # Invariant under tranlation and scaling
             def f(x):
                 return 3.5 * x - 1234.675
@@ -2219,6 +2233,15 @@ class TestQuantiles(unittest.TestCase):
             actual = quantiles(statistics.NormalDist(), n=n, method="inclusive")
             self.assertTrue(all(math.isclose(e, a, abs_tol=0.0001)
                             for e, a in zip(expected, actual)))
+        # Whenever n is smaller than the number of data points, running
+        # method='inclusive' should give the same result as method='exclusive'
+        # after the two included extreme points are removed.
+        data = [random.randrange(10_000) for i in range(501)]
+        actual = quantiles(data, n=32, method='inclusive')
+        data.remove(min(data))
+        data.remove(max(data))
+        expected = quantiles(data, n=32)
+        self.assertEqual(expected, actual)
 
     def test_equal_inputs(self):
         quantiles = statistics.quantiles