hypothesishelpers.py
76 lines
| 2.1 KiB
| text/x-python
|
PythonLexer
/ tests / hypothesishelpers.py
David R. MacIver
|
r26842 | # Helper module to use the Hypothesis tool in tests | ||
# | ||||
# Copyright 2015 David R. MacIver | ||||
# | ||||
# For details see http://hypothesis.readthedocs.org | ||||
Robert Stanca
|
r28728 | from __future__ import absolute_import, print_function | ||
David R. MacIver
|
r26842 | import os | ||
import sys | ||||
import traceback | ||||
Yuya Nishihara
|
r27998 | try: | ||
# hypothesis 2.x | ||||
from hypothesis.configuration import set_hypothesis_home_dir | ||||
from hypothesis import settings | ||||
except ImportError: | ||||
# hypothesis 1.x | ||||
from hypothesis.settings import set_hypothesis_home_dir | ||||
from hypothesis import Settings as settings | ||||
David R. MacIver
|
r26842 | import hypothesis.strategies as st | ||
Yuya Nishihara
|
r27998 | from hypothesis import given | ||
David R. MacIver
|
r26842 | |||
# hypothesis store data regarding generate example and code | ||||
Augie Fackler
|
r43346 | set_hypothesis_home_dir(os.path.join(os.getenv('TESTTMP'), ".hypothesis")) | ||
David R. MacIver
|
r26842 | |||
def check(*args, **kwargs): | ||||
"""decorator to make a function a hypothesis test | ||||
Decorated function are run immediately (to be used doctest style)""" | ||||
Augie Fackler
|
r43346 | |||
David R. MacIver
|
r26842 | def accept(f): | ||
# Workaround for https://github.com/DRMacIver/hypothesis/issues/206 | ||||
# Fixed in version 1.13 (released 2015 october 29th) | ||||
f.__module__ = '__anon__' | ||||
try: | ||||
Yuya Nishihara
|
r27999 | with settings(max_examples=2000): | ||
given(*args, **kwargs)(f)() | ||||
David R. MacIver
|
r26842 | except Exception: | ||
traceback.print_exc(file=sys.stdout) | ||||
sys.exit(1) | ||||
Augie Fackler
|
r43346 | |||
David R. MacIver
|
r26842 | return accept | ||
def roundtrips(data, decode, encode): | ||||
"""helper to tests function that must do proper encode/decode roundtripping | ||||
""" | ||||
Augie Fackler
|
r43346 | |||
David R. MacIver
|
r26842 | @given(data) | ||
def testroundtrips(value): | ||||
encoded = encode(value) | ||||
decoded = decode(encoded) | ||||
if decoded != value: | ||||
raise ValueError( | ||||
Augie Fackler
|
r43346 | "Round trip failed: %s(%r) -> %s(%r) -> %r" | ||
% (encode.__name__, value, decode.__name__, encoded, decoded) | ||||
) | ||||
David R. MacIver
|
r26842 | try: | ||
testroundtrips() | ||||
except Exception: | ||||
# heredoc swallow traceback, we work around it | ||||
traceback.print_exc(file=sys.stdout) | ||||
raise | ||||
print("Round trip OK") | ||||
# strategy for generating bytestring that might be an issue for Mercurial | ||||
bytestrings = ( | ||||
Augie Fackler
|
r43346 | st.builds( | ||
lambda s, e: s.encode(e), | ||||
st.text(), | ||||
st.sampled_from(['utf-8', 'utf-16',]), | ||||
) | ||||
) | st.binary() | ||||