Skip to content

Commit a256eff

Browse files
committed
TST: better assertion messages on test failures
CLN: pep8
1 parent ee0d3e4 commit a256eff

File tree

1 file changed

+58
-32
lines changed

1 file changed

+58
-32
lines changed

pandas/util/testing.py

Lines changed: 58 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ def set_trace():
8888

8989
#------------------------------------------------------------------------------
9090
# contextmanager to ensure the file cleanup
91+
92+
9193
@contextmanager
9294
def ensure_clean(filename=None):
9395
# if we are not passed a filename, generate a temporary
@@ -114,6 +116,8 @@ def get_data_path(f=''):
114116

115117
#------------------------------------------------------------------------------
116118
# Comparators
119+
120+
117121
def equalContents(arr1, arr2):
118122
"""Checks if the set of unique elements of arr1 and arr2 are equivalent.
119123
"""
@@ -127,6 +131,20 @@ def assert_isinstance(obj, class_type_or_tuple):
127131
type(obj), class_type_or_tuple))
128132

129133

134+
def assert_index_equal(left, right):
135+
assert left.equals(
136+
right), "[index] left [{0}], right [{0}]".format(left, right)
137+
138+
139+
def assert_attr_equal(attr, left, right):
140+
left_attr = getattr(left, attr, None)
141+
right_attr = getattr(right, attr, None)
142+
assert left_attr == right_attr, "[{0}] left [{1}], right [{2}]".format(
143+
attr,
144+
left_attr,
145+
right_attr)
146+
147+
130148
def isiterable(obj):
131149
return hasattr(obj, '__iter__')
132150

@@ -137,7 +155,7 @@ def assert_isinstance(obj, class_type_or_tuple):
137155
"Expected object to be of type %r, found %r instead" % (type(obj), class_type_or_tuple))
138156

139157

140-
def assert_almost_equal(a, b, check_less_precise = False):
158+
def assert_almost_equal(a, b, check_less_precise=False):
141159
if isinstance(a, dict) or isinstance(b, dict):
142160
return assert_dict_equal(a, b)
143161

