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

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 

6 

7class DayCounterTests(TestCase): 

8 

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) 

15 

16class Unit_Tests(TestCase): 

17 

18 def test_roll_day(self): 

19 holidays_de = DE() 

20 

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)) 

26 

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)) 

31 

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)) 

39 

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)) 

47 

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)) 

57 

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)) 

66 

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)) 

74 

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)) 

81 

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)) 

104 

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)]) 

123 

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)]) 

136 

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)]) 

153 

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)]) 

166 

167 

168if __name__ == '__main__': 

169 main()