212 lines
6.6 KiB
Python
212 lines
6.6 KiB
Python
|
import warnings
|
||
|
|
||
|
from sympy.testing.pytest import (raises, warns, ignore_warnings,
|
||
|
warns_deprecated_sympy, Failed)
|
||
|
from sympy.utilities.exceptions import sympy_deprecation_warning
|
||
|
|
||
|
|
||
|
|
||
|
# Test callables
|
||
|
|
||
|
|
||
|
def test_expected_exception_is_silent_callable():
|
||
|
def f():
|
||
|
raise ValueError()
|
||
|
raises(ValueError, f)
|
||
|
|
||
|
|
||
|
# Under pytest raises will raise Failed rather than AssertionError
|
||
|
def test_lack_of_exception_triggers_AssertionError_callable():
|
||
|
try:
|
||
|
raises(Exception, lambda: 1 + 1)
|
||
|
assert False
|
||
|
except Failed as e:
|
||
|
assert "DID NOT RAISE" in str(e)
|
||
|
|
||
|
|
||
|
def test_unexpected_exception_is_passed_through_callable():
|
||
|
def f():
|
||
|
raise ValueError("some error message")
|
||
|
try:
|
||
|
raises(TypeError, f)
|
||
|
assert False
|
||
|
except ValueError as e:
|
||
|
assert str(e) == "some error message"
|
||
|
|
||
|
# Test with statement
|
||
|
|
||
|
def test_expected_exception_is_silent_with():
|
||
|
with raises(ValueError):
|
||
|
raise ValueError()
|
||
|
|
||
|
|
||
|
def test_lack_of_exception_triggers_AssertionError_with():
|
||
|
try:
|
||
|
with raises(Exception):
|
||
|
1 + 1
|
||
|
assert False
|
||
|
except Failed as e:
|
||
|
assert "DID NOT RAISE" in str(e)
|
||
|
|
||
|
|
||
|
def test_unexpected_exception_is_passed_through_with():
|
||
|
try:
|
||
|
with raises(TypeError):
|
||
|
raise ValueError("some error message")
|
||
|
assert False
|
||
|
except ValueError as e:
|
||
|
assert str(e) == "some error message"
|
||
|
|
||
|
# Now we can use raises() instead of try/catch
|
||
|
# to test that a specific exception class is raised
|
||
|
|
||
|
|
||
|
def test_second_argument_should_be_callable_or_string():
|
||
|
raises(TypeError, lambda: raises("irrelevant", 42))
|
||
|
|
||
|
|
||
|
def test_warns_catches_warning():
|
||
|
with warnings.catch_warnings(record=True) as w:
|
||
|
with warns(UserWarning):
|
||
|
warnings.warn('this is the warning message')
|
||
|
assert len(w) == 0
|
||
|
|
||
|
|
||
|
def test_warns_raises_without_warning():
|
||
|
with raises(Failed):
|
||
|
with warns(UserWarning):
|
||
|
pass
|
||
|
|
||
|
|
||
|
def test_warns_hides_other_warnings():
|
||
|
with raises(RuntimeWarning):
|
||
|
with warns(UserWarning):
|
||
|
warnings.warn('this is the warning message', UserWarning)
|
||
|
warnings.warn('this is the other message', RuntimeWarning)
|
||
|
|
||
|
|
||
|
def test_warns_continues_after_warning():
|
||
|
with warnings.catch_warnings(record=True) as w:
|
||
|
finished = False
|
||
|
with warns(UserWarning):
|
||
|
warnings.warn('this is the warning message')
|
||
|
finished = True
|
||
|
assert finished
|
||
|
assert len(w) == 0
|
||
|
|
||
|
|
||
|
def test_warns_many_warnings():
|
||
|
with warns(UserWarning):
|
||
|
warnings.warn('this is the warning message', UserWarning)
|
||
|
warnings.warn('this is the other warning message', UserWarning)
|
||
|
|
||
|
|
||
|
def test_warns_match_matching():
|
||
|
with warnings.catch_warnings(record=True) as w:
|
||
|
with warns(UserWarning, match='this is the warning message'):
|
||
|
warnings.warn('this is the warning message', UserWarning)
|
||
|
assert len(w) == 0
|
||
|
|
||
|
|
||
|
def test_warns_match_non_matching():
|
||
|
with warnings.catch_warnings(record=True) as w:
|
||
|
with raises(Failed):
|
||
|
with warns(UserWarning, match='this is the warning message'):
|
||
|
warnings.warn('this is not the expected warning message', UserWarning)
|
||
|
assert len(w) == 0
|
||
|
|
||
|
def _warn_sympy_deprecation(stacklevel=3):
|
||
|
sympy_deprecation_warning(
|
||
|
"feature",
|
||
|
active_deprecations_target="active-deprecations",
|
||
|
deprecated_since_version="0.0.0",
|
||
|
stacklevel=stacklevel,
|
||
|
)
|
||
|
|
||
|
def test_warns_deprecated_sympy_catches_warning():
|
||
|
with warnings.catch_warnings(record=True) as w:
|
||
|
with warns_deprecated_sympy():
|
||
|
_warn_sympy_deprecation()
|
||
|
assert len(w) == 0
|
||
|
|
||
|
|
||
|
def test_warns_deprecated_sympy_raises_without_warning():
|
||
|
with raises(Failed):
|
||
|
with warns_deprecated_sympy():
|
||
|
pass
|
||
|
|
||
|
def test_warns_deprecated_sympy_wrong_stacklevel():
|
||
|
with raises(Failed):
|
||
|
with warns_deprecated_sympy():
|
||
|
_warn_sympy_deprecation(stacklevel=1)
|
||
|
|
||
|
def test_warns_deprecated_sympy_doesnt_hide_other_warnings():
|
||
|
# Unlike pytest's deprecated_call, we should not hide other warnings.
|
||
|
with raises(RuntimeWarning):
|
||
|
with warns_deprecated_sympy():
|
||
|
_warn_sympy_deprecation()
|
||
|
warnings.warn('this is the other message', RuntimeWarning)
|
||
|
|
||
|
|
||
|
def test_warns_deprecated_sympy_continues_after_warning():
|
||
|
with warnings.catch_warnings(record=True) as w:
|
||
|
finished = False
|
||
|
with warns_deprecated_sympy():
|
||
|
_warn_sympy_deprecation()
|
||
|
finished = True
|
||
|
assert finished
|
||
|
assert len(w) == 0
|
||
|
|
||
|
def test_ignore_ignores_warning():
|
||
|
with warnings.catch_warnings(record=True) as w:
|
||
|
with ignore_warnings(UserWarning):
|
||
|
warnings.warn('this is the warning message')
|
||
|
assert len(w) == 0
|
||
|
|
||
|
|
||
|
def test_ignore_does_not_raise_without_warning():
|
||
|
with warnings.catch_warnings(record=True) as w:
|
||
|
with ignore_warnings(UserWarning):
|
||
|
pass
|
||
|
assert len(w) == 0
|
||
|
|
||
|
|
||
|
def test_ignore_allows_other_warnings():
|
||
|
with warnings.catch_warnings(record=True) as w:
|
||
|
# This is needed when pytest is run as -Werror
|
||
|
# the setting is reverted at the end of the catch_Warnings block.
|
||
|
warnings.simplefilter("always")
|
||
|
with ignore_warnings(UserWarning):
|
||
|
warnings.warn('this is the warning message', UserWarning)
|
||
|
warnings.warn('this is the other message', RuntimeWarning)
|
||
|
assert len(w) == 1
|
||
|
assert isinstance(w[0].message, RuntimeWarning)
|
||
|
assert str(w[0].message) == 'this is the other message'
|
||
|
|
||
|
|
||
|
def test_ignore_continues_after_warning():
|
||
|
with warnings.catch_warnings(record=True) as w:
|
||
|
finished = False
|
||
|
with ignore_warnings(UserWarning):
|
||
|
warnings.warn('this is the warning message')
|
||
|
finished = True
|
||
|
assert finished
|
||
|
assert len(w) == 0
|
||
|
|
||
|
|
||
|
def test_ignore_many_warnings():
|
||
|
with warnings.catch_warnings(record=True) as w:
|
||
|
# This is needed when pytest is run as -Werror
|
||
|
# the setting is reverted at the end of the catch_Warnings block.
|
||
|
warnings.simplefilter("always")
|
||
|
with ignore_warnings(UserWarning):
|
||
|
warnings.warn('this is the warning message', UserWarning)
|
||
|
warnings.warn('this is the other message', RuntimeWarning)
|
||
|
warnings.warn('this is the warning message', UserWarning)
|
||
|
warnings.warn('this is the other message', RuntimeWarning)
|
||
|
warnings.warn('this is the other message', RuntimeWarning)
|
||
|
assert len(w) == 3
|
||
|
for wi in w:
|
||
|
assert isinstance(wi.message, RuntimeWarning)
|
||
|
assert str(wi.message) == 'this is the other message'
|