diff --git a/tests/test_financial.py b/tests/test_financial.py index ad01952..920a060 100644 --- a/tests/test_financial.py +++ b/tests/test_financial.py @@ -90,13 +90,27 @@ def test_decimal_with_when(self): class TestPV: - def test_pv(self): - assert_almost_equal(npf.pv(0.07, 20, 12000, 0), -127128.17, 2) - - def test_pv_decimal(self): - assert_equal(npf.pv(Decimal('0.07'), Decimal('20'), Decimal('12000'), - Decimal('0')), - Decimal('-127128.1709461939327295222005')) + @pytest.mark.parametrize("rate, periods, payments, future_value, exp_result", [ + (0.07, 20, 0, 12000, -3101.0280337664), + (0.025, 4, 0, 1000, -905.9506447998), + (-0.07, 56, 0, 1200000, -69845129.5182595000), + (0.05, 20, 0, -12000, 4522.6737944760), + (0.05, 356.5288568, 0, -25000.00, 0.0006971776), + (0.05, 50, 0, 0, 0.0000000000), + (0.05, 26, 500, 0, -7187.5926504975), + ]) + @pytest.mark.parametrize('number_type', [float, Decimal]) + def test_pv(self, rate, periods, payments, future_value, exp_result, number_type): + result = npf.pv(rate, periods, payments, future_value) + + if exp_result is not numpy.nan: + if number_type is Decimal: + assert result == pytest.approx(exp_result, rel=0.2) + else: + assert_allclose(float(result), float( + exp_result), atol=1e-10) + else: + assert numpy.isnan(result) class TestRate: @@ -279,6 +293,7 @@ def test_mirr(self, values, finance_rate, reinvest_rate, expected): ) def test_mirr_decimal(self, number_type, args, expected): values = [number_type(v) for v in args['values']] + result = npf.mirr( values, number_type(args['finance_rate']), @@ -721,7 +736,8 @@ def test_gh_39(self): def test_gh_44(self): # "true" value as calculated by Google sheets - cf = [-1678.87, 771.96, 1814.05, 3520.30, 3552.95, 3584.99, 4789.91, -1] + cf = [-1678.87, 771.96, 1814.05, 3520.30, + 3552.95, 3584.99, 4789.91, -1] assert_almost_equal(npf.irr(cf), 1.00426, 4) def test_irr_no_real_solution_exception(self):