1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
# This file is part of Hypothesis, which may be found at
# https://github.com/HypothesisWorks/hypothesis/
#
# Copyright the Hypothesis Authors.
# Individual contributors are listed in AUTHORS.rst and the git log.
#
# This Source Code Form is subject to the terms of the Mozilla Public License,
# v. 2.0. If a copy of the MPL was not distributed with this file, You can
# obtain one at https://mozilla.org/MPL/2.0/.
import pytest
from hypothesis import HealthCheck, assume, given, settings
from hypothesis.strategies import integers, text
class HasSetup:
def setup_example(self):
self.setups = getattr(self, "setups", 0)
self.setups += 1
class HasTeardown:
def teardown_example(self, ex):
self.teardowns = getattr(self, "teardowns", 0)
self.teardowns += 1
class SomeGivens:
@given(integers())
@settings(suppress_health_check=[HealthCheck.differing_executors])
def give_me_an_int(self, x):
pass
@given(text())
def give_me_a_string(self, x):
pass
@given(integers())
@settings(max_examples=1000)
def give_me_a_positive_int(self, x):
assert x >= 0
@given(integers().map(lambda x: x.nope))
def fail_in_reify(self, x):
pass
@given(integers())
@settings(suppress_health_check=[HealthCheck.filter_too_much])
def assume_some_stuff(self, x):
assume(x > 0)
@given(integers().filter(lambda x: x > 0))
def assume_in_reify(self, x):
pass
class HasSetupAndTeardown(HasSetup, HasTeardown, SomeGivens):
pass
def test_calls_setup_and_teardown_on_self_as_first_argument():
x = HasSetupAndTeardown()
x.give_me_an_int()
x.give_me_a_string()
assert x.setups > 0
assert x.teardowns == x.setups
def test_calls_setup_and_teardown_on_self_unbound():
x = HasSetupAndTeardown()
HasSetupAndTeardown.give_me_an_int(x)
assert x.setups > 0
assert x.teardowns == x.setups
def test_calls_setup_and_teardown_on_failure():
x = HasSetupAndTeardown()
with pytest.raises(AssertionError):
x.give_me_a_positive_int()
assert x.setups > 0
assert x.teardowns == x.setups
def test_still_tears_down_on_error_in_generation():
x = HasSetupAndTeardown()
with pytest.raises(AttributeError):
x.fail_in_reify()
assert x.setups > 0
assert x.teardowns == x.setups
def test_still_tears_down_on_failed_assume():
x = HasSetupAndTeardown()
x.assume_some_stuff()
assert x.setups > 0
assert x.teardowns == x.setups
def test_still_tears_down_on_failed_assume_in_reify():
x = HasSetupAndTeardown()
x.assume_in_reify()
assert x.setups > 0
assert x.teardowns == x.setups
def test_sets_up_without_teardown():
class Foo(HasSetup, SomeGivens):
pass
x = Foo()
x.give_me_an_int()
assert x.setups > 0
assert not hasattr(x, "teardowns")
def test_tears_down_without_setup():
class Foo(HasTeardown, SomeGivens):
pass
x = Foo()
x.give_me_an_int()
assert x.teardowns > 0
assert not hasattr(x, "setups")
|