Skip to content

Commit 2b0abee

Browse files
committed
hypothesis: use the settings strategy for ancestor interfaces too.
1 parent 301f86a commit 2b0abee

File tree

2 files changed

+46
-10
lines changed

2 files changed

+46
-10
lines changed

returns/contrib/hypothesis/laws.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,7 @@ def interface_strategies(
8989
Can be used independently from other functions.
9090
"""
9191
mapping: Mapping[type[object], StrategyFactory] = {
92-
interface: strategy_from_container(
93-
container_type,
94-
use_init=settings.use_init,
95-
)
92+
interface: _strategy_for_container(container_type, settings)
9693
for interface in lawful_interfaces(container_type)
9794
}
9895
with strategies_for_types(mapping):
@@ -106,12 +103,9 @@ def register_container(
106103
settings: Settings,
107104
) -> Iterator[None]:
108105
"""Temporary registers a container if it is not registered yet."""
109-
strategy = (
110-
strategy_from_container(container_type, use_init=settings.use_init)
111-
if settings.strategy is None
112-
else settings.strategy
113-
)
114-
with strategies_for_types({container_type: strategy}):
106+
with strategies_for_types({
107+
container_type: _strategy_for_container(container_type, settings)
108+
}):
115109
yield
116110

117111

@@ -228,6 +222,16 @@ def _clean_caches() -> None:
228222
st.from_type.__clear_cache() # type: ignore[attr-defined] # noqa: SLF001
229223

230224

225+
def _strategy_for_container(
226+
container_type: type[Lawful], settings: Settings
227+
) -> StrategyFactory:
228+
return (
229+
strategy_from_container(container_type, use_init=settings.use_init)
230+
if settings.strategy is None
231+
else settings.strategy
232+
)
233+
234+
231235
def _run_law(
232236
container_type: type[Lawful],
233237
law: Law,

tests/test_contrib/test_hypothesis/test_type_resolution.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,38 @@ def test_interface_strategies() -> None:
213213
]
214214

215215

216+
def test_interface_strategies_with_settings() -> None:
217+
"""Check that we prefer the strategy in the settings."""
218+
container_type = test_custom_type_applicative._Wrapper # noqa: SLF001
219+
220+
strategy_factories_before = _interface_factories(container_type)
221+
222+
with interface_strategies(
223+
container_type,
224+
settings=Settings(
225+
settings_kwargs={},
226+
use_init=False,
227+
strategy=st.builds(container_type, st.integers()),
228+
),
229+
):
230+
strategy_factories_inside = _interface_factories(container_type)
231+
232+
strategy_factories_after = _interface_factories(container_type)
233+
234+
assert _strategy_strings(strategy_factories_before, container_type) == [
235+
'None',
236+
'None',
237+
]
238+
assert _strategy_strings(strategy_factories_inside, container_type) == [
239+
'builds(_Wrapper, integers())',
240+
'builds(_Wrapper, integers())',
241+
]
242+
assert _strategy_strings(strategy_factories_after, container_type) == [
243+
'None',
244+
'None',
245+
]
246+
247+
216248
def _interface_factories(type_: type[Lawful]) -> list[StrategyFactory | None]:
217249
return [
218250
look_up_strategy(interface) for interface in lawful_interfaces(type_)

0 commit comments

Comments
 (0)