You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
2.7 KiB

6 months ago
import pytest
from pandas.errors import (
AbstractMethodError,
UndefinedVariableError,
)
import pandas as pd
@pytest.mark.parametrize(
"exc",
[
"AttributeConflictWarning",
"CSSWarning",
"CategoricalConversionWarning",
"ClosedFileError",
"DataError",
"DatabaseError",
"DtypeWarning",
"EmptyDataError",
"IncompatibilityWarning",
"IndexingError",
"InvalidColumnName",
"InvalidComparison",
"InvalidVersion",
"LossySetitemError",
"MergeError",
"NoBufferPresent",
"NumExprClobberingError",
"NumbaUtilError",
"OptionError",
"OutOfBoundsDatetime",
"ParserError",
"ParserWarning",
"PerformanceWarning",
"PossibleDataLossError",
"PossiblePrecisionLoss",
"PyperclipException",
"SettingWithCopyError",
"SettingWithCopyWarning",
"SpecificationError",
"UnsortedIndexError",
"UnsupportedFunctionCall",
"ValueLabelTypeMismatch",
],
)
def test_exception_importable(exc):
from pandas import errors
err = getattr(errors, exc)
assert err is not None
# check that we can raise on them
msg = "^$"
with pytest.raises(err, match=msg):
raise err()
def test_catch_oob():
from pandas import errors
msg = "Cannot cast 1500-01-01 00:00:00 to unit='ns' without overflow"
with pytest.raises(errors.OutOfBoundsDatetime, match=msg):
pd.Timestamp("15000101").as_unit("ns")
@pytest.mark.parametrize(
"is_local",
[
True,
False,
],
)
def test_catch_undefined_variable_error(is_local):
variable_name = "x"
if is_local:
msg = f"local variable '{variable_name}' is not defined"
else:
msg = f"name '{variable_name}' is not defined"
with pytest.raises(UndefinedVariableError, match=msg):
raise UndefinedVariableError(variable_name, is_local)
class Foo:
@classmethod
def classmethod(cls):
raise AbstractMethodError(cls, methodtype="classmethod")
@property
def property(self):
raise AbstractMethodError(self, methodtype="property")
def method(self):
raise AbstractMethodError(self)
def test_AbstractMethodError_classmethod():
xpr = "This classmethod must be defined in the concrete class Foo"
with pytest.raises(AbstractMethodError, match=xpr):
Foo.classmethod()
xpr = "This property must be defined in the concrete class Foo"
with pytest.raises(AbstractMethodError, match=xpr):
Foo().property
xpr = "This method must be defined in the concrete class Foo"
with pytest.raises(AbstractMethodError, match=xpr):
Foo().method()