Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add dates() and times() strategies to hypothesis.extra.datetime
- Loading branch information
Adam Chainz
committed
Sep 25, 2015
1 parent
9da0f7f
commit c717e4f
Showing
7 changed files
with
285 additions
and
41 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,3 +2,7 @@ | |
*.swp | ||
*.pyc | ||
venv* | ||
.cache | ||
.hypothesis | ||
docs/_build | ||
*.egg-info |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
# coding=utf-8 | ||
|
||
# This file is part of Hypothesis (https://github.com/DRMacIver/hypothesis) | ||
|
||
# Most of this work is copyright (C) 2013-2015 David R. MacIver | ||
# (david@drmaciver.com), but it contains contributions by others. See | ||
# https://github.com/DRMacIver/hypothesis/blob/master/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 | ||
|
||
from random import Random | ||
from datetime import MAXYEAR | ||
|
||
import pytest | ||
import hypothesis.settings as hs | ||
from hypothesis.strategytests import strategy_test_suite | ||
from hypothesis.extra.datetime import dates | ||
from hypothesis.internal.debug import minimal | ||
from hypothesis.internal.compat import hrange | ||
from hypothesis.searchstrategy.strategies import BadData | ||
|
||
hs.Settings.default.max_examples = 1000 | ||
|
||
|
||
TestStandardDescriptorFeatures1 = strategy_test_suite(dates()) | ||
|
||
|
||
def test_can_find_after_the_year_2000(): | ||
assert minimal(dates(), lambda x: x.year > 2000).year == 2001 | ||
|
||
|
||
def test_can_find_before_the_year_2000(): | ||
assert minimal(dates(), lambda x: x.year < 2000).year == 1999 | ||
|
||
|
||
def test_can_find_each_month(): | ||
for i in hrange(1, 12): | ||
minimal(dates(), lambda x: x.month == i) | ||
|
||
|
||
def test_min_year_is_respected(): | ||
assert minimal(dates(min_year=2003)).year == 2003 | ||
|
||
|
||
def test_max_year_is_respected(): | ||
assert minimal(dates(max_year=1998)).year == 1998 | ||
|
||
|
||
def test_year_bounds_are_respected_in_deserialization(): | ||
s = dates() | ||
r = Random(1) | ||
template = s.draw_template(r, s.draw_parameter(r)) | ||
year = s.reify(template).year | ||
basic = s.to_basic(template) | ||
above = dates(min_year=year + 1) | ||
below = dates(max_year=year - 1) | ||
with pytest.raises(BadData): | ||
above.from_basic(basic) | ||
with pytest.raises(BadData): | ||
below.from_basic(basic) | ||
|
||
|
||
def test_can_draw_times_in_the_final_year(): | ||
last_year = dates(min_year=MAXYEAR) | ||
r = Random(1) | ||
for _ in hrange(1000): | ||
last_year.reify(last_year.draw_and_produce(r)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
# coding=utf-8 | ||
|
||
# This file is part of Hypothesis (https://github.com/DRMacIver/hypothesis) | ||
|
||
# Most of this work is copyright (C) 2013-2015 David R. MacIver | ||
# (david@drmaciver.com), but it contains contributions by others. See | ||
# https://github.com/DRMacIver/hypothesis/blob/master/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 | ||
|
||
from random import Random | ||
|
||
import pytz | ||
import pytest | ||
import hypothesis.settings as hs | ||
from hypothesis import given, assume | ||
from hypothesis.strategytests import strategy_test_suite | ||
from hypothesis.extra.datetime import times | ||
from hypothesis.internal.debug import minimal | ||
from hypothesis.searchstrategy.strategies import BadData | ||
|
||
hs.Settings.default.max_examples = 1000 | ||
|
||
|
||
TestStandardDescriptorFeatures1 = strategy_test_suite(times()) | ||
|
||
|
||
def test_can_find_midnight(): | ||
minimal( | ||
times(), | ||
lambda x: (x.hour == 0 and x.minute == 0 and x.second == 0), | ||
) | ||
|
||
|
||
def test_can_find_non_midnight(): | ||
assert minimal(times(), lambda x: x.hour != 0).hour == 1 | ||
|
||
|
||
def test_can_find_off_the_minute(): | ||
minimal(times(), lambda x: x.second == 0) | ||
|
||
|
||
def test_can_find_on_the_minute(): | ||
minimal(times(), lambda x: x.second != 0) | ||
|
||
|
||
def test_simplifies_towards_midnight(): | ||
d = minimal(times()) | ||
assert d.hour == 0 | ||
assert d.minute == 0 | ||
assert d.second == 0 | ||
assert d.microsecond == 0 | ||
|
||
|
||
def test_can_generate_naive_time(): | ||
minimal(times(allow_naive=True), lambda d: not d.tzinfo) | ||
|
||
|
||
def test_can_generate_non_naive_time(): | ||
assert minimal( | ||
times(allow_naive=True), lambda d: d.tzinfo).tzinfo == pytz.UTC | ||
|
||
|
||
def test_can_generate_non_utc(): | ||
minimal( | ||
times(), | ||
lambda d: assume(d.tzinfo) and d.tzinfo.zone != u'UTC') | ||
|
||
|
||
@given(times(timezones=[])) | ||
def test_naive_times_are_naive(dt): | ||
assert not dt.tzinfo | ||
|
||
|
||
@given(times(allow_naive=False)) | ||
def test_timezone_aware_times_are_timezone_aware(dt): | ||
assert dt.tzinfo | ||
|
||
|
||
def test_restricts_to_allowed_set_of_timezones(): | ||
timezones = list(map(pytz.timezone, list(pytz.all_timezones)[:3])) | ||
x = minimal(times(timezones=timezones)) | ||
assert any(tz.zone == x.tzinfo.zone for tz in timezones) | ||
|
||
|
||
def test_timezones_are_checked_in_deserialization(): | ||
s = times() | ||
r = Random(1) | ||
basic = s.to_basic(s.draw_template(r, s.draw_parameter(r))) | ||
with pytest.raises(BadData): | ||
times(timezones=[]).from_basic(basic) |