Skip to content

Commit eefd9fb

Browse files
committed
wrapper tests
1 parent 4e9ebed commit eefd9fb

File tree

4 files changed

+38
-5
lines changed

4 files changed

+38
-5
lines changed

pymatsolver/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@
6262

6363
# Simple solvers
6464
from .solvers import Diagonal, Triangle, Forward, Backward
65-
from .wrappers import WrapDirect
66-
from .wrappers import WrapIterative
65+
from .wrappers import wrap_direct, WrapDirect
66+
from .wrappers import wrap_iterative, WrapIterative
6767

6868
# Scipy Iterative solvers
6969
from .iterative import SolverCG

pymatsolver/wrappers.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@ def _valid_kwargs_for_func(func, **kwargs):
2828
sig.bind_partial(**{key: value})
2929
valid_kwargs[key] = value
3030
except TypeError:
31-
warnings.warn(f'Unused keyword argument "{key}" for {func.__name__}.', stacklevel=3)
31+
warnings.warn(f'Unused keyword argument "{key}" for {func.__name__}.', UserWarning, stacklevel=3)
3232
# stack level of three because we want the warning issued at the call
3333
# to the wrapped solver's `__init__` method.
3434
return valid_kwargs
3535

3636

37-
def WrapDirect(fun, factorize=True, name=None):
37+
def wrap_direct(fun, factorize=True, name=None):
3838
"""Wraps a direct Solver.
3939
4040
Parameters
@@ -121,6 +121,7 @@ def clean(self):
121121
"__init__": __init__,
122122
"_solve_single": _solve_single,
123123
"_solve_multiple": _solve_multiple,
124+
"kwargs": kwargs,
124125
"clean": clean,
125126
}
126127
)
@@ -146,7 +147,7 @@ def clean(self):
146147
return WrappedClass
147148

148149

149-
def WrapIterative(fun, check_accuracy=None, accuracy_tol=None, name=None):
150+
def wrap_iterative(fun, check_accuracy=None, accuracy_tol=None, name=None):
150151
"""
151152
Wraps an iterative Solver.
152153
@@ -229,6 +230,7 @@ def _solve_multiple(self, rhs):
229230
"__init__": __init__,
230231
"_solve_single": _solve_single,
231232
"_solve_multiple": _solve_multiple,
233+
"kwargs": kwargs,
232234
}
233235
)
234236
WrappedClass.__doc__ = f"""Wrapped {class_name} solver.
@@ -253,3 +255,6 @@ def _solve_multiple(self, rhs):
253255

254256
return WrappedClass
255257

258+
259+
WrapDirect = wrap_direct
260+
WrapIterative = wrap_iterative

tests/test_Basic.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ def _solve_single(self, rhs):
1515
def _solve_multiple(self, rhs):
1616
return rhs
1717

18+
def clean(self):
19+
# this is to test that the __del__ still executes if the object doesn't successfully clean.
20+
raise MemoryError("Nothing to cleanup!")
21+
1822
class NotTransposableIdentitySolver(IdentitySolver):
1923
""" A class that can't be transposed."""
2024

tests/test_Wrappers.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from pymatsolver import SolverCG, SolverLU
2+
import pytest
3+
import scipy.sparse as sp
4+
import warnings
5+
6+
7+
@pytest.mark.parametrize("solver_class", [SolverCG, SolverLU])
8+
def test_wrapper_unused_kwargs(solver_class):
9+
A = sp.eye(10)
10+
11+
with pytest.warns(UserWarning, match="Unused keyword argument.*"):
12+
solver_class(A, not_a_keyword_arg=True)
13+
14+
def test_good_arg_iterative():
15+
# Ensure this doesn't throw a warning!
16+
with warnings.catch_warnings():
17+
warnings.simplefilter("error")
18+
SolverCG(sp.eye(10), rtol=1e-4)
19+
20+
def test_good_arg_direct():
21+
# Ensure this doesn't throw a warning!
22+
with warnings.catch_warnings():
23+
warnings.simplefilter("error")
24+
SolverLU(sp.eye(10, format='csc'), permc_spec='NATURAL')

0 commit comments

Comments
 (0)