Skip to content

Commit 91a9c61

Browse files
committed
migrate most cached_test_function usages
1 parent 5c4d3a8 commit 91a9c61

File tree

9 files changed

+93
-243
lines changed

9 files changed

+93
-243
lines changed

hypothesis-python/RELEASE.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
RELEASE_TYPE: patch
22

3-
his patch refactors some internals to prepare for future work using our IR (:issue:`3921`).
3+
This patch refactors some internals to prepare for future work using our IR (:issue:`3921`).

hypothesis-python/src/hypothesis/internal/conjecture/engine.py

+12-5
Original file line numberDiff line numberDiff line change
@@ -434,10 +434,17 @@ def kill_branch(self) -> NoReturn:
434434
else:
435435
trial_data.freeze()
436436
key = self._cache_key_ir(data=trial_data)
437-
try:
438-
return self.__data_cache_ir[key]
439-
except KeyError:
440-
pass
437+
if trial_data.status > Status.OVERRUN:
438+
try:
439+
return self.__data_cache_ir[key]
440+
except KeyError:
441+
pass
442+
else:
443+
# if we simulated to an overrun, then we our result is certainly
444+
# an overrun; no need to consult the cache. (and we store this result
445+
# for simulation-less lookup later).
446+
self.__data_cache[key] = Overrun
447+
return Overrun
441448

