Author: Carl Friedrich Bolz <cfb...@gmx.de> Branch: hypothesis-apptest Changeset: r85074:1fb5d21e02ba Date: 2016-06-09 14:42 +0200 http://bitbucket.org/pypy/pypy/changeset/1fb5d21e02ba/
Log: try to make it possible to test applevel functions (and soon methods) with hypothesis. Limited to one argument for now. diff --git a/pypy/interpreter/gateway.py b/pypy/interpreter/gateway.py --- a/pypy/interpreter/gateway.py +++ b/pypy/interpreter/gateway.py @@ -1121,7 +1121,7 @@ if not isinstance(source, str): flags = source.__code__.co_flags source = py.std.inspect.getsource(source).lstrip() - while source.startswith(('@py.test.mark.', '@pytest.mark.')): + while source.startswith(('@py.test.mark.', '@pytest.mark.', '@app_hypothesis_given')): # these decorators are known to return the same function # object, we may ignore them assert '\n' in source diff --git a/pypy/objspace/std/test/test_mapdict.py b/pypy/objspace/std/test/test_mapdict.py --- a/pypy/objspace/std/test/test_mapdict.py +++ b/pypy/objspace/std/test/test_mapdict.py @@ -1,5 +1,6 @@ from pypy.objspace.std.test.test_dictmultiobject import FakeSpace, W_DictObject from pypy.objspace.std.mapdict import * +from pypy.tool.pytest.appsupport import app_hypothesis_given class Config: class objspace: diff --git a/pypy/tool/pytest/appsupport.py b/pypy/tool/pytest/appsupport.py --- a/pypy/tool/pytest/appsupport.py +++ b/pypy/tool/pytest/appsupport.py @@ -11,6 +11,21 @@ # ____________________________________________________________ +def app_hypothesis_given(arg1): + from hypothesis import given + def decorator(func): + @given(arg1) + def inner(space, original, arg1): + return original(space, space.wrap(arg1)) + + @given(arg1) + def appdirect(arg1): + return func(arg1) + appdirect.hypothesis_inner = inner + appdirect.original_function = func + return appdirect + return decorator + class AppCode(object): def __init__(self, space, pycode): self.code = pycode diff --git a/pypy/tool/pytest/apptest.py b/pypy/tool/pytest/apptest.py --- a/pypy/tool/pytest/apptest.py +++ b/pypy/tool/pytest/apptest.py @@ -51,10 +51,17 @@ if self.config.option.runappdirect: return target() space = gettestobjspace() - filename = self._getdynfilename(target) - func = app2interp_temp(target, filename=filename) + if hasattr(target, 'hypothesis_inner'): + filename = self._getdynfilename(target.original_function) + original = app2interp_temp(target.original_function, filename=filename) + func = target.hypothesis_inner + args = (space, original) + else: + filename = self._getdynfilename(target) + args = (space, ) + func = app2interp_temp(target, filename=filename) print "executing", func - self.execute_appex(space, func, space) + self.execute_appex(space, func, *args) def repr_failure(self, excinfo): if excinfo.errisinstance(AppError): diff --git a/pypy/tool/pytest/test/test_hypothesis.py b/pypy/tool/pytest/test/test_hypothesis.py new file mode 100644 --- /dev/null +++ b/pypy/tool/pytest/test/test_hypothesis.py @@ -0,0 +1,12 @@ +from pypy.tool.pytest.appsupport import app_hypothesis_given +import hypothesis.strategies as strategies + + +# test for the app-test hypothesis support + +@app_hypothesis_given(strategies.floats(min_value=1.0, max_value=2.0)) +def app_test_floats(f): + assert 1.0 <= f <= 2.0 + assert f == f # not a NaN + + _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit