61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
"""
|
|
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()
|