hypothesishelpers.py
79 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 | ||||
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): | ||||
Augie Fackler
|
r46554 | """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(), | ||||
Augie Fackler
|
r46554 | st.sampled_from( | ||
[ | ||||
'utf-8', | ||||
'utf-16', | ||||
] | ||||
), | ||||
Augie Fackler
|
r43346 | ) | ||
) | st.binary() | ||||