Coverage for tests/test_datetools.py: 99%
91 statements
« prev ^ index » next coverage.py v7.8.2, created at 2025-06-05 14:27 +0000
« prev ^ index » next coverage.py v7.8.2, created at 2025-06-05 14:27 +0000
1from unittest import main, TestCase
2from rivapy.tools.datetools import roll_day, Period, Schedule, DayCounter
3from rivapy.tools.enums import RollConvention, DayCounterType
4from datetime import date, datetime
5from holidays import DE
7class DayCounterTests(TestCase):
9 def test_ACT365(self):
10 d1 = datetime(2023,1,1)
11 d2 = datetime(2024,1,1)
12 self.assertAlmostEqual(DayCounter.yf_Act365Fixed(d1,d2), 1.0, delta=1e-5)
13 dc = DayCounter(DayCounterType.Act365Fixed)
14 self.assertAlmostEqual(DayCounter.yf_Act365Fixed(d1,d2), dc.yf(d1,d2), delta=1e-5)
16class Unit_Tests(TestCase):
18 def test_roll_day(self):
19 holidays_de = DE()
21 # business days are unchanged for all roll conventions
22 roll_conventions = [roll_convention.value for roll_convention in RollConvention]
23 roll_conventions.pop(2) # remove 'ModifiedFollowingEOM' as it needs a start date
24 for roll_convention in roll_conventions:
25 self.assertEqual(roll_day(date(1997, 1, 2), holidays_de, roll_convention), datetime(1997, 1, 2))
27 # test UNADJUSTED
28 roll_convention = RollConvention.UNADJUSTED
29 self.assertEqual(roll_day(datetime(1997, 5, 1), holidays_de, roll_convention), datetime(1997, 5, 1))
30 self.assertEqual(roll_day(datetime(1997, 7, 6), holidays_de, roll_convention), datetime(1997, 7, 6))
32 # test FOLLOWING
33 roll_convention = RollConvention.FOLLOWING
34 self.assertEqual(roll_day(datetime(1997, 5, 1), holidays_de, roll_convention), datetime(1997, 5, 2))
35 self.assertEqual(roll_day(datetime(1997, 7, 5), holidays_de, roll_convention), datetime(1997, 7, 7))
36 self.assertEqual(roll_day(datetime(1997, 5, 17), holidays_de, roll_convention), datetime(1997, 5, 20))
37 self.assertEqual(roll_day(datetime(1997, 12, 25), holidays_de, roll_convention), datetime(1997, 12, 29))
38 self.assertEqual(roll_day(datetime(1997, 3, 28), holidays_de, roll_convention), datetime(1997, 4, 1))
40 # test MODIFIED_FOLLOWING
41 roll_convention = RollConvention.MODIFIED_FOLLOWING
42 self.assertEqual(roll_day(datetime(1997, 5, 1), holidays_de, roll_convention), datetime(1997, 5, 2))
43 self.assertEqual(roll_day(datetime(1997, 12, 25), holidays_de, roll_convention), datetime(1997, 12, 29))
44 self.assertEqual(roll_day(datetime(1997, 8, 30), holidays_de, roll_convention), datetime(1997, 8, 29))
45 self.assertEqual(roll_day(datetime(1997, 8, 31), holidays_de, roll_convention), datetime(1997, 8, 29))
46 self.assertEqual(roll_day(datetime(1997, 3, 28), holidays_de, roll_convention), datetime(1997, 3, 27))
48 # test MODIFIED_FOLLOWING_BIMONTHLY
49 roll_convention = RollConvention.MODIFIED_FOLLOWING_BIMONTHLY
50 self.assertEqual(roll_day(datetime(1997, 5, 1), holidays_de, roll_convention), datetime(1997, 5, 2))
51 self.assertEqual(roll_day(datetime(1997, 12, 25), holidays_de, roll_convention), datetime(1997, 12, 29))
52 self.assertEqual(roll_day(datetime(1997, 8, 30), holidays_de, roll_convention), datetime(1997, 8, 29))
53 self.assertEqual(roll_day(datetime(1997, 8, 31), holidays_de, roll_convention), datetime(1997, 8, 29))
54 self.assertEqual(roll_day(datetime(1997, 3, 28), holidays_de, roll_convention), datetime(1997, 3, 27))
55 self.assertEqual(roll_day(datetime(1997, 2, 15), holidays_de, roll_convention), datetime(1997, 2, 14))
56 self.assertEqual(roll_day(datetime(1997, 2, 16), holidays_de, roll_convention), datetime(1997, 2, 17))
58 # test NEAREST
59 roll_convention = RollConvention.NEAREST
60 self.assertEqual(roll_day(datetime(1997, 5, 1), holidays_de, roll_convention), datetime(1997, 5, 2))
61 self.assertEqual(roll_day(datetime(1997, 7, 5), holidays_de, roll_convention), datetime(1997, 7, 4))
62 self.assertEqual(roll_day(datetime(1997, 7, 6), holidays_de, roll_convention), datetime(1997, 7, 7))
63 self.assertEqual(roll_day(datetime(1997, 5, 18), holidays_de, roll_convention), datetime(1997, 5, 20))
64 self.assertEqual(roll_day(datetime(1997, 3, 29), holidays_de, roll_convention), datetime(1997, 3, 27))
65 self.assertEqual(roll_day(datetime(1997, 3, 30), holidays_de, roll_convention), datetime(1997, 4, 1))
67 # test PRECEDING
68 roll_convention = RollConvention.PRECEDING
69 self.assertEqual(roll_day(datetime(1997, 5, 1), holidays_de, roll_convention), datetime(1997, 4, 30))
70 self.assertEqual(roll_day(datetime(1997, 7, 6), holidays_de, roll_convention), datetime(1997, 7, 4))
71 self.assertEqual(roll_day(datetime(1997, 5, 19), holidays_de, roll_convention), datetime(1997, 5, 16))
72 self.assertEqual(roll_day(datetime(1997, 12, 28), holidays_de, roll_convention), datetime(1997, 12, 24))
73 self.assertEqual(roll_day(datetime(1997, 3, 31), holidays_de, roll_convention), datetime(1997, 3, 27))
75 # test MODIFIED_PRECEDING
76 roll_convention = RollConvention.MODIFIED_PRECEDING
77 self.assertEqual(roll_day(datetime(1997, 5, 1), holidays_de, roll_convention), datetime(1997, 5, 2))
78 self.assertEqual(roll_day(datetime(1997, 7, 5), holidays_de, roll_convention), datetime(1997, 7, 4))
79 self.assertEqual(roll_day(datetime(1997, 7, 6), holidays_de, roll_convention), datetime(1997, 7, 4))
80 self.assertEqual(roll_day(datetime(1997, 3, 2), holidays_de, roll_convention), datetime(1997, 3, 3))
82 # test MODIFIED_FOLLOWING_EOM
83 roll_convention = RollConvention.MODIFIED_FOLLOWING_EOM
84 self.assertEqual(roll_day(datetime(1997, 3, 28), holidays_de, roll_convention, datetime(1997, 2, 28)),
85 datetime(1997, 3, 27))
86 self.assertEqual(roll_day(datetime(1997, 4, 26), holidays_de, roll_convention, datetime(1997, 3, 26)),
87 datetime(1997, 4, 28))
88 self.assertEqual(roll_day(datetime(1997, 4, 27), holidays_de, roll_convention, datetime(1997, 3, 27)),
89 datetime(1997, 4, 28))
90 self.assertEqual(roll_day(datetime(1997, 6, 29), holidays_de, roll_convention, datetime(1997, 5, 29)),
91 datetime(1997, 6, 30))
92 self.assertEqual(roll_day(datetime(1997, 7, 30), holidays_de, roll_convention, datetime(1997, 6, 30)),
93 datetime(1997, 7, 30))
94 self.assertEqual(roll_day(datetime(1997, 8, 31), holidays_de, roll_convention, datetime(1997, 7, 31)),
95 datetime(1997, 8, 29))
96 self.assertEqual(roll_day(datetime(1997, 9, 28), holidays_de, roll_convention, datetime(1997, 8, 28)),
97 datetime(1997, 9, 29))
98 self.assertEqual(roll_day(datetime(1997, 9, 29), holidays_de, roll_convention, datetime(1997, 8, 29)),
99 datetime(1997, 9, 29))
100 self.assertEqual(roll_day(datetime(1997, 11, 30), holidays_de, roll_convention, datetime(1997, 10, 30)),
101 datetime(1997, 11, 28))
102 self.assertEqual(roll_day(datetime(1997, 12, 28), holidays_de, roll_convention, datetime(1997, 11, 28)),
103 datetime(1997, 12, 29))
105 def test_schedule_generation(self):
106 holidays_de = DE()
107 self.assertEqual(Schedule(datetime(2020, 8, 21), datetime(2021, 8, 21), Period(0, 3, 0), True, False,
108 RollConvention.UNADJUSTED, holidays_de).generate_dates(False),
109 [datetime(2020, 8, 21), datetime(2020, 11, 21), datetime(2021, 2, 21), datetime(2021, 5, 21),
110 datetime(2021, 8, 21)])
111 self.assertEqual(Schedule(datetime(2020, 8, 21), datetime(2021, 8, 21), Period(0, 3, 0), True, True,
112 RollConvention.UNADJUSTED, holidays_de).generate_dates(False),
113 [datetime(2020, 8, 21), datetime(2020, 11, 21), datetime(2021, 2, 21), datetime(2021, 5, 21),
114 datetime(2021, 8, 21)])
115 self.assertEqual(Schedule(datetime(2020, 8, 21), datetime(2021, 8, 21), Period(0, 3, 0), False, False,
116 RollConvention.UNADJUSTED, holidays_de).generate_dates(False),
117 [datetime(2020, 8, 21), datetime(2020, 11, 21), datetime(2021, 2, 21), datetime(2021, 5, 21),
118 datetime(2021, 8, 21)])
119 self.assertEqual(Schedule(datetime(2020, 8, 21), datetime(2021, 8, 21), Period(0, 3, 0), False, True,
120 RollConvention.UNADJUSTED, holidays_de).generate_dates(False),
121 [datetime(2020, 8, 21), datetime(2020, 11, 21), datetime(2021, 2, 21), datetime(2021, 5, 21),
122 datetime(2021, 8, 21)])
124 self.assertEqual(Schedule(datetime(2020, 8, 21), datetime(2021, 8, 21), Period(0, 5, 0), True, False,
125 RollConvention.UNADJUSTED, holidays_de).generate_dates(False),
126 [datetime(2020, 8, 21), datetime(2021, 3, 21), datetime(2021, 8, 21)])
127 self.assertEqual(Schedule(datetime(2020, 8, 21), datetime(2021, 8, 21), Period(0, 5, 0), True, True,
128 RollConvention.UNADJUSTED, holidays_de).generate_dates(False),
129 [datetime(2020, 8, 21), datetime(2020, 10, 21), datetime(2021, 3, 21), datetime(2021, 8, 21)])
130 self.assertEqual(Schedule(datetime(2020, 8, 21), datetime(2021, 8, 21), Period(0, 5, 0), False, False,
131 RollConvention.UNADJUSTED, holidays_de).generate_dates(False),
132 [datetime(2020, 8, 21), datetime(2021, 1, 21), datetime(2021, 8, 21)])
133 self.assertEqual(Schedule(datetime(2020, 8, 21), datetime(2021, 8, 21), Period(0, 5, 0), False, True,
134 RollConvention.UNADJUSTED, holidays_de).generate_dates(False),
135 [datetime(2020, 8, 21), datetime(2021, 1, 21), datetime(2021, 6, 21), datetime(2021, 8, 21)])
137 self.assertEqual(Schedule(datetime(2020, 8, 21), datetime(2021, 8, 21), Period(0, 3, 0), True, False,
138 RollConvention.MODIFIED_FOLLOWING, holidays_de).generate_dates(False),
139 [datetime(2020, 8, 21), datetime(2020, 11, 23), datetime(2021, 2, 22), datetime(2021, 5, 21),
140 datetime(2021, 8, 23)])
141 self.assertEqual(Schedule(datetime(2020, 8, 21), datetime(2021, 8, 21), Period(0, 3, 0), True, True,
142 RollConvention.MODIFIED_FOLLOWING, holidays_de).generate_dates(False),
143 [datetime(2020, 8, 21), datetime(2020, 11, 23), datetime(2021, 2, 22), datetime(2021, 5, 21),
144 datetime(2021, 8, 23)])
145 self.assertEqual(Schedule(datetime(2020, 8, 21), datetime(2021, 8, 21), Period(0, 3, 0), False, False,
146 RollConvention.MODIFIED_FOLLOWING, holidays_de).generate_dates(False),
147 [datetime(2020, 8, 21), datetime(2020, 11, 23), datetime(2021, 2, 22), datetime(2021, 5, 21),
148 datetime(2021, 8, 23)])
149 self.assertEqual(Schedule(datetime(2020, 8, 21), datetime(2021, 8, 21), Period(0, 3, 0), False, True,
150 RollConvention.MODIFIED_FOLLOWING, holidays_de).generate_dates(False),
151 [datetime(2020, 8, 21), datetime(2020, 11, 23), datetime(2021, 2, 22), datetime(2021, 5, 21),
152 datetime(2021, 8, 23)])
154 self.assertEqual(Schedule(datetime(2020, 8, 21), datetime(2021, 8, 21), Period(0, 5, 0), True, False,
155 RollConvention.MODIFIED_FOLLOWING, holidays_de).generate_dates(False),
156 [datetime(2020, 8, 21), datetime(2021, 3, 22), datetime(2021, 8, 23)])
157 self.assertEqual(Schedule(datetime(2020, 8, 21), datetime(2021, 8, 21), Period(0, 5, 0), True, True,
158 RollConvention.MODIFIED_FOLLOWING, holidays_de).generate_dates(False),
159 [datetime(2020, 8, 21), datetime(2020, 10, 21), datetime(2021, 3, 22), datetime(2021, 8, 23)])
160 self.assertEqual(Schedule(datetime(2020, 8, 21), datetime(2021, 8, 21), Period(0, 5, 0), False, False,
161 RollConvention.MODIFIED_FOLLOWING, holidays_de).generate_dates(False),
162 [datetime(2020, 8, 21), datetime(2021, 1, 21), datetime(2021, 8, 23)])
163 self.assertEqual(Schedule(datetime(2020, 8, 21), datetime(2021, 8, 21), Period(0, 5, 0), False, True,
164 RollConvention.MODIFIED_FOLLOWING, holidays_de).generate_dates(False),
165 [datetime(2020, 8, 21), datetime(2021, 1, 21), datetime(2021, 6, 21), datetime(2021, 8, 23)])
168if __name__ == '__main__':
169 main()