Skip to content

Commit 83759c8

Browse files
committed
TST: Refactor hypothesis strategies
These were outdated and still referred to facts used by numba. Also moved into strategies into their own file. However, the biggest change is that we now only test nicely behaved (no nan,infinities or subnormal) numbers
1 parent 87a4ea7 commit 83759c8

File tree

2 files changed

+48
-49
lines changed

2 files changed

+48
-49
lines changed

numpy_financial/tests/strategies.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import numpy as np
2+
from hypothesis import strategies as st
3+
from hypothesis.extra import numpy as npst
4+
5+
real_scalar_dtypes = st.one_of(
6+
npst.floating_dtypes(),
7+
npst.integer_dtypes(),
8+
npst.unsigned_integer_dtypes()
9+
)
10+
nicely_behaved_doubles = npst.from_dtype(
11+
np.dtype("f8"),
12+
allow_nan=False,
13+
allow_infinity=False,
14+
allow_subnormal=False,
15+
)
16+
cashflow_array_strategy = npst.arrays(
17+
dtype=npst.floating_dtypes(sizes=64),
18+
shape=npst.array_shapes(min_dims=1, max_dims=2, min_side=0, max_side=25),
19+
elements=nicely_behaved_doubles,
20+
)
21+
cashflow_list_strategy = cashflow_array_strategy.map(lambda x: x.tolist())
22+
cashflow_array_like_strategy = st.one_of(
23+
cashflow_array_strategy,
24+
cashflow_list_strategy,
25+
)
26+
short_nicely_behaved_doubles = npst.arrays(
27+
dtype=npst.floating_dtypes(sizes=64),
28+
shape=npst.array_shapes(min_dims=0, max_dims=1, min_side=0, max_side=5),
29+
elements=nicely_behaved_doubles,
30+
)
31+
32+
when_strategy = st.sampled_from(
33+
['end', 'begin', 'e', 'b', 0, 1, 'beginning', 'start', 'finish']
34+
)

numpy_financial/tests/test_financial.py

Lines changed: 14 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
import math
22
from decimal import Decimal
33

4-
import hypothesis.extra.numpy as npst
5-
import hypothesis.strategies as st
6-
74
# Don't use 'import numpy as np', to avoid accidentally testing
85
# the versions in numpy instead of numpy_financial.
96
import numpy
107
import pytest
11-
from hypothesis import assume, given, settings
8+
from hypothesis import assume, given
129
from numpy.testing import (
1310
assert_,
1411
assert_allclose,
@@ -17,42 +14,11 @@
1714
)
1815

1916
import numpy_financial as npf
20-
21-
22-
def float_dtype():
23-
return npst.floating_dtypes(sizes=[32, 64], endianness="<")
24-
25-
26-
def int_dtype():
27-
return npst.integer_dtypes(sizes=[32, 64], endianness="<")
28-
29-
30-
def uint_dtype():
31-
return npst.unsigned_integer_dtypes(sizes=[32, 64], endianness="<")
32-
33-
34-
real_scalar_dtypes = st.one_of(float_dtype(), int_dtype(), uint_dtype())
35-
36-
37-
cashflow_array_strategy = npst.arrays(
38-
dtype=real_scalar_dtypes,
39-
shape=npst.array_shapes(min_dims=1, max_dims=2, min_side=0, max_side=25),
40-
)
41-
cashflow_list_strategy = cashflow_array_strategy.map(lambda x: x.tolist())
42-
43-
cashflow_array_like_strategy = st.one_of(
17+
from numpy_financial.tests.strategies import (
4418
cashflow_array_strategy,
45-
cashflow_list_strategy,
46-
)
47-
48-
short_scalar_array_strategy = npst.arrays(
49-
dtype=real_scalar_dtypes,
50-
shape=npst.array_shapes(min_dims=0, max_dims=1, min_side=0, max_side=5),
51-
)
52-
53-
54-
when_strategy = st.sampled_from(
55-
['end', 'begin', 'e', 'b', 0, 1, 'beginning', 'start', 'finish']
19+
cashflow_array_like_strategy,
20+
short_nicely_behaved_doubles,
21+
when_strategy,
5622
)
5723

5824

@@ -285,8 +251,7 @@ def test_npv(self):
285251
rtol=1e-2,
286252
)
287253

288-
@given(rates=short_scalar_array_strategy, values=cashflow_array_strategy)
289-
@settings(deadline=None)
254+
@given(rates=short_nicely_behaved_doubles, values=cashflow_array_strategy)
290255
def test_fuzz(self, rates, values):
291256
npf.npv(rates, values)
292257

@@ -421,17 +386,17 @@ def test_mirr_no_real_solution_exception(self):
421386

422387
@given(
423388
values=cashflow_array_like_strategy,
424-
finance_rate=short_scalar_array_strategy,
425-
reinvestment_rate=short_scalar_array_strategy,
389+
finance_rate=short_nicely_behaved_doubles,
390+
reinvestment_rate=short_nicely_behaved_doubles,
426391
)
427392
def test_fuzz(self, values, finance_rate, reinvestment_rate):
428393
assume(finance_rate.size == reinvestment_rate.size)
429394
npf.mirr(values, finance_rate, reinvestment_rate)
430395

431396
@given(
432397
values=cashflow_array_like_strategy,
433-
finance_rate=short_scalar_array_strategy,
434-
reinvestment_rate=short_scalar_array_strategy,
398+
finance_rate=short_nicely_behaved_doubles,
399+
reinvestment_rate=short_nicely_behaved_doubles,
435400
)
436401
def test_mismatching_rates_raise(self, values, finance_rate, reinvestment_rate):
437402
assume(finance_rate.size != reinvestment_rate.size)
@@ -468,10 +433,10 @@ def test_broadcast(self):
468433
)
469434

470435
@given(
471-
rates=short_scalar_array_strategy,
472-
payments=short_scalar_array_strategy,
473-
present_values=short_scalar_array_strategy,
474-
future_values=short_scalar_array_strategy,
436+
rates=short_nicely_behaved_doubles,
437+
payments=short_nicely_behaved_doubles,
438+
present_values=short_nicely_behaved_doubles,
439+
future_values=short_nicely_behaved_doubles,
475440
whens=when_strategy,
476441
)
477442
def test_fuzz(self, rates, payments, present_values, future_values, whens):

0 commit comments

Comments
 (0)