def test_validates_bounds(): with pytest.raises(ValueError): IntSet.single(-1) with pytest.raises(ValueError): IntSet.single(2 ** 64) with pytest.raises(ValueError): IntSet.interval(1, 2 ** 65) with pytest.raises(ValueError): IntSet.interval(2 ** 65, 1)
def test_insert_into_interval(bounds, ints): imp = IntSet.interval(*bounds) for i in ints: imp = imp.insert(i) assert i in imp for i in ints: assert i in imp
def test_builder_insert_intervals_equivalent_to_successive_union(intervals): builder = IntSet.Builder() equiv = IntSet.empty() for ij in intervals: equiv |= IntSet.interval(*ij) builder.insert_interval(*ij) assert builder.build() == equiv
def test_sequentially_removing_intervals_yields_empty(ls): running = IntSet.from_intervals(ls) for i in ls: inter = IntSet.interval(*i) extra = inter & running original = running.size() assert (running - inter) == (running - extra) running -= inter assert running.size() == original - extra.size() assert running.size() == 0
def test_can_produce_whole_range_intset(): assert IntSet.interval(0, 2 ** 64).size() == 2 ** 64
def three_adjacent_values(self, v): assume(v + 2 <= 2 ** 64) return (IntSet.interval(v, v + 3), [v, v + 1, v + 2])
def adjacent_values(self, v): assume(v + 1 <= 2 ** 64) return (IntSet.interval(v, v + 2), [v, v + 1])
def build_interval(self, bounds): return (IntSet.interval(*bounds), list(range(*bounds)))
def test_unioning_a_value_in_includes_it(intervals, i): mp = IntSet.from_intervals(intervals) assume(i not in mp) mp2 = mp | IntSet.interval(i, i + 1) assert i in mp2
intervals = st.tuples(integers_in_range, integers_in_range).map( lambda x: sorted(tuple(x))) SMALL = 100 short_intervals = st.builds( lambda start, length: assume( start + length <= 2 ** 64) and (start, start + length), integers_in_range, st.integers(0, SMALL)) interval_list = st.lists(intervals, average_size=10) IntSets = st.builds( IntSet.from_intervals, interval_list) | integers_in_range.map( IntSet.single) | intervals.map(lambda x: IntSet.interval(*x)) @example(IntSet.empty()) @example(IntSet.single(1)) @example(IntSet([1, 2, 3, 6])) @given(IntSets) def test_pickling_works_correctly(x): assert pickle.loads(pickle.dumps(x)) == x @example(IntSet.interval(0, 10)) @example(IntSet([(0, 10), (15, 20)])) @given(IntSets) def test_copies_as_self(x): assert copy(x) is x
def insert_interval(self, ij): self.builder.insert_interval(*ij) self.equivalent = self.equivalent | IntSet.interval(*ij)
def test_union_leads_to_extension(x, y): z = x | y for u in list(x.intervals()) + list(y.intervals()): assert IntSet.interval(*u).issubset(z)
def test_interval_ending_at_zero_is_zero(): assert IntSet.interval(0, 0) == IntSet.empty()
def test_union_of_two_intervals_contains_each_start(i1, i2): assume(i1[0] < i1[1]) assume(i2[0] < i2[1]) x = IntSet.interval(*i1) | IntSet.interval(*i2) assert i1[0] in x assert i2[0] in x