Skip to content

Commit 6853fad

Browse files
authored
Merge pull request #412 from JamesParrott/Avoid_composite_test_strategies
Refactor test strategies to avoid @composite as it shrinks slowly
2 parents cd3ba97 + ea7b333 commit 6853fad

1 file changed

Lines changed: 31 additions & 27 deletions

File tree

tests/hypothesis_tests.py

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from hypothesis import HealthCheck, given, settings
77
from hypothesis.strategies import (
88
builds,
9-
composite,
9+
composite, # Preferably avoid. Shrinking composite strategies is slow.
1010
floats,
1111
integers,
1212
just,
@@ -153,19 +153,17 @@ def test_MultiPoint_roundtrips(
153153
assert actual.oid == expected.oid
154154

155155

156-
@composite
157-
def multipointM(draw):
158-
N = draw(PointsLengths)
159-
return shp.MultiPointM(
160-
points=draw(coords_2D_list(min_size=N, max_size=N)),
161-
m=draw(lists(ms, min_size=N, max_size=N)),
162-
oid=oid,
163-
)
164156

157+
def multipointM_from_xyms(point_ms: tuple[float, float, float | None], oid_: int) -> shp.MultiPointM:
158+
x_vals, y_vals, m_vals = zip(*point_ms)
159+
xy_vals = zip(x_vals, y_vals)
160+
return shp.MultiPointM(points=list(xy_vals), m=list(m_vals), oid=oid_)
161+
162+
multipointM = builds(multipointM_from_xyms, lists(tuples(xs, ys, ms), min_size=1), oid)
165163

166164
@pytest.mark.hypothesis
167165
@settings(suppress_health_check=[HealthCheck.too_slow, HealthCheck.data_too_large])
168-
@given(expected=multipointM(), i=integers(min_value=1))
166+
@given(expected=multipointM, i=integers(min_value=1))
169167
def test_MultiPointM_roundtrips(
170168
expected: shp.MultiPointM,
171169
i: int,
@@ -188,20 +186,17 @@ def test_MultiPointM_roundtrips(
188186
assert actual.oid == expected.oid
189187

190188

191-
@composite
192-
def multipointZ(draw):
193-
N = draw(PointsLengths)
194-
return shp.MultiPointZ(
195-
points=draw(coords_2D_list(min_size=N, max_size=N)),
196-
z=draw(lists(zs, min_size=N, max_size=N)),
197-
m=draw(lists(ms, min_size=N, max_size=N)),
198-
oid=oid,
199-
)
189+
def multipointZ_from_xyzms(pointz_ms: tuple[float, float, float, float | None], oid_: int) -> shp.MultiPointZ:
190+
x_vals, y_vals, z_vals, m_vals = zip(*pointz_ms)
191+
xy_vals = zip(x_vals, y_vals)
192+
return shp.MultiPointZ(points=list(xy_vals), z=list(z_vals), m=list(m_vals), oid=oid_)
193+
194+
multipointz = builds(multipointZ_from_xyzms, lists(tuples(xs, ys, zs, ms), min_size=1), oid)
200195

201196

202197
@pytest.mark.hypothesis
203198
@settings(suppress_health_check=[HealthCheck.too_slow, HealthCheck.data_too_large])
204-
@given(expected=multipointZ(), i=integers(min_value=1))
199+
@given(expected=multipointz, i=integers(min_value=1))
205200
def test_MultiPointZ_roundtrips(
206201
expected: shp.MultiPointZ,
207202
i: int,
@@ -382,19 +377,28 @@ def test_PolygonZ_roundtrips(
382377
assert actual.oid == expected.oid
383378

384379
part_types = sampled_from(range(6)) # 0: Triangle Strip, ..., 5: Ring
385-
@composite
386-
def multipatches(draw):
387-
N = draw(PointsLengths)
388-
p_types = draw(lists(part_types, min_size=N, max_size=N))
389-
patches = draw(lists(lists(tuples(xs, ys, zs, ms), min_size=1), min_size=N, max_size=N))
390-
return shp.MultiPatch(lines = patches, partTypes = p_types, oid=oid)
391380

381+
def multipatch_from_xyzms_and_types(
382+
xyzms_and_types: list[tuple[list[tuple[float, float, float, float | None]], int]],
383+
oid: int,
384+
) -> shp.MultiPatch:
385+
xyzm_vals, p_types = zip(*xyzms_and_types)
386+
return shp.MultiPatch(lines = xyzm_vals, partTypes = p_types, oid=oid)
392387

388+
multipatches = builds(
389+
multipatch_from_xyzms_and_types,
390+
lists(tuples(lists(tuples(xs, ys, zs, ms), min_size=1), part_types), min_size=1), oid)
391+
# @composite
392+
# def multipatches(draw):
393+
# N = draw(PointsLengths)
394+
# p_types = draw(lists(part_types, min_size=N, max_size=N))
395+
# patches = draw(lists(lists(tuples(xs, ys, zs, ms), min_size=1), min_size=N, max_size=N))
396+
# return shp.MultiPatch(lines = patches, partTypes = p_types, oid=oid)
393397

394398

395399
@pytest.mark.hypothesis
396400
@settings(suppress_health_check=[HealthCheck.too_slow, HealthCheck.data_too_large])
397-
@given(expected=multipatches(), i=integers(min_value=1))
401+
@given(expected=multipatches, i=integers(min_value=1))
398402
def test_MultiPatch_roundtrips(
399403
expected: shp.MultiPatch,
400404
i: int,

0 commit comments

Comments
 (0)