Skip to content

Commit d1ee9d4

Browse files
committed
TST: Improve testing for rate returning NaN
* Add more descriptive test name * Reduce code duplication by parametrizing tests * Test that Decimal inputs return a decimal NaN * Reduce linelength to be <80 chars
1 parent 8272b59 commit d1ee9d4

File tree

1 file changed

+20
-28
lines changed

1 file changed

+20
-28
lines changed

numpy_financial/tests/test_financial.py

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
from numpy.testing import (
88
assert_, assert_almost_equal, assert_allclose, assert_equal, assert_raises
99
)
10+
import pytest
1011

1112
import numpy_financial as npf
12-
import pytest
1313

1414

1515
class TestFinancial(object):
@@ -23,6 +23,25 @@ def test_npv_irr_congruence(self):
2323
def test_rate(self):
2424
assert_almost_equal(npf.rate(10, 0, -3500, 10000), 0.1107, 4)
2525

26+
@pytest.mark.parametrize('number_type', [Decimal, float])
27+
@pytest.mark.parametrize('when', [0, 1, 'end', 'begin'])
28+
def test_rate_with_infeasible_solution(self, number_type, when):
29+
"""
30+
Test when no feasible rate can be found.
31+
32+
Rate will return NaN, if the Newton Raphson method cannot find a
33+
feasible rate within the required tolerance or number of iterations.
34+
This can occur if both `pmt` and `pv` have the same sign, as it is
35+
impossible to repay a loan by making further withdrawls.
36+
"""
37+
result = npf.rate(number_type(12.0),
38+
number_type(400.0),
39+
number_type(10000.0),
40+
number_type(5000.0),
41+
when=when)
42+
is_nan = Decimal.is_nan if number_type == Decimal else numpy.isnan
43+
assert is_nan(result)
44+
2645
def test_rate_decimal(self):
2746
rate = npf.rate(Decimal('10'), Decimal('0'), Decimal('-3500'),
2847
Decimal('10000'))
@@ -411,30 +430,3 @@ def test_broadcast_decimal(self):
411430
[Decimal('-74.998201'), Decimal('-75.62318601'),
412431
Decimal('-75.62318601'), Decimal('-76.88882405'),
413432
Decimal('-76.88882405')], 4)
414-
415-
@pytest.mark.parametrize('number_type', [Decimal, float])
416-
def test_rate_nan(self, number_type):
417-
"""
418-
Test for checking inputs whose output is NaN
419-
Rate will return NaN, if newton raphson method's change or diff was not able to become
420-
less than default tolerance value i.e. 1e-6 in max iterations possible,
421-
Both payments and present value are positive, it is impossible to pay off the existing balance
422-
by making further withdrawals, regardless of the rate.
423-
"""
424-
rate = npf.rate(number_type(12.0), number_type(400), number_type(10000.0), number_type(0))
425-
assert_equal(numpy.nan, float(rate))
426-
rate = npf.rate(number_type(12.0), number_type(400), number_type(10000.0), number_type(5000))
427-
assert_equal(numpy.nan, float(rate))
428-
429-
# begin
430-
rate = npf.rate(number_type(12.0), number_type(400), number_type(10000.0), number_type(20000), 1)
431-
assert_equal(numpy.nan, float(rate))
432-
rate = npf.rate(number_type(12.0), number_type(400), number_type(10000.0), number_type(20000), 'begin')
433-
assert_equal(numpy.nan, float(rate))
434-
435-
# end
436-
rate = npf.rate(number_type(12.0), number_type(400), number_type(10000.0), number_type(0))
437-
assert_equal(numpy.nan, float(rate))
438-
rate = npf.rate(number_type(12.0), number_type(400), number_type(10000.0), number_type(0), 'end')
439-
assert_equal(numpy.nan, float(rate))
440-

0 commit comments

Comments
 (0)