Skip to content

Commit

Permalink
Fixes #1503 no longer collapse false explanations
Browse files Browse the repository at this point in the history
  • Loading branch information
tomviner committed Jun 24, 2016
1 parent 6359e75 commit e30ec79
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 47 deletions.
12 changes: 12 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -27,19 +27,31 @@
Thanks `@Vogtinator`_ for reporting. Thanks to `@RedBeardCode`_ and
`@tomviner`_ for PR.

* Always include full assertion explanation. The previous behaviour was hiding
sub-expressions that happened to be False, assuming this was redundant information.
Thanks `@bagerard`_ for reporting (`#1503`_). Thanks to `@davehunt`_ and
`@tomviner`_ for PR.

*

*

*

.. _#1580: https://github.com/pytest-dev/pytest/pull/1580
.. _#1605: https://github.com/pytest-dev/pytest/issues/1605
.. _#1597: https://github.com/pytest-dev/pytest/pull/1597
.. _#460: https://github.com/pytest-dev/pytest/pull/460
.. _#1553: https://github.com/pytest-dev/pytest/issues/1553
.. _#1503: https://github.com/pytest-dev/pytest/issues/1503

.. _@graingert: https://github.com/graingert
.. _@taschini: https://github.com/taschini
.. _@nikratio: https://github.com/nikratio
.. _@RedBeardCode: https://github.com/RedBeardCode
.. _@Vogtinator: https://github.com/Vogtinator
.. _@bagerard: https://github.com/bagerard
.. _@davehunt: https://github.com/davehunt


2.9.2
Expand Down
33 changes: 0 additions & 33 deletions _pytest/assertion/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,44 +38,11 @@ def format_explanation(explanation):
displaying diffs.
"""
explanation = ecu(explanation)
explanation = _collapse_false(explanation)
lines = _split_explanation(explanation)
result = _format_lines(lines)
return u('\n').join(result)


def _collapse_false(explanation):
"""Collapse expansions of False
So this strips out any "assert False\n{where False = ...\n}"
blocks.
"""
where = 0
while True:
start = where = explanation.find("False\n{False = ", where)
if where == -1:
break
level = 0
prev_c = explanation[start]
for i, c in enumerate(explanation[start:]):
if prev_c + c == "\n{":
level += 1
elif prev_c + c == "\n}":
level -= 1
if not level:
break
prev_c = c
else:
raise AssertionError("unbalanced braces: %r" % (explanation,))
end = start + i
where = end
if explanation[end - 1] == '\n':
explanation = (explanation[:start] + explanation[start+15:end-1] +
explanation[end+1:])
where -= 17
return explanation


def _split_explanation(explanation):
"""Return a list of individual lines in the explanation
Expand Down
34 changes: 20 additions & 14 deletions testing/test_assertrewrite.py
Original file line number Diff line number Diff line change
Expand Up @@ -213,10 +213,12 @@ def x():
return False
def f():
assert x() and x()
assert getmsg(f, {"x" : x}) == "assert (x())"
assert getmsg(f, {"x" : x}) == """assert (False)
+ where False = x()"""
def f():
assert False or x()
assert getmsg(f, {"x" : x}) == "assert (False or x())"
assert getmsg(f, {"x" : x}) == """assert (False or False)
+ where False = x()"""
def f():
assert 1 in {} and 2 in {}
assert getmsg(f) == "assert (1 in {})"
Expand Down Expand Up @@ -299,27 +301,34 @@ def g(a=42, *args, **kwargs):
ns = {"g" : g}
def f():
assert g()
assert getmsg(f, ns) == """assert g()"""
assert getmsg(f, ns) == """assert False
+ where False = g()"""
def f():
assert g(1)
assert getmsg(f, ns) == """assert g(1)"""
assert getmsg(f, ns) == """assert False
+ where False = g(1)"""
def f():
assert g(1, 2)
assert getmsg(f, ns) == """assert g(1, 2)"""
assert getmsg(f, ns) == """assert False
+ where False = g(1, 2)"""
def f():
assert g(1, g=42)
assert getmsg(f, ns) == """assert g(1, g=42)"""
assert getmsg(f, ns) == """assert False
+ where False = g(1, g=42)"""
def f():
assert g(1, 3, g=23)
assert getmsg(f, ns) == """assert g(1, 3, g=23)"""
assert getmsg(f, ns) == """assert False
+ where False = g(1, 3, g=23)"""
def f():
seq = [1, 2, 3]
assert g(*seq)
assert getmsg(f, ns) == """assert g(*[1, 2, 3])"""
assert getmsg(f, ns) == """assert False
+ where False = g(*[1, 2, 3])"""
def f():
x = "a"
assert g(**{x : 2})
assert getmsg(f, ns) == """assert g(**{'a': 2})"""
assert getmsg(f, ns) == """assert False
+ where False = g(**{'a': 2})"""

def test_attribute(self):
class X(object):
Expand All @@ -332,7 +341,8 @@ def f():
def f():
x.a = False # noqa
assert x.a # noqa
assert getmsg(f, ns) == """assert x.a"""
assert getmsg(f, ns) == """assert False
+ where False = x.a"""

def test_comparisons(self):
def f():
Expand Down Expand Up @@ -710,7 +720,3 @@ def test_long_repr():
""")
result = testdir.runpytest()
assert 'unbalanced braces' not in result.stdout.str()


def test_collapse_false_unbalanced_braces():
util._collapse_false('some text{ False\n{False = some more text\n}')

0 comments on commit e30ec79

Please sign in to comment.