|
61 | 61 |
|
62 | 62 | _ApplyCases = List[Tuple[BaseOffset, Dict[datetime, datetime]]]
|
63 | 63 |
|
| 64 | +_ARITHMETIC_DATE_OFFSET = [ |
| 65 | + "years", |
| 66 | + "months", |
| 67 | + "weeks", |
| 68 | + "days", |
| 69 | + "hours", |
| 70 | + "minutes", |
| 71 | + "seconds", |
| 72 | + "milliseconds", |
| 73 | + "microseconds", |
| 74 | +] |
| 75 | + |
64 | 76 |
|
65 | 77 | class TestCommon(Base):
|
66 | 78 | # executed value created by Base._get_offset
|
@@ -551,28 +563,144 @@ def test_mul(self):
|
551 | 563 | assert DateOffset(2) == 2 * DateOffset(1)
|
552 | 564 | assert DateOffset(2) == DateOffset(1) * 2
|
553 | 565 |
|
554 |
| - def test_constructor(self): |
555 |
| - |
556 |
| - assert (self.d + DateOffset(months=2)) == datetime(2008, 3, 2) |
557 |
| - assert (self.d - DateOffset(months=2)) == datetime(2007, 11, 2) |
| 566 | + @pytest.mark.parametrize("relativedelta_kwd", list(liboffsets._relativedelta_kwds)) |
| 567 | + def test_constructor(self, relativedelta_kwd, request): |
| 568 | + if relativedelta_kwd == "millisecond": |
| 569 | + request.node.add_marker( |
| 570 | + pytest.mark.xfail( |
| 571 | + raises=NotImplementedError, |
| 572 | + reason="Constructing DateOffset object with `millisecond` is not " |
| 573 | + "yet supported.", |
| 574 | + ) |
| 575 | + ) |
| 576 | + offset = DateOffset(**{relativedelta_kwd: 2}) |
| 577 | + assert offset.kwds == {relativedelta_kwd: 2} |
| 578 | + assert getattr(offset, relativedelta_kwd) == 2 |
558 | 579 |
|
| 580 | + def test_default_constructor(self): |
559 | 581 | assert (self.d + DateOffset(2)) == datetime(2008, 1, 4)
|
560 | 582 |
|
| 583 | + def test_is_anchored(self): |
561 | 584 | assert not DateOffset(2).is_anchored()
|
562 | 585 | assert DateOffset(1).is_anchored()
|
563 | 586 |
|
564 |
| - d = datetime(2008, 1, 31) |
565 |
| - assert (d + DateOffset(months=1)) == datetime(2008, 2, 29) |
566 |
| - |
567 | 587 | def test_copy(self):
|
568 | 588 | assert DateOffset(months=2).copy() == DateOffset(months=2)
|
| 589 | + assert DateOffset(milliseconds=1).copy() == DateOffset(milliseconds=1) |
| 590 | + |
| 591 | + @pytest.mark.parametrize( |
| 592 | + "arithmatic_offset_type, expected", |
| 593 | + zip( |
| 594 | + _ARITHMETIC_DATE_OFFSET, |
| 595 | + [ |
| 596 | + "2009-01-02", |
| 597 | + "2008-02-02", |
| 598 | + "2008-01-09", |
| 599 | + "2008-01-03", |
| 600 | + "2008-01-02 01:00:00", |
| 601 | + "2008-01-02 00:01:00", |
| 602 | + "2008-01-02 00:00:01", |
| 603 | + "2008-01-02 00:00:00.001000000", |
| 604 | + "2008-01-02 00:00:00.000001000", |
| 605 | + ], |
| 606 | + ), |
| 607 | + ) |
| 608 | + def test_add(self, arithmatic_offset_type, expected): |
| 609 | + assert DateOffset(**{arithmatic_offset_type: 1}) + self.d == Timestamp(expected) |
| 610 | + assert self.d + DateOffset(**{arithmatic_offset_type: 1}) == Timestamp(expected) |
| 611 | + |
| 612 | + @pytest.mark.parametrize( |
| 613 | + "arithmatic_offset_type, expected", |
| 614 | + zip( |
| 615 | + _ARITHMETIC_DATE_OFFSET, |
| 616 | + [ |
| 617 | + "2007-01-02", |
| 618 | + "2007-12-02", |
| 619 | + "2007-12-26", |
| 620 | + "2008-01-01", |
| 621 | + "2008-01-01 23:00:00", |
| 622 | + "2008-01-01 23:59:00", |
| 623 | + "2008-01-01 23:59:59", |
| 624 | + "2008-01-01 23:59:59.999000000", |
| 625 | + "2008-01-01 23:59:59.999999000", |
| 626 | + ], |
| 627 | + ), |
| 628 | + ) |
| 629 | + def test_sub(self, arithmatic_offset_type, expected): |
| 630 | + assert self.d - DateOffset(**{arithmatic_offset_type: 1}) == Timestamp(expected) |
| 631 | + with pytest.raises(TypeError, match="Cannot subtract datetime from offset"): |
| 632 | + DateOffset(**{arithmatic_offset_type: 1}) - self.d |
| 633 | + |
| 634 | + @pytest.mark.parametrize( |
| 635 | + "arithmatic_offset_type, n, expected", |
| 636 | + zip( |
| 637 | + _ARITHMETIC_DATE_OFFSET, |
| 638 | + range(1, 10), |
| 639 | + [ |
| 640 | + "2009-01-02", |
| 641 | + "2008-03-02", |
| 642 | + "2008-01-23", |
| 643 | + "2008-01-06", |
| 644 | + "2008-01-02 05:00:00", |
| 645 | + "2008-01-02 00:06:00", |
| 646 | + "2008-01-02 00:00:07", |
| 647 | + "2008-01-02 00:00:00.008000000", |
| 648 | + "2008-01-02 00:00:00.000009000", |
| 649 | + ], |
| 650 | + ), |
| 651 | + ) |
| 652 | + def test_mul_add(self, arithmatic_offset_type, n, expected): |
| 653 | + assert DateOffset(**{arithmatic_offset_type: 1}) * n + self.d == Timestamp( |
| 654 | + expected |
| 655 | + ) |
| 656 | + assert n * DateOffset(**{arithmatic_offset_type: 1}) + self.d == Timestamp( |
| 657 | + expected |
| 658 | + ) |
| 659 | + assert self.d + DateOffset(**{arithmatic_offset_type: 1}) * n == Timestamp( |
| 660 | + expected |
| 661 | + ) |
| 662 | + assert self.d + n * DateOffset(**{arithmatic_offset_type: 1}) == Timestamp( |
| 663 | + expected |
| 664 | + ) |
| 665 | + |
| 666 | + @pytest.mark.parametrize( |
| 667 | + "arithmatic_offset_type, n, expected", |
| 668 | + zip( |
| 669 | + _ARITHMETIC_DATE_OFFSET, |
| 670 | + range(1, 10), |
| 671 | + [ |
| 672 | + "2007-01-02", |
| 673 | + "2007-11-02", |
| 674 | + "2007-12-12", |
| 675 | + "2007-12-29", |
| 676 | + "2008-01-01 19:00:00", |
| 677 | + "2008-01-01 23:54:00", |
| 678 | + "2008-01-01 23:59:53", |
| 679 | + "2008-01-01 23:59:59.992000000", |
| 680 | + "2008-01-01 23:59:59.999991000", |
| 681 | + ], |
| 682 | + ), |
| 683 | + ) |
| 684 | + def test_mul_sub(self, arithmatic_offset_type, n, expected): |
| 685 | + assert self.d - DateOffset(**{arithmatic_offset_type: 1}) * n == Timestamp( |
| 686 | + expected |
| 687 | + ) |
| 688 | + assert self.d - n * DateOffset(**{arithmatic_offset_type: 1}) == Timestamp( |
| 689 | + expected |
| 690 | + ) |
| 691 | + |
| 692 | + def test_leap_year(self): |
| 693 | + d = datetime(2008, 1, 31) |
| 694 | + assert (d + DateOffset(months=1)) == datetime(2008, 2, 29) |
569 | 695 |
|
570 | 696 | def test_eq(self):
|
571 | 697 | offset1 = DateOffset(days=1)
|
572 | 698 | offset2 = DateOffset(days=365)
|
573 | 699 |
|
574 | 700 | assert offset1 != offset2
|
575 | 701 |
|
| 702 | + assert DateOffset(milliseconds=3) != DateOffset(milliseconds=7) |
| 703 | + |
576 | 704 |
|
577 | 705 | class TestOffsetNames:
|
578 | 706 | def test_get_offset_name(self):
|
@@ -741,7 +869,15 @@ def test_month_offset_name(month_classes):
|
741 | 869 |
|
742 | 870 |
|
743 | 871 | @pytest.mark.parametrize("kwd", sorted(liboffsets._relativedelta_kwds))
|
744 |
| -def test_valid_relativedelta_kwargs(kwd): |
| 872 | +def test_valid_relativedelta_kwargs(kwd, request): |
| 873 | + if kwd == "millisecond": |
| 874 | + request.node.add_marker( |
| 875 | + pytest.mark.xfail( |
| 876 | + raises=NotImplementedError, |
| 877 | + reason="Constructing DateOffset object with `millisecond` is not " |
| 878 | + "yet supported.", |
| 879 | + ) |
| 880 | + ) |
745 | 881 | # Check that all the arguments specified in liboffsets._relativedelta_kwds
|
746 | 882 | # are in fact valid relativedelta keyword args
|
747 | 883 | DateOffset(**{kwd: 1})
|
|
0 commit comments