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)
-----------------------------
- 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
FixtureLookupError which would lead to to an internal error,
obfuscating the original problem. Thanks talljosh for initial

View File

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

View File

@ -665,3 +665,24 @@ class TestAssertionRewriteHookDetails(object):
result.stdout.fnmatch_lines([
"* 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}')