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
« 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)
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])
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
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])
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)
67if __name__ == "__main__":
68 unittest.main()