summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/test_numbits.py115
1 files changed, 107 insertions, 8 deletions
diff --git a/tests/test_numbits.py b/tests/test_numbits.py
index a556869b..eb094d2a 100644
--- a/tests/test_numbits.py
+++ b/tests/test_numbits.py
@@ -3,20 +3,23 @@
"""Tests for coverage.numbits"""
+import sqlite3
+
from hypothesis import example, given, settings
from hypothesis.strategies import sets, integers
from coverage import env
+from coverage.backward import byte_to_int
from coverage.numbits import (
- nums_to_numbits, numbits_to_nums, merge_numbits, numbits_any_intersection,
- num_in_numbits,
+ nums_to_numbits, numbits_to_nums, numbits_union, numbits_intersection,
+ numbits_any_intersection, num_in_numbits, register_sqlite_functions,
)
from tests.coveragetest import CoverageTest
# Hypothesis-generated line number data
line_numbers = integers(min_value=1, max_value=9999)
-line_number_sets = sets(line_numbers, min_size=1)
+line_number_sets = sets(line_numbers)
# When coverage-testing ourselves, hypothesis complains about a test being
# flaky because the first run exceeds the deadline (and fails), and the second
@@ -26,6 +29,12 @@ if env.METACOV:
default_settings = settings(default_settings, deadline=None)
+def good_numbits(numbits):
+ """Assert that numbits is good."""
+ # It shouldn't end with a zero byte, that should have been trimmed off.
+ assert (not numbits) or (byte_to_int(numbits[-1]) != 0)
+
+
class NumbitsOpTest(CoverageTest):
"""Tests of the numbits operations in numbits.py."""
@@ -34,19 +43,43 @@ class NumbitsOpTest(CoverageTest):
@given(line_number_sets)
@settings(default_settings)
def test_conversion(self, nums):
- nums2 = numbits_to_nums(nums_to_numbits(nums))
+ numbits = nums_to_numbits(nums)
+ good_numbits(numbits)
+ nums2 = numbits_to_nums(numbits)
self.assertEqual(nums, set(nums2))
@given(line_number_sets, line_number_sets)
@settings(default_settings)
- def test_merging(self, nums1, nums2):
- merged = numbits_to_nums(merge_numbits(nums_to_numbits(nums1), nums_to_numbits(nums2)))
- self.assertEqual(nums1 | nums2, set(merged))
+ def test_union(self, nums1, nums2):
+ nb1 = nums_to_numbits(nums1)
+ good_numbits(nb1)
+ nb2 = nums_to_numbits(nums2)
+ good_numbits(nb2)
+ nbu = numbits_union(nb1, nb2)
+ good_numbits(nbu)
+ union = numbits_to_nums(nbu)
+ self.assertEqual(nums1 | nums2, set(union))
+
+ @given(line_number_sets, line_number_sets)
+ @settings(default_settings)
+ def test_intersection(self, nums1, nums2):
+ nb1 = nums_to_numbits(nums1)
+ good_numbits(nb1)
+ nb2 = nums_to_numbits(nums2)
+ good_numbits(nb2)
+ nbi = numbits_intersection(nb1, nb2)
+ good_numbits(nbi)
+ intersection = numbits_to_nums(nbi)
+ self.assertEqual(nums1 & nums2, set(intersection))
@given(line_number_sets, line_number_sets)
@settings(default_settings)
def test_any_intersection(self, nums1, nums2):
- inter = numbits_any_intersection(nums_to_numbits(nums1), nums_to_numbits(nums2))
+ nb1 = nums_to_numbits(nums1)
+ good_numbits(nb1)
+ nb2 = nums_to_numbits(nums2)
+ good_numbits(nb2)
+ inter = numbits_any_intersection(nb1, nb2)
expect = bool(nums1 & nums2)
self.assertEqual(expect, bool(inter))
@@ -55,5 +88,71 @@ class NumbitsOpTest(CoverageTest):
@example(152, {144})
def test_num_in_numbits(self, num, nums):
numbits = nums_to_numbits(nums)
+ good_numbits(numbits)
is_in = num_in_numbits(num, numbits)
self.assertEqual(num in nums, is_in)
+
+
+class NumbitsSqliteFunctionTest(CoverageTest):
+ """Tests of the SQLite integration for numbits functions."""
+
+ run_in_temp_dir = False
+
+ def setUp(self):
+ super(NumbitsSqliteFunctionTest, self).setUp()
+ conn = sqlite3.connect(":memory:")
+ register_sqlite_functions(conn)
+ self.cursor = conn.cursor()
+ self.cursor.execute("create table data (id int, numbits blob)")
+ self.cursor.executemany(
+ "insert into data (id, numbits) values (?, ?)",
+ [
+ (i, nums_to_numbits(range(i, 100, i)))
+ for i in range(1, 11)
+ ]
+ )
+ self.addCleanup(self.cursor.close)
+
+ def test_numbits_union(self):
+ res = self.cursor.execute(
+ "select numbits_union("
+ "(select numbits from data where id = 7),"
+ "(select numbits from data where id = 9)"
+ ")"
+ )
+ answer = numbits_to_nums(list(res)[0][0])
+ self.assertEqual(
+ [7, 9, 14, 18, 21, 27, 28, 35, 36, 42, 45, 49,
+ 54, 56, 63, 70, 72, 77, 81, 84, 90, 91, 98, 99],
+ answer
+ )
+
+ def test_numbits_intersection(self):
+ res = self.cursor.execute(
+ "select numbits_intersection("
+ "(select numbits from data where id = 7),"
+ "(select numbits from data where id = 9)"
+ ")"
+ )
+ answer = numbits_to_nums(list(res)[0][0])
+ self.assertEqual([63], answer)
+
+ def test_numbits_any_intersection(self):
+ res = self.cursor.execute(
+ "select numbits_any_intersection(?, ?)",
+ (nums_to_numbits([1, 2, 3]), nums_to_numbits([3, 4, 5]))
+ )
+ answer = [any_inter for (any_inter,) in res]
+ self.assertEqual([1], answer)
+
+ res = self.cursor.execute(
+ "select numbits_any_intersection(?, ?)",
+ (nums_to_numbits([1, 2, 3]), nums_to_numbits([7, 8, 9]))
+ )
+ answer = [any_inter for (any_inter,) in res]
+ self.assertEqual([0], answer)
+
+ def test_num_in_numbits(self):
+ res = self.cursor.execute("select id, num_in_numbits(12, numbits) from data order by id")
+ answer = [is_in for (id, is_in) in res]
+ self.assertEqual([1, 1, 1, 1, 0, 1, 0, 0, 0, 0], answer)