diff --git a/pandas/tests/indexes/multi/test_indexing.py b/pandas/tests/indexes/multi/test_indexing.py index 6bce89c520ce6..b6f131e5c1c9b 100644 --- a/pandas/tests/indexes/multi/test_indexing.py +++ b/pandas/tests/indexes/multi/test_indexing.py @@ -526,7 +526,7 @@ def test_get_loc_duplicates(self): xp = 0 assert rs == xp - with pytest.raises(KeyError): + with pytest.raises(KeyError, match="2"): index.get_loc(2) def test_get_loc_level(self): diff --git a/pandas/tests/indexes/multi/test_setops.py b/pandas/tests/indexes/multi/test_setops.py index e8d5baaef42d4..d5b29527ee08e 100644 --- a/pandas/tests/indexes/multi/test_setops.py +++ b/pandas/tests/indexes/multi/test_setops.py @@ -221,14 +221,12 @@ def test_difference_sort_incomparable(): tm.assert_index_equal(result, idx) -@pytest.mark.xfail(reason="Not implemented.") def test_difference_sort_incomparable_true(): - # TODO decide on True behaviour - # # sort=True, raises idx = pd.MultiIndex.from_product([[1, pd.Timestamp("2000"), 2], ["a", "b"]]) other = pd.MultiIndex.from_product([[3, pd.Timestamp("2000"), 4], ["c", "d"]]) - with pytest.raises(TypeError): + msg = "The 'sort' keyword only takes the values of None or False; True was passed." + with pytest.raises(ValueError, match=msg): idx.difference(other, sort=True) diff --git a/pandas/tests/indexes/period/test_indexing.py b/pandas/tests/indexes/period/test_indexing.py index c03c89f32f73e..9378a0ffc5f84 100644 --- a/pandas/tests/indexes/period/test_indexing.py +++ b/pandas/tests/indexes/period/test_indexing.py @@ -487,8 +487,15 @@ def test_get_indexer_mismatched_dtype_with_method(self, non_comparable_idx, meth other2 = other.astype(dtype) if dtype == "object" and isinstance(other, PeriodIndex): continue - # For object dtype we are liable to get a different exception message - with pytest.raises(TypeError): + # Two different error message patterns depending on dtypes + msg = "|".join( + re.escape(msg) + for msg in ( + f"Cannot compare dtypes {pi.dtype} and {other.dtype}", + " not supported between instances of ", + ) + ) + with pytest.raises(TypeError, match=msg): pi.get_indexer(other2, method=method) def test_get_indexer_non_unique(self): diff --git a/pandas/tests/indexes/test_common.py b/pandas/tests/indexes/test_common.py index dce2e0172556a..bc1295cc0a0ce 100644 --- a/pandas/tests/indexes/test_common.py +++ b/pandas/tests/indexes/test_common.py @@ -39,7 +39,11 @@ def test_droplevel(self, index): if isinstance(index.name, tuple) and level is index.name: # GH 21121 : droplevel with tuple name continue - with pytest.raises(ValueError): + msg = ( + "Cannot remove 1 levels from an index with 1 levels: at least one " + "level must be left." + ) + with pytest.raises(ValueError, match=msg): index.droplevel(level) for level in "wrong", ["wrong"]: @@ -77,7 +81,11 @@ def test_constructor_unwraps_index(self, index): # FutureWarning from non-tuple sequence of nd indexing @pytest.mark.filterwarnings("ignore::FutureWarning") def test_getitem_error(self, index, itm): - with pytest.raises(IndexError): + msg = r"index 101 is out of bounds for axis 0 with size [\d]+|" + re.escape( + "only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) " + "and integer or boolean arrays are valid indices" + ) + with pytest.raises(IndexError, match=msg): index[itm] def test_to_flat_index(self, index): @@ -249,7 +257,8 @@ def test_searchsorted_monotonic(self, index): assert expected_right == ssm_right else: # non-monotonic should raise. - with pytest.raises(ValueError): + msg = "index must be monotonic increasing or decreasing" + with pytest.raises(ValueError, match=msg): index._searchsorted_monotonic(value, side="left") def test_pickle(self, index): diff --git a/pandas/tests/indexes/test_numpy_compat.py b/pandas/tests/indexes/test_numpy_compat.py index 8bfb97ca494e6..47f7b7f37cf48 100644 --- a/pandas/tests/indexes/test_numpy_compat.py +++ b/pandas/tests/indexes/test_numpy_compat.py @@ -49,8 +49,7 @@ def test_numpy_ufuncs_basic(index, func): # https://numpy.org/doc/stable/reference/ufuncs.html if isinstance(index, DatetimeIndexOpsMixin): - # raise TypeError or ValueError (PeriodIndex) - with pytest.raises(Exception): + with tm.external_error_raised((TypeError, AttributeError)): with np.errstate(all="ignore"): func(index) elif isinstance(index, (Float64Index, Int64Index, UInt64Index)): @@ -66,7 +65,7 @@ def test_numpy_ufuncs_basic(index, func): if len(index) == 0: pass else: - with pytest.raises(Exception): + with tm.external_error_raised((TypeError, AttributeError)): with np.errstate(all="ignore"): func(index) @@ -77,7 +76,6 @@ def test_numpy_ufuncs_basic(index, func): def test_numpy_ufuncs_other(index, func, request): # test ufuncs of numpy, see: # https://numpy.org/doc/stable/reference/ufuncs.html - if isinstance(index, (DatetimeIndex, TimedeltaIndex)): if isinstance(index, DatetimeIndex) and index.tz is not None: if func in [np.isfinite, np.isnan, np.isinf]: @@ -96,13 +94,11 @@ def test_numpy_ufuncs_other(index, func, request): result = func(index) assert isinstance(result, np.ndarray) else: - # raise TypeError or ValueError (PeriodIndex) - with pytest.raises(Exception): + with tm.external_error_raised(TypeError): func(index) elif isinstance(index, PeriodIndex): - # raise TypeError or ValueError (PeriodIndex) - with pytest.raises(Exception): + with tm.external_error_raised(TypeError): func(index) elif isinstance(index, (Float64Index, Int64Index, UInt64Index)): @@ -114,5 +110,5 @@ def test_numpy_ufuncs_other(index, func, request): if len(index) == 0: pass else: - with pytest.raises(Exception): + with tm.external_error_raised(TypeError): func(index)