diff options
-rw-r--r-- | coverage/numbits.py | 6 | ||||
-rw-r--r-- | tests/test_numbits.py | 10 |
2 files changed, 15 insertions, 1 deletions
diff --git a/coverage/numbits.py b/coverage/numbits.py index bc29ed94..19c328c4 100644 --- a/coverage/numbits.py +++ b/coverage/numbits.py @@ -40,3 +40,9 @@ def merge_numbits(numbits1, numbits2): """Merge two numbits""" byte_pairs = zip_longest(bytes_to_ints(numbits1), bytes_to_ints(numbits2), fillvalue=0) return binary_bytes(b1 | b2 for b1, b2 in byte_pairs) + +@contract(numbits1='bytes', numbits2='bytes', returns='bool') +def numbits_any_intersection(numbits1, numbits2): + """Is there any number that appears in both numbits?""" + byte_pairs = zip_longest(bytes_to_ints(numbits1), bytes_to_ints(numbits2), fillvalue=0) + return any(b1 & b2 for b1, b2 in byte_pairs) diff --git a/tests/test_numbits.py b/tests/test_numbits.py index 2b8e2e4b..ff574d40 100644 --- a/tests/test_numbits.py +++ b/tests/test_numbits.py @@ -6,7 +6,9 @@ from hypothesis import given from hypothesis.strategies import sets, integers -from coverage.numbits import nums_to_numbits, numbits_to_nums, merge_numbits +from coverage.numbits import ( + nums_to_numbits, numbits_to_nums, merge_numbits, numbits_any_intersection, + ) from tests.coveragetest import CoverageTest @@ -27,3 +29,9 @@ class NumbitsOpTest(CoverageTest): 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)) + + @given(line_numbers, line_numbers) + def test_any_intersection(self, nums1, nums2): + inter = numbits_any_intersection(nums_to_numbits(nums1), nums_to_numbits(nums2)) + expect = bool(nums1 & nums2) + self.assertEqual(expect, bool(inter)) |