Skip to content

Commit ef4a36f

Browse files
add test for fillna
1 parent fa063bf commit ef4a36f

File tree

7 files changed

+74
-0
lines changed

7 files changed

+74
-0
lines changed

pandas/tests/extension/base/missing.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,20 @@ def test_fillna_no_op_returns_copy(self, data):
122122
assert result is not data
123123
tm.assert_extension_array_equal(result, data)
124124

125+
def test_fillna_readonly(self, data_missing):
126+
data = data_missing.copy()
127+
data._readonly = True
128+
129+
# by default copy=True, then this works fine
130+
result = data.fillna(data_missing[1])
131+
assert result[0] == data_missing[1]
132+
tm.assert_extension_array_equal(data, data_missing)
133+
134+
# but with copy=False, this raises for EAs that respect the copy keyword
135+
with pytest.raises(ValueError, match="Cannot modify read-only array"):
136+
data.fillna(data_missing[1], copy=False)
137+
tm.assert_extension_array_equal(data, data_missing)
138+
125139
def test_fillna_series(self, data_missing):
126140
fill_value = data_missing[1]
127141
ser = pd.Series(data_missing)

pandas/tests/extension/decimal/test_decimal.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,10 @@ def test_fillna_limit_series(self, data_missing):
171171
):
172172
super().test_fillna_limit_series(data_missing)
173173

174+
@pytest.mark.xfail(reason="copy keyword is missing")
175+
def test_fillna_readonly(self, data_missing):
176+
super().test_fillna_readonly(data_missing)
177+
174178
def test_series_repr(self, data):
175179
# Overriding this base test to explicitly test that
176180
# the custom _formatter is used

pandas/tests/extension/test_arrow.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -687,6 +687,21 @@ def test_fillna_no_op_returns_copy(self, data):
687687
assert result is not data
688688
tm.assert_extension_array_equal(result, data)
689689

690+
def test_fillna_readonly(self, data_missing):
691+
data = data_missing.copy()
692+
data._readonly = True
693+
694+
# by default copy=True, then this works fine
695+
result = data.fillna(data_missing[1])
696+
assert result[0] == data_missing[1]
697+
tm.assert_extension_array_equal(data, data_missing)
698+
699+
# copy=False is generally not honored by ArrowExtensionArray, always
700+
# returns new data -> same result as above
701+
result = data.fillna(data_missing[1])
702+
assert result[0] == data_missing[1]
703+
tm.assert_extension_array_equal(data, data_missing)
704+
690705
@pytest.mark.xfail(
691706
reason="GH 45419: pyarrow.ChunkedArray does not support views", run=False
692707
)

pandas/tests/extension/test_interval.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ def test_fillna_limit_series(self, data_missing):
100100
def test_fillna_length_mismatch(self, data_missing):
101101
super().test_fillna_length_mismatch(data_missing)
102102

103+
@pytest.mark.xfail(reason="copy=False is not Implemented")
104+
def test_fillna_readonly(self, data_missing):
105+
super().test_fillna_readonly(data_missing)
106+
103107
@pytest.mark.filterwarnings(
104108
"ignore:invalid value encountered in cast:RuntimeWarning"
105109
)

pandas/tests/extension/test_numpy.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,11 @@ def test_fillna_frame(self, data_missing):
342342
# Non-scalar "scalar" values.
343343
super().test_fillna_frame(data_missing)
344344

345+
@skip_nested
346+
def test_fillna_readonly(self, data_missing):
347+
# Non-scalar "scalar" values.
348+
super().test_fillna_readonly(data_missing)
349+
345350
@skip_nested
346351
def test_setitem_invalid(self, data, invalid_scalar):
347352
# object dtype can hold anything, so doesn't raise

pandas/tests/extension/test_sparse.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,19 @@ def test_isna(self, data_missing):
237237
def test_fillna_no_op_returns_copy(self, data, request):
238238
super().test_fillna_no_op_returns_copy(data)
239239

240+
def test_fillna_readonly(self, data_missing):
241+
# copy=False keyword is not ignored by SparseArray.fillna
242+
data = data_missing.copy()
243+
data._readonly = True
244+
245+
# by default copy=True, then this works fine
246+
result = data.fillna(data_missing[1])
247+
assert result[0] == data_missing[1]
248+
249+
# copy=False is ignored -> so same result as above
250+
result = data.fillna(data_missing[1], copy=False)
251+
assert result[0] == data_missing[1]
252+
240253
@pytest.mark.xfail(reason="Unsupported")
241254
def test_fillna_series(self, data_missing):
242255
# this one looks doable.

pandas/tests/extension/test_string.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,25 @@ def test_fillna_no_op_returns_copy(self, data):
169169
assert result is not data
170170
tm.assert_extension_array_equal(result, data)
171171

172+
def test_fillna_readonly(self, data_missing):
173+
data = data_missing.copy()
174+
data._readonly = True
175+
176+
# by default copy=True, then this works fine
177+
result = data.fillna(data_missing[1])
178+
assert result[0] == data_missing[1]
179+
tm.assert_extension_array_equal(data, data_missing)
180+
181+
# copy=False is generally not honored by Arrow-backed array, always
182+
# returns new data -> same result as above
183+
if data.dtype.storage == "pyarrow":
184+
result = data.fillna(data_missing[1])
185+
assert result[0] == data_missing[1]
186+
else:
187+
with pytest.raises(ValueError, match="Cannot modify read-only array"):
188+
data.fillna(data_missing[1], copy=False)
189+
tm.assert_extension_array_equal(data, data_missing)
190+
172191
def _get_expected_exception(
173192
self, op_name: str, obj, other
174193
) -> type[Exception] | tuple[type[Exception], ...] | None:

0 commit comments

Comments
 (0)