Fix collapse false to look at unescaped braces only

Sometimes the repr of an object can contain the "\n{" sequence which is
used as a formatting language, so they are escaped to "\\n{".  But the
collapse-false code needs to look for the real "\n{" token instead of
simply "{" as otherwise it may get unbalanced braces from the object's
repr (sometimes caused by the collapsing of long reprs by saferepr).

Fixes issue #731.

--HG--
branch : pytest-2.7
This commit is contained in:
Floris Bruynooghe 2015-04-30 02:31:12 +01:00
parent e94f5727c4
commit 7f554f50e3
3 changed files with 29 additions and 2 deletions

View File

@ -1,6 +1,10 @@
2.7.1.dev (compared to 2.7.0) 2.7.1.dev (compared to 2.7.0)
----------------------------- -----------------------------
- fix issue731: do not get confused by the braces which may be present
and unbalanced in an object's repr while collapsing False
explanations. Thanks Carl Meyer for the report and test case.
- fix issue553: properly handling inspect.getsourcelines failures in - fix issue553: properly handling inspect.getsourcelines failures in
FixtureLookupError which would lead to to an internal error, FixtureLookupError which would lead to to an internal error,
obfuscating the original problem. Thanks talljosh for initial obfuscating the original problem. Thanks talljosh for initial

View File

@ -45,13 +45,15 @@ def _collapse_false(explanation):
if where == -1: if where == -1:
break break
level = 0 level = 0
prev_c = explanation[start]
for i, c in enumerate(explanation[start:]): for i, c in enumerate(explanation[start:]):
if c == "{": if prev_c + c == "\n{":
level += 1 level += 1
elif c == "}": elif prev_c + c == "\n}":
level -= 1 level -= 1
if not level: if not level:
break break
prev_c = c
else: else:
raise AssertionError("unbalanced braces: %r" % (explanation,)) raise AssertionError("unbalanced braces: %r" % (explanation,))
end = start + i end = start + i

View File

@ -665,3 +665,24 @@ class TestAssertionRewriteHookDetails(object):
result.stdout.fnmatch_lines([ result.stdout.fnmatch_lines([
"* 1 passed*", "* 1 passed*",
]) ])
def test_issue731(testdir):
testdir.makepyfile("""
class LongReprWithBraces(object):
def __repr__(self):
return 'LongReprWithBraces({' + ('a' * 80) + '}' + ('a' * 120) + ')'
def some_method(self):
return False
def test_long_repr():
obj = LongReprWithBraces()
assert obj.some_method()
""")
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}')