def test_clears_out_database_as_things_get_boring(): key = b"a database key" database = InMemoryExampleDatabase() do_we_care = True def stuff(): try: find( st.binary(min_size=50), lambda x: do_we_care and has_a_non_zero_byte(x), settings=settings(database=database, max_examples=10), database_key=key, ) except NoSuchExample: pass stuff() assert len(non_covering_examples(database)) > 1 do_we_care = False stuff() initial = len(non_covering_examples(database)) assert initial > 0 for _ in range(initial): stuff() keys = len(non_covering_examples(database)) if not keys: break else: assert False
def test_clears_out_everything_smaller_than_the_interesting_example(): target = None # We retry the test run a few times to get a large enough initial # set of examples that we're not going to explore them all in the # initial run. last_sum = [None] database = InMemoryExampleDatabase() seen = set() @settings( database=database, verbosity=Verbosity.quiet, max_examples=100, timeout=unlimited, suppress_health_check=[HealthCheck.hung_test], ) @given(st.binary(min_size=10, max_size=10)) def test(b): if target is not None: if len(seen) < 30: seen.add(b) if b in seen: return if b >= target: raise ValueError() return b = hbytes(b) s = sum(b) if ( (last_sum[0] is None and s > 1000) or (last_sum[0] is not None and s >= last_sum[0] - 1) ): last_sum[0] = s raise ValueError() with pytest.raises(ValueError): test() saved = non_covering_examples(database) assert len(saved) > 30 target = sorted(saved)[len(saved) // 2] with pytest.raises(ValueError): test() saved = non_covering_examples(database) assert target in saved or target in seen for s in saved: assert s >= target
def test_saves_data_while_shrinking(monkeypatch): key = b"hi there" n = 5 db = InMemoryExampleDatabase() assert list(db.fetch(key)) == [] seen = set() monkeypatch.setattr( ConjectureRunner, "generate_new_examples", lambda runner: runner.cached_test_function([255] * 10), ) def f(data): x = data.draw_bytes(10) if sum(x) >= 2000 and len(seen) < n: seen.add(x) if x in seen: data.mark_interesting() runner = ConjectureRunner(f, settings=settings(database=db), database_key=key) runner.run() assert runner.interesting_examples assert len(seen) == n in_db = non_covering_examples(db) assert in_db.issubset(seen) assert in_db == seen
def test_saves_data_while_shrinking(monkeypatch): key = b'hi there' n = 5 db = InMemoryExampleDatabase() assert list(db.fetch(key)) == [] seen = set() monkeypatch.setattr( ConjectureRunner, 'generate_new_examples', lambda runner: runner.test_function( ConjectureData.for_buffer([255] * 10))) def f(data): x = data.draw_bytes(10) if sum(x) >= 2000 and len(seen) < n: seen.add(hbytes(x)) if hbytes(x) in seen: data.mark_interesting() runner = ConjectureRunner( f, settings=settings(database=db), database_key=key) runner.run() assert runner.interesting_examples assert len(seen) == n in_db = non_covering_examples(db) assert in_db.issubset(seen) assert in_db == seen
def test_clears_out_everything_smaller_than_the_interesting_example(): in_clearing = False target = [None] for _ in range(5): # We retry the test run a few times to get a large enough initial # set of examples that we're not going to explore them all in the # initial run. cache = {} seen = set() database = InMemoryExampleDatabase() @settings(database=database, verbosity=Verbosity.quiet, max_examples=100) @given(st.binary(min_size=10, max_size=10)) def test(i): if not in_clearing: if len([b for b in i if b > 1]) >= 8: assert cache.setdefault(i, len(cache) % 10 != 9) elif len(seen) <= 20: seen.add(i) else: if target[0] is None: remainder = sorted([s for s in saved if s not in seen]) target[0] = remainder[len(remainder) // 2] assert i in seen or i < target[0] with pytest.raises(AssertionError): test() saved = non_covering_examples(database) if len(saved) > 30: break else: assert False, 'Never generated enough examples while shrinking' in_clearing = True with pytest.raises(AssertionError): test() saved = non_covering_examples(database) for s in saved: assert s >= target[0]
def test_clears_out_everything_smaller_than_the_interesting_example(): in_clearing = False target = [None] for _ in range(5): # We retry the test run a few times to get a large enough initial # set of examples that we're not going to explore them all in the # initial run. cache = {} seen = set() database = InMemoryExampleDatabase() @settings( database=database, verbosity=Verbosity.quiet, max_examples=100) @given(st.binary(min_size=10, max_size=10)) def test(i): if not in_clearing: if len([b for b in i if b > 1]) >= 8: assert cache.setdefault(i, len(cache) % 10 != 9) elif len(seen) <= 20: seen.add(i) else: if target[0] is None: remainder = sorted([s for s in saved if s not in seen]) target[0] = remainder[len(remainder) // 2] assert i in seen or i < target[0] with pytest.raises(AssertionError): test() saved = non_covering_examples(database) if len(saved) > 30: break else: assert False, 'Never generated enough examples while shrinking' in_clearing = True with pytest.raises(AssertionError): test() saved = non_covering_examples(database) for s in saved: assert s >= target[0]
def test_garbage_collects_the_database(): key = b'hi there' n = 200 db = InMemoryExampleDatabase() local_settings = settings(database=db, max_shrinks=n, timeout=unlimited) runner = ConjectureRunner(slow_shrinker(), settings=local_settings, database_key=key) runner.run() assert runner.interesting_examples assert len(non_covering_examples(db)) == n + 1 runner = ConjectureRunner(lambda data: data.draw_bytes(4), settings=local_settings, database_key=key) runner.run() assert 0 < len(non_covering_examples(db)) < n
def test_saves_data_while_shrinking(): key = b'hi there' n = 5 db = InMemoryExampleDatabase() assert list(db.fetch(key)) == [] seen = set() def f(data): x = data.draw_bytes(512) if sum(x) >= 5000 and len(seen) < n: seen.add(hbytes(x)) if hbytes(x) in seen: data.mark_interesting() runner = ConjectureRunner(f, settings=settings(database=db), database_key=key) runner.run() assert runner.interesting_examples assert len(seen) == n in_db = non_covering_examples(db) assert in_db.issubset(seen) assert in_db == seen
def count(): return len(non_covering_examples(db))