123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- """
- Behavioral based tests for offsets and date_range.
- This file is adapted from https://github.com/pandas-dev/pandas/pull/18761 -
- which was more ambitious but less idiomatic in its use of Hypothesis.
- You may wish to consult the previous version for inspiration on further
- tests, or when trying to pin down the bugs exposed by the tests below.
- """
- from hypothesis import (
- assume,
- given,
- )
- import pytest
- import pytz
- import pandas as pd
- from pandas._testing._hypothesis import (
- DATETIME_JAN_1_1900_OPTIONAL_TZ,
- YQM_OFFSET,
- )
- # ----------------------------------------------------------------
- # Offset-specific behaviour tests
- @pytest.mark.arm_slow
- @given(DATETIME_JAN_1_1900_OPTIONAL_TZ, YQM_OFFSET)
- def test_on_offset_implementations(dt, offset):
- assume(not offset.normalize)
- # check that the class-specific implementations of is_on_offset match
- # the general case definition:
- # (dt + offset) - offset == dt
- try:
- compare = (dt + offset) - offset
- except (pytz.NonExistentTimeError, pytz.AmbiguousTimeError):
- # When dt + offset does not exist or is DST-ambiguous, assume(False) to
- # indicate to hypothesis that this is not a valid test case
- # DST-ambiguous example (GH41906):
- # dt = datetime.datetime(1900, 1, 1, tzinfo=pytz.timezone('Africa/Kinshasa'))
- # offset = MonthBegin(66)
- assume(False)
- assert offset.is_on_offset(dt) == (compare == dt)
- @given(YQM_OFFSET)
- def test_shift_across_dst(offset):
- # GH#18319 check that 1) timezone is correctly normalized and
- # 2) that hour is not incorrectly changed by this normalization
- assume(not offset.normalize)
- # Note that dti includes a transition across DST boundary
- dti = pd.date_range(
- start="2017-10-30 12:00:00", end="2017-11-06", freq="D", tz="US/Eastern"
- )
- assert (dti.hour == 12).all() # we haven't screwed up yet
- res = dti + offset
- assert (res.hour == 12).all()
|