Coverage for tests / test_components.py: 98%

51 statements  

« prev     ^ index     » next       coverage.py v7.12.0, created at 2025-11-27 14:36 +0000

1from unittest import main, TestCase 

2import unittest 

3import rivapy 

4from rivapy.tools.datetools import DayCounter, Schedule, _term_to_period 

5from rivapy.tools.enums import RollConvention, SecuritizationLevel, DayCounterType, Currency 

6from rivapy.instruments._logger import logger 

7from datetime import date, datetime 

8from rivapy.instruments.components import ( 

9 AmortizationScheme, 

10 ConstNotionalStructure, 

11 LinearNotionalStructure, 

12 ZeroAmortizationScheme, 

13 LinearAmortizationScheme, 

14 VariableAmortizationScheme, 

15) 

16 

17 

18class ComponentsTests(TestCase): 

19 amort_scheme = ZeroAmortizationScheme() 

20 amort_scheme_lin = LinearAmortizationScheme(80, 2) 

21 amort_scheme_var = VariableAmortizationScheme([30, 50, 20], [1, 2, 3]) 

22 

23 def test_amortization(self): 

24 self.assertEqual(ComponentsTests.amort_scheme.get_total_amortization(), 0.0) 

25 self.assertEqual(ComponentsTests.amort_scheme._total_amortization, 0.0) 

26 self.assertEqual(ComponentsTests.amort_scheme_lin.get_total_amortization(), 80.0) 

27 self.assertEqual(ComponentsTests.amort_scheme_lin.total_amortization, 80) 

28 self.assertEqual(ComponentsTests.amort_scheme_lin._n_steps, 2) 

29 with self.assertRaises(ValueError): 

30 LinearAmortizationScheme(105, 2) # negative amortization not allowed 

31 self.assertEqual(ComponentsTests.amort_scheme_var.get_total_amortization(), 100.0) 

32 self.assertEqual(ComponentsTests.amort_scheme_var._amortization_amounts, [30, 50, 20]) 

33 self.assertEqual(ComponentsTests.amort_scheme_var._terms, [1, 2, 3]) 

34 self.assertEqual(ComponentsTests.amort_scheme_var.get_nr_of_amortization_steps(), 3) 

35 with self.assertRaises(ValueError): 

36 VariableAmortizationScheme([60, 50], [1, 2]) # sum > 100 not allowed 

37 

38 def test_notional_structures(self): 

39 notional_const = ConstNotionalStructure(1000000) 

40 date = datetime(2025, 1, 1) 

41 self.assertEqual(notional_const.notional, [1000000]) 

42 self.assertEqual(notional_const.get_amount(5), 1000000) 

43 self.assertEqual(notional_const.get_amount_per_date(date), 1000000) 

44 self.assertEqual(notional_const.get_size(), 1) 

45 self.assertEqual(notional_const.get_amortizations_by_index(), [(1, 1000000)]) 

46 self.assertEqual(notional_const.get_amortization_schedule(), []) 

47 with self.assertLogs(logger, level="ERROR") as cm: 

48 result = notional_const.get_amortization_schedule() 

49 # assertLogs returns a list of formatted log messages in cm.output 

50 self.assertIn("End dates of notional structure are not set.", cm.output[0]) 

51 

52 notional_lin = LinearNotionalStructure(1000000, 500000, 5) 

53 self.assertEqual(notional_lin._start_notional, 1000000) 

54 self.assertEqual(notional_lin._end_notional, 500000) 

55 self.assertEqual(notional_lin._n_steps, 5) 

56 self.assertEqual(notional_lin.notional, [1000000.0, 875000.0, 750000.0, 625000.0, 500000.0]) 

57 self.assertEqual(notional_lin.get_amount(4), 500000) 

58 self.assertEqual(notional_lin.get_size(), 5) 

59 self.assertEqual(notional_lin.get_amortizations_by_index(), [(1, 125000.0), (2, 125000.0), (3, 125000.0), (4, 125000.0)]) 

60 with self.assertLogs(logger, level="ERROR") as cm: 

61 result = notional_lin.get_amortization_schedule() 

62 # assertLogs returns a list of formatted log messages in cm.output 

63 self.assertIn("End dates of notional structure are not set.", cm.output[0]) 

64 # self.assertIsNone(result) 

65 

66 

67if __name__ == "__main__": 

68 unittest.main()