@@ -212,18 +230,18 @@ def assert_series_equal(left, right, check_dtype=True,
212230
assert_isinstance(left, type(right))
213231
assert_almost_equal(left.values, right.values, check_less_precise)
214232
if check_dtype:
215-
assert(left.dtype == right.dtype)
233+
assert_attr_equal('dtype', left, right)
216234
if check_less_precise:
217-
assert_almost_equal(left.index.values, right.index.values, check_less_precise)
235+
assert_almost_equal(
236+
left.index.values, right.index.values, check_less_precise)
218237
else:
219-
assert(left.index.equals(right.index))
238+
assert_index_equal(left.index, right.index)
220239
if check_index_type:
221240
assert_isinstance(left.index, type(right.index))
222-
assert(left.index.dtype == right.index.dtype)
223-
assert(left.index.inferred_type == right.index.inferred_type)
241+
assert_attr_equal('dtype', left.index, right.index)
242+
assert_attr_equal('inferred_type', left.index, right.index)
224243
if check_index_freq:
225-
assert(getattr(left, 'freqstr', None) ==
226-
getattr(right, 'freqstr', None))
244+
assert_attr_equal('freqstr', left.index, right.index)
227245

228246

229247
def assert_frame_equal(left, right, check_dtype=True,
@@ -238,11 +256,11 @@ def assert_frame_equal(left, right, check_dtype=True,
238256
assert_isinstance(right, DataFrame)
239257

240258
if check_less_precise:
241-
assert_almost_equal(left.columns,right.columns)
242-
assert_almost_equal(left.index,right.index)
259+
assert_almost_equal(left.columns, right.columns)
260+
assert_almost_equal(left.index, right.index)
243261
else:
244-
assert(left.columns.equals(right.columns))
245-
assert(left.index.equals(right.index))
262+
assert_index_equal(left.columns, right.columns)
263+
assert_index_equal(left.index, right.index)
246264

247265
for i, col in enumerate(left.columns):
248266
assert(col in right)
@@ -255,15 +273,15 @@ def assert_frame_equal(left, right, check_dtype=True,
255273

256274
if check_index_type:
257275
assert_isinstance(left.index, type(right.index))
258-
assert(left.index.dtype == right.index.dtype)
259-
assert(left.index.inferred_type == right.index.inferred_type)
276+
assert_attr_equal('dtype', left.index, right.index)
277+
assert_attr_equal('inferred_type', left.index, right.index)
260278
if check_column_type:
261279
assert_isinstance(left.columns, type(right.columns))
262-
assert(left.columns.dtype == right.columns.dtype)
263-
assert(left.columns.inferred_type == right.columns.inferred_type)
280+
assert_attr_equal('dtype', left.columns, right.columns)
281+
assert_attr_equal('inferred_type', left.columns, right.columns)
264282
if check_names:
265-
assert(left.index.names == right.index.names)
266-
assert(left.columns.names == right.columns.names)
283+
assert_attr_equal('names', left.index, right.index)
284+
assert_attr_equal('names', left.columns, right.columns)
267285

268286

269287
def assert_panel_equal(left, right,
@@ -272,28 +290,30 @@ def assert_panel_equal(left, right,
272290
if check_panel_type:
273291
assert_isinstance(left, type(right))
274292

275-
assert(left.items.equals(right.items))
276-
assert(left.major_axis.equals(right.major_axis))
277-
assert(left.minor_axis.equals(right.minor_axis))
293+
for axis in ['items', 'major_axis', 'minor_axis']:
294+
assert_index_equal(
295+
getattr(left, axis, None), getattr(right, axis, None))
278296

279297
for col, series in compat.iteritems(left):
280298
assert(col in right)
281-
assert_frame_equal(series, right[col], check_less_precise=check_less_precise, check_names=False) # TODO strangely check_names fails in py3 ?
299+
# TODO strangely check_names fails in py3 ?
300+
assert_frame_equal(
301+
series, right[col], check_less_precise=check_less_precise, check_names=False)
282302

283303
for col in right:
284304
assert(col in left)
285305

286306

287307
def assert_panel4d_equal(left, right,
288308
check_less_precise=False):
289-
assert(left.labels.equals(right.labels))
290-
assert(left.items.equals(right.items))
291-
assert(left.major_axis.equals(right.major_axis))
292-
assert(left.minor_axis.equals(right.minor_axis))
309+
for axis in ['labels', 'items', 'major_axis', 'minor_axis']:
310+
assert_index_equal(
311+
getattr(left, axis, None), getattr(right, axis, None))
293312

294313
for col, series in compat.iteritems(left):
295314
assert(col in right)
296-
assert_panel_equal(series, right[col], check_less_precise=check_less_precise)
315+
assert_panel_equal(
316+
series, right[col], check_less_precise=check_less_precise)
297317

298318
for col in right:
299319
assert(col in left)
@@ -487,8 +507,8 @@ def makeCustomIndex(nentries, nlevels, prefix='#', names=False, ndupe_l=None,
487507
for i in range(nlevels):
488508
def keyfunc(x):
489509
import re
490-
numeric_tuple = re.sub("[^\d_]_?","",x).split("_")
491-
return lmap(int,numeric_tuple)
510+
numeric_tuple = re.sub("[^\d_]_?", "", x).split("_")
511+
return lmap(int, numeric_tuple)
492512

493513
# build a list of lists to create the index from
494514
div_factor = nentries // ndupe_l[i] + 1
@@ -604,6 +624,7 @@ def add_nans_panel4d(panel4d):
604624

605625

606626
class TestSubDict(dict):
627+
607628
def __init__(self, *args, **kwargs):
608629
dict.__init__(self, *args, **kwargs)
609630

@@ -677,6 +698,7 @@ def skip_if_no_package(*args, **kwargs):
677698
# Additional tags decorators for nose
678699
#
679700

701+
680702
def optional_args(decorator):
681703
"""allows a decorator to take optional positional and keyword arguments.
682704
Assumes that taking a single, callable, positional argument means that
@@ -705,6 +727,7 @@ def dec(f):
705727

706728
_network_error_classes = IOError, HTTPException
707729

730+
708731
@optional_args
709732
def network(t, raise_on_error=_RAISE_NETWORK_ERROR_DEFAULT,
710733
error_classes=_network_error_classes, num_runs=2):
@@ -796,9 +819,9 @@ def network_wrapper(*args, **kwargs):
796819
raise
797820
except Exception as e:
798821
if runs < num_runs:
799-
print("Failed: %r" % e)
822+
print("Failed: %r" % e)
800823
else:
801-
raise
824+
raise
802825

803826
runs += 1
804827

@@ -913,6 +936,7 @@ def wrapper(*args, **kwargs):
913936

914937

915938
class SimpleMock(object):
939+
916940
"""
917941
Poor man's mocking object
918942
@@ -926,6 +950,7 @@ class SimpleMock(object):
926950
>>> a.attr1 == "fizz" and a.attr2 == "buzz"
927951
True
928952
"""
953+
929954
def __init__(self, obj, *args, **kwds):
930955
assert(len(args) % 2 == 0)
931956
attrs = kwds.get("attrs", {})
@@ -1010,7 +1035,8 @@ def assertRaisesRegexp(exception, regexp, callable, *args, **kwargs):
10101035
raise AssertionError('"%s" does not match "%s"' %
10111036
(expected_regexp.pattern, str(e)))
10121037
else:
1013-
# Apparently some exceptions don't have a __name__ attribute? Just aping unittest library here
1038+
# Apparently some exceptions don't have a __name__ attribute? Just
1039+
# aping unittest library here
10141040
name = getattr(exception, "__name__", str(exception))
10151041
raise AssertionError("{0} not raised".format(name))
10161042

0 commit comments

Comments
 (0)