442449
data = self.new_conjecture_data_ir(nodes, max_length=max_length)
443450
# note that calling test_function caches `data` for us, for both an ir
@@ -1446,7 +1453,7 @@ def cached_test_function(
14461453
buffer: Union[bytes, bytearray],
14471454
*,
14481455
extend: int = 0,
1449-
) -> Union[ConjectureResult, _Overrun]:
1456+
) -> Union[ConjectureResult, _Overrun]: # pragma: no cover # removing function soon
14501457
"""Checks the tree to see if we've tested this buffer, and returns the
14511458
previous result if we have.
14521459

hypothesis-python/tests/conjecture/test_engine.py

+56-65
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def test_terminates_shrinks(n, monkeypatch):
117117
db = InMemoryExampleDatabase()
118118

119119
def generate_new_examples(self):
120-
self.cached_test_function([255] * 1000)
120+
self.cached_test_function_ir(ir(255) * 1000)
121121

122122
monkeypatch.setattr(
123123
ConjectureRunner, "generate_new_examples", generate_new_examples
@@ -514,11 +514,11 @@ def __repr__(self):
514514

515515

516516
def test_debug_data(capsys):
517-
buf = [0, 1, 2]
517+
nodes = ir(0, 1, 2)
518518

519519
def f(data):
520-
for x in bytes(buf):
521-
if data.draw(st.integers(0, 100)) != x:
520+
for node in nodes:
521+
if data.draw(st.integers(0, 100)) != node.value:
522522
data.mark_invalid()
523523
data.start_example(1)
524524
data.stop_example()
@@ -533,7 +533,7 @@ def f(data):
533533
verbosity=Verbosity.debug,
534534
),
535535
)
536-
runner.cached_test_function(buf)
536+
runner.cached_test_function_ir(nodes)
537537
runner.run()
538538

539539
out, _ = capsys.readouterr()
@@ -569,12 +569,12 @@ def f(data):
569569

570570

571571
@pytest.mark.parametrize("skip_target", [False, True])
572-
@pytest.mark.parametrize("initial_attempt", [127, 128])
572+
@pytest.mark.parametrize("initial_attempt", [ir(127, 128)])
573573
def test_clears_out_its_database_on_shrinking(
574574
initial_attempt, skip_target, monkeypatch
575575
):
576576
def generate_new_examples(self):
577-
self.cached_test_function(initial_attempt)
577+
self.cached_test_function_ir(initial_attempt)
578578

579579
monkeypatch.setattr(
580580
ConjectureRunner, "generate_new_examples", generate_new_examples
@@ -615,16 +615,16 @@ def f(data):
615615

616616
runner = ConjectureRunner(f, settings=settings(database=None))
617617
r = runner.cached_test_function(bytes(8))
618-
assert r.status == Status.INTERESTING
618+
assert r.status is Status.INTERESTING
619619
assert call_count == 1
620620
r2 = runner.cached_test_function(bytes([255] * 7))
621-
assert r2.status == Status.OVERRUN
621+
assert r2.status is Status.OVERRUN
622622
assert call_count == 1
623623

624624

625625
def test_shrinks_both_interesting_examples(monkeypatch):
626626
def generate_new_examples(self):
627-
self.cached_test_function(bytes([1]))
627+
self.cached_test_function_ir(ir(1))
628628

629629
monkeypatch.setattr(
630630
ConjectureRunner, "generate_new_examples", generate_new_examples
@@ -636,8 +636,8 @@ def f(data):
636636

637637
runner = ConjectureRunner(f, database_key=b"key")
638638
runner.run()
639-
assert runner.interesting_examples[0].buffer == bytes([0])
640-
assert runner.interesting_examples[1].buffer == bytes([1])
639+
assert runner.interesting_examples[0].choices == (0,)
640+
assert runner.interesting_examples[1].choices == (1,)
641641

642642

643643
def test_discarding(monkeypatch):
@@ -776,7 +776,7 @@ def f(data):
776776
for i in range(10):
777777
database.save(runner.secondary_key, bytes([i]))
778778

779-
runner.cached_test_function([10])
779+
runner.cached_test_function_ir(ir(10))
780780
assert runner.interesting_examples
781781

782782
assert len(set(database.fetch(key))) == 1
@@ -805,13 +805,11 @@ def f(data):
805805
),
806806
database_key=key,
807807
)
808-
809808
for i in range(10):
810809
database.save(runner.secondary_key, bytes([i]))
811810

812-
runner.cached_test_function([10])
811+
runner.cached_test_function_ir(ir(10))
813812
assert runner.interesting_examples
814-
815813
assert len(set(database.fetch(key))) == 1
816814
assert len(set(database.fetch(runner.secondary_key))) == 10
817815

@@ -823,7 +821,6 @@ def f(data):
823821
)
824822

825823
(v,) = runner.interesting_examples.values()
826-
827824
assert list(v.buffer) == [5]
828825

829826

@@ -948,10 +945,10 @@ def tf(data):
948945
with deterministic_PRNG():
949946
runner = ConjectureRunner(tf, settings=TEST_SETTINGS)
950947
for _ in range(2):
951-
for b in (b"\0", b"\1"):
952-
d = runner.cached_test_function(b)
948+
for nodes in (ir(0), ir(1)):
949+
d = runner.cached_test_function_ir(nodes)
953950
assert d.status == Status.INTERESTING
954-
assert d.buffer == b
951+
assert d.choices == (nodes[0].value,)
955952
assert count == 2
956953

957954

@@ -968,11 +965,11 @@ def test_function(data):
968965
with deterministic_PRNG():
969966
runner = ConjectureRunner(test_function, settings=TEST_SETTINGS)
970967

971-
data = runner.cached_test_function(bytes(3))
968+
data = runner.cached_test_function_ir(ir(0, b"\0", 0))
972969
assert data.status == Status.VALID
973970
for n in [2, 1, 0]:
974-
prefix_data = runner.cached_test_function(bytes(n))
975-
assert prefix_data is Overrun
971+
d = runner.cached_test_function_ir(data.ir_nodes[:n])
972+
assert d is Overrun
976973
assert call_count == 1
977974

978975

@@ -982,14 +979,14 @@ def test_will_evict_entries_from_the_cache(monkeypatch):
982979

983980
def tf(data):
984981
nonlocal count
985-
data.draw_bytes(1, 1)
982+
data.draw_integer(0, 2**8 - 1)
986983
count += 1
987984

988985
runner = ConjectureRunner(tf, settings=TEST_SETTINGS)
989986

990987
for _ in range(3):
991988
for n in range(10):
992-
runner.cached_test_function([n])
989+
runner.cached_test_function_ir(ir(n))
993990

994991
# Because we exceeded the cache size, our previous
995992
# calls will have been evicted, so each call to
@@ -1100,7 +1097,7 @@ def test(data):
11001097
runner = ConjectureRunner(
11011098
test, settings=settings(TEST_SETTINGS, report_multiple_bugs=False)
11021099
)
1103-
runner.cached_test_function([255, 255])
1100+
runner.cached_test_function_ir(ir(255, 255))
11041101
runner.shrink_interesting_examples()
11051102

11061103
results = {d.buffer for d in runner.interesting_examples.values()}
@@ -1294,15 +1291,15 @@ def test(data):
12941291
database_key=b"stuff",
12951292
)
12961293

1297-
d1 = runner.cached_test_function([0, 1]).as_result()
1298-
d2 = runner.cached_test_function([1, 0]).as_result()
1294+
d1 = runner.cached_test_function_ir(ir(0, 1)).as_result()
1295+
d2 = runner.cached_test_function_ir(ir(1, 0)).as_result()
12991296

13001297
assert len(runner.pareto_front) == 2
13011298

13021299
assert runner.pareto_front[0] == d1
13031300
assert runner.pareto_front[1] == d2
13041301

1305-
d3 = runner.cached_test_function([0, 0]).as_result()
1302+
d3 = runner.cached_test_function_ir(ir(0, 0)).as_result()
13061303
assert len(runner.pareto_front) == 1
13071304

13081305
assert runner.pareto_front[0] == d3
@@ -1317,18 +1314,13 @@ def test(data):
13171314
settings=settings(TEST_SETTINGS, database=InMemoryExampleDatabase()),
13181315
database_key=b"stuff",
13191316
)
1320-
1321-
d1 = runner.cached_test_function([1]).as_result()
1317+
d1 = runner.cached_test_function_ir(ir(1)).as_result()
13221318

13231319
assert len(runner.pareto_front) == 1
1324-
13251320
# This can happen in practice if we e.g. reexecute a test because it has
13261321
# expired from the cache. It's easier just to test it directly though
13271322
# rather than simulate the failure mode.
1328-
is_pareto = runner.pareto_front.add(d1)
1329-
1330-
assert is_pareto
1331-
1323+
assert runner.pareto_front.add(d1)
13321324
assert len(runner.pareto_front) == 1
13331325

13341326

@@ -1343,8 +1335,8 @@ def test(data):
13431335
database_key=b"stuff",
13441336
)
13451337

1346-
d1 = runner.cached_test_function([0]).as_result()
1347-
d2 = runner.cached_test_function([1]).as_result()
1338+
d1 = runner.cached_test_function_ir(ir(0)).as_result()
1339+
d2 = runner.cached_test_function_ir(ir(1)).as_result()
13481340

13491341
assert dominance(d1, d2) == DominanceRelation.NO_DOMINANCE
13501342

@@ -1360,8 +1352,8 @@ def test(data):
13601352
database_key=b"stuff",
13611353
)
13621354

1363-
d1 = runner.cached_test_function([0]).as_result()
1364-
d2 = runner.cached_test_function([1]).as_result()
1355+
d1 = runner.cached_test_function_ir(ir(0)).as_result()
1356+
d2 = runner.cached_test_function_ir(ir(1)).as_result()
13651357
assert dominance(d1, d2) == DominanceRelation.LEFT_DOMINATES
13661358

13671359

@@ -1387,9 +1379,7 @@ def test(data):
13871379
runner = ConjectureRunner(
13881380
test, settings=settings(TEST_SETTINGS, phases=[Phase.target])
13891381
)
1390-
1391-
runner.cached_test_function(bytes(2))
1392-
1382+
runner.cached_test_function_ir(ir(0))
13931383
runner.run()
13941384

13951385
assert runner.best_observed_targets["n"] == (2**16) - 1
@@ -1431,16 +1421,17 @@ def test(data):
14311421

14321422
def test_does_not_cache_extended_prefix():
14331423
def test(data):
1434-
data.draw_bytes(8, 8)
1424+
data.draw_integer()
1425+
data.draw_integer()
14351426

14361427
with deterministic_PRNG():
14371428
runner = ConjectureRunner(test, settings=TEST_SETTINGS)
14381429

1439-
d1 = runner.cached_test_function(b"", extend=8)
1440-
d2 = runner.cached_test_function(b"", extend=8)
1441-
assert d1.status == d2.status == Status.VALID
1442-
1443-
assert d1.buffer != d2.buffer
1430+
d1 = runner.cached_test_function_ir(ir(0), extend=10)
1431+
assert runner.call_count == 1
1432+
d2 = runner.cached_test_function_ir(ir(0), extend=10)
1433+
assert runner.call_count == 2
1434+
assert d1.status is d2.status is Status.VALID
14441435

14451436

14461437
def test_does_cache_if_extend_is_not_used():
@@ -1454,8 +1445,8 @@ def test(data):
14541445
with deterministic_PRNG():
14551446
runner = ConjectureRunner(test, settings=TEST_SETTINGS)
14561447

1457-
d1 = runner.cached_test_function(b"\0", extend=8)
1458-
d2 = runner.cached_test_function(b"\0", extend=8)
1448+
d1 = runner.cached_test_function_ir(ir(b"\0"), extend=8)
1449+
d2 = runner.cached_test_function_ir(ir(b"\0"), extend=8)
14591450
assert d1.status == d2.status == Status.VALID
14601451
assert d1.buffer == d2.buffer
14611452
assert calls == 1
@@ -1472,10 +1463,10 @@ def test(data):
14721463
with deterministic_PRNG():
14731464
runner = ConjectureRunner(test, settings=TEST_SETTINGS)
14741465

1475-
d1 = runner.cached_test_function(b"\0", extend=8)
1476-
d2 = runner.cached_test_function(d1.buffer)
1466+
d1 = runner.cached_test_function_ir(ir(b"\0"), extend=8)
1467+
d2 = runner.cached_test_function_ir(d1.ir_nodes)
14771468
assert d1.status == d2.status == Status.VALID
1478-
assert d1.buffer == d2.buffer
1469+
assert d1.ir_nodes == d2.ir_nodes
14791470
assert calls == 1
14801471

14811472

@@ -1486,8 +1477,8 @@ def test(data):
14861477
with deterministic_PRNG():
14871478
runner = ConjectureRunner(test, settings=TEST_SETTINGS)
14881479

1489-
d1 = runner.cached_test_function(b"", extend=4)
1490-
d2 = runner.cached_test_function(b"", extend=8)
1480+
d1 = runner.cached_test_function_ir(ir(b""), extend=4)
1481+
d2 = runner.cached_test_function_ir(ir(b""), extend=8)
14911482
assert d1.status == Status.OVERRUN
14921483
assert d2.status == Status.VALID
14931484

@@ -1500,10 +1491,11 @@ def test(data):
15001491
with deterministic_PRNG():
15011492
runner = ConjectureRunner(test, settings=TEST_SETTINGS)
15021493

1503-
d1 = runner.cached_test_function(bytes(8), extend=0)
1504-
d2 = runner.cached_test_function(bytes(8), extend=8)
1505-
assert d1.status == Status.OVERRUN
1506-
assert d2.status == Status.VALID
1494+
data = runner.cached_test_function_ir(ir(bytes(8)), extend=0)
1495+
assert data.status is Status.OVERRUN
1496+
1497+
data = runner.cached_test_function_ir(ir(bytes(8)), extend=10)
1498+
assert data.status is Status.VALID
15071499

15081500

15091501
def test_does_not_cache_extended_prefix_if_overrun():
@@ -1513,8 +1505,8 @@ def test(data):
15131505
with deterministic_PRNG():
15141506
runner = ConjectureRunner(test, settings=TEST_SETTINGS)
15151507

1516-
d1 = runner.cached_test_function(b"", extend=4)
1517-
d2 = runner.cached_test_function(b"", extend=8)
1508+
d1 = runner.cached_test_function_ir(ir(b""), extend=4)
1509+
d2 = runner.cached_test_function_ir(ir(b""), extend=8)
15181510
assert d1.status == Status.OVERRUN
15191511
assert d2.status == Status.VALID
15201512

@@ -1534,15 +1526,14 @@ def test(data):
15341526

15351527
def test_can_be_set_to_ignore_limits():
15361528
def test(data):
1537-
data.draw_bytes(1, 1)
1529+
data.draw_integer(0, 2**8 - 1)
15381530

15391531
with deterministic_PRNG():
15401532
runner = ConjectureRunner(
15411533
test, settings=settings(TEST_SETTINGS, max_examples=1), ignore_limits=True
15421534
)
1543-
15441535
for c in range(256):
1545-
runner.cached_test_function([c])
1536+
runner.cached_test_function_ir(ir(c))
15461537

15471538
assert runner.tree.is_exhausted
15481539

0 commit comments

Comments
 (0)