123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- # coding=utf-8
- #
- # This file is part of Hypothesis, which may be found at
- # https://github.com/HypothesisWorks/hypothesis-python
- #
- # Most of this work is copyright (C) 2013-2018 David R. MacIver
- # (david@drmaciver.com), but it contains contributions by others. See
- # CONTRIBUTING.rst for a full list of people who may hold copyright, and
- # consult the git log if you need to determine who owns an individual
- # contribution.
- #
- # 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 http://mozilla.org/MPL/2.0/.
- #
- # END HEADER
- from __future__ import division, print_function, absolute_import
- import hypothesis.internal.conjecture.utils as d
- from hypothesis.types import RandomWithSeed
- from hypothesis.searchstrategy.strategies import SearchStrategy, \
- MappedSearchStrategy
- class BoolStrategy(SearchStrategy):
- """A strategy that produces Booleans with a Bernoulli conditional
- distribution."""
- def __repr__(self):
- return u'BoolStrategy()'
- def calc_has_reusable_values(self, recur):
- return True
- def do_draw(self, data):
- return d.boolean(data)
- def is_simple_data(value):
- try:
- hash(value)
- return True
- except TypeError:
- return False
- class JustStrategy(SearchStrategy):
- """A strategy which simply returns a single fixed value with probability
- 1."""
- def __init__(self, value):
- SearchStrategy.__init__(self)
- self.value = value
- def __repr__(self):
- return 'just(%r)' % (self.value,)
- def calc_has_reusable_values(self, recur):
- return True
- def calc_is_cacheable(self, recur):
- return is_simple_data(self.value)
- def do_draw(self, data):
- return self.value
- class RandomStrategy(MappedSearchStrategy):
- """A strategy which produces Random objects.
- The conditional distribution is simply a RandomWithSeed seeded with
- a 128 bits of data chosen uniformly at random.
- """
- def pack(self, i):
- return RandomWithSeed(i)
- class SampledFromStrategy(SearchStrategy):
- """A strategy which samples from a set of elements. This is essentially
- equivalent to using a OneOfStrategy over Just strategies but may be more
- efficient and convenient.
- The conditional distribution chooses uniformly at random from some
- non-empty subset of the elements.
- """
- def __init__(self, elements):
- SearchStrategy.__init__(self)
- self.elements = d.check_sample(elements)
- assert self.elements
- def calc_has_reusable_values(self, recur):
- return True
- def calc_is_cacheable(self, recur):
- return is_simple_data(self.elements)
- def do_draw(self, data):
- return d.choice(data, self.elements)